Project: dawn-third
/* 
 * 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 = new Cursor(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() { 
   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. Schriftgre hngt 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(153186243); 
 
    /** the color for blue */ 
    final static public RGB COLOR_BLUE = new RGB(00255); 
 
    /** the color for white */ 
    final static public RGB COLOR_WHITE = new RGB(255255255); 
 
    /** the color for gray */ 
    final static public RGB COLOR_GRAY = new RGB(200200200); 
 
    /** the color for dark gray */ 
    final static public RGB COLOR_DARK_GRAY = new RGB(150150150); 
 
    /** the color for black */ 
    final static public RGB COLOR_BLACK = new RGB(000); 
     
    /** the color for red */ 
    final static public RGB COLOR_RED = new RGB(25500); 
     
    /** the color for green */ 
    final static public RGB COLOR_GREEN= new RGB(02550); 
     
    /** the color for yellow */ 
    final static public RGB COLOR_YELLOW= new RGB(2552550); 
     
    /** the color for pink */ 
    final static public RGB COLOR_PINK= new RGB(2550255); 
     
     /** the color for cyan */ 
    final static public RGB COLOR_CYAN= new RGB(0255255); 
     
    /** the color for orange */ 
    final static public RGB COLOR_ORANGE= new RGB(2551280); 
     
     /** the color for orange */ 
    final static public RGB COLOR_PURPLE= new RGB(1280255); 
     
    /** 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); 
}