2 * Copyright (c) 2003-2004 Christopher Lenz and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * Christopher Lenz - initial API and implementation
11 * $Id: OverlayPreferenceStore.java,v 1.1 2004-09-02 18:11:51 jsurfer Exp $
14 package net.sourceforge.phpeclipse.css.ui.internal.preferences;
16 import java.util.ArrayList;
17 import java.util.Iterator;
18 import java.util.List;
20 import org.eclipse.jface.preference.IPreferenceStore;
21 import org.eclipse.jface.preference.PreferenceStore;
22 import org.eclipse.jface.util.IPropertyChangeListener;
23 import org.eclipse.jface.util.PropertyChangeEvent;
25 public class OverlayPreferenceStore implements IPreferenceStore {
27 // Inner Classes -----------------------------------------------------------
30 * Descriptor used to denote data types.
32 public static final class Type {
38 * Data structure for the overlay key.
40 public static class OverlayKey {
45 public OverlayKey(Type type, String key) {
52 * @see IPropertyChangeListener
54 private class PropertyListener implements IPropertyChangeListener {
57 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
59 public void propertyChange(PropertyChangeEvent event) {
60 OverlayKey key = findOverlayKey(event.getProperty());
62 propagateProperty(fParent, key, fStore);
67 // Constants ---------------------------------------------------------------
70 * Boolean property type.
72 public static final Type BOOLEAN = new Type();
75 * Double property type.
77 public static final Type DOUBLE = new Type();
80 * Floating point property type.
82 public static final Type FLOAT = new Type();
85 * Integer property type.
87 public static final Type INT = new Type();
90 * Long integer property type.
92 public static final Type LONG = new Type();
95 * String property type.
97 public static final Type STRING = new Type();
99 // Instance Variables ------------------------------------------------------
102 * The parent preference store.
104 private IPreferenceStore fParent;
107 * The underlying preference store.
109 private IPreferenceStore fStore;
112 * The keys of this store.
114 private List fOverlayKeys = new ArrayList();
117 * The property listener.
119 private PropertyListener fPropertyListener;
121 // Constructors ------------------------------------------------------------
124 * Creates and returns a new overlay preference store.
126 * @param parent the parent preference store
128 public OverlayPreferenceStore(IPreferenceStore parent) {
129 this.fParent = parent;
130 fStore = new PreferenceStore();
133 // Public Methods ----------------------------------------------------------
135 public void addKey(Type type, String key) {
136 this.fOverlayKeys.add(new OverlayKey(type, key));
138 public void addBooleanKey(String key) {
139 addKey(BOOLEAN, key);
141 public void addDoubleKey(String key) {
144 public void addFloatKey(String key) {
147 public void addIntKey(String key) {
150 public void addLongKey(String key) {
153 public void addStringKey(String key) {
158 * Propagates all overlay keys from this store to the parent store.
160 public void propagate() {
161 for (Iterator i = fOverlayKeys.iterator(); i.hasNext(); ) {
162 propagateProperty(fStore, (OverlayKey) i.next(), fParent);
167 * Loads the values from the parent into this store.
170 for (Iterator i = fOverlayKeys.iterator(); i.hasNext(); ) {
171 loadProperty(fParent, (OverlayKey) i.next(), fStore, true);
176 * Loads the default values.
178 public void loadDefaults() {
179 for (Iterator i = fOverlayKeys.iterator(); i.hasNext(); ) {
180 setToDefault(((OverlayKey) i.next()).fKey);
185 * Starts to listen for changes.
187 public void startListening() {
188 if (fPropertyListener == null) {
189 fPropertyListener = new PropertyListener();
190 fParent.addPropertyChangeListener(fPropertyListener);
195 * Stops to listen for changes.
197 public void stopListening() {
198 if (fPropertyListener != null) {
199 fParent.removePropertyChangeListener(fPropertyListener);
200 fPropertyListener = null;
204 // IPreferenceStore Implementation -----------------------------------------
207 * @see IPreferenceStore#addPropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
209 public void addPropertyChangeListener(IPropertyChangeListener listener) {
210 fStore.addPropertyChangeListener(listener);
214 * @see IPreferenceStore#removePropertyChangeListener(org.eclipse.jface.util.IPropertyChangeListener)
216 public void removePropertyChangeListener(IPropertyChangeListener listener) {
217 fStore.removePropertyChangeListener(listener);
221 * @see IPreferenceStore#firePropertyChangeEvent(java.lang.String, java.lang.Object, java.lang.Object)
223 public void firePropertyChangeEvent(String name, Object oldValue,
225 fStore.firePropertyChangeEvent(name, oldValue, newValue);
229 * @see IPreferenceStore#contains(java.lang.String)
231 public boolean contains(String name) {
232 return fStore.contains(name);
236 * @see IPreferenceStore#getBoolean(java.lang.String)
238 public boolean getBoolean(String name) {
239 return fStore.getBoolean(name);
243 * @see IPreferenceStore#getDefaultBoolean(java.lang.String)
245 public boolean getDefaultBoolean(String name) {
246 return fStore.getDefaultBoolean(name);
250 * @see IPreferenceStore#getDefaultDouble(java.lang.String)
252 public double getDefaultDouble(String name) {
253 return fStore.getDefaultDouble(name);
257 * @see IPreferenceStore#getDefaultFloat(String)
259 public float getDefaultFloat(String name) {
260 return fStore.getDefaultFloat(name);
264 * @see IPreferenceStore#getDefaultInt(String)
266 public int getDefaultInt(String name) {
267 return fStore.getDefaultInt(name);
271 * @see IPreferenceStore#getDefaultLong(String)
273 public long getDefaultLong(String name) {
274 return fStore.getDefaultLong(name);
278 * @see IPreferenceStore#getDefaultString(String)
280 public String getDefaultString(String name) {
281 return fStore.getDefaultString(name);
285 * @see IPreferenceStore#getDouble(String)
287 public double getDouble(String name) {
288 return fStore.getDouble(name);
292 * @see IPreferenceStore#getFloat(String)
294 public float getFloat(String name) {
295 return fStore.getFloat(name);
299 * @see IPreferenceStore#getInt(String)
301 public int getInt(String name) {
302 return fStore.getInt(name);
306 * @see IPreferenceStore#getLong(String)
308 public long getLong(String name) {
309 return fStore.getLong(name);
313 * @see IPreferenceStore#getString(String)
315 public String getString(String name) {
316 return fStore.getString(name);
320 * @see IPreferenceStore#isDefault(String)
322 public boolean isDefault(String name) {
323 return fStore.isDefault(name);
327 * @see IPreferenceStore#needsSaving()
329 public boolean needsSaving() {
330 return fStore.needsSaving();
334 * @see IPreferenceStore#putValue(String, String)
336 public void putValue(String name, String value) {
338 fStore.putValue(name, value);
343 * @see IPreferenceStore#setDefault(String, double)
345 public void setDefault(String name, double value) {
347 fStore.setDefault(name, value);
352 * @see IPreferenceStore#setDefault(String, float)
354 public void setDefault(String name, float value) {
356 fStore.setDefault(name, value);
361 * @see IPreferenceStore#setDefault(String, int)
363 public void setDefault(String name, int value) {
365 fStore.setDefault(name, value);
370 * @see IPreferenceStore#setDefault(String, long)
372 public void setDefault(String name, long value) {
374 fStore.setDefault(name, value);
379 * @see IPreferenceStore#setDefault(String, String)
381 public void setDefault(String name, String value) {
383 fStore.setDefault(name, value);
388 * @see IPreferenceStore#setDefault(String, boolean)
390 public void setDefault(String name, boolean value) {
392 fStore.setDefault(name, value);
397 * @see IPreferenceStore#setToDefault(String)
399 public void setToDefault(String name) {
400 fStore.setToDefault(name);
404 * @see IPreferenceStore#setValue(String, double)
406 public void setValue(String name, double value) {
408 fStore.setValue(name, value);
413 * @see IPreferenceStore#setValue(String, float)
415 public void setValue(String name, float value) {
417 fStore.setValue(name, value);
422 * @see IPreferenceStore#setValue(String, int)
424 public void setValue(String name, int value) {
426 fStore.setValue(name, value);
431 * @see IPreferenceStore#setValue(String, long)
433 public void setValue(String name, long value) {
435 fStore.setValue(name, value);
440 * @see IPreferenceStore#setValue(String, String)
442 public void setValue(String name, String value) {
444 fStore.setValue(name, value);
449 * @see IPreferenceStore#setValue(String, boolean)
451 public void setValue(String name, boolean value) {
453 fStore.setValue(name, value);
457 // Protected Methods -------------------------------------------------------
460 * Tries to find and return the overlay key for the given preference key
463 * @param key the preference key string
464 * @return the overlay key or <code>null</code> if none can be found
466 protected final OverlayKey findOverlayKey(String key) {
467 for (Iterator i = fOverlayKeys.iterator(); i.hasNext(); ) {
468 OverlayKey k = (OverlayKey) i.next();
469 if (k.fKey.equals(key)) {
477 * Propagates the given overlay key from the orgin to the target preference
480 * @param origin the source preference store
481 * @param key the overlay key
482 * @param target the preference store to which the key is propagated
484 protected final void propagateProperty(IPreferenceStore origin,
485 OverlayKey key, IPreferenceStore target) {
486 if (origin.isDefault(key.fKey)) {
487 if (!target.isDefault(key.fKey)) {
488 target.setToDefault(key.fKey);
494 boolean originValue = origin.getBoolean(key.fKey);
495 boolean targetValue = target.getBoolean(key.fKey);
496 if (targetValue != originValue) {
497 target.setValue(key.fKey, originValue);
499 } else if (DOUBLE == d) {
500 double originValue = origin.getDouble(key.fKey);
501 double targetValue = target.getDouble(key.fKey);
502 if (targetValue != originValue) {
503 target.setValue(key.fKey, originValue);
505 } else if (FLOAT == d) {
506 float originValue = origin.getFloat(key.fKey);
507 float targetValue = target.getFloat(key.fKey);
508 if (targetValue != originValue) {
509 target.setValue(key.fKey, originValue);
511 } else if (INT == d) {
512 int originValue = origin.getInt(key.fKey);
513 int targetValue = target.getInt(key.fKey);
514 if (targetValue != originValue) {
515 target.setValue(key.fKey, originValue);
517 } else if (LONG == d) {
518 long originValue = origin.getLong(key.fKey);
519 long targetValue = target.getLong(key.fKey);
520 if (targetValue != originValue) {
521 target.setValue(key.fKey, originValue);
523 } else if (STRING == d) {
524 String originValue = origin.getString(key.fKey);
525 String targetValue = target.getString(key.fKey);
526 if ((targetValue != null) && (originValue != null)
527 && !targetValue.equals(originValue)) {
528 target.setValue(key.fKey, originValue);
533 // Private Methods ---------------------------------------------------------
536 * Tells whether the given preference key string is
537 * covered by this overlay store.
539 * @param key the preference key string
540 * @return <code>true</code> if this overlay store covers the given key
542 private boolean covers(String key) {
543 return (findOverlayKey(key) != null);
547 * Loads the given key from the orgin into the target.
549 * @param orgin the source preference store
550 * @param key the overlay key
551 * @param target the preference store to which the key is propagated
552 * @param forceInitialization if <code>true</code> the value in the target
553 * gets initialized before loading
555 private void loadProperty(IPreferenceStore orgin, OverlayKey key,
556 IPreferenceStore target, boolean forceInitialization) {
559 if (forceInitialization) {
560 target.setValue(key.fKey, true);
562 target.setValue(key.fKey, orgin.getBoolean(key.fKey));
563 target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey));
564 } else if (DOUBLE == d) {
565 if (forceInitialization) {
566 target.setValue(key.fKey, 1.0D);
568 target.setValue(key.fKey, orgin.getDouble(key.fKey));
569 target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey));
570 } else if (FLOAT == d) {
571 if (forceInitialization) {
572 target.setValue(key.fKey, 1.0F);
574 target.setValue(key.fKey, orgin.getFloat(key.fKey));
575 target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey));
576 } else if (INT == d) {
577 if (forceInitialization) {
578 target.setValue(key.fKey, 1);
580 target.setValue(key.fKey, orgin.getInt(key.fKey));
581 target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey));
582 } else if (LONG == d) {
583 if (forceInitialization) {
584 target.setValue(key.fKey, 1L);
586 target.setValue(key.fKey, orgin.getLong(key.fKey));
587 target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey));
588 } else if (STRING == d) {
589 if (forceInitialization) {
590 target.setValue(key.fKey, "1"); //$NON-NLS-1$
592 target.setValue(key.fKey, orgin.getString(key.fKey));
593 target.setDefault(key.fKey, orgin.getDefaultString(key.fKey));