Mercurial > projects > dwt2
annotate org.eclipse.core.databinding.observable/src/org/eclipse/core/databinding/observable/ObservableTracker.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, 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 *******************************************************************************/ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 package org.eclipse.core.databinding.observable; |
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 java.util.HashSet; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 import java.util.Iterator; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 import java.util.Set; |
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 import org.eclipse.core.internal.databinding.IdentityWrapper; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 import org.eclipse.core.runtime.Assert; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 * 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
|
23 * 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
|
24 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
26 * 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
|
27 * 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
|
28 * 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
|
29 * 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
|
30 * </p> |
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 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 * 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
|
34 * 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
|
35 * 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
|
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 * 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
|
40 * 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
|
41 * 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
|
42 * 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
|
43 * 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
|
44 * 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
|
45 * 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
|
46 * refactor the widget updating code. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
47 * </p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
48 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
49 * <p> |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 * 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
|
51 * 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
|
52 * 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
|
53 * 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
|
54 * 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
|
55 * </p> |
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 * @since 1.0 |
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 public class ObservableTracker { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 |
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 * 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
|
63 * 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
|
64 * 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
|
65 * 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
|
66 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 private static ThreadLocal currentChangeListener = new ThreadLocal(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 private static ThreadLocal currentStaleListener = new ThreadLocal(); |
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 private static ThreadLocal currentObservableSet = new ThreadLocal(); |
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 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
74 * 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
|
75 * 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
|
76 * 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
|
77 * runnable. |
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 * @param runnable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 * runnable to execute |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 * @param changeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 * listener to register with all accessed observables |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 * @param staleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 * listener to register with all accessed observables, or |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 * <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
|
86 * @return an array of unique observable objects |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 public static IObservable[] runAndMonitor(Runnable runnable, |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 IChangeListener changeListener, IStaleListener staleListener) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 // Remember the previous value in the listener stack |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
93 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
94 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
96 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
97 Set observableSet = new HashSet(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 // 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
|
99 currentObservableSet.set(observableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 currentChangeListener.set(changeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 currentStaleListener.set(staleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 try { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 runnable.run(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
104 } finally { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
105 // 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
|
106 // previous listener) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
107 currentObservableSet.set(lastObservableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
108 currentChangeListener.set(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
109 currentStaleListener.set(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
110 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 int i = 0; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 IObservable[] result = new IObservable[observableSet.size()]; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
114 for (Iterator it = observableSet.iterator(); it.hasNext();) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
115 IdentityWrapper wrapper = cast(IdentityWrapper) it.next(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 result[i++] = cast(IObservable) wrapper.unwrap(); |
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 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 return result; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
120 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 /** |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
123 * Runs the given runnable without tracking dependencies. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 * @param runnable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
125 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
126 * @since 1.1 |
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 public static void runAndIgnore(Runnable runnable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 // Remember the previous value in the listener stack |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
130 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
131 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
132 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
133 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
135 currentObservableSet.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 currentChangeListener.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 currentStaleListener.set(null); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 try { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
139 runnable.run(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
140 } finally { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 // 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
|
142 // previous listener) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
143 currentObservableSet.set(lastObservableSet); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
144 currentChangeListener.set(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 currentStaleListener.set(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
146 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
147 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
148 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
149 /* |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 * 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
|
151 * 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
|
152 * recursion and stack overflow. |
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 private static String toString(IObservable observable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 return observable.getClass().getName() + "@" //$NON-NLS-1$ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
156 + Integer.toHexString(System.identityHashCode(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
158 |
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 * 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
|
161 * 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
|
162 * 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
|
163 * 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
|
164 * 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
|
165 * listener. |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
166 * |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
167 * @param observable |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
168 */ |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
169 public static void getterCalled(IObservable observable) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
170 Realm realm = observable.getRealm(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
171 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
|
172 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
|
173 + toString(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
174 if (!realm.isCurrent()) |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
175 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
|
176 + toString(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
177 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
178 Set lastObservableSet = cast(Set) currentObservableSet.get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
179 if (lastObservableSet is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
180 return; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
181 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
182 IChangeListener lastChangeListener = cast(IChangeListener) currentChangeListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
183 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
184 IStaleListener lastStaleListener = cast(IStaleListener) currentStaleListener |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
185 .get(); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
186 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
187 bool added = false; |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
188 if (lastObservableSet !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
189 added = lastObservableSet.add(new IdentityWrapper(observable)); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
190 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
191 |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
192 // If anyone is listening for observable usage... |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
193 if (added && lastChangeListener !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
194 observable.addChangeListener(lastChangeListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
195 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
196 if (added && lastStaleListener !is null) { |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
197 observable.addStaleListener(lastStaleListener); |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
198 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
199 } |
6208d4f6a277
Added trees for databinding.beans and observable
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
200 } |