//* Licensed Materials - Property of IBM * //* eu.abc4trust.pabce.1.0 * //* (C) Copyright IBM Corp. 2012. All Rights Reserved. * //* US Government Users Restricted Rights - Use, duplication or * //* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * //*/**/**************************************************************** package eu.abc4trust.ri.ui.user.utils; import java.net.URL; import org.eclipse.jface.resource.ColorRegistry; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.rwt.SessionSingletonBase; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.plugin.AbstractUIPlugin; import eu.abc4trust.ri.ui.user.Activator; /** * Singleton store for resources (images, colors).<br/> * <br/> * Note that this class is implemented as <a href=http://wiki.eclipse.org/RAP/FAQ#What_is_a_Session_Singleton_and_how_can_I_implement_one.3F">Session Singleton</a>. * This was done because without the session singleton approach the images in the UI were not displayed any more * after restarting the application/UI, i.e., they were only displayed the first time the application/UI was started. * Apparently, when restarting the application, the ImageRegistry disposed the images which lead to this unintended behavior. */ public class ResourceRegistryStore { // Image constants public static final String IMG_ARROW = "arrow"; //$NON-NLS-1$ public static final String IMG_MISSING = "missingImage"; //$NON-NLS-1$ public static final String IMG_LOCK_SMALL = "lock_small"; //$NON-NLS-1$ public static final String IMG_INFORMATION = "information"; //$NON-NLS-1$ public static final String IMG_DELETE = "delete"; //$NON-NLS-1$ public static final String IMG_CREDENTIAL_DELETE_16x16 = "credential_delete_16x16"; //$NON-NLS-1$ public static final String IMG_CREDENTIAL_DELETE_64x64 = "credential_delete_64x64"; //$NON-NLS-1$ public static final String IMG_CHECKBOX_SELECTED = "checkbox_selected"; //$NON-NLS-1$ public static final String IMG_CHECKBOX_UNSELECTED = "checkbox_unselected"; //$NON-NLS-1$ // Color constants public static final String COL_GREY = "col190190190"; //$NON-NLS-1$ public static final String COL_BLUE001 = "blue001"; //$NON-NLS-1$ public static final String COL_BLUE002 = "blue002"; //$NON-NLS-1$ public static final String COL_RED001 = "red001"; //$NON-NLS-1$ public static final String COL_GREEN001 = "green001"; //$NON-NLS-1$ // Registries private final ImageRegistry imageRegistry; private final ColorRegistry colorRegistry; private ResourceRegistryStore() { // 'private' modifier prevents instantiation from outside imageRegistry = new ImageRegistry(); colorRegistry = new ColorRegistry(); initializeImages(); initializeColors(); } private void initializeImages() { imageRegistry.put(IMG_ARROW, getImageDescriptorFromPlugin("icons/arrow.png")); //$NON-NLS-1$ imageRegistry.put(IMG_MISSING, getImageDescriptorFromPlugin("icons/missing.png")); //$NON-NLS-1$ imageRegistry.put(IMG_LOCK_SMALL, getImageDescriptorFromPlugin("org.eclipse.rap.ui", "icons/full/progress/lockedstate.gif")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_INFORMATION, getImageDescriptorFromPlugin("org.eclipse.rap.rwt", "resource/widget/rap/dialog/information.gif")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_DELETE, getImageDescriptorFromPlugin("org.eclipse.rap.ui", "icons/full/etool16/delete.gif")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_CREDENTIAL_DELETE_64x64, getImageDescriptorFromPlugin("icons/credential_delete_64x64.png")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_CREDENTIAL_DELETE_16x16, getImageDescriptorFromPlugin("icons/credential_delete_16x16.png")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_CHECKBOX_SELECTED, getImageDescriptorFromPlugin("org.eclipse.rap.rwt", "resource/widget/rap/button/check-selected.png")); //$NON-NLS-1$ //$NON-NLS-2$ imageRegistry.put(IMG_CHECKBOX_UNSELECTED, getImageDescriptorFromPlugin("org.eclipse.rap.rwt", "resource/widget/rap/button/check-unselected.png")); //$NON-NLS-1$ //$NON-NLS-2$ } private void initializeColors() { colorRegistry.put(COL_GREY, Display.getDefault().getSystemColor(SWT.COLOR_GRAY).getRGB()); colorRegistry.put(COL_BLUE001, new RGB(167, 211, 233)); colorRegistry.put(COL_BLUE002, new RGB(167, 211, 233)); colorRegistry.put(COL_RED001, new RGB(220, 0, 0)); colorRegistry.put(COL_GREEN001, new RGB(160, 255, 160)); } private static ImageDescriptor getImageDescriptorFromPlugin(String imageFilePath) { return AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, imageFilePath); } private static ImageDescriptor getImageDescriptorFromPlugin(String pluginID, String imageFilePath) { return AbstractUIPlugin.imageDescriptorFromPlugin(pluginID, imageFilePath); } public static ResourceRegistryStore getInstance() { return (ResourceRegistryStore) SessionSingletonBase.getInstance(ResourceRegistryStore.class); } public static ImageRegistry getImageRegistry() { return getInstance().imageRegistry; } public static ColorRegistry getColorRegistry() { return getInstance().colorRegistry; } public static Image getImage(String key) { return getImageRegistry().get(key); } public static ImageDescriptor getImageDescriptor(String key) { return getImageRegistry().getDescriptor(key); } public static Color getColor(String key) { return getColorRegistry().get(key); } /** * Generates a thumbnail from the image with the given URL. * Thumbnails are cached. * * @param image * @param maxSideLength * @return */ public static Image getThumbnail(URL image, int maxSideLength) { return getThumbnail(image, maxSideLength, false); } @Deprecated // TODO grey thumbnails not implemented yet public static Image getGrayThumbnail(URL image, int maxSideLength) { return getThumbnail(image, maxSideLength, true); } private static Image getThumbnail(URL image, int maxSideLength, boolean gray) { String id = "thumbmail::"+maxSideLength+"::"+image+"::"+gray; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ // check whether there is already a thumbnail for this image URL in the registry Image cachedThumbnail = ResourceRegistryStore.getImage(id); if (cachedThumbnail != null) { return cachedThumbnail; } ImageDescriptor imgDesc = ImageDescriptor.createFromURL(image); if (imgDesc == null) return getImage(IMG_MISSING); ImageData imgData = imgDesc.getImageData(); if (imgData == null) return getImage(IMG_MISSING); int oWidth = imgData.width; int oHeight = imgData.height; double ratio; if (oWidth >= oHeight) { ratio = (double)maxSideLength/oWidth; } else { ratio = (double)maxSideLength/oHeight; } Image thumbnail = new Image(Display.getDefault(), imgData.scaledTo((int)(oWidth*ratio), (int)(oHeight*ratio))); // if (gray) { // TODO add support for gray image or remove gray parameter // Image grayed = new Image(Display.getDefault(), thumbnail, SWT.image); // thumbnail.dispose(); // // put into registry // } ResourceRegistryStore.getImageRegistry().put(id, thumbnail); return thumbnail; } }