X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Fpreferences%2FEclipsePreferences.java;fp=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Fpreferences%2FEclipsePreferences.java;h=c57c443e302844ca6d9d657b61510e7a7ed71823;hb=c6806c7c38252b1d782581599efecff3930aa395;hp=0000000000000000000000000000000000000000;hpb=17f902a2717d92dee566eae233cc635ec8bebd74;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java new file mode 100755 index 00000000..c57c443e --- /dev/null +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/preferences/EclipsePreferences.java @@ -0,0 +1,189 @@ +package net.mograsim.plugin.preferences; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.resource.ColorRegistry; +import org.eclipse.jface.util.IPropertyChangeListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.ui.statushandlers.StatusManager; +import org.eclipse.ui.themes.ITheme; + +import net.mograsim.plugin.MograsimActivator; +import net.mograsim.preferences.ColorDefinition; +import net.mograsim.preferences.Preferences; + +public class EclipsePreferences implements Preferences +{ + private final ITheme theme; + private final IPreferenceStore prefs; + private final Preferences defaultPrefs; + + private final ListenerManager booleanListeners; + private final ListenerManager intListeners; + private final ListenerManager doubleListeners; + private final ListenerManager colorDefinitionListeners; + + protected EclipsePreferences(ITheme theme, IPreferenceStore prefs, Preferences defaultPrefs) + { + this.theme = theme; + this.prefs = prefs; + this.defaultPrefs = defaultPrefs; + + this.booleanListeners = new ListenerManager<>(this::getBoolean); + this.intListeners = new ListenerManager<>(this::getInt); + this.doubleListeners = new ListenerManager<>(this::getDouble); + this.colorDefinitionListeners = new ListenerManager<>(this::getColorDefinition); + } + + @Override + public boolean getBoolean(String name) + { + prefs.setDefault(name, defaultPrefs.getBoolean(name)); + return prefs.getBoolean(name); + } + + @Override + public int getInt(String name) + { + prefs.setDefault(name, defaultPrefs.getInt(name)); + return prefs.getInt(name); + } + + @Override + public double getDouble(String name) + { + prefs.setDefault(name, defaultPrefs.getDouble(name)); + return prefs.getDouble(name); + } + + @Override + public ColorDefinition getColorDefinition(String name) + { + RGB rgb = getColorRegistry().getRGB(name); + if (rgb == null) + { + StatusManager.getManager().handle(new Status(IStatus.ERROR, MograsimActivator.PLUGIN_ID, "No color for name " + name)); + return null; + } + return new ColorDefinition(rgb.red, rgb.green, rgb.blue); + } + + @Override + public Color getColor(String name) + { + return getColorRegistry().get(name); + } + + private ColorRegistry getColorRegistry() + { + return theme.getColorRegistry(); + } + + @Override + public void addBooleanListener(String name, Consumer listener) + { + booleanListeners.addListener(name, listener); + } + + @Override + public void removeBooleanListener(String name, Consumer listener) + { + booleanListeners.removeListener(name, listener); + } + + @Override + public void addIntListener(String name, Consumer listener) + { + intListeners.addListener(name, listener); + } + + @Override + public void removeIntListener(String name, Consumer listener) + { + intListeners.removeListener(name, listener); + } + + @Override + public void addDoubleListener(String name, Consumer listener) + { + doubleListeners.addListener(name, listener); + } + + @Override + public void removeDoubleListener(String name, Consumer listener) + { + doubleListeners.removeListener(name, listener); + } + + @Override + public void addColorDefinitionListener(String name, Consumer listener) + { + colorDefinitionListeners.addListener(name, listener); + } + + @Override + public void removeColorDefinitionListener(String name, Consumer listener) + { + colorDefinitionListeners.removeListener(name, listener); + } + + private class ListenerManager

+ { + private final Map>> listenersPerName; + private final IPropertyChangeListener eclipseListener; + + public ListenerManager(Function preferenceGetter) + { + this.listenersPerName = new HashMap<>(); + this.eclipseListener = e -> + { + String name = e.getProperty(); + synchronized (listenersPerName) + { + Set> listenersThisName = listenersPerName.get(name); + if (listenersThisName != null) + { + P p = preferenceGetter.apply(name); + listenersThisName.forEach(l -> l.accept(p)); + } + } + }; + } + + public void addListener(String name, Consumer

listener) + { + synchronized (listenersPerName) + { + boolean wasEmpty = listenersPerName.isEmpty(); + listenersPerName.computeIfAbsent(name, n -> new HashSet<>()).add(listener); + if (wasEmpty) + prefs.addPropertyChangeListener(eclipseListener); + } + } + + public void removeListener(String name, Consumer

listener) + { + synchronized (listenersPerName) + { + Set> listenersThisName = listenersPerName.get(name); + if (listenersThisName != null) + { + listenersThisName.remove(listener); + if (listenersThisName.isEmpty()) + listenersPerName.remove(name); + } + if (listenersPerName.isEmpty()) + prefs.addPropertyChangeListener(eclipseListener); + } + } + } +} \ No newline at end of file