// Copyright (c) 2003-2008 by Leif Frenzel - see http://leiffrenzel.de // This code is made available under the terms of the Eclipse Public License, // version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html package net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.eclipsefp.haskell.ui.HaskellUIPlugin; import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.StringConverter; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; /** Provides colors for syntax coloring in the editor. * * This is implemented as singleton to make it accessible from * everywhere and also to reduce resource management to one single place. * * @author Leif Frenzel */ public class ColorProvider implements IEditorPreferenceNames { public static final RGB DEFAULT_COMMENT = new RGB( 63, 127, 95 ); public static final RGB DEFAULT_LITERATE_COMMENT = new RGB( 63, 95, 191 ); public static final RGB DEFAULT_DOC = new RGB( 63, 95, 191 ); public static final RGB DEFAULT_PRAGMA = new RGB( 63, 95, 191 ); public static final RGB DEFAULT_KEYWORD = new RGB( 0, 0, 196 ); public static final RGB DEFAULT_FUNCTION = new RGB( 64, 192, 192 ); public static final RGB DEFAULT_STRING = new RGB( 128, 64, 64 ); public static final RGB DEFAULT_CHAR = new RGB( 96, 96, 96 ); public static final RGB DEFAULT_NUMBER = new RGB( 0, 0, 0 ); public static final RGB DEFAULT_VAR = new RGB( 0, 0, 0 ); public static final RGB DEFAULT_VARSYM = new RGB( 155, 0, 0 ); public static final RGB DEFAULT_CON = new RGB( 200, 0, 0 ); public static final RGB DEFAULT_CPP = new RGB( 63, 95, 191 ); public static final RGB DEFAULT_TH = new RGB( 0, 0, 0 ); public static final RGB DEFAULT_SYMBOL = new RGB( 128, 128, 0 ); public static final RGB DEFAULT_OTHER = new RGB( 0, 0, 0 ); /** The internal singleton reference to ColorProvider. */ private static class SingletonHolder { private static final ColorProvider theInstance = new ColorProvider(); } private final Map<RGB, Color> colors; private final Map<String, RGB> rgbs; private IPreferenceStore prefStore; /** <p>constructs the singleton instance of ColorProvider. Private in order * to ensure the singleton pattern.</p> */ private ColorProvider() { colors = new HashMap<>( 10 ); rgbs = new HashMap<>( 10 ); initializeRgbs(); } public static final ColorProvider getInstance() { return SingletonHolder.theInstance; } public ColorProvider(final IPreferenceStore store){ prefStore=store; colors = new HashMap<>( 10 ); rgbs = new HashMap<>( 10 ); initializeRgbs(); } /** <p>releases all of the color resources held by this ColorProvider.</p> */ public void dispose() { Iterator<Color> it = colors.values().iterator(); while( it.hasNext() ) { it.next().dispose(); it.remove(); } } public Color getColor( final String key ) { RGB rgb = rgbs.get( key ); Assert.isNotNull( rgb ); return getColor( rgb ); } void changeColor( final String key, final Object newValue ) { RGB oldRgb = rgbs.get( key ); if( oldRgb != null ) { RGB newRgb = getNewRgb( newValue ); if( newRgb != null ) { rgbs.put( key, newRgb ); } } } // helping methods ////////////////// private RGB getNewRgb( final Object value ) { RGB result = null; if( value instanceof RGB ) { result = ( RGB )value; } else if( value instanceof String ) { result = StringConverter.asRGB( ( String )value ); } return result; } private Color getColor( final RGB rgb ) { Color color = colors.get( rgb ); if( color == null || color.isDisposed()) { color = new Color( Display.getCurrent(), rgb ); colors.put( rgb, color ); } return color; } private void initializeRgbs() { putRgb( EDITOR_COMMENT_COLOR, DEFAULT_COMMENT ); putRgb( EDITOR_DOC_COLOR, DEFAULT_DOC); putRgb( EDITOR_PRAGMA_COLOR, DEFAULT_PRAGMA ); putRgb( EDITOR_LITERATE_COMMENT_COLOR, DEFAULT_LITERATE_COMMENT ); putRgb( EDITOR_FUNCTION_COLOR, DEFAULT_FUNCTION ); putRgb( EDITOR_KEYWORD_COLOR, DEFAULT_KEYWORD ); putRgb( EDITOR_DEFAULT_COLOR, DEFAULT_OTHER ); putRgb( EDITOR_STRING_COLOR, DEFAULT_STRING ); putRgb( EDITOR_CHAR_COLOR, DEFAULT_CHAR ); putRgb( EDITOR_NUMBER_COLOR, DEFAULT_NUMBER ); putRgb( EDITOR_VAR_COLOR, DEFAULT_VAR ); putRgb( EDITOR_VARSYM_COLOR, DEFAULT_VARSYM ); putRgb( EDITOR_CON_COLOR, DEFAULT_CON ); putRgb( EDITOR_CPP_COLOR, DEFAULT_CPP ); putRgb( EDITOR_TH_COLOR, DEFAULT_TH ); putRgb( EDITOR_SYMBOL_COLOR, DEFAULT_SYMBOL ); } private void putRgb( final String key, final RGB defaultRgb ) { RGB rgb = PreferenceConverter.getColor( getPreferenceStore(), key ); if( rgb == null ) { rgb = defaultRgb; } rgbs.put( key, rgb ); } private IPreferenceStore getPreferenceStore() { if (prefStore!=null){ return prefStore; } return HaskellUIPlugin.getDefault().getPreferenceStore(); } }