/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.gui.resources.api; import java.io.ByteArrayInputStream; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.LogFactory; import org.eclipse.swt.SWTException; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Display; import de.rcenvironment.core.component.model.api.ComponentInterface; /** * The ComponentImageManager caches the SWT Image resource for the component icons. Currently the image is created and cached if it is * requested for the first time. * * TODO Insert the icon as soon as it becomes known by the RCE instance. To implement this behavior, this class should implement the * DistributedComponentKnowledgeListener. However as other objects are also DistributedComponentKnowledgeListeners, they could get notified * before the ComponentImageManger and try to access an Image before it was created by this Manager. * * TODO Remove/update the image as soon as the component becomes unknown to the RCE instance. There might be synchronization issues here. * Furthermore issue #0014327 needs to be considered. * * TODO Automatically dispose all cached images if the RCE instance is shut down. * * @author Tobias Rodehutskors */ public final class ComponentImageManager { private static final String SETTING_COMPONENT_ICON_FAILED = "Setting component icon failed."; private static ComponentImageManager instance; /** * Simple container utility class to store the references to all three image sizes. */ private class ImageContainer { private Image icon16 = null; private Image icon24 = null; private Image icon32 = null; } private Map<String, ImageContainer> iconImageMap = new HashMap<String, ImageContainer>(); private ComponentImageManager() { } /** * @return The static instance of the {@link ComponentImageManager}. */ public static ComponentImageManager getInstance() { if (instance == null) { instance = new ComponentImageManager(); } return instance; } /** * Returns the icon of the given component as an image. The image is cached by the ComponentImageManger and should not be disposed! * * @param ci The ComponentInterface of the Component for which the icon image should be retrieved. * @return The icon image of the ComponentInterface or null if the icon is not specified. */ public Image getIcon16Image(ComponentInterface ci) { return returnImageContainer(ci).icon16; } /** * Returns the icon of the given component as an image. The image is cached by the ComponentImageManger and should not be disposed! * * @param ci The ComponentInterface of the Component for which the icon image should be retrieved. * @return The icon image of the ComponentInterface or null if the icon is not specified. */ public Image getIcon24Image(ComponentInterface ci) { return returnImageContainer(ci).icon24; } /** * Returns the icon of the given component as an image. The image is cached by the ComponentImageManger and should not be disposed! * * @param ci The ComponentInterface of the Component for which the icon image should be retrieved. * @return The icon image of the ComponentInterface or null if the icon is not specified. */ public Image getIcon32Image(ComponentInterface ci) { return returnImageContainer(ci).icon32; } private ImageContainer returnImageContainer(ComponentInterface ci) { // check if the cache already contains the icon hash if (!iconImageMap.containsKey(ci.getIconHash())) { // if not, instantiate the images and store them in the cache ImageContainer tmpContainer = new ImageContainer(); if (ci.getIcon16() != null) { try { tmpContainer.icon16 = new Image(Display.getCurrent(), new ByteArrayInputStream(ci.getIcon16())); } catch (SWTException e) { // TODO should we set a fallback icon as done in https://mantis.sc.dlr.de/view.php?id=11453 ? // image = Activator.getInstance().getImageRegistry().getDescriptor(Activator.IMAGE_RCE_ICON_16); LogFactory.getLog(getClass()).debug(SETTING_COMPONENT_ICON_FAILED, e); } } if (ci.getIcon24() != null) { try { tmpContainer.icon24 = new Image(Display.getCurrent(), new ByteArrayInputStream(ci.getIcon24())); } catch (SWTException e) { LogFactory.getLog(getClass()).debug(SETTING_COMPONENT_ICON_FAILED, e); } } if (ci.getIcon32() != null) { try { tmpContainer.icon32 = new Image(Display.getCurrent(), new ByteArrayInputStream(ci.getIcon32())); } catch (SWTException e) { LogFactory.getLog(getClass()).debug(SETTING_COMPONENT_ICON_FAILED, e); } } iconImageMap.put(ci.getIconHash(), tmpContainer); } return iconImageMap.get(ci.getIconHash()); } }