Avoid NPE in update OccurrenceAnnotation
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / preferences / OverlayPreferenceStore.java
1 /*
2  * (c) Copyright IBM Corp. 2000, 2001.
3  * All Rights Reserved.
4  */
5
6 package net.sourceforge.phpeclipse.preferences;
7
8 import org.eclipse.jface.preference.IPreferenceStore;
9 import org.eclipse.jface.preference.PreferenceStore;
10 import org.eclipse.jface.util.IPropertyChangeListener;
11 import org.eclipse.jface.util.PropertyChangeEvent;
12
13 /**
14  * An overlaying preference store.
15  */
16 public class OverlayPreferenceStore implements IPreferenceStore {
17
18   public static final class TypeDescriptor {
19     private TypeDescriptor() {
20     }
21   };
22
23   public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
24   public static final TypeDescriptor DOUBLE = new TypeDescriptor();
25   public static final TypeDescriptor FLOAT = new TypeDescriptor();
26   public static final TypeDescriptor INT = new TypeDescriptor();
27   public static final TypeDescriptor LONG = new TypeDescriptor();
28   public static final TypeDescriptor STRING = new TypeDescriptor();
29
30   public static class OverlayKey {
31
32     TypeDescriptor fDescriptor;
33     String fKey;
34
35     public OverlayKey(TypeDescriptor descriptor, String key) {
36       fDescriptor = descriptor;
37       fKey = key;
38     }
39   };
40
41   private class PropertyListener implements IPropertyChangeListener {
42
43     /*
44      * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
45      */
46     public void propertyChange(PropertyChangeEvent event) {
47       OverlayKey key = findOverlayKey(event.getProperty());
48       if (key != null)
49         propagateProperty(fParent, key, fStore);
50     }
51   };
52
53   private IPreferenceStore fParent;
54   private IPreferenceStore fStore;
55   private OverlayKey[] fOverlayKeys;
56
57   private PropertyListener fPropertyListener;
58
59   public OverlayPreferenceStore(IPreferenceStore parent, OverlayKey[] overlayKeys) {
60     fParent = parent;
61     fOverlayKeys = overlayKeys;
62     fStore = new PreferenceStore();
63   }
64
65   private OverlayKey findOverlayKey(String key) {
66     for (int i = 0; i < fOverlayKeys.length; i++) {
67       if (fOverlayKeys[i].fKey.equals(key))
68         return fOverlayKeys[i];
69     }
70     return null;
71   }
72
73   private boolean covers(String key) {
74     return (findOverlayKey(key) != null);
75   }
76
77   private void propagateProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target) {
78
79     if (orgin.isDefault(key.fKey)) {
80       if (!target.isDefault(key.fKey))
81         target.setToDefault(key.fKey);
82       return;
83     }
84
85     TypeDescriptor d = key.fDescriptor;
86     if (BOOLEAN == d) {
87
88       boolean originValue = orgin.getBoolean(key.fKey);
89       boolean targetValue = target.getBoolean(key.fKey);
90       if (targetValue != originValue)
91         target.setValue(key.fKey, originValue);
92
93     } else if (DOUBLE == d) {
94
95       double originValue = orgin.getDouble(key.fKey);
96       double targetValue = target.getDouble(key.fKey);
97       if (targetValue != originValue)
98         target.setValue(key.fKey, originValue);
99
100     } else if (FLOAT == d) {
101
102       float originValue = orgin.getFloat(key.fKey);
103       float targetValue = target.getFloat(key.fKey);
104       if (targetValue != originValue)
105         target.setValue(key.fKey, originValue);
106
107     } else if (INT == d) {
108
109       int originValue = orgin.getInt(key.fKey);
110       int targetValue = target.getInt(key.fKey);
111       if (targetValue != originValue)
112         target.setValue(key.fKey, originValue);
113
114     } else if (LONG == d) {
115
116       long originValue = orgin.getLong(key.fKey);
117       long targetValue = target.getLong(key.fKey);
118       if (targetValue != originValue)
119         target.setValue(key.fKey, originValue);
120
121     } else if (STRING == d) {
122
123       String originValue = orgin.getString(key.fKey);
124       String targetValue = target.getString(key.fKey);
125       if (targetValue != null && originValue != null && !targetValue.equals(originValue))
126         target.setValue(key.fKey, originValue);
127
128     }
129   }
130
131   public void propagate() {
132     for (int i = 0; i < fOverlayKeys.length; i++)
133       propagateProperty(fStore, fOverlayKeys[i], fParent);
134   }
135
136   private void loadProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target, boolean forceInitialization) {
137     TypeDescriptor d = key.fDescriptor;
138     if (BOOLEAN == d) {
139
140       if (forceInitialization)
141         target.setValue(key.fKey, true);
142       target.setValue(key.fKey, orgin.getBoolean(key.fKey));
143       target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey));
144
145     } else if (DOUBLE == d) {
146
147       if (forceInitialization)
148         target.setValue(key.fKey, 1.0D);
149       target.setValue(key.fKey, orgin.getDouble(key.fKey));
150       target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey));
151
152     } else if (FLOAT == d) {
153
154       if (forceInitialization)
155         target.setValue(key.fKey, 1.0F);
156       target.setValue(key.fKey, orgin.getFloat(key.fKey));
157       target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey));
158
159     } else if (INT == d) {
160
161       if (forceInitialization)
162         target.setValue(key.fKey, 1);
163       target.setValue(key.fKey, orgin.getInt(key.fKey));
164       target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey));
165
166     } else if (LONG == d) {
167
168       if (forceInitialization)
169         target.setValue(key.fKey, 1L);
170       target.setValue(key.fKey, orgin.getLong(key.fKey));
171       target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey));
172
173     } else if (STRING == d) {
174
175       if (forceInitialization)
176         target.setValue(key.fKey, "1"); //$NON-NLS-1$
177       target.setValue(key.fKey, orgin.getString(key.fKey));
178       target.setDefault(key.fKey, orgin.getDefaultString(key.fKey));
179
180     }
181   }
182
183   public void load() {
184     for (int i = 0; i < fOverlayKeys.length; i++)
185       loadProperty(fParent, fOverlayKeys[i], fStore, true);
186   }
187
188   public void loadDefaults() {
189     for (int i = 0; i < fOverlayKeys.length; i++)
190       setToDefault(fOverlayKeys[i].fKey);
191   }
192
193   public void start() {
194     if (fPropertyListener == null) {
195       fPropertyListener = new PropertyListener();
196       fParent.addPropertyChangeListener(fPropertyListener);
197     }
198   }
199
200   public void stop() {
201     if (fPropertyListener != null) {
202       fParent.removePropertyChangeListener(fPropertyListener);
203       fPropertyListener = null;
204     }
205   }
206
207   /*
208    * @see IPreferenceStore#addPropertyChangeListener(IPropertyChangeListener)
209    */
210   public void addPropertyChangeListener(IPropertyChangeListener listener) {
211     fStore.addPropertyChangeListener(listener);
212   }
213
214   /*
215    * @see IPreferenceStore#removePropertyChangeListener(IPropertyChangeListener)
216    */
217   public void removePropertyChangeListener(IPropertyChangeListener listener) {
218     fStore.removePropertyChangeListener(listener);
219   }
220
221   /*
222    * @see IPreferenceStore#firePropertyChangeEvent(String, Object, Object)
223    */
224   public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
225     fStore.firePropertyChangeEvent(name, oldValue, newValue);
226   }
227
228   /*
229    * @see IPreferenceStore#contains(String)
230    */
231   public boolean contains(String name) {
232     return fStore.contains(name);
233   }
234
235   /*
236    * @see IPreferenceStore#getBoolean(String)
237    */
238   public boolean getBoolean(String name) {
239     return fStore.getBoolean(name);
240   }
241
242   /*
243    * @see IPreferenceStore#getDefaultBoolean(String)
244    */
245   public boolean getDefaultBoolean(String name) {
246     return fStore.getDefaultBoolean(name);
247   }
248
249   /*
250    * @see IPreferenceStore#getDefaultDouble(String)
251    */
252   public double getDefaultDouble(String name) {
253     return fStore.getDefaultDouble(name);
254   }
255
256   /*
257    * @see IPreferenceStore#getDefaultFloat(String)
258    */
259   public float getDefaultFloat(String name) {
260     return fStore.getDefaultFloat(name);
261   }
262
263   /*
264    * @see IPreferenceStore#getDefaultInt(String)
265    */
266   public int getDefaultInt(String name) {
267     return fStore.getDefaultInt(name);
268   }
269
270   /*
271    * @see IPreferenceStore#getDefaultLong(String)
272    */
273   public long getDefaultLong(String name) {
274     return fStore.getDefaultLong(name);
275   }
276
277   /*
278    * @see IPreferenceStore#getDefaultString(String)
279    */
280   public String getDefaultString(String name) {
281     return fStore.getDefaultString(name);
282   }
283
284   /*
285    * @see IPreferenceStore#getDouble(String)
286    */
287   public double getDouble(String name) {
288     return fStore.getDouble(name);
289   }
290
291   /*
292    * @see IPreferenceStore#getFloat(String)
293    */
294   public float getFloat(String name) {
295     return fStore.getFloat(name);
296   }
297
298   /*
299    * @see IPreferenceStore#getInt(String)
300    */
301   public int getInt(String name) {
302     return fStore.getInt(name);
303   }
304
305   /*
306    * @see IPreferenceStore#getLong(String)
307    */
308   public long getLong(String name) {
309     return fStore.getLong(name);
310   }
311
312   /*
313    * @see IPreferenceStore#getString(String)
314    */
315   public String getString(String name) {
316     return fStore.getString(name);
317   }
318
319   /*
320    * @see IPreferenceStore#isDefault(String)
321    */
322   public boolean isDefault(String name) {
323     return fStore.isDefault(name);
324   }
325
326   /*
327    * @see IPreferenceStore#needsSaving()
328    */
329   public boolean needsSaving() {
330     return fStore.needsSaving();
331   }
332
333   /*
334    * @see IPreferenceStore#putValue(String, String)
335    */
336   public void putValue(String name, String value) {
337     if (covers(name))
338       fStore.putValue(name, value);
339   }
340
341   /*
342    * @see IPreferenceStore#setDefault(String, double)
343    */
344   public void setDefault(String name, double value) {
345     if (covers(name))
346       fStore.setDefault(name, value);
347   }
348
349   /*
350    * @see IPreferenceStore#setDefault(String, float)
351    */
352   public void setDefault(String name, float value) {
353     if (covers(name))
354       fStore.setDefault(name, value);
355   }
356
357   /*
358    * @see IPreferenceStore#setDefault(String, int)
359    */
360   public void setDefault(String name, int value) {
361     if (covers(name))
362       fStore.setDefault(name, value);
363   }
364
365   /*
366    * @see IPreferenceStore#setDefault(String, long)
367    */
368   public void setDefault(String name, long value) {
369     if (covers(name))
370       fStore.setDefault(name, value);
371   }
372
373   /*
374    * @see IPreferenceStore#setDefault(String, String)
375    */
376   public void setDefault(String name, String value) {
377     if (covers(name))
378       fStore.setDefault(name, value);
379   }
380
381   /*
382    * @see IPreferenceStore#setDefault(String, boolean)
383    */
384   public void setDefault(String name, boolean value) {
385     if (covers(name))
386       fStore.setDefault(name, value);
387   }
388
389   /*
390    * @see IPreferenceStore#setToDefault(String)
391    */
392   public void setToDefault(String name) {
393     fStore.setToDefault(name);
394   }
395
396   /*
397    * @see IPreferenceStore#setValue(String, double)
398    */
399   public void setValue(String name, double value) {
400     if (covers(name))
401       fStore.setValue(name, value);
402   }
403
404   /*
405    * @see IPreferenceStore#setValue(String, float)
406    */
407   public void setValue(String name, float value) {
408     if (covers(name))
409       fStore.setValue(name, value);
410   }
411
412   /*
413    * @see IPreferenceStore#setValue(String, int)
414    */
415   public void setValue(String name, int value) {
416     if (covers(name))
417       fStore.setValue(name, value);
418   }
419
420   /*
421    * @see IPreferenceStore#setValue(String, long)
422    */
423   public void setValue(String name, long value) {
424     if (covers(name))
425       fStore.setValue(name, value);
426   }
427
428   /*
429    * @see IPreferenceStore#setValue(String, String)
430    */
431   public void setValue(String name, String value) {
432     if (covers(name))
433       fStore.setValue(name, value);
434   }
435
436   /*
437    * @see IPreferenceStore#setValue(String, boolean)
438    */
439   public void setValue(String name, boolean value) {
440     if (covers(name))
441       fStore.setValue(name, value);
442   }
443 }