Mercurial > projects > dwt2
annotate org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableTracker.d @ 97:c86eb8b3098e
packageimport
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 21 Apr 2009 11:18:25 +0200 |
parents | b74ac5dfcc06 |
children |
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, 2008 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 * Matthew Hall - Fix NPE, more detailed assert messages (bug 210115) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 *******************************************************************************/ |
96
b74ac5dfcc06
package to module and java.lang.all import
Frank Benoit <benoit@tionex.de>
parents:
95
diff
changeset
|
12 module org.eclipse.core.databinding.observable.ObservableTracker; |
97 | 13 import org.eclipse.core.databinding.observable.IChangeListener; |
14 import org.eclipse.core.databinding.observable.IStaleListener; | |
15 import org.eclipse.core.databinding.observable.Realm; | |
16 import org.eclipse.core.databinding.observable.IObservable; | |
96
b74ac5dfcc06
package to module and java.lang.all import
Frank Benoit <benoit@tionex.de>
parents:
95
diff
changeset
|
17 |
b74ac5dfcc06
package to module and java.lang.all import
Frank Benoit <benoit@tionex.de>
parents:
95
diff
changeset
|
18 import java.lang.all; |
95
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 import java.util.HashSet; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 import java.util.Iterator; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 import java.util.Set; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 import org.eclipse.core.internal.databinding.IdentityWrapper; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 import org.eclipse.core.runtime.Assert; |
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 * This class makes it possible to monitor whenever an IObservable is read from. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 * This can be used to automatically attach and remove listeners. How to use it: |
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 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 * If you are implementing an IObservable, invoke getterCalled(this) whenever a |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 * getter is called - that is, whenever your observable is read from. You only |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 * need to do this once per method call. If one getter delegates to another, the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 * outer getter doesn't need to call the method since the inner one will. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 * </p> |
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 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 * If you want to determine what observables were used in a particular block of |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 * code, call runAndMonitorcast(Runnable). This will execute the given runnable and |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
41 * return the set of observables that were read from. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
42 * </p> |
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 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
45 * This can be used to automatically attach listeners. For example, imagine you |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
46 * have a block of code that updates some widget by reading from a bunch of |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
47 * observables. Whenever one of those observables changes, you want to re-run |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
48 * the code and cause the widget to be refreshed. You could do this in the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
49 * traditional manner by attaching one listener to each observable and |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 * re-running your widget update code whenever one of them changes, but this |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 * code is repetitive and requires updating the listener code whenever you |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 * refactor the widget updating code. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 * </p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
56 * Alternatively, you could use a utility class that runs the code in a |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 * runAndMonitor block and automatically attach listeners to any observable used |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
58 * in updating the widget. The advantage of the latter approach is that it, |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
59 * eliminates the code for attaching and detaching listeners and will always |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 * stay in synch with changes to the widget update logic. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
61 * </p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
62 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 * @since 1.0 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 public class ObservableTracker { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
66 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 * Threadlocal storage pointing to the current Set of IObservables, or null |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 * if none. Note that this is actually the top of a stack. Whenever a method |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
70 * changes the current value, it remembers the old value as a local variable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
71 * and restores the old value when the method exits. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 private static ThreadLocal currentChangeListener = new ThreadLocal(); |
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 private static ThreadLocal currentStaleListener = new ThreadLocal(); |
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 private static ThreadLocal currentObservableSet = new ThreadLocal(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 |
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 * Invokes the given runnable, and returns the set of IObservables that were |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 * read by the runnable. If the runnable calls this method recursively, the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 * result will not contain IObservables that were used within the inner |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 * runnable. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 * @param runnable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 * runnable to execute |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 * @param changeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 * listener to register with all accessed observables |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 * @param staleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 * listener to register with all accessed observables, or |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 * <code>null</code> if no stale listener is to be registered |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 * @return an array of unique observable objects |
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 public static IObservable[] runAndMonitor(Runnable runnable, |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 IChangeListener changeListener, IStaleListener staleListener) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
96 // Remember the previous value in the listener stack |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
97 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 Set observableSet = new HashSet(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
104 // Push the new listeners to the top of the stack |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
105 currentObservableSet.set(observableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
106 currentChangeListener.set(changeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
107 currentStaleListener.set(staleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
108 try { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
109 runnable.run(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
110 } finally { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 // Pop the new listener off the top of the stack (by restoring the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 // previous listener) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 currentObservableSet.set(lastObservableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
114 currentChangeListener.set(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
115 currentStaleListener.set(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
117 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
118 int i = 0; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 IObservable[] result = new IObservable[observableSet.size()]; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
120 for (Iterator it = observableSet.iterator(); it.hasNext();) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 IdentityWrapper wrapper = cast(IdentityWrapper) it.next(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 result[i++] = cast(IObservable) wrapper.unwrap(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
123 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
125 return result; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
126 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
127 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
128 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 * Runs the given runnable without tracking dependencies. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
130 * @param runnable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
131 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
132 * @since 1.1 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
133 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 public static void runAndIgnore(Runnable runnable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
135 // Remember the previous value in the listener stack |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
139 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
140 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 currentObservableSet.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
142 currentChangeListener.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
143 currentStaleListener.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
144 try { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 runnable.run(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
146 } finally { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
147 // Pop the new listener off the top of the stack (by restoring the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
148 // previous listener) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
149 currentObservableSet.set(lastObservableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 currentChangeListener.set(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
151 currentStaleListener.set(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
152 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
153 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
154 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 /* |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
156 * Returns the same string as the default Object.toString() implementation. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 * getterCalled() uses this method IObservable.toString() to avoid infinite |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
158 * recursion and stack overflow. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
159 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
160 private static String toString(IObservable observable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
161 return observable.getClass().getName() + "@" //$NON-NLS-1$ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
162 + Integer.toHexString(System.identityHashCode(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
163 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
164 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
165 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
166 * Notifies the ObservableTracker that an observable was read from. The |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
167 * JavaDoc for methods that invoke this method should include the following |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
168 * tag: "@TrackedGetter This method will notify ObservableTracker that the |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
169 * receiver has been read from". This lets callers know that they can rely |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
170 * on automatic updates from the object without explicitly attaching a |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
171 * listener. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
172 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
173 * @param observable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
174 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
175 public static void getterCalled(IObservable observable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
176 Realm realm = observable.getRealm(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
177 if (realm is null) // observable.isDisposed() would be more appropriate if it existed |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
178 Assert.isTrue(false, "Getter called on disposed observable " //$NON-NLS-1$ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
179 + toString(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
180 if (!realm.isCurrent()) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
181 Assert.isTrue(false, "Getter called outside realm of observable " //$NON-NLS-1$ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
182 + toString(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
183 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
184 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
185 if (lastObservableSet is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
186 return; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
187 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
188 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
189 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
190 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
191 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
192 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
193 bool added = false; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
194 if (lastObservableSet !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
195 added = lastObservableSet.add(new IdentityWrapper(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
196 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
197 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
198 // If anyone is listening for observable usage... |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
199 if (added && lastChangeListener !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
200 observable.addChangeListener(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
201 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
202 if (added && lastStaleListener !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
203 observable.addStaleListener(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
204 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
205 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
206 } |