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