1 package net.mograsim.plugin.preferences;
3 import java.util.HashMap;
4 import java.util.HashSet;
7 import java.util.function.Consumer;
8 import java.util.function.Function;
10 import org.eclipse.core.runtime.IStatus;
11 import org.eclipse.core.runtime.Status;
12 import org.eclipse.jface.preference.IPreferenceStore;
13 import org.eclipse.jface.resource.ColorRegistry;
14 import org.eclipse.jface.util.IPropertyChangeListener;
15 import org.eclipse.swt.graphics.Color;
16 import org.eclipse.swt.graphics.RGB;
17 import org.eclipse.ui.statushandlers.StatusManager;
18 import org.eclipse.ui.themes.ITheme;
20 import net.mograsim.plugin.MograsimActivator;
21 import net.mograsim.preferences.ColorDefinition;
22 import net.mograsim.preferences.Preferences;
24 public class EclipsePreferences implements Preferences
26 private final ITheme theme;
27 private final IPreferenceStore prefs;
28 private final Preferences defaultPrefs;
30 private final ListenerManager<Boolean> booleanListeners;
31 private final ListenerManager<Integer> intListeners;
32 private final ListenerManager<Double> doubleListeners;
33 private final ListenerManager<String> stringListeners;
34 private final ListenerManager<ColorDefinition> colorDefinitionListeners;
36 protected EclipsePreferences(ITheme theme, IPreferenceStore prefs, Preferences defaultPrefs)
40 this.defaultPrefs = defaultPrefs;
42 this.booleanListeners = new ListenerManager<>(this::getBoolean);
43 this.intListeners = new ListenerManager<>(this::getInt);
44 this.doubleListeners = new ListenerManager<>(this::getDouble);
45 this.stringListeners = new ListenerManager<>(this::getString);
46 this.colorDefinitionListeners = new ListenerManager<>(this::getColorDefinition);
50 public boolean getBoolean(String name)
52 prefs.setDefault(name, defaultPrefs.getBoolean(name));
53 return prefs.getBoolean(name);
57 public int getInt(String name)
59 prefs.setDefault(name, defaultPrefs.getInt(name));
60 return prefs.getInt(name);
64 public double getDouble(String name)
66 prefs.setDefault(name, defaultPrefs.getDouble(name));
67 return prefs.getDouble(name);
71 public String getString(String name)
73 prefs.setDefault(name, defaultPrefs.getString(name));
74 return prefs.getString(name);
78 public ColorDefinition getColorDefinition(String name)
80 RGB rgb = getColorRegistry().getRGB(name);
83 StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "No color for name " + name));
86 return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
90 public Color getColor(String name)
92 return getColorRegistry().get(name);
95 private ColorRegistry getColorRegistry()
97 return theme.getColorRegistry();
101 public void addBooleanListener(String name, Consumer<Boolean> listener)
103 booleanListeners.addListener(name, listener);
107 public void removeBooleanListener(String name, Consumer<Boolean> listener)
109 booleanListeners.removeListener(name, listener);
113 public void addIntListener(String name, Consumer<Integer> listener)
115 intListeners.addListener(name, listener);
119 public void removeIntListener(String name, Consumer<Integer> listener)
121 intListeners.removeListener(name, listener);
125 public void addDoubleListener(String name, Consumer<Double> listener)
127 doubleListeners.addListener(name, listener);
131 public void removeDoubleListener(String name, Consumer<Double> listener)
133 doubleListeners.removeListener(name, listener);
137 public void addStringListener(String name, Consumer<String> listener)
139 stringListeners.addListener(name, listener);
143 public void removeStringListener(String name, Consumer<String> listener)
145 stringListeners.removeListener(name, listener);
149 public void addColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
151 colorDefinitionListeners.addListener(name, listener);
155 public void removeColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
157 colorDefinitionListeners.removeListener(name, listener);
160 private class ListenerManager<P>
162 private final Map<String, Set<Consumer<P>>> listenersPerName;
163 private final IPropertyChangeListener eclipseListener;
165 public ListenerManager(Function<String, P> preferenceGetter)
167 this.listenersPerName = new HashMap<>();
168 this.eclipseListener = e ->
170 String name = e.getProperty();
171 synchronized (listenersPerName)
173 Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
174 if (listenersThisName != null)
176 P p = preferenceGetter.apply(name);
177 listenersThisName.forEach(l -> l.accept(p));
183 public void addListener(String name, Consumer<P> listener)
185 synchronized (listenersPerName)
187 boolean wasEmpty = listenersPerName.isEmpty();
188 listenersPerName.computeIfAbsent(name, n -> new HashSet<>()).add(listener);
190 prefs.addPropertyChangeListener(eclipseListener);
194 public void removeListener(String name, Consumer<P> listener)
196 synchronized (listenersPerName)
198 Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
199 if (listenersThisName != null)
201 listenersThisName.remove(listener);
202 if (listenersThisName.isEmpty())
203 listenersPerName.remove(name);
205 if (listenersPerName.isEmpty())
206 prefs.addPropertyChangeListener(eclipseListener);