package org.marketcetera.photon.ui; import java.util.Map; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; import org.eclipse.update.internal.ui.parts.ImageOverlayIcon; import org.marketcetera.photon.Messages; import org.marketcetera.photon.PhotonImages; import org.marketcetera.photon.PhotonPlugin; import org.marketcetera.util.misc.ClassVersion; /* $License$ */ /** * Contribution item for a status indicator. It supports three status: on, off, * and error. * <p> * It is added via the <code>org.eclipse.ui.menus</code> extension point. Images * can be overlayed with a custom image, the path of which is also provided by * the extension point. * <p> * The Eclipse internal {@link ImageOverlayIcon} class is used intentionally to * avoid duplicating code. * <p> * TODO: test to verify this continues to work as expected. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: StatusIndicatorContributionItem.java 10782 2009-09-30 20:11:02Z * will $ * @since 1.0.0 */ @SuppressWarnings("restriction") @ClassVersion("$Id: StatusIndicatorContributionItem.java 16841 2014-02-20 19:59:04Z colin $")//$NON-NLS-1$ public abstract class StatusIndicatorContributionItem extends WorkbenchWindowControlContribution implements IExecutableExtension { private static final String OVERLAY_KEY = "overlay"; //$NON-NLS-1$ private Image mOnImage; private Image mOffImage; private Image mErrorImage; private boolean mOverlays; /** * Returns the image for the "on" status. * * @return the image indicating an "on" status */ public Image getOnImage() { return mOnImage; } /** * Returns the image for the "off" status. * * @return the image indicating an "off" status */ public Image getOffImage() { return mOffImage; } /** * Returns the image for the "error" status. * * @return the image indicating an "error" status */ public Image getErrorImage() { return mErrorImage; } /** * Subclasses can override to provide additional cleanup, but must be sure * to call this method as well. */ @Override public void dispose() { // Dispose custom images if (mOverlays) { if (mOnImage != null) mOnImage.dispose(); if (mOffImage != null) mOffImage.dispose(); if (mErrorImage != null) mErrorImage.dispose(); } } /** * Subclasses may override to retrieve additional configuration, but must be sure to * call this {@link StatusIndicatorContributionItem} implementation. * * @see IExecutableExtension#setInitializationData(IConfigurationElement, String, Object) */ @SuppressWarnings("unchecked") @Override public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException { if (data instanceof Map) { Map<String, String> dataMap = (Map<String, String>) data; for (String key : dataMap.keySet()) { if (OVERLAY_KEY.equals(key)) { createImages(dataMap.get(key)); break; } } } } private void createImages(String overlay) { ImageRegistry imageRegistry = PhotonPlugin.getDefault() .getImageRegistry(); Image greenImage = imageRegistry.get(PhotonImages.GREEN_LED); Image grayImage = imageRegistry.get(PhotonImages.GRAY_LED); Image redImage = imageRegistry.get(PhotonImages.RED_LED); if (overlay != null) { ImageDescriptor overlayDescriptor = PhotonPlugin .getImageDescriptor(overlay); if (overlayDescriptor != null) { try { ImageDescriptor[][] overlays = new ImageDescriptor[][] { null, new ImageDescriptor[] { overlayDescriptor } }; mOnImage = new ImageOverlayIcon(greenImage, overlays, getSize(greenImage)).createImage(); mOffImage = new ImageOverlayIcon(grayImage, overlays, getSize(grayImage)).createImage(); mErrorImage = new ImageOverlayIcon(redImage, overlays, getSize(redImage)).createImage(); mOverlays = true; return; } catch (Exception e) { // fall through to defaults (without overlay) Messages.STATUS_INDICATOR_OVERLAY_ERROR.error(this, e, overlay); } } } mOnImage = greenImage; mOffImage = grayImage; mErrorImage = redImage; } private Point getSize(Image greenImage) { Rectangle r = greenImage.getBounds(); return new Point(r.width, r.height); } }