Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gvozdev2013-06-24 14:15:58 +0000
committerAndrew Gvozdev2013-06-24 14:32:11 +0000
commita855283bd411a2782328fe78a975382778beab25 (patch)
tree900b45452c0332825fb9c489c5b09fd5879cb01b /core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui
parentd8796f4c42cf7267cbb461e32937122d1c70b0c6 (diff)
downloadorg.eclipse.cdt-a855283bd411a2782328fe78a975382778beab25.tar.gz
org.eclipse.cdt-a855283bd411a2782328fe78a975382778beab25.tar.xz
org.eclipse.cdt-a855283bd411a2782328fe78a975382778beab25.zip
bug 411499: Generalize facility for shared images
Diffstat (limited to 'core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui')
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java137
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/SharedImagesFactory.java221
2 files changed, 246 insertions, 112 deletions
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java
index 9f3e0f90ed2..a01a8b27e69 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CDTSharedImages.java
@@ -12,18 +12,9 @@
package org.eclipse.cdt.ui;
import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
/**
@@ -51,10 +42,6 @@ import org.eclipse.swt.graphics.Image;
* @since 5.3
*/
public class CDTSharedImages {
- private static final char OVERLAY_SEPARATOR = '.';
- private static ImageRegistry imageRegistry = new ImageRegistry(CUIPlugin.getStandardDisplay());
- private static Map<String, URL> urlMap = new HashMap<String, URL>();
-
public static final String IMG_OBJS_TEMPLATE = "icons/obj16/template_obj.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_VARIABLE = "icons/obj16/variable_obj.gif"; //$NON-NLS-1$
public static final String IMG_OBJS_LOCAL_VARIABLE = "icons/obj16/variable_local_obj.gif"; //$NON-NLS-1$
@@ -198,53 +185,29 @@ public class CDTSharedImages {
public static final String IMG_OVR_USER = "icons/ovr16/person_ovr.gif"; //$NON-NLS-1$
// Pin & Clone
- public static final String IMG_THREAD_SUSPENDED_R_PINNED = "icons/obj16/threads_obj_r.gif"; //$NON-NLS-1$
- public static final String IMG_THREAD_SUSPENDED_G_PINNED = "icons/obj16/threads_obj_g.gif"; //$NON-NLS-1$
- public static final String IMG_THREAD_SUSPENDED_B_PINNED = "icons/obj16/threads_obj_b.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_SUSPENDED_R_PINNED = "icons/obj16/threads_obj_r.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_SUSPENDED_G_PINNED = "icons/obj16/threads_obj_g.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_SUSPENDED_B_PINNED = "icons/obj16/threads_obj_b.gif"; //$NON-NLS-1$
- public static final String IMG_THREAD_RUNNING_R_PINNED = "icons/obj16/thread_obj_r.gif"; //$NON-NLS-1$
- public static final String IMG_THREAD_RUNNING_G_PINNED = "icons/obj16/thread_obj_g.gif"; //$NON-NLS-1$
- public static final String IMG_THREAD_RUNNING_B_PINNED = "icons/obj16/thread_obj_b.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_RUNNING_R_PINNED = "icons/obj16/thread_obj_r.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_RUNNING_G_PINNED = "icons/obj16/thread_obj_g.gif"; //$NON-NLS-1$
+ public static final String IMG_THREAD_RUNNING_B_PINNED = "icons/obj16/thread_obj_b.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_SUSPENDED_R_PINNED = "icons/obj16/debugts_obj_r.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_SUSPENDED_G_PINNED = "icons/obj16/debugts_obj_g.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_SUSPENDED_B_PINNED = "icons/obj16/debugts_obj_b.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_SUSPENDED_R_PINNED = "icons/obj16/debugts_obj_r.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_SUSPENDED_G_PINNED = "icons/obj16/debugts_obj_g.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_SUSPENDED_B_PINNED = "icons/obj16/debugts_obj_b.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_RUNNING_R_PINNED = "icons/obj16/debugt_obj_r.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_RUNNING_G_PINNED = "icons/obj16/debugt_obj_g.gif"; //$NON-NLS-1$
- public static final String IMG_CONTAINER_RUNNING_B_PINNED = "icons/obj16/debugt_obj_b.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_RUNNING_R_PINNED = "icons/obj16/debugt_obj_r.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_RUNNING_G_PINNED = "icons/obj16/debugt_obj_g.gif"; //$NON-NLS-1$
+ public static final String IMG_CONTAINER_RUNNING_B_PINNED = "icons/obj16/debugt_obj_b.gif"; //$NON-NLS-1$
- public static final String IMG_VIEW_PIN_ACTION = "icons/obj16/toolbar_pinned.gif"; //$NON-NLS-1$
- public static final String IMG_VIEW_PIN_ACTION_R = "icons/obj16/toolbar_pinned_r.gif"; //$NON-NLS-1$
- public static final String IMG_VIEW_PIN_ACTION_G = "icons/obj16/toolbar_pinned_g.gif"; //$NON-NLS-1$
- public static final String IMG_VIEW_PIN_ACTION_B = "icons/obj16/toolbar_pinned_b.gif"; //$NON-NLS-1$
- public static final String IMG_VIEW_PIN_ACTION_MULTI = "icons/obj16/toolbar_pinned_multi.gif"; //$NON-NLS-1$
+ public static final String IMG_VIEW_PIN_ACTION = "icons/obj16/toolbar_pinned.gif"; //$NON-NLS-1$
+ public static final String IMG_VIEW_PIN_ACTION_R = "icons/obj16/toolbar_pinned_r.gif"; //$NON-NLS-1$
+ public static final String IMG_VIEW_PIN_ACTION_G = "icons/obj16/toolbar_pinned_g.gif"; //$NON-NLS-1$
+ public static final String IMG_VIEW_PIN_ACTION_B = "icons/obj16/toolbar_pinned_b.gif"; //$NON-NLS-1$
+ public static final String IMG_VIEW_PIN_ACTION_MULTI = "icons/obj16/toolbar_pinned_multi.gif"; //$NON-NLS-1$
- /**
- * The method finds URL of the image corresponding to the key which could be project-relative path
- * of the image in org.eclipse.cdt.ui plugin or a (previously registered) string representation of URL
- * in a bundle.
- * For project-relative paths a check on existence and variables expansion (such as "$NL$")
- * is done using {@link FileLocator}.
- *
- * @param key - the key which could be project-relative path of the image in org.eclipse.cdt.ui plugin
- * or a previously registered string representation of URL in a bundle.
- * @return the URL or {@code null} if image was not found.
- */
- private static URL getUrl(String key) {
- // Note that the map can keep null URL in order not to search again
- if (urlMap.containsKey(key))
- return urlMap.get(key);
-
- IPath projectRelativePath = new Path(key);
- URL url = FileLocator.find(CUIPlugin.getDefault().getBundle(), projectRelativePath, null);
- if (url==null) {
- Exception e = new Exception(NLS.bind(Messages.CDTSharedImages_MissingImage, key, CUIPlugin.PLUGIN_ID));
- CUIPlugin.log(e.getMessage(), e);
- }
- urlMap.put(key, url);
- return url;
- }
+ private static SharedImagesFactory imagesFactory = new SharedImagesFactory(CUIPlugin.getDefault());
/**
* Internal method. It lets register image URL from a bundle directly to the map.
@@ -255,7 +218,7 @@ public class CDTSharedImages {
* @noreference This is internal method which is not intended to be referenced by clients.
*/
public static void register(URL url) {
- urlMap.put(url.toString(), url);
+ imagesFactory.register(url);
}
/**
@@ -270,16 +233,7 @@ public class CDTSharedImages {
* @return the image from the repository or the default image for missing image descriptor.
*/
public static Image getImage(String key) {
- URL url = getUrl(key);
- String registryKey = url!=null ? url.toString() : null;
- Image image = imageRegistry.get(registryKey);
- if (image==null) {
- ImageDescriptor descriptor= ImageDescriptor.createFromURL(url);
- imageRegistry.put(registryKey, descriptor);
- image = imageRegistry.get(registryKey);
- }
-
- return image;
+ return imagesFactory.getImage(key);
}
/**
@@ -290,14 +244,7 @@ public class CDTSharedImages {
* @return the image from the repository or {@link ImageDescriptor#getMissingImageDescriptor()}.
*/
public static ImageDescriptor getImageDescriptor(String key) {
- URL url = getUrl(key);
- String registryKey = url!=null ? url.toString() : null;
- ImageDescriptor descriptor = imageRegistry.getDescriptor(registryKey);
- if (descriptor==null) {
- descriptor = ImageDescriptor.createFromURL(url);
- imageRegistry.put(registryKey, descriptor);
- }
- return descriptor;
+ return imagesFactory.getImageDescriptor(key);
}
/**
@@ -319,39 +266,7 @@ public class CDTSharedImages {
* an element to the array if no overlay should be added in given quadrant.
*/
public static Image getImageOverlaid(String baseKey, String[] overlayKeys) {
- Assert.isTrue(overlayKeys.length==5);
-
- String suffix=""; //$NON-NLS-1$
- for (int i=0;i<5;i++) {
- String overlayKey=""; //$NON-NLS-1$
- if (i<overlayKeys.length && overlayKeys[i]!=null) {
- overlayKey=overlayKeys[i];
- }
- suffix=suffix+OVERLAY_SEPARATOR+overlayKey;
- }
- if (suffix.length()==5) {
- // No overlays added
- Image result = getImage(baseKey);
- return result;
- }
- String compositeKey=baseKey+suffix;
-
- Image result = imageRegistry.get(compositeKey);
- if (result!=null)
- return result;
-
- Image baseImage = getImage(baseKey);
- ImageDescriptor[] overlayDescriptors = new ImageDescriptor[5];
- for (int i=0;i<5;i++) {
- String overlayKey = overlayKeys[i];
- if (overlayKey!=null) {
- overlayDescriptors[i] = getImageDescriptor(overlayKey);
- }
- }
- ImageDescriptor compositeDescriptor = new DecorationOverlayIcon(baseImage, overlayDescriptors);
- imageRegistry.put(compositeKey, compositeDescriptor);
- result = imageRegistry.get(compositeKey);
- return result;
+ return imagesFactory.getImageOverlaid(baseKey, overlayKeys);
}
/**
@@ -369,9 +284,7 @@ public class CDTSharedImages {
* @return image overlaid with smaller image in the specified quadrant.
*/
public static Image getImageOverlaid(String baseKey, String overlayKey, int quadrant) {
- String[] overlayKeys = new String[5];
- overlayKeys[quadrant]=overlayKey;
- return getImageOverlaid(baseKey, overlayKeys);
+ return imagesFactory.getImageOverlaid(baseKey, overlayKey, quadrant);
}
/**
@@ -381,7 +294,7 @@ public class CDTSharedImages {
* @return an image with warning overlay.
*/
public static Image getImageWithWarning(String baseKey) {
- return CDTSharedImages.getImageOverlaid(baseKey, CDTSharedImages.IMG_OVR_WARNING, IDecoration.BOTTOM_LEFT);
+ return getImageOverlaid(baseKey, CDTSharedImages.IMG_OVR_WARNING, IDecoration.BOTTOM_LEFT);
}
/**
@@ -391,7 +304,7 @@ public class CDTSharedImages {
* @return an image with error overlay.
*/
public static Image getImageWithError(String baseKey) {
- return CDTSharedImages.getImageOverlaid(baseKey, CDTSharedImages.IMG_OVR_ERROR, IDecoration.BOTTOM_LEFT);
+ return getImageOverlaid(baseKey, CDTSharedImages.IMG_OVR_ERROR, IDecoration.BOTTOM_LEFT);
}
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/SharedImagesFactory.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/SharedImagesFactory.java
new file mode 100644
index 00000000000..d48dae7bbaf
--- /dev/null
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/SharedImagesFactory.java
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2013, 2013 Andrew Gvozdev and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Andrew Gvozdev - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.cdt.ui;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.viewers.DecorationOverlayIcon;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * A helper class to provide common methods to set up managed image repository for a plugin.
+ * <p>
+ * This class provides {@link Image} and {@link ImageDescriptor}
+ * for images in the interface. All {@code Image} objects provided
+ * by this class are managed by this class and must never be disposed
+ * by other clients.
+ * </p>
+ * <p>
+ * See {@link CDTSharedImages} for an example of using this factory.
+ * </p>
+ *
+ * @since 5.7
+ *
+ */
+public class SharedImagesFactory {
+ private static final char OVERLAY_SEPARATOR = '.';
+
+ private Bundle bundle;
+ private ImageRegistry imageRegistry;
+ private Map<String, URL> urlMap = new HashMap<String, URL>();
+
+ /**
+ * Constructor.
+ *
+ * @param plugin - the plugin where the images are defined.
+ */
+ public SharedImagesFactory(Plugin plugin) {
+ this.bundle = plugin.getBundle();
+
+ Display display = Display.getCurrent();
+ if (display == null) {
+ display = Display.getDefault();
+ }
+ this.imageRegistry = new ImageRegistry(display);
+ }
+
+ /**
+ * The method finds URL of the image corresponding to the key which could be project-relative path
+ * of the image in org.eclipse.cdt.ui plugin or a (previously registered) string representation of URL
+ * in a bundle.
+ * For project-relative paths a check on existence and variables expansion (such as "$NL$")
+ * is done using {@link FileLocator}.
+ *
+ * @param key - the key which could be project-relative path of the image in org.eclipse.cdt.ui plugin
+ * or a previously registered string representation of URL in a bundle.
+ * @return the URL or {@code null} if image was not found.
+ */
+ private URL getUrl(String key) {
+ // Note that the map can keep null URL in order not to search again
+ if (urlMap.containsKey(key))
+ return urlMap.get(key);
+
+ IPath projectRelativePath = new Path(key);
+ URL url = FileLocator.find(bundle, projectRelativePath, null);
+ if (url==null) {
+ Exception e = new Exception(NLS.bind(Messages.CDTSharedImages_MissingImage, key, CUIPlugin.PLUGIN_ID));
+ CUIPlugin.log(e.getMessage(), e);
+ }
+ urlMap.put(key, url);
+ return url;
+ }
+
+ /**
+ * This method lets register image URL from a bundle directly to the map.
+ * It is caller responsibility to ensure that a valid URL is passed.
+ *
+ * @param url - URL of the image pointing to its location in a bundle (bundle entry).
+ */
+ public void register(URL url) {
+ urlMap.put(url.toString(), url);
+ }
+
+ /**
+ * The method retrieves an image from the internal repository according to the given key.
+ * The image is managed by image registry and the caller must not dispose it.
+ *
+ * @param key - one of {@code CDTSharedImages.IMG_} constants.
+ * <p>
+ * Reserved for internal usage: the key could be a string representation of URL pointing to location
+ * of the image in the bundle. Such URL key must be registered first with {@code register(URL url)}.
+ * </p>
+ * @return the image from the repository or the default image for missing image descriptor.
+ */
+ public Image getImage(String key) {
+ URL url = getUrl(key);
+ String registryKey = url!=null ? url.toString() : null;
+ Image image = imageRegistry.get(registryKey);
+ if (image==null) {
+ ImageDescriptor descriptor= ImageDescriptor.createFromURL(url);
+ imageRegistry.put(registryKey, descriptor);
+ image = imageRegistry.get(registryKey);
+ }
+
+ return image;
+ }
+
+ /**
+ * The method retrieves an image descriptor from the internal repository according to the given key.
+ * See also {@link #getImage(String)}.
+ *
+ * @param key - one of {@code CDTSharedImages.IMG_} constants.
+ * @return the image from the repository or {@link ImageDescriptor#getMissingImageDescriptor()}.
+ */
+ public ImageDescriptor getImageDescriptor(String key) {
+ URL url = getUrl(key);
+ String registryKey = url!=null ? url.toString() : null;
+ ImageDescriptor descriptor = imageRegistry.getDescriptor(registryKey);
+ if (descriptor==null) {
+ descriptor = ImageDescriptor.createFromURL(url);
+ imageRegistry.put(registryKey, descriptor);
+ }
+ return descriptor;
+ }
+
+ /**
+ * Retrieves an overlaid image from the internal repository of images.
+ * If there is no image one will be created.
+ *
+ * The decoration overlay for the base image will use the array of
+ * provided overlays. The indices of the array correspond to the values
+ * of the 5 overlay constants defined on {@link IDecoration}, i.e.
+ * {@link IDecoration#TOP_LEFT},
+ * {@link IDecoration#TOP_RIGHT},
+ * {@link IDecoration#BOTTOM_LEFT},
+ * {@link IDecoration#BOTTOM_RIGHT} or
+ * {@link IDecoration#UNDERLAY}.
+ *
+ * @param baseKey the base image key.
+ * @param overlayKeys the keys for the overlay images. Must be
+ * String[5], i.e. string array of 5 elements. Put {@code null} as
+ * an element to the array if no overlay should be added in given quadrant.
+ */
+ public Image getImageOverlaid(String baseKey, String[] overlayKeys) {
+ Assert.isTrue(overlayKeys.length==5);
+
+ String suffix=""; //$NON-NLS-1$
+ for (int i=0;i<5;i++) {
+ String overlayKey=""; //$NON-NLS-1$
+ if (i<overlayKeys.length && overlayKeys[i]!=null) {
+ overlayKey=overlayKeys[i];
+ }
+ suffix=suffix+OVERLAY_SEPARATOR+overlayKey;
+ }
+ if (suffix.length()==5) {
+ // No overlays added
+ Image result = getImage(baseKey);
+ return result;
+ }
+ String compositeKey=baseKey+suffix;
+
+ Image result = imageRegistry.get(compositeKey);
+ if (result!=null)
+ return result;
+
+ Image baseImage = getImage(baseKey);
+ ImageDescriptor[] overlayDescriptors = new ImageDescriptor[5];
+ for (int i=0;i<5;i++) {
+ String overlayKey = overlayKeys[i];
+ if (overlayKey!=null) {
+ overlayDescriptors[i] = getImageDescriptor(overlayKey);
+ }
+ }
+ ImageDescriptor compositeDescriptor = new DecorationOverlayIcon(baseImage, overlayDescriptors);
+ imageRegistry.put(compositeKey, compositeDescriptor);
+ result = imageRegistry.get(compositeKey);
+ return result;
+ }
+
+ /**
+ * Retrieves an overlaid image descriptor from the repository of images.
+ * If there is no image one will be created.
+ *
+ * @param baseKey - key of the base image. Expected to be in repository.
+ * @param overlayKey - key of overlay image. Expected to be in repository as well.
+ * @param quadrant - location of overlay, one of those:
+ * {@link IDecoration#TOP_LEFT},
+ * {@link IDecoration#TOP_RIGHT},
+ * {@link IDecoration#BOTTOM_LEFT},
+ * {@link IDecoration#BOTTOM_RIGHT}
+ *
+ * @return image overlaid with smaller image in the specified quadrant.
+ */
+ public Image getImageOverlaid(String baseKey, String overlayKey, int quadrant) {
+ String[] overlayKeys = new String[5];
+ overlayKeys[quadrant]=overlayKey;
+ return getImageOverlaid(baseKey, overlayKeys);
+ }
+}
+

Back to the top