/*******************************************************************************
* Copyright (c) 2009 SpringSource, a divison of VMware, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SpringSource, a division of VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.virgo.ide.ui.editors.text;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceConverter;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.pde.internal.ui.PDEPlugin;
import org.eclipse.pde.internal.ui.editor.text.IColorManager;
import org.eclipse.pde.internal.ui.editor.text.IPDEColorConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
/**
* @author Christian Dupuis
*/
public class BundleColorManager implements IColorManager, IPDEColorConstants, ISpringColorConstants {
private static BundleColorManager fColorManager;
private final Map fColorTable = new HashMap(5);
private static int counter = 0;
public BundleColorManager() {
initialize();
}
public static IColorManager getDefault() {
if (fColorManager == null) {
fColorManager = new BundleColorManager();
}
counter += 1;
return fColorManager;
}
public static void initializeDefaults(IPreferenceStore store) {
PreferenceConverter.setDefault(store, P_DEFAULT, DEFAULT);
PreferenceConverter.setDefault(store, P_PROC_INSTR, PROC_INSTR);
PreferenceConverter.setDefault(store, P_STRING, STRING);
PreferenceConverter.setDefault(store, P_TAG, TAG);
PreferenceConverter.setDefault(store, P_XML_COMMENT, XML_COMMENT);
PreferenceConverter.setDefault(store, P_HEADER_KEY, HEADER_KEY);
PreferenceConverter.setDefault(store, P_HEADER_OSGI, HEADER_OSGI);
store.setDefault(P_HEADER_OSGI + IPDEColorConstants.P_BOLD_SUFFIX, true);
PreferenceConverter.setDefault(store, P_HEADER_VALUE, HEADER_VALUE);
PreferenceConverter.setDefault(store, P_HEADER_ATTRIBUTES, HEADER_ATTRIBUTES);
store.setDefault(P_HEADER_ATTRIBUTES + IPDEColorConstants.P_ITALIC_SUFFIX, true);
PreferenceConverter.setDefault(store, P_HEADER_ASSIGNMENT, HEADER_ASSIGNMENT);
PreferenceConverter.setDefault(store, P_HEADER_SPRING, HEADER_SPRING);
store.setDefault(P_HEADER_SPRING + IPDEColorConstants.P_BOLD_SUFFIX, true);
}
private void initialize() {
IPreferenceStore pstore = PDEPlugin.getDefault().getPreferenceStore();
putColor(pstore, P_DEFAULT);
putColor(pstore, P_PROC_INSTR);
putColor(pstore, P_STRING);
putColor(pstore, P_TAG);
putColor(pstore, P_XML_COMMENT);
putColor(pstore, P_HEADER_KEY);
putColor(pstore, P_HEADER_OSGI);
putColor(pstore, P_HEADER_VALUE);
putColor(pstore, P_HEADER_ATTRIBUTES);
putColor(pstore, P_HEADER_ASSIGNMENT);
putColor(pstore, P_HEADER_SPRING);
pstore = JavaPlugin.getDefault().getCombinedPreferenceStore();
for (String element : IColorManager.PROPERTIES_COLORS) {
putColor(pstore, element);
}
}
public void disposeColors(boolean resetSingleton) {
Iterator e = fColorTable.values().iterator();
while (e.hasNext()) {
((Color) e.next()).dispose();
}
if (resetSingleton) {
fColorManager = null;
}
}
public void dispose() {
counter--;
if (counter == 0) {
disposeColors(true);
}
}
private void putColor(IPreferenceStore pstore, String property) {
putColor(property, PreferenceConverter.getColor(pstore, property));
}
private void putColor(String property, RGB setting) {
Color oldColor = (Color) fColorTable.get(property);
if (oldColor != null) {
if (oldColor.getRGB().equals(setting)) {
return;
}
oldColor.dispose();
}
fColorTable.put(property, new Color(Display.getCurrent(), setting));
}
public Color getColor(String key) {
Color color = (Color) fColorTable.get(key);
if (color == null) {
color = Display.getCurrent().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
}
return color;
}
public void handlePropertyChangeEvent(PropertyChangeEvent event) {
Object color = event.getNewValue();
if (color instanceof RGB) {
putColor(event.getProperty(), (RGB) color);
}
else {
putColor(event.getProperty(), StringConverter.asRGB(color.toString()));
}
}
}