Mercurial > projects > dwt2
annotate org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/value/AbstractVetoableValue.d @ 95:6208d4f6a277
Added trees for databinding.beans and observable
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 21 Apr 2009 10:55:51 +0200 |
parents | |
children | b74ac5dfcc06 |
rev | line source |
---|---|
95
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 /******************************************************************************* |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2 * Copyright (c) 2005, 2007 IBM Corporation and others. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
7 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
8 * Contributors: |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 * Brad Reynolds - bug 164653 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 *******************************************************************************/ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 package org.eclipse.core.databinding.observable.value; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
13 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 import org.eclipse.core.databinding.observable.Diffs; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 import org.eclipse.core.databinding.observable.Realm; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 import org.eclipse.core.internal.databinding.Util; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 * This class is thread safe. All state accessing methods must be invoked from |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 * the {@link Realm#isCurrent() current realm}. Methods for adding and removing |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 * listeners may be invoked from any thread. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 * </p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 * @since 1.0 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
26 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
27 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
28 public abstract class AbstractVetoableValue : AbstractObservableValue |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 , IVetoableValue { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
30 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
31 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 * Creates a new vetoable value. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 public this() { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 this(Realm.getDefault()); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
38 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 * @param realm |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
41 public this(Realm realm) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
42 super(realm); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
43 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
44 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
45 final protected void doSetValue(Object value) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
46 Object currentValue = doGetValue(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
47 ValueDiff diff = Diffs.createValueDiff(currentValue, value); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
48 bool okToProceed = fireValueChanging(diff); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
49 if (!okToProceed) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 throw new ChangeVetoException("Change not permitted"); //$NON-NLS-1$ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 doSetApprovedValue(value); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 if (!Util.equals(diff.getOldValue(), diff.getNewValue())) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 fireValueChange(diff); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
56 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
58 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
59 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 * Sets the value. Invoked after performing veto checks. Should not fire change events. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
61 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
62 * @param value |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 protected abstract void doSetApprovedValue(Object value); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
66 public synchronized void addValueChangingListener( |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 IValueChangingListener listener) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 addListener(ValueChangingEvent.TYPE, listener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
70 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
71 public synchronized void removeValueChangingListener( |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 IValueChangingListener listener) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 removeListener(ValueChangingEvent.TYPE, listener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
74 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
75 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 * Notifies listeners about a pending change, and returns true if no |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 * listener vetoed the change. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
79 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 * @param diff |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 * @return false if the change was vetoed, true otherwise |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 protected bool fireValueChanging(ValueDiff diff) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 checkRealm(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 ValueChangingEvent event = new ValueChangingEvent(this, diff); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 fireEvent(event); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 return !event.veto; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 public synchronized void dispose() { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 super.dispose(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
93 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
94 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 } |