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