/* * Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron, * Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY. * * THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS. * WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE * IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR * CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. * DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, * OR MODIFICATIONS. * THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION, * USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS * PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY * AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM */ package org.csstudio.swt.xygraph.util; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import org.csstudio.swt.xygraph.Activator; import org.eclipse.draw2d.Cursors; import org.eclipse.jface.resource.ColorRegistry; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; /** * A factory, which provides convenience methods for the creation of Images and * Fonts. * * All resources created via this factory get automatically disposed, when the * application is stopped. * * @author Sven Wende, Xihui Chen * @version $Revision$ * */ public final class XYGraphMediaFactory { /** * The shared instance. */ private static XYGraphMediaFactory _instance; /** * The color registry. */ private ColorRegistry _colorRegistry; /** * The image registry. */ private ImageRegistry _imageRegistry; /** * The font registry. */ private FontRegistry _fontRegistry; private Set<Cursor> cursorRegistry; /** * Map that holds the provided image descriptors. */ private HashMap<ImageDescriptor, Image> _imageCache; public enum CURSOR_TYPE { GRABBING; } private volatile static Cursor CURSOR_GRABBING; public void disposeResources(){ if(CURSOR_GRABBING!=null && !CURSOR_GRABBING.isDisposed()) CURSOR_GRABBING.dispose(); if(cursorRegistry != null) for(Cursor cursor : cursorRegistry){ if(cursor != null && !cursor.isDisposed()) cursor.dispose(); } } public static Cursor getCursor(CURSOR_TYPE cursorType){ switch (cursorType) { case GRABBING: if(CURSOR_GRABBING == null){ CURSOR_GRABBING = GraphicsUtil.createCursor(Display.getDefault(), getInstance().getImage("images/Grabbing.png").getImageData(), 8,8); } return CURSOR_GRABBING; default: return Cursors.HAND; } } /** * Private constructor to avoid instantiation. */ private XYGraphMediaFactory() { _colorRegistry = new ColorRegistry(); _imageRegistry = new ImageRegistry(); _fontRegistry = new FontRegistry(); _imageCache = new HashMap<ImageDescriptor, Image>(); // dispose all images from the image cache, when the display is disposed Display.getDefault().addListener(SWT.Dispose, new Listener() { @Override public void handleEvent(final Event event) { for (Image img : _imageCache.values()) { img.dispose(); } disposeResources(); } }); } /** * Return the shared instance of this class. * * @return The shared instance of this class. */ public static synchronized XYGraphMediaFactory getInstance() { if (_instance == null) { _instance = new XYGraphMediaFactory(); } return _instance; } /** * Create the <code>Color</code> for the given color information. * * @param r * red * @param g * green * @param b * blue * * @return The <code>Color</code> for the given color information. */ public Color getColor(final int r, final int g, final int b) { return getColor(new RGB(r, g, b)); } /** * Create the <code>Color</code> for the given <code>RGB</code>. * * @param rgb * A <code>RGB</code> object. * @return The <code>Color</code> for the given <code>RGB</code>. */ public Color getColor(final RGB rgb) { assert rgb != null : "rgb!=null"; //$NON-NLS-1$ Color result = null; String key = String.valueOf(rgb.hashCode()); if (!_colorRegistry.hasValueFor(key)) { _colorRegistry.put(key, rgb); } result = _colorRegistry.get(key); return result; } /** * Create the <code>Font</code> for the given information. * * @param name * The font name. * @param height * The font height. * @param style * The font style. * @return The <code>Font</code> for the given information. */ public Font getFont(final String name, final int height, final int style) { assert name != null : "name!=null"; //$NON-NLS-1$ FontData fd = new FontData(name, height, style); String key = String.valueOf(fd.hashCode()); if (!_fontRegistry.hasValueFor(key)) { _fontRegistry.put(key, new FontData[] { fd }); } return _fontRegistry.get(key); } /** * Create the <code>Font</code> for the given <code>FontData</code>. * * @param fontData * The <code>FontData</code> * @return The <code>Font</code> for the given <code>FontData</code> */ public Font getFont(final FontData[] fontData) { FontData f = fontData[0]; return getFont(f.getName(), f.getHeight(), f.getStyle()); } /** * Create the <code>Font</code> for the given <code>FontData</code> and * the given style code. * * @param fontData * The <code>FontData</code> * @param style * The style code. * @return The <code>Font</code> for the given <code>FontData</code> and * the given style code. */ public Font getFont(final FontData[] fontData, final int style) { FontData f = fontData[0]; Font font = getFont(f.getName(), f.getHeight(), style); return font; } /** * Create the <code>Font</code> for the given <code>FontData</code> and * the given style code. * * @param fontData * The <code>FontData</code> * @return The <code>Font</code> for the given <code>FontData</code> and * the given style code. */ public Font getFont(final FontData fontData) { Font font = getFont(fontData.getName(), fontData.getHeight(), fontData.getStyle()); return font; } /** * Return the system's default font. * * @param style * additional styles, e.g. SWT.Bold * @return The system's default font. */ public Font getDefaultFont(final int style) { // FIXME Die default Schriftart bzw. Schriftgr��e h�ngt vom Betriebssystem ab return getFont("Arial", 10, style); //$NON-NLS-1$ } /**Register the image to imageRegistry so it can be disposed when Display disposed. * @param key * @param img */ public void registerImage(final String key, final Image img){ _imageRegistry.put(key, img); } public Image getRegisteredImage(final String key){ return _imageRegistry.get(key); } /** * Load the <code>Image</code> from the given path in the given plugin. * Usually, this is the image found via the the given plug-in * relative path. But this implementation also supports a hack for testing: * If no plugin is running, because for example this is an SWT-only * test, the path is used as is, i.e. relative to the current * directory. * * @param relativePath * The image's relative path to the root of the plugin. * @return The <code>Image</code> from the given path in the given plugin. */ public Image getImage(final String relativePath) { // Is image already cached in imageRegistry? if (_imageRegistry.get(relativePath) == null) { InputStream stream = XYGraphMediaFactory.class.getResourceAsStream(relativePath); Image image; if (stream==null) { image = Activator.getImageDescriptor(relativePath).createImage(); } else { image = new Image(Display.getCurrent(), stream); try { stream.close(); } catch (IOException ioe) { } } // Must be running as JUnit test or demo w/o plugin environment. // The following only works for test code inside this plugin, // not when called from other plugins' test code. // final Display display = Display.getCurrent(); // final Image img = new Image(display, relativePath); _imageRegistry.put(relativePath, image); } return _imageRegistry.get(relativePath); } /**Register the cursor so it can be disposed when the plugin stopped. * @param cursor */ public void registerCursor(Cursor cursor){ if(cursorRegistry == null){ cursorRegistry = new HashSet<Cursor>(); } cursorRegistry.add(cursor); } /** the color for light blue */ final static public RGB COLOR_LIGHT_BLUE = new RGB(153, 186, 243); /** the color for blue */ final static public RGB COLOR_BLUE = new RGB(0, 0, 255); /** the color for white */ final static public RGB COLOR_WHITE = new RGB(255, 255, 255); /** the color for gray */ final static public RGB COLOR_GRAY = new RGB(200, 200, 200); /** the color for dark gray */ final static public RGB COLOR_DARK_GRAY = new RGB(150, 150, 150); /** the color for black */ final static public RGB COLOR_BLACK = new RGB(0, 0, 0); /** the color for red */ final static public RGB COLOR_RED = new RGB(255, 0, 0); /** the color for green */ final static public RGB COLOR_GREEN= new RGB(0, 255, 0); /** the color for yellow */ final static public RGB COLOR_YELLOW= new RGB(255, 255, 0); /** the color for pink */ final static public RGB COLOR_PINK= new RGB(255, 0, 255); /** the color for cyan */ final static public RGB COLOR_CYAN= new RGB(0, 255, 255); /** the color for orange */ final static public RGB COLOR_ORANGE= new RGB(255, 128, 0); /** the color for orange */ final static public RGB COLOR_PURPLE= new RGB(128, 0, 255); /** the font for Arial in height of 9 */ final static public FontData FONT_ARIAL = new FontData("Arial", 9, SWT.NONE); /** the font for Tahoma in height of 9 */ final static public FontData FONT_TAHOMA = new FontData("Tahoma", 9, SWT.NONE); }