package tk.eclipse.plugin.htmleditor; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.resource.StringConverter; import org.eclipse.jface.text.TextAttribute; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.Token; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Display; public class ColorProvider { private Map<RGB, Color> colorTable = new HashMap<RGB, Color>(10); private Map<String, Token> tokenTable = new HashMap<String, Token>(10); IPreferenceStore store; public ColorProvider(IPreferenceStore store) { this.store = store; } public IToken getToken(String prefKey){ Token token = tokenTable.get(prefKey); if (token == null){ String colorName = store.getString(prefKey); RGB rgb = StringConverter.asRGB(colorName); token = new Token(new TextAttribute(getColor(rgb))); tokenTable.put(prefKey, token); } return token; } public void dispose(){ Iterator e = colorTable.values().iterator(); while (e.hasNext()){ ((Color) e.next()).dispose(); } } public Color getColor(String prefKey){ String colorName = store.getString(prefKey); RGB rgb = StringConverter.asRGB(colorName); return getColor(rgb); } private Color getColor(RGB rgb) { Color color = colorTable.get(rgb); if (color == null){ color = new Color(Display.getCurrent(), rgb); colorTable.put(rgb, color); } return color; } public boolean affectsTextPresentation(PropertyChangeEvent event){ Token token = tokenTable.get(event.getProperty()); return (token != null); } public void handlePreferenceStoreChanged(PropertyChangeEvent event){ String prefKey = event.getProperty(); Token token = tokenTable.get(prefKey); if (token != null){ String colorName = store.getString(prefKey); RGB rgb = StringConverter.asRGB(colorName); token.setData(new TextAttribute(getColor(rgb))); } } }