2 * Created on 11.10.2002
6 package net.sourceforge.phpdt.tidy.preferences;
8 import java.util.ArrayList;
11 import org.eclipse.core.resources.IResource;
12 import org.eclipse.core.runtime.CoreException;
13 import org.eclipse.core.runtime.Platform;
14 import org.eclipse.core.runtime.QualifiedName;
15 import org.eclipse.jface.preference.IPreferenceStore;
16 import org.eclipse.jface.preference.PreferenceStore;
17 import org.eclipse.jface.resource.JFaceResources;
18 import org.eclipse.jface.util.Assert;
19 import org.eclipse.jface.util.IPropertyChangeListener;
20 import org.eclipse.jface.util.ListenerList;
21 import org.eclipse.jface.util.PropertyChangeEvent;
22 import org.eclipse.jface.util.SafeRunnable;
26 * This class can be used for wrapping a IResource to a PreferencePage
28 * Most of the class is C&P from the PreferenceStore which uses a Propertie
29 * instance to store a the Properties.
35 public class ResourcePreferenceStore implements IPreferenceStore {
37 private IResource resource;
38 private IPreferenceStore defaultValues = null;
39 private String prefix;
41 private List unDefaulted = new ArrayList();
44 * List of registered listeners (element type: <code>IPropertyChangeListener</code>).
45 * These listeners are to be informed when the current value of a preference changes.
47 private ListenerList listeners = new ListenerList();
50 * Indicates whether a value as been changed by <code>setToDefault</code>
51 * or <code>setValue</code>; initially <code>false</code>.
53 private boolean dirty = false;
57 * Creates a IPreferenceStore were the Values are stored in a IResource
58 * and the defaultValues are taken from a different IPreferenceStore
59 * (like the default one of the plugin). If _defaultValues is empty, no
60 * default values are present.
63 * Because of the different mechanism for storeing Preferences, any
64 * lookup for a preference with the given name will be 'translated' as
68 * <li>The defaultValues are querried without prefix just with the given
70 * <li>The Resource will be querried with the prefix and the name as a
74 * Be carefull: even defaulted Properties are written into the underlying
76 * @param _prefix -- String used as Qualifier
77 * @param _resource -- a IResource, which may NOT be null
78 * @param _defaultValues -- a IPreferenceStore or null
80 public ResourcePreferenceStore(IResource _resource, String _prefix, IPreferenceStore _defaultValues) {
82 Assert.isNotNull(_resource);
85 defaultValues = _defaultValues;
86 if (defaultValues == null) {
87 defaultValues = new PreferenceStore();
91 public ResourcePreferenceStore(IResource _resource, String _prefix) {
92 this(_resource, _prefix, null);
95 public ResourcePreferenceStore(IResource _resource) {
96 this(_resource, null, null);
99 private QualifiedName getQNForName(String name) {
100 return new QualifiedName(prefix, name);
103 private boolean resourceContains(String name) {
105 return (resource.getPersistentProperty(getQNForName(name)) != null);
106 } catch (CoreException e) {
111 private String getProperty(String name) {
113 return resource.getPersistentProperty(getQNForName(name));
114 } catch (CoreException e) {
120 private void setProperty(String name, String value) {
122 resource.setPersistentProperty(getQNForName(name), value);
123 } catch (CoreException e) {
129 * Method declared on IPreferenceStore.
131 public void addPropertyChangeListener(IPropertyChangeListener listener) {
132 listeners.add(listener);
135 * Method declared on IPreferenceStore.
137 public boolean contains(String name) {
138 return (resourceContains(name) || defaultValues.contains(name));
141 * Method declared on IPreferenceStore.
143 public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
144 final Object[] listeners = this.listeners.getListeners();
145 // Do we need to fire an event.
146 if (listeners.length > 0 && (oldValue == null || !oldValue.equals(newValue))) {
147 final PropertyChangeEvent pe = new PropertyChangeEvent(this, name, oldValue, newValue);
149 Platform.run(new SafeRunnable(JFaceResources.getString("PreferenceStore.changeError")) { //$NON-NLS-1$
151 for (int i = 0; i < listeners.length; ++i) {
152 IPropertyChangeListener l = (IPropertyChangeListener) listeners[i];
153 l.propertyChange(pe);
161 * Helper function: gets boolean for a given name.
163 public boolean getBoolean(String name) {
164 String value = getProperty(name);
166 return BOOLEAN_DEFAULT_DEFAULT;
167 if (value.equals(IPreferenceStore.TRUE))
172 * Method declared on IPreferenceStore.
174 public boolean getDefaultBoolean(String name) {
175 return defaultValues.getBoolean(name);
178 * Method declared on IPreferenceStore.
180 public double getDefaultDouble(String name) {
181 return defaultValues.getDouble(name);
184 * Method declared on IPreferenceStore.
186 public float getDefaultFloat(String name) {
187 return defaultValues.getFloat(name);
190 * Method declared on IPreferenceStore.
192 public int getDefaultInt(String name) {
193 return defaultValues.getInt(name);
196 * Method declared on IPreferenceStore.
198 public long getDefaultLong(String name) {
199 return defaultValues.getLong(name);
202 * Method declared on IPreferenceStore.
204 public String getDefaultString(String name) {
205 return defaultValues.getString(name);
208 public double getDouble(String name) {
209 String value = getProperty(name);
211 return DOUBLE_DEFAULT_DEFAULT;
212 double ival = DOUBLE_DEFAULT_DEFAULT;
214 ival = new Double(value).doubleValue();
215 } catch (NumberFormatException e) {
221 * Helper function: gets long for a given name.
223 public long getLong(String name) {
224 String value = getProperty(name);
226 return LONG_DEFAULT_DEFAULT;
227 long ival = LONG_DEFAULT_DEFAULT;
229 ival = Long.parseLong(value);
230 } catch (NumberFormatException e) {
235 * Method declared on IPreferenceStore.
237 public String getString(String name) {
238 String value = getProperty(name);
240 return STRING_DEFAULT_DEFAULT;
244 public float getFloat(String name) {
245 String value = getProperty(name);
247 return FLOAT_DEFAULT_DEFAULT;
248 float ival = FLOAT_DEFAULT_DEFAULT;
250 ival = new Float(value).floatValue();
251 } catch (NumberFormatException e) {
257 * Method declared on IPreferenceStore.
260 public int getInt(String name) {
261 String value = getProperty(name);
263 return INT_DEFAULT_DEFAULT;
266 ival = Integer.parseInt(value);
267 } catch (NumberFormatException e) {
273 * Method declared on IPreferenceStore.
275 public boolean isDefault(String name) {
276 //REMIND: Is that the right algo?
277 return (!resourceContains(name) || getProperty(name).equals(defaultValues.getString(name)));
281 * Indicates whether this PrefStore needds saving. As there isn't any saving
282 * facility, it always returns false
284 * Method declared on IPreferenceStore.
286 public boolean needsSaving() {
291 * Method declared on IPreferenceStore.
293 public void putValue(String name, String value) {
294 String oldValue = getString(name);
295 if (oldValue == null || !oldValue.equals(value)) {
296 setValue(name, value);
302 * Method declared on IPreferenceStore.
304 public void removePropertyChangeListener(IPropertyChangeListener listener) {
305 listeners.remove(listener);
309 * Method declared on IPreferenceStore.
311 public void setDefault(String name, double value) {
312 defaultValues.setValue(name, value);
315 * Method declared on IPreferenceStore.
317 public void setDefault(String name, float value) {
318 defaultValues.setValue(name, value);
321 * Method declared on IPreferenceStore.
323 public void setDefault(String name, int value) {
324 defaultValues.setValue(name, value);
327 * Method declared on IPreferenceStore.
329 public void setDefault(String name, long value) {
330 defaultValues.setValue(name, value);
333 * Method declared on IPreferenceStore.
335 public void setDefault(String name, String value) {
336 defaultValues.setValue(name, value);
339 * Method declared on IPreferenceStore.
341 public void setDefault(String name, boolean value) {
342 defaultValues.setValue(name, value);
346 * Method declared on IPreferenceStore.
348 public void setToDefault(String name) {
349 Object oldValue = getProperty(name);
350 String newValue = null;
351 if (defaultValues != null)
352 newValue = (String) defaultValues.getString(name);
353 setProperty(name, newValue);
356 firePropertyChangeEvent(name, oldValue, newValue);
359 * Method declared on IPreferenceStore.
361 public void setValue(String name, double value) {
362 double oldValue = getDouble(name);
363 if (oldValue != value) {
364 setProperty(name, Double.toString(value));
366 firePropertyChangeEvent(name, new Double(oldValue), new Double(value));
370 * Method declared on IPreferenceStore.
372 public void setValue(String name, float value) {
373 float oldValue = getFloat(name);
374 if (oldValue != value) {
375 setProperty(name, Float.toString(value));
377 firePropertyChangeEvent(name, new Float(oldValue), new Float(value));
381 * Method declared on IPreferenceStore.
383 public void setValue(String name, int value) {
384 int oldValue = getInt(name);
385 if (oldValue != value) {
386 setProperty(name, Integer.toString(value));
388 firePropertyChangeEvent(name, new Integer(oldValue), new Integer(value));
392 * Method declared on IPreferenceStore.
394 public void setValue(String name, long value) {
395 long oldValue = getLong(name);
396 if (oldValue != value) {
397 setProperty(name, Long.toString(value));
399 firePropertyChangeEvent(name, new Long(oldValue), new Long(value));
403 * Method declared on IPreferenceStore.
405 public void setValue(String name, String value) {
406 String oldValue = getString(name);
407 if (oldValue == null || !oldValue.equals(value)) {
408 setProperty(name, value);
410 firePropertyChangeEvent(name, oldValue, value);
414 * Method declared on IPreferenceStore.
416 public void setValue(String name, boolean value) {
417 boolean oldValue = getBoolean(name);
418 if (oldValue != value) {
419 setProperty(name, value == true ? IPreferenceStore.TRUE : IPreferenceStore.FALSE);
421 firePropertyChangeEvent(name, new Boolean(oldValue), new Boolean(value));