package com.google.dart.tools.ui.theme.preferences; import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.IPreferenceNodeVisitor; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Provides just enough preference management to update the preview in the preference page, without * also updating all open editors. */ public class PreviewPreferences implements IEclipsePreferences { private Map<String, String> store = new HashMap<String, String>(); private List<IEclipsePreferences.IPreferenceChangeListener> listeners = new ArrayList<IEclipsePreferences.IPreferenceChangeListener>();; @Override public String absolutePath() { return null; } @Override public void accept(IPreferenceNodeVisitor visitor) throws BackingStoreException { } @Override public void addNodeChangeListener(INodeChangeListener listener) { } @Override public void addPreferenceChangeListener(IPreferenceChangeListener listener) { listeners.add(listener); } @Override public String[] childrenNames() throws BackingStoreException { return null; } @Override public void clear() throws BackingStoreException { store.clear(); } @Override public void flush() throws BackingStoreException { } @Override public String get(String key, String def) { if (store.containsKey(key)) { return store.get(key); } else { return def; } } @Override public boolean getBoolean(String key, boolean def) { return Boolean.parseBoolean(get(key, String.valueOf(def))); } @Override public byte[] getByteArray(String key, byte[] def) { return null; } @Override public double getDouble(String key, double def) { return 0; } @Override public float getFloat(String key, float def) { return 0; } @Override public int getInt(String key, int def) { return 0; } @Override public long getLong(String key, long def) { return 0; } @Override public String[] keys() throws BackingStoreException { return store.keySet().toArray(new String[0]); } @Override public String name() { return null; } @Override public Preferences node(String path) { return null; } @Override public boolean nodeExists(String pathName) throws BackingStoreException { return false; } @Override public Preferences parent() { return null; } @Override public void put(String key, String value) { Object oldValue = store.get(key); store.put(key, value); firePreferenceEvent(key, oldValue, value); } @Override public void putBoolean(String key, boolean value) { put(key, String.valueOf(value)); } @Override public void putByteArray(String key, byte[] value) { } @Override public void putDouble(String key, double value) { } @Override public void putFloat(String key, float value) { } @Override public void putInt(String key, int value) { put(key, String.valueOf(value)); } @Override public void putLong(String key, long value) { } @Override public void remove(String key) { store.remove(key); } @Override public void removeNode() throws BackingStoreException { } @Override public void removeNodeChangeListener(INodeChangeListener listener) { } @Override public void removePreferenceChangeListener(IPreferenceChangeListener listener) { listeners.remove(listener); } @Override public void sync() throws BackingStoreException { } /* * Convenience method for notifying preference change listeners. */ protected void firePreferenceEvent(String key, Object oldValue, Object newValue) { if (listeners == null) { return; } final PreferenceChangeEvent event = new PreferenceChangeEvent(this, key, oldValue, newValue); for (int i = 0; i < listeners.size(); i++) { final IPreferenceChangeListener listener = listeners.get(i); ISafeRunnable job = new ISafeRunnable() { @Override public void handleException(Throwable exception) { // already logged in Platform#run() } @Override public void run() throws Exception { listener.preferenceChange(event); } }; SafeRunner.run(job); } } }