/** * Created on 11.10.2002 * * @author Jan Schulz */ package net.sourceforge.phpdt.tidy.preferences; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.QualifiedName; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.util.Assert; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.ListenerList; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.util.SafeRunnable; /** * This class can be used for wrapping a IResource to a PreferencePage * * Most of the class is C&P from the PreferenceStore which uses a Propertie * instance to store a the Properties. * * * @author Jan Schulz * @since 11.10.2002 */ public class ResourcePreferenceStore implements IPreferenceStore { private IResource resource; private IPreferenceStore defaultValues = null; private String prefix; private List unDefaulted = new ArrayList(); /** * List of registered listeners (element type: IPropertyChangeListener). * These listeners are to be informed when the current value of a preference changes. */ private ListenerList listeners = new ListenerList(); /** * Indicates whether a value as been changed by setToDefault * or setValue; initially false. */ private boolean dirty = false; /** *

* Creates a IPreferenceStore were the Values are stored in a IResource * and the defaultValues are taken from a different IPreferenceStore * (like the default one of the plugin). If _defaultValues is empty, no * default values are present. *

*

* Because of the different mechanism for storeing Preferences, any * lookup for a preference with the given name will be 'translated' as * following: *

*

*

* Be carefull: even defaulted Properties are written into the underlying * resource! * @param _prefix -- String used as Qualifier * @param _resource -- a IResource, which may NOT be null * @param _defaultValues -- a IPreferenceStore or null */ public ResourcePreferenceStore(IResource _resource, String _prefix, IPreferenceStore _defaultValues) { super(); Assert.isNotNull(_resource); resource = _resource; prefix = _prefix; defaultValues = _defaultValues; if (defaultValues == null) { defaultValues = new PreferenceStore(); } } public ResourcePreferenceStore(IResource _resource, String _prefix) { this(_resource, _prefix, null); } public ResourcePreferenceStore(IResource _resource) { this(_resource, null, null); } private QualifiedName getQNForName(String name) { return new QualifiedName(prefix, name); } private boolean resourceContains(String name) { try { return (resource.getPersistentProperty(getQNForName(name)) != null); } catch (CoreException e) { return false; } } private String getProperty(String name) { try { return resource.getPersistentProperty(getQNForName(name)); } catch (CoreException e) { } return null; } private void setProperty(String name, String value) { try { resource.setPersistentProperty(getQNForName(name), value); } catch (CoreException e) { } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void addPropertyChangeListener(IPropertyChangeListener listener) { listeners.add(listener); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public boolean contains(String name) { return (resourceContains(name) || defaultValues.contains(name)); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) { final Object[] listeners = this.listeners.getListeners(); // Do we need to fire an event. if (listeners.length > 0 && (oldValue == null || !oldValue.equals(newValue))) { final PropertyChangeEvent pe = new PropertyChangeEvent(this, name, oldValue, newValue); Platform.run(new SafeRunnable(JFaceResources.getString("PreferenceStore.changeError")) { //$NON-NLS-1$ public void run() { for (int i = 0; i < listeners.length; ++i) { IPropertyChangeListener l = (IPropertyChangeListener) listeners[i]; l.propertyChange(pe); } } }); } } /** * Helper function: gets boolean for a given name. */ public boolean getBoolean(String name) { String value = getProperty(name); if (value == null) return BOOLEAN_DEFAULT_DEFAULT; if (value.equals(IPreferenceStore.TRUE)) return true; return false; } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public boolean getDefaultBoolean(String name) { return defaultValues.getBoolean(name); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public double getDefaultDouble(String name) { return defaultValues.getDouble(name); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public float getDefaultFloat(String name) { return defaultValues.getFloat(name); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public int getDefaultInt(String name) { return defaultValues.getInt(name); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public long getDefaultLong(String name) { return defaultValues.getLong(name); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public String getDefaultString(String name) { return defaultValues.getString(name); } public double getDouble(String name) { String value = getProperty(name); if (value == null) return DOUBLE_DEFAULT_DEFAULT; double ival = DOUBLE_DEFAULT_DEFAULT; try { ival = new Double(value).doubleValue(); } catch (NumberFormatException e) { } return ival; } /** * Helper function: gets long for a given name. */ public long getLong(String name) { String value = getProperty(name); if (value == null) return LONG_DEFAULT_DEFAULT; long ival = LONG_DEFAULT_DEFAULT; try { ival = Long.parseLong(value); } catch (NumberFormatException e) { } return ival; } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public String getString(String name) { String value = getProperty(name); if (value == null) return STRING_DEFAULT_DEFAULT; return value; } public float getFloat(String name) { String value = getProperty(name); if (value == null) return FLOAT_DEFAULT_DEFAULT; float ival = FLOAT_DEFAULT_DEFAULT; try { ival = new Float(value).floatValue(); } catch (NumberFormatException e) { } return ival; } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public int getInt(String name) { String value = getProperty(name); if (value == null) return INT_DEFAULT_DEFAULT; int ival = 0; try { ival = Integer.parseInt(value); } catch (NumberFormatException e) { } return ival; } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public boolean isDefault(String name) { //REMIND: Is that the right algo? return (!resourceContains(name) || getProperty(name).equals(defaultValues.getString(name))); } /** * Indicates whether this PrefStore needds saving. As there isn't any saving * facility, it always returns false * * Method declared on IPreferenceStore. */ public boolean needsSaving() { return false; } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void putValue(String name, String value) { String oldValue = getString(name); if (oldValue == null || !oldValue.equals(value)) { setValue(name, value); dirty = true; } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void removePropertyChangeListener(IPropertyChangeListener listener) { listeners.remove(listener); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, double value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, float value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, int value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, long value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, String value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setDefault(String name, boolean value) { defaultValues.setValue(name, value); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setToDefault(String name) { Object oldValue = getProperty(name); String newValue = null; if (defaultValues != null) newValue = (String) defaultValues.getString(name); setProperty(name, newValue); dirty = true; firePropertyChangeEvent(name, oldValue, newValue); } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, double value) { double oldValue = getDouble(name); if (oldValue != value) { setProperty(name, Double.toString(value)); dirty = true; firePropertyChangeEvent(name, new Double(oldValue), new Double(value)); } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, float value) { float oldValue = getFloat(name); if (oldValue != value) { setProperty(name, Float.toString(value)); dirty = true; firePropertyChangeEvent(name, new Float(oldValue), new Float(value)); } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, int value) { int oldValue = getInt(name); if (oldValue != value) { setProperty(name, Integer.toString(value)); dirty = true; firePropertyChangeEvent(name, new Integer(oldValue), new Integer(value)); } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, long value) { long oldValue = getLong(name); if (oldValue != value) { setProperty(name, Long.toString(value)); dirty = true; firePropertyChangeEvent(name, new Long(oldValue), new Long(value)); } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, String value) { String oldValue = getString(name); if (oldValue == null || !oldValue.equals(value)) { setProperty(name, value); dirty = true; firePropertyChangeEvent(name, oldValue, value); } } /* (non-Javadoc) * Method declared on IPreferenceStore. */ public void setValue(String name, boolean value) { boolean oldValue = getBoolean(name); if (oldValue != value) { setProperty(name, value == true ? IPreferenceStore.TRUE : IPreferenceStore.FALSE); dirty = true; firePropertyChangeEvent(name, new Boolean(oldValue), new Boolean(value)); } } }