/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* author: atotic
* date: 7/8/03
* IBM's wizard code
*/
package org.python.pydev.ui;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.DataFormatException;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.python.pydev.core.log.Log;
/**
* ColorCache gets colors by RGB, or name
* Named colors are retrieved from preferences
*
* It would be nice if color cache listened to preference changes
* and modified its colors when prefs changed. But currently colors are
* immutable, so this can't be done
implements Preferences.IPropertyChangeListener
preferences.addPropertyChangeListener(this);
preferences.removePropertyChangeListener(this);
*/
public abstract class ColorCache {
private Map<RGB, Color> fColorTable = new HashMap<RGB, Color>();
private Map<String, Color> fNamedColorTable = new HashMap<String, Color>();
protected IPreferenceStore preferences;
public ColorCache(IPreferenceStore prefs) {
preferences = prefs;
}
public void dispose() {
Iterator<Color> it = fColorTable.values().iterator();
while (it.hasNext()) {
it.next().dispose();
}
it = fNamedColorTable.values().iterator();
while (it.hasNext()) {
it.next().dispose();
}
fColorTable.clear();
fNamedColorTable.clear();
}
public Color getColor(String name) {
return getNamedColor(name);
}
public Color getColor(RGB rgb) {
Color color = (Color) fColorTable.get(rgb);
if (color == null) {
color = new Color(Display.getCurrent(), rgb);
fColorTable.put(rgb, color);
}
return color;
}
// getNamedColor gets color from preferences
// if preference is not found, then it looks whether color is one
// of the well-known predefined names
protected Color getNamedColor(String name) {
Color color = (Color) fNamedColorTable.get(name);
if (color == null) {
String colorCode = preferences.getString(name);
if (colorCode.length() == 0) {
if (name.equals("RED")) {
color = getColor(new RGB(255, 0, 0));
} else if (name.equals("BLACK")) {
color = getColor(new RGB(0, 0, 0));
} else if (name.equals("WHITE")) {
color = getColor(new RGB(255, 255, 255));
} else {
Log.log("Unknown color:" + name);
color = getColor(new RGB(255, 0, 0));
}
} else {
try {
RGB rgb = StringConverter.asRGB(colorCode);
color = new Color(Display.getCurrent(), rgb);
fNamedColorTable.put(name, color);
} catch (DataFormatException e) {
// Data conversion failure, maybe someone edited our prefs by hand
Log.log(e);
color = new Color(Display.getCurrent(), new RGB(255, 50, 0));
}
}
}
return color;
}
//reloads the specified color from preferences
public void reloadNamedColor(String name) {
if (fNamedColorTable.containsKey(name)) {
//UndisposedColors.add(fNamedColorTable.get(name));
((Color) fNamedColorTable.get(name)).dispose();
fNamedColorTable.remove(name);
}
}
/**
* When new preferences are set, the contents of the cache are cleared.
*/
public void setPreferences(IPreferenceStore prefs) {
this.dispose();
this.preferences = prefs;
}
}