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<ColorDefinition> colorDefinitionListeners;
35 protected EclipsePreferences(ITheme theme, IPreferenceStore prefs, Preferences defaultPrefs)
39 this.defaultPrefs = defaultPrefs;
41 this.booleanListeners = new ListenerManager<>(this::getBoolean);
42 this.intListeners = new ListenerManager<>(this::getInt);
43 this.doubleListeners = new ListenerManager<>(this::getDouble);
44 this.colorDefinitionListeners = new ListenerManager<>(this::getColorDefinition);
48 public boolean getBoolean(String name)
50 prefs.setDefault(name, defaultPrefs.getBoolean(name));
51 return prefs.getBoolean(name);
55 public int getInt(String name)
57 prefs.setDefault(name, defaultPrefs.getInt(name));
58 return prefs.getInt(name);
62 public double getDouble(String name)
64 prefs.setDefault(name, defaultPrefs.getDouble(name));
65 return prefs.getDouble(name);
69 public ColorDefinition getColorDefinition(String name)
71 RGB rgb = getColorRegistry().getRGB(name);
74 StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "No color for name " + name));
77 return new ColorDefinition(rgb.red, rgb.green, rgb.blue);
81 public Color getColor(String name)
83 return getColorRegistry().get(name);
86 private ColorRegistry getColorRegistry()
88 return theme.getColorRegistry();
92 public void addBooleanListener(String name, Consumer<Boolean> listener)
94 booleanListeners.addListener(name, listener);
98 public void removeBooleanListener(String name, Consumer<Boolean> listener)
100 booleanListeners.removeListener(name, listener);
104 public void addIntListener(String name, Consumer<Integer> listener)
106 intListeners.addListener(name, listener);
110 public void removeIntListener(String name, Consumer<Integer> listener)
112 intListeners.removeListener(name, listener);
116 public void addDoubleListener(String name, Consumer<Double> listener)
118 doubleListeners.addListener(name, listener);
122 public void removeDoubleListener(String name, Consumer<Double> listener)
124 doubleListeners.removeListener(name, listener);
128 public void addColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
130 colorDefinitionListeners.addListener(name, listener);
134 public void removeColorDefinitionListener(String name, Consumer<ColorDefinition> listener)
136 colorDefinitionListeners.removeListener(name, listener);
139 private class ListenerManager<P>
141 private final Map<String, Set<Consumer<P>>> listenersPerName;
142 private final IPropertyChangeListener eclipseListener;
144 public ListenerManager(Function<String, P> preferenceGetter)
146 this.listenersPerName = new HashMap<>();
147 this.eclipseListener = e ->
149 String name = e.getProperty();
150 synchronized (listenersPerName)
152 Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
153 if (listenersThisName != null)
155 P p = preferenceGetter.apply(name);
156 listenersThisName.forEach(l -> l.accept(p));
162 public void addListener(String name, Consumer<P> listener)
164 synchronized (listenersPerName)
166 boolean wasEmpty = listenersPerName.isEmpty();
167 listenersPerName.computeIfAbsent(name, n -> new HashSet<>()).add(listener);
169 prefs.addPropertyChangeListener(eclipseListener);
173 public void removeListener(String name, Consumer<P> listener)
175 synchronized (listenersPerName)
177 Set<Consumer<P>> listenersThisName = listenersPerName.get(name);
178 if (listenersThisName != null)
180 listenersThisName.remove(listener);
181 if (listenersThisName.isEmpty())
182 listenersPerName.remove(name);
184 if (listenersPerName.isEmpty())
185 prefs.addPropertyChangeListener(eclipseListener);