78
|
1 /*******************************************************************************
|
|
2 * Copyright (c) 2005, 2008 IBM Corporation and others.
|
|
3 * All rights reserved. This program and the accompanying materials
|
|
4 * are made available under the terms of the Eclipse Public License v1.0
|
|
5 * which accompanies this distribution, and is available at
|
|
6 * http://www.eclipse.org/legal/epl-v10.html
|
|
7 *
|
|
8 * Contributors:
|
|
9 * IBM Corporation - initial API and implementation
|
|
10 * Matt Carter - bug 170668
|
|
11 * Brad Reynolds - bug 170848
|
|
12 * Matthew Hall - bug 180746, bug 207844
|
|
13 * Michael Krauter, bug 180223
|
|
14 *******************************************************************************/
|
|
15 module org.eclipse.jface.databinding.swt.SWTObservables;
|
|
16
|
|
17 import java.lang.all;
|
|
18
|
|
19 import java.util.ArrayList;
|
|
20 import java.util.Iterator;
|
|
21
|
|
22 import org.eclipse.core.databinding.observable.Realm;
|
|
23 import org.eclipse.core.databinding.observable.list.IObservableList;
|
|
24 import org.eclipse.jface.internal.databinding.internal.swt.LinkObservableValue;
|
|
25 import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
|
|
26 import org.eclipse.jface.internal.databinding.swt.CComboObservableList;
|
|
27 import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
|
|
28 import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionObservableValue;
|
|
29 import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
|
|
30 import org.eclipse.jface.internal.databinding.swt.ComboObservableList;
|
|
31 import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
|
|
32 import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
|
|
33 import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
|
|
34 import org.eclipse.jface.internal.databinding.swt.DelayedObservableValue;
|
|
35 import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
|
|
36 import org.eclipse.jface.internal.databinding.swt.ListObservableList;
|
|
37 import org.eclipse.jface.internal.databinding.swt.ListObservableValue;
|
|
38 import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionObservableValue;
|
|
39 import org.eclipse.jface.internal.databinding.swt.SWTProperties;
|
|
40 import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
|
|
41 import org.eclipse.jface.internal.databinding.swt.ShellObservableValue;
|
|
42 import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
|
|
43 import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
|
|
44 import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
|
|
45 import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
|
|
46 import org.eclipse.swt.custom.CCombo;
|
|
47 import org.eclipse.swt.custom.CLabel;
|
|
48 import org.eclipse.swt.widgets.Button;
|
|
49 import org.eclipse.swt.widgets.Combo;
|
|
50 import org.eclipse.swt.widgets.Control;
|
|
51 import org.eclipse.swt.widgets.Display;
|
|
52 import org.eclipse.swt.widgets.Label;
|
|
53 import org.eclipse.swt.widgets.Link;
|
|
54 import org.eclipse.swt.widgets.List;
|
|
55 import org.eclipse.swt.widgets.Scale;
|
|
56 import org.eclipse.swt.widgets.Shell;
|
|
57 import org.eclipse.swt.widgets.Spinner;
|
|
58 import org.eclipse.swt.widgets.Table;
|
|
59 import org.eclipse.swt.widgets.Text;
|
|
60
|
|
61 /**
|
|
62 * A factory for creating observables for SWT widgets
|
|
63 *
|
|
64 * @since 1.1
|
|
65 *
|
|
66 */
|
|
67 public class SWTObservables {
|
|
68
|
|
69 private static java.util.List realms = new ArrayList();
|
|
70
|
|
71 /**
|
|
72 * Returns the realm representing the UI thread for the given display.
|
|
73 *
|
|
74 * @param display
|
|
75 * @return the realm representing the UI thread for the given display
|
|
76 */
|
|
77 public static Realm getRealm(Display display) {
|
|
78 synchronized (realms) {
|
|
79 for (Iterator it = realms.iterator(); it.hasNext();) {
|
|
80 DisplayRealm displayRealm = cast(DisplayRealm) it.next();
|
|
81 if (displayRealm.display is display) {
|
|
82 return displayRealm;
|
|
83 }
|
|
84 }
|
|
85 DisplayRealm result = new DisplayRealm(display);
|
|
86 realms.add(result);
|
|
87 return result;
|
|
88 }
|
|
89 }
|
|
90
|
|
91 /**
|
|
92 * Returns an observable which delays notification of value change events
|
|
93 * from <code>observable</code> until <code>delay</code> milliseconds
|
|
94 * have passed since the last change event, or until a FocusOut event is
|
|
95 * received from the underlying widget (whichever happens earlier). This
|
|
96 * class helps to delay validation until the user stops typing. To notify
|
|
97 * about pending changes, the returned observable value will fire a stale
|
|
98 * event when the wrapped observable value fires a change event, but this
|
|
99 * change is being delayed.
|
|
100 *
|
|
101 * @param delay
|
|
102 * @param observable
|
|
103 * @return an observable which delays notification of value change events
|
|
104 * from <code>observable</code> until <code>delay</code>
|
|
105 * milliseconds have passed since the last change event.
|
|
106 *
|
|
107 * @since 1.2
|
|
108 */
|
|
109 public static ISWTObservableValue observeDelayedValue(int delay, ISWTObservableValue observable) {
|
|
110 return new DelayedObservableValue(delay, observable);
|
|
111 }
|
|
112
|
|
113 /**
|
|
114 * @param control
|
|
115 * @return an observable value tracking the enabled state of the given
|
|
116 * control
|
|
117 */
|
|
118 public static ISWTObservableValue observeEnabled(Control control) {
|
|
119 return new ControlObservableValue(control, SWTProperties.ENABLED);
|
|
120 }
|
|
121
|
|
122 /**
|
|
123 * @param control
|
|
124 * @return an observable value tracking the visible state of the given
|
|
125 * control
|
|
126 */
|
|
127 public static ISWTObservableValue observeVisible(Control control) {
|
|
128 return new ControlObservableValue(control, SWTProperties.VISIBLE);
|
|
129 }
|
|
130
|
|
131 /**
|
|
132 * @param control
|
|
133 * @return an observable value tracking the tooltip text of the given
|
|
134 * control
|
|
135 */
|
|
136 public static ISWTObservableValue observeTooltipText(Control control) {
|
|
137 return new ControlObservableValue(control, SWTProperties.TOOLTIP_TEXT);
|
|
138 }
|
|
139
|
|
140 /**
|
|
141 * Returns an observable observing the selection attribute of the provided
|
|
142 * <code>control</code>. The supported types are:
|
|
143 * <ul>
|
|
144 * <li>org.eclipse.swt.widgets.Spinner</li>
|
|
145 * <li>org.eclipse.swt.widgets.Button</li>
|
|
146 * <li>org.eclipse.swt.widgets.Combo</li>
|
|
147 * <li>org.eclipse.swt.custom.CCombo</li>
|
|
148 * <li>org.eclipse.swt.widgets.List</li>
|
|
149 * <li>org.eclipse.swt.widgets.Scale</li>
|
|
150 * </ul>
|
|
151 *
|
|
152 * @param control
|
|
153 * @return observable value
|
|
154 * @throws IllegalArgumentException
|
|
155 * if <code>control</code> type is unsupported
|
|
156 */
|
|
157 public static ISWTObservableValue observeSelection(Control control) {
|
|
158 if (null !is cast(Spinner)control) {
|
|
159 return new SpinnerObservableValue(cast(Spinner) control,
|
|
160 SWTProperties.SELECTION);
|
|
161 } else if (null !is cast(Button)control) {
|
|
162 return new ButtonObservableValue(cast(Button) control);
|
|
163 } else if (null !is cast(Combo)control) {
|
|
164 return new ComboObservableValue(cast(Combo) control,
|
|
165 SWTProperties.SELECTION);
|
|
166 } else if (null !is cast(CCombo)control) {
|
|
167 return new CComboObservableValue(cast(CCombo) control,
|
|
168 SWTProperties.SELECTION);
|
|
169 } else if (null !is cast(List)control) {
|
|
170 return new ListObservableValue(cast(List) control);
|
|
171 } else if (null !is cast(Scale)control) {
|
|
172 return new ScaleObservableValue(cast(Scale) control,
|
|
173 SWTProperties.SELECTION);
|
|
174 }
|
|
175
|
|
176 throw new IllegalArgumentException(
|
|
177 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
178 }
|
|
179
|
|
180 /**
|
|
181 * Returns an observable observing the minimum attribute of the provided
|
|
182 * <code>control</code>. The supported types are:
|
|
183 * <ul>
|
|
184 * <li>org.eclipse.swt.widgets.Spinner</li>
|
|
185 * <li>org.eclipse.swt.widgets.Scale</li>
|
|
186 * </ul>
|
|
187 *
|
|
188 * @param control
|
|
189 * @return observable value
|
|
190 * @throws IllegalArgumentException
|
|
191 * if <code>control</code> type is unsupported
|
|
192 */
|
|
193 public static ISWTObservableValue observeMin(Control control) {
|
|
194 if (null !is cast(Spinner)control) {
|
|
195 return new SpinnerObservableValue(cast(Spinner) control,
|
|
196 SWTProperties.MIN);
|
|
197 } else if (null !is cast(Scale)control) {
|
|
198 return new ScaleObservableValue(cast(Scale) control, SWTProperties.MIN);
|
|
199 }
|
|
200
|
|
201 throw new IllegalArgumentException(
|
|
202 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
203 }
|
|
204
|
|
205 /**
|
|
206 * Returns an observable observing the maximum attribute of the provided
|
|
207 * <code>control</code>. The supported types are:
|
|
208 * <ul>
|
|
209 * <li>org.eclipse.swt.widgets.Spinner</li>
|
|
210 * <li>org.eclipse.swt.widgets.Scale</li>
|
|
211 * </ul>
|
|
212 *
|
|
213 * @param control
|
|
214 * @return observable value
|
|
215 * @throws IllegalArgumentException
|
|
216 * if <code>control</code> type is unsupported
|
|
217 */
|
|
218 public static ISWTObservableValue observeMax(Control control) {
|
|
219 if (null !is cast(Spinner)control) {
|
|
220 return new SpinnerObservableValue(cast(Spinner) control,
|
|
221 SWTProperties.MAX);
|
|
222 } else if (null !is cast(Scale)control) {
|
|
223 return new ScaleObservableValue(cast(Scale) control, SWTProperties.MAX);
|
|
224 }
|
|
225
|
|
226 throw new IllegalArgumentException(
|
|
227 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
228 }
|
|
229
|
|
230 /**
|
|
231 * Returns an observable observing the text attribute of the provided
|
|
232 * <code>control</code>. The supported types are:
|
|
233 * <ul>
|
|
234 * <li>org.eclipse.swt.widgets.Text</li>
|
|
235 * </ul>
|
|
236 *
|
|
237 * <li>org.eclipse.swt.widgets.Label</li>
|
|
238 * @param control
|
|
239 * @param event event type to register for change events
|
|
240 * @return observable value
|
|
241 * @throws IllegalArgumentException
|
|
242 * if <code>control</code> type is unsupported
|
|
243 */
|
|
244 public static ISWTObservableValue observeText(Control control, int event) {
|
|
245 if (null !is cast(Text)control) {
|
|
246 return new TextObservableValue(cast(Text) control, event);
|
|
247 }
|
|
248
|
|
249 throw new IllegalArgumentException(
|
|
250 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
251 }
|
|
252
|
|
253 /**
|
|
254 * Returns an observable observing the text attribute of the provided
|
|
255 * <code>control</code>. The supported types are:
|
|
256 * <ul>
|
|
257 * <li>org.eclipse.swt.widgets.Label</li>
|
|
258 * <li>org.eclipse.swt.widgets.Link (as of 1.2)</li>
|
|
259 * <li>org.eclipse.swt.custom.Label</li>
|
|
260 * <li>org.eclipse.swt.widgets.Combo</li>
|
|
261 * <li>org.eclipse.swt.custom.CCombo</li>
|
|
262 * <li>org.eclipse.swt.widgets.Shell</li>
|
|
263 * </ul>
|
|
264 *
|
|
265 * @param control
|
|
266 * @return observable value
|
|
267 * @throws IllegalArgumentException
|
|
268 * if <code>control</code> type is unsupported
|
|
269 */
|
|
270 public static ISWTObservableValue observeText(Control control) {
|
|
271 if (null !is cast(Label)control) {
|
|
272 return new LabelObservableValue(cast(Label) control);
|
|
273 } else if (null !is cast(Link)control) {
|
|
274 return new LinkObservableValue(cast(Link) control);
|
|
275 } else if (null !is cast(CLabel)control) {
|
|
276 return new CLabelObservableValue(cast(CLabel) control);
|
|
277 } else if (null !is cast(Combo)control) {
|
|
278 return new ComboObservableValue(cast(Combo) control, SWTProperties.TEXT);
|
|
279 } else if (null !is cast(CCombo)control) {
|
|
280 return new CComboObservableValue(cast(CCombo) control,
|
|
281 SWTProperties.TEXT);
|
|
282 } else if (null !is cast(Shell)control) {
|
|
283 return new ShellObservableValue(cast(Shell) control);
|
|
284 }
|
|
285
|
|
286 throw new IllegalArgumentException(
|
|
287 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
288 }
|
|
289
|
|
290 /**
|
|
291 * Returns an observable observing the items attribute of the provided
|
|
292 * <code>control</code>. The supported types are:
|
|
293 * <ul>
|
|
294 * <li>org.eclipse.swt.widgets.Combo</li>
|
|
295 * <li>org.eclipse.swt.custom.CCombo</li>
|
|
296 * <li>org.eclipse.swt.widgets.List</li>
|
|
297 * </ul>
|
|
298 *
|
|
299 * @param control
|
|
300 * @return observable list
|
|
301 * @throws IllegalArgumentException
|
|
302 * if <code>control</code> type is unsupported
|
|
303 */
|
|
304 public static IObservableList observeItems(Control control) {
|
|
305 if (null !is cast(Combo)control) {
|
|
306 return new ComboObservableList(cast(Combo) control);
|
|
307 } else if (null !is cast(CCombo)control) {
|
|
308 return new CComboObservableList(cast(CCombo) control);
|
|
309 } else if (null !is cast(List)control) {
|
|
310 return new ListObservableList(cast(List) control);
|
|
311 }
|
|
312
|
|
313 throw new IllegalArgumentException(
|
|
314 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
315 }
|
|
316
|
|
317 /**
|
|
318 * Returns an observable observing the single selection index attribute of
|
|
319 * the provided <code>control</code>. The supported types are:
|
|
320 * <ul>
|
|
321 * <li>org.eclipse.swt.widgets.Table</li>
|
|
322 * <li>org.eclipse.swt.widgets.Combo</li>
|
|
323 * <li>org.eclipse.swt.custom.CCombo</li>
|
|
324 * <li>org.eclipse.swt.widgets.List</li>
|
|
325 * </ul>
|
|
326 *
|
|
327 * @param control
|
|
328 * @return observable value
|
|
329 * @throws IllegalArgumentException
|
|
330 * if <code>control</code> type is unsupported
|
|
331 */
|
|
332 public static ISWTObservableValue observeSingleSelectionIndex(
|
|
333 Control control) {
|
|
334 if (null !is cast(Table)control) {
|
|
335 return new TableSingleSelectionObservableValue(cast(Table) control);
|
|
336 } else if (null !is cast(Combo)control) {
|
|
337 return new ComboSingleSelectionObservableValue(cast(Combo) control);
|
|
338 } else if (null !is cast(CCombo)control) {
|
|
339 return new CComboSingleSelectionObservableValue(cast(CCombo) control);
|
|
340 } else if (null !is cast(List)control) {
|
|
341 return new ListSingleSelectionObservableValue(cast(List) control);
|
|
342 }
|
|
343
|
|
344 throw new IllegalArgumentException(
|
|
345 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
346 }
|
|
347
|
|
348 /**
|
|
349 * @param control
|
|
350 * @return an observable value tracking the foreground color of the given
|
|
351 * control
|
|
352 */
|
|
353 public static ISWTObservableValue observeForeground(Control control) {
|
|
354 return new ControlObservableValue(control, SWTProperties.FOREGROUND);
|
|
355 }
|
|
356
|
|
357 /**
|
|
358 * @param control
|
|
359 * @return an observable value tracking the background color of the given
|
|
360 * control
|
|
361 */
|
|
362 public static ISWTObservableValue observeBackground(Control control) {
|
|
363 return new ControlObservableValue(control, SWTProperties.BACKGROUND);
|
|
364 }
|
|
365
|
|
366 /**
|
|
367 * @param control
|
|
368 * @return an observable value tracking the font of the given control
|
|
369 */
|
|
370 public static ISWTObservableValue observeFont(Control control) {
|
|
371 return new ControlObservableValue(control, SWTProperties.FONT);
|
|
372 }
|
|
373
|
|
374 /**
|
|
375 * Returns an observable observing the editable attribute of
|
|
376 * the provided <code>control</code>. The supported types are:
|
|
377 * <ul>
|
|
378 * <li>org.eclipse.swt.widgets.Text</li>
|
|
379 * </ul>
|
|
380 *
|
|
381 * @param control
|
|
382 * @return observable value
|
|
383 * @throws IllegalArgumentException
|
|
384 * if <code>control</code> type is unsupported
|
|
385 */
|
|
386 public static ISWTObservableValue observeEditable(Control control) {
|
|
387 if (null !is cast(Text)control) {
|
|
388 return new TextEditableObservableValue(cast(Text) control);
|
|
389 }
|
|
390
|
|
391 throw new IllegalArgumentException(
|
|
392 "Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
|
|
393 }
|
|
394
|
|
395 private static class DisplayRealm : Realm {
|
|
396 private Display display;
|
|
397
|
|
398 /**
|
|
399 * @param display
|
|
400 */
|
|
401 private this(Display display) {
|
|
402 this.display = display;
|
|
403 }
|
|
404
|
|
405 public bool isCurrent() {
|
|
406 return Display.getCurrent() is display;
|
|
407 }
|
|
408
|
|
409 public void asyncExec(Runnable runnable) {
|
|
410 Runnable safeRunnable = dgRunnable((Runnable runnable_) {
|
|
411 safeRun(runnable_);
|
|
412 }, runnable);
|
|
413 if (!display.isDisposed()) {
|
|
414 display.asyncExec(safeRunnable);
|
|
415 }
|
|
416 }
|
|
417
|
|
418 /*
|
|
419 * (non-Javadoc)
|
|
420 *
|
|
421 * @see java.lang.Object#hashCode()
|
|
422 */
|
|
423 public int hashCode() {
|
|
424 return (display is null) ? 0 : display.hashCode();
|
|
425 }
|
|
426
|
|
427 /*
|
|
428 * (non-Javadoc)
|
|
429 *
|
|
430 * @see java.lang.Object#equals(java.lang.Object)
|
|
431 */
|
|
432 public bool equals(Object obj) {
|
|
433 if (this is obj)
|
|
434 return true;
|
|
435 if (obj is null)
|
|
436 return false;
|
|
437 if (getClass() !is obj.getClass())
|
|
438 return false;
|
|
439 final DisplayRealm other = cast(DisplayRealm) obj;
|
|
440 if (display is null) {
|
|
441 if (other.display !is null)
|
|
442 return false;
|
|
443 } else if (!display.equals(other.display))
|
|
444 return false;
|
|
445 return true;
|
|
446 }
|
|
447 }
|
|
448 }
|