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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }