package org.reldb.dbrowser.ui.preferences; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.Vector; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.preference.PreferenceNode; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.reldb.dbrowser.ui.version.Version; public class Preferences { private static PreferenceStore preferences = null; private static HashMap<String, HashSet<PreferenceChangeListener>> preferenceListeners; public static PreferenceStore getPreferences() { if (preferences == null) { preferences = new PreferenceStore(Version.getPreferencesRepositoryName()); try { preferences.load(); } catch (IOException e) { System.out.println("Preferences: Creating new preferences."); } preferenceListeners = new HashMap<String, HashSet<PreferenceChangeListener>>(); preferences.addPropertyChangeListener(new IPropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent event) { dispatchPreferenceChangeEvent(event.getProperty(), event.getNewValue()); } }); } return preferences; } public static void setPreference(String name, Rectangle rect) { PreferenceStore prefs = getPreferences(); prefs.setValue(name + "_x", rect.x); prefs.setValue(name + "_y", rect.y); prefs.setValue(name + "_width", rect.width); prefs.setValue(name + "_height", rect.height); save(); } public static void setPreference(String name, String[] value) { int n = 0; for (String string: value) getPreferences().setValue(name + "[" + (n++) + "]", string); while (true) { String string = getPreferences().getString(name + "[" + n + "]"); if (string.length() == 0) break; else getPreferences().setToDefault(name + "[" + n + "]"); n++; } save(); } public static void setPreference(String name, String value) { getPreferences().setValue(name, value); save(); } public static void setPreference(String name, boolean value) { getPreferences().setValue(name, value); save(); } public static void setPreference(String name, int value) { getPreferences().setValue(name, value); save(); } public static Rectangle getPreferenceRectangle(String name) { PreferenceStore prefs = getPreferences(); int x = prefs.getInt(name + "_x"); int y = prefs.getInt(name + "_y"); int width = prefs.getInt(name + "_width"); int height = prefs.getInt(name + "_height"); return new Rectangle(x, y, width, height); } public static String[] getPreferenceStringArray(String name) { int n = 0; Vector<String> strings = new Vector<String>(); while (true) { String string = getPreferences().getString(name + "[" + (n++) + "]"); if (string.length() == 0) break; else strings.add(string); } return strings.toArray(new String[0]); } public static String getPreferenceString(String name) { return getPreferences().getString(name); } public static boolean getPreferenceBoolean(String name) { return getPreferences().getBoolean(name); } public static int getPreferenceInteger(String name) { return getPreferences().getInt(name); } public static FontData[] getPreferenceFont(String name) { return PreferenceConverter.basicGetFontData(getPreferences().getString(name)); } public static Font getPreferenceFont(Display display, String name) { FontRegistry fontRegistry = JFaceResources.getFontRegistry(); FontData[] fonts = fontRegistry.filterData(getPreferenceFont(name), display); if (fonts == null) return fontRegistry.defaultFont(); return new Font(display, fonts); } private static void dispatchPreferenceChangeEvent(String name, Object newValue) { HashSet<PreferenceChangeListener> listeners = preferenceListeners.get(name); if (listeners == null) return; for (PreferenceChangeListener listener: listeners) try { listener.preferenceChange(new PreferenceChangeEvent(name)); } catch (Exception e) { System.out.println("Preferences: exception notifying listener " + listener.toString() + ": " + e); e.printStackTrace(); } } public static void addPreferenceChangeListener(String name, PreferenceChangeListener listener) { HashSet<PreferenceChangeListener> listeners = preferenceListeners.get(name); if (listeners == null) { listeners = new HashSet<PreferenceChangeListener>(); preferenceListeners.put(name, listeners); } listeners.add(listener); } public static void removePreferenceChangeListener(String name, PreferenceChangeListener listener) { HashSet<PreferenceChangeListener> listeners = preferenceListeners.get(name); if (listeners == null) return; listeners.remove(listener); if (listeners.size() == 0) preferenceListeners.remove(name); } private PreferenceDialog preferenceDialog; public Preferences(Shell parent) { PreferenceManager preferenceManager = new PreferenceManager(); PreferenceNode general = new PreferenceNode("General", new PreferencePageGeneral()); preferenceManager.addToRoot(general); PreferenceNode cmd = new PreferenceNode("Command line", new PreferencePageCmd()); preferenceManager.addToRoot(cmd); preferenceDialog = new PreferenceDialog(parent, preferenceManager); preferenceDialog.setPreferenceStore(preferences); } private static void save() { try { preferences.save(); } catch (IOException e) { System.out.println("Preferences: Unable to save preferences: " + e); } } public void show() { preferenceDialog.open(); save(); } }