/**
* <copyright>
* </copyright>
*
*
*/
package org.emftext.language.java.resource.java.ui;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.Map;
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.swt.graphics.Image;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
/**
* A provider class for all images that are required by the generated UI plug-in.
* The default implementation load images from the bundle and caches them to make
* sure each image is loaded at most once.
*/
public class JavaImageProvider {
public final static JavaImageProvider INSTANCE = new JavaImageProvider();
private Map<String, Image> imageCache = new LinkedHashMap<String, Image>();
/**
* Returns the image associated with the given key. The key can be either a path
* to an image file in the resource bundle or a shared image from
* org.eclipse.ui.ISharedImages.
*/
public Image getImage(String key) {
if (key == null) {
return null;
}
Image image = null;
// try shared images
try {
Field declaredField = ISharedImages.class.getDeclaredField(key);
Object valueObject = declaredField.get(null);
if (valueObject instanceof String) {
String value = (String) valueObject;
image = PlatformUI.getWorkbench().getSharedImages().getImage(value);
}
} catch (SecurityException e) {
} catch (NoSuchFieldException e) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
if (image != null) {
return image;
}
// try cache
if (imageCache.containsKey(key)) {
return imageCache.get(key);
}
// try loading image from UI bundle
ImageDescriptor descriptor = getImageDescriptor(key);
if (descriptor == null) {
return null;
}
image = descriptor.createImage();
if (image == null) {
return null;
}
imageCache.put(key, image);
return image;
}
/**
* <p>
* Returns the image for the given key. Possible keys are:
* </p>
* <p>
* <ul>
* </p>
* <p>
* <li>platform:/plugin/your.plugin/icons/yourIcon.png</li>
* </p>
* <p>
* <li>bundleentry://557.fwk3560063/icons/yourIcon.png</li>
* </p>
* <p>
* </ul>
* </p>
*/
public ImageDescriptor getImageDescriptor(String key) {
IPath path = new Path(key);
org.emftext.language.java.resource.java.ui.JavaUIPlugin plugin = org.emftext.language.java.resource.java.ui.JavaUIPlugin.getDefault();
if (plugin == null) {
return null;
}
ImageDescriptor descriptor = ImageDescriptor.createFromURL(FileLocator.find(plugin.getBundle(), path, null));
if (ImageDescriptor.getMissingImageDescriptor().equals(descriptor) || descriptor == null) {
// try loading image from any bundle
try {
URL pluginUrl = new URL(key);
descriptor = ImageDescriptor.createFromURL(pluginUrl);
if (ImageDescriptor.getMissingImageDescriptor().equals(descriptor) || descriptor == null) {
return null;
}
} catch (MalformedURLException mue) {
org.emftext.language.java.resource.java.ui.JavaUIPlugin.logError("IconProvider can't load image (URL is malformed).", mue);
}
}
return descriptor;
}
}