Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 194734 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableMap.java (-141 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006, 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
 *     Brad Reynolds - bug 171616
11
 *     Matthew hall - bugs 223164, 241585, 226289
12
 *******************************************************************************/
13
14
package org.eclipse.core.internal.databinding.beans;
15
16
import java.beans.PropertyChangeListener;
17
import java.beans.PropertyDescriptor;
18
import java.lang.reflect.Method;
19
20
import org.eclipse.core.databinding.beans.IBeanObservable;
21
import org.eclipse.core.databinding.observable.Diffs;
22
import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
23
import org.eclipse.core.databinding.observable.set.IObservableSet;
24
import org.eclipse.core.databinding.util.Policy;
25
import org.eclipse.core.runtime.IStatus;
26
import org.eclipse.core.runtime.Status;
27
28
/**
29
 * @since 1.0
30
 * 
31
 */
32
public class JavaBeanObservableMap extends ComputedObservableMap implements
33
		IBeanObservable {
34
35
	private PropertyDescriptor propertyDescriptor;
36
	
37
	private PropertyChangeListener elementListener = new PropertyChangeListener() {
38
		public void propertyChange(final java.beans.PropertyChangeEvent event) {
39
			if (!updating) {
40
				getRealm().exec(new Runnable() {
41
					public void run() {
42
						fireMapChange(Diffs.createMapDiffSingleChange(
43
								event.getSource(), event.getOldValue(), event
44
								.getNewValue()));
45
					}
46
				});
47
			}
48
		}
49
	};
50
51
	private ListenerSupport listenerSupport;
52
53
	private boolean updating = false;
54
55
	private boolean attachListeners;
56
57
	/**
58
	 * @param domain
59
	 * @param propertyDescriptor
60
	 */
61
	public JavaBeanObservableMap(IObservableSet domain,
62
			PropertyDescriptor propertyDescriptor) {
63
		this(domain, propertyDescriptor, true);
64
	}
65
66
	/**
67
	 * @param domain
68
	 * @param propertyDescriptor
69
	 * @param attachListeners
70
	 */
71
	public JavaBeanObservableMap(IObservableSet domain,
72
			PropertyDescriptor propertyDescriptor, boolean attachListeners) {
73
		super(domain, propertyDescriptor.getPropertyType());
74
75
		this.propertyDescriptor = propertyDescriptor;
76
		this.attachListeners = attachListeners;
77
		if (attachListeners) {
78
			this.listenerSupport = new ListenerSupport(elementListener,
79
					propertyDescriptor.getName());
80
		}
81
	}
82
83
	protected void hookListener(Object domainElement) {
84
		if (attachListeners && domainElement != null) {
85
			listenerSupport.hookListener(domainElement);
86
		}
87
	}
88
89
	protected void unhookListener(Object domainElement) {
90
		if (attachListeners && domainElement != null) {
91
			listenerSupport.unhookListener(domainElement);
92
		}
93
	}
94
95
	protected Object doGet(Object key) {
96
		if (key == null) {
97
			return null;
98
		}
99
		try {
100
			Method readMethod = propertyDescriptor.getReadMethod();
101
			if (!readMethod.isAccessible()) {
102
				readMethod.setAccessible(true);
103
			}
104
			return readMethod.invoke(key, new Object[0]);
105
		} catch (Exception e) {
106
			Policy.getLog().log(
107
					new Status(IStatus.ERROR, Policy.JFACE_DATABINDING,
108
							IStatus.ERROR, "cannot get value", e)); //$NON-NLS-1$
109
			throw new RuntimeException(e);
110
		}
111
	}
112
113
	protected Object doPut(Object key, Object value) {
114
		try {
115
			Object oldValue = get(key);
116
			propertyDescriptor.getWriteMethod().invoke(key,
117
					new Object[] { value });
118
			keySet().add(key);
119
			return oldValue;
120
		} catch (Exception e) {
121
			Policy.getLog().log(
122
					new Status(IStatus.ERROR, Policy.JFACE_DATABINDING,
123
							IStatus.ERROR, "cannot set value", e)); //$NON-NLS-1$
124
			throw new RuntimeException(e);
125
		}
126
	}
127
128
	/* (non-Javadoc)
129
	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getObserved()
130
	 */
131
	public Object getObserved() {
132
		return keySet();
133
	}
134
135
	/* (non-Javadoc)
136
	 * @see org.eclipse.core.databinding.beans.IBeanObservable#getPropertyDescriptor()
137
	 */
138
	public PropertyDescriptor getPropertyDescriptor() {
139
		return propertyDescriptor;
140
	}
141
}
(-)src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableList.java (-410 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006-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
 *     Brad Reynolds - bug 171616
11
 *     Matthew Hall - bugs 208858, 221351, 213145, 223164
12
 *     Mike Evans - bug 217558
13
 *******************************************************************************/
14
15
package org.eclipse.core.internal.databinding.beans;
16
17
import java.beans.PropertyChangeListener;
18
import java.beans.PropertyDescriptor;
19
import java.lang.reflect.Array;
20
import java.lang.reflect.InvocationTargetException;
21
import java.lang.reflect.Method;
22
import java.util.ArrayList;
23
import java.util.Arrays;
24
import java.util.Collection;
25
import java.util.Iterator;
26
import java.util.List;
27
28
import org.eclipse.core.databinding.BindingException;
29
import org.eclipse.core.databinding.beans.IBeanObservable;
30
import org.eclipse.core.databinding.observable.Diffs;
31
import org.eclipse.core.databinding.observable.Realm;
32
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
33
import org.eclipse.core.databinding.observable.list.ObservableList;
34
35
/**
36
 * @since 1.0
37
 * 
38
 */
39
public class JavaBeanObservableList extends ObservableList implements
40
		IBeanObservable {
41
42
	private final Object object;
43
44
	private PropertyChangeListener collectionListener = new PropertyChangeListener() {
45
		public void propertyChange(java.beans.PropertyChangeEvent event) {
46
			if (!updating) {
47
				getRealm().exec(new Runnable() {
48
					public void run() {
49
						updateWrappedList( new ArrayList( Arrays.asList(getValues() ) ) );
50
					}
51
				});
52
			}
53
		}
54
	};
55
56
	private boolean updating = false;
57
58
	private PropertyDescriptor descriptor;
59
60
	private ListenerSupport collectionListenSupport;
61
62
	private boolean attachListeners;
63
64
	/**
65
	 * @param realm
66
	 * @param object
67
	 * @param descriptor
68
	 * @param elementType
69
	 */
70
	public JavaBeanObservableList(Realm realm, Object object,
71
			PropertyDescriptor descriptor, Class elementType) {
72
		this(realm, object, descriptor, elementType, true);
73
	}
74
75
	/**
76
	 * @param realm
77
	 * @param object
78
	 * @param descriptor
79
	 * @param elementType
80
	 * @param attachListeners
81
	 */
82
	public JavaBeanObservableList(Realm realm, Object object,
83
			PropertyDescriptor descriptor, Class elementType,
84
			boolean attachListeners) {
85
86
		super(realm, new ArrayList(), elementType);
87
		this.object = object;
88
		this.descriptor = descriptor;
89
		this.attachListeners = attachListeners;
90
91
		if (attachListeners) {
92
			this.collectionListenSupport = new ListenerSupport(
93
					collectionListener, descriptor.getName());
94
		}
95
96
		// initialize list without firing events
97
		wrappedList.addAll(Arrays.asList(getValues()));
98
	}
99
100
	protected void firstListenerAdded() {
101
		if (attachListeners) {
102
			collectionListenSupport.hookListener(this.object);
103
		}
104
	}
105
106
	protected void lastListenerRemoved() {
107
		if (collectionListenSupport != null) {
108
			collectionListenSupport.dispose();
109
		}
110
	}
111
112
	public synchronized void dispose() {
113
		super.dispose();
114
		lastListenerRemoved();
115
	}
116
117
	private Object primGetValues() {
118
		Exception ex = null;
119
		try {
120
			Method readMethod = descriptor.getReadMethod();
121
			if (!readMethod.isAccessible()) {
122
				readMethod.setAccessible(true);
123
			}
124
			return readMethod.invoke(object, new Object[0]);
125
		} catch (IllegalArgumentException e) {
126
			ex = e;
127
		} catch (IllegalAccessException e) {
128
			ex = e;
129
		} catch (InvocationTargetException e) {
130
			ex = e;
131
		}
132
		throw new BindingException("Could not read collection values", ex); //$NON-NLS-1$
133
	}
134
135
	private Object[] getValues() {
136
		Object[] values = null;
137
138
		Object result = primGetValues();
139
		if (descriptor.getPropertyType().isArray())
140
			values = (Object[]) result;
141
		else {
142
			// TODO add jUnit for POJO (var. SettableValue) collections
143
			Collection list = (Collection) result;
144
			if (list != null) {
145
				values = list.toArray();
146
			}
147
		}
148
		if (values == null)
149
			values = new Object[0];
150
		return values;
151
	}
152
153
	public Object getObserved() {
154
		return object;
155
	}
156
157
	public PropertyDescriptor getPropertyDescriptor() {
158
		return descriptor;
159
	}
160
161
	private void setValues() {
162
		if (descriptor.getPropertyType().isArray()) {
163
			Class componentType = descriptor.getPropertyType()
164
					.getComponentType();
165
			Object[] newArray = (Object[]) Array.newInstance(componentType,
166
					wrappedList.size());
167
			wrappedList.toArray(newArray);
168
			primSetValues(newArray);
169
		} else {
170
			// assume that it is a java.util.List
171
			primSetValues(new ArrayList(wrappedList));
172
		}
173
	}
174
175
	private void primSetValues(Object newValue) {
176
		Exception ex = null;
177
		try {
178
			Method writeMethod = descriptor.getWriteMethod();
179
			if (!writeMethod.isAccessible()) {
180
				writeMethod.setAccessible(true);
181
			}
182
			writeMethod.invoke(object, new Object[] { newValue });
183
			return;
184
		} catch (IllegalArgumentException e) {
185
			ex = e;
186
		} catch (IllegalAccessException e) {
187
			ex = e;
188
		} catch (InvocationTargetException e) {
189
			ex = e;
190
		}
191
		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
192
	}
193
194
	public Object set(int index, Object element) {
195
		getterCalled();
196
		updating = true;
197
		try {
198
			Object oldElement = wrappedList.set(index, element);
199
			setValues();
200
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
201
					index, false, oldElement), Diffs.createListDiffEntry(index,
202
					true, element)));
203
			return oldElement;
204
		} finally {
205
			updating = false;
206
		}
207
	}
208
209
	public Object move(int oldIndex, int newIndex) {
210
		getterCalled();
211
		updating = true;
212
		try {
213
			int size = wrappedList.size();
214
			if (oldIndex < 0 || oldIndex >= size)
215
				throw new IndexOutOfBoundsException(
216
						"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
217
			if (newIndex < 0 || newIndex >= size)
218
				throw new IndexOutOfBoundsException(
219
						"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
220
			if (oldIndex == newIndex)
221
				return wrappedList.get(oldIndex);
222
			Object element = wrappedList.remove(oldIndex);
223
			wrappedList.add(newIndex, element);
224
			setValues();
225
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
226
					oldIndex, false, element), Diffs.createListDiffEntry(
227
					newIndex, true, element)));
228
			return element;
229
		} finally {
230
			updating = false;
231
		}
232
	}
233
234
	public Object remove(int index) {
235
		getterCalled();
236
		updating = true;
237
		try {
238
			Object oldElement = wrappedList.remove(index);
239
			setValues();
240
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
241
					index, false, oldElement)));
242
			return oldElement;
243
		} finally {
244
			updating = false;
245
		}
246
	}
247
248
	public boolean add(Object element) {
249
		updating = true;
250
		try {
251
			int index = wrappedList.size();
252
			boolean result = wrappedList.add(element);
253
			setValues();
254
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
255
					index, true, element)));
256
			return result;
257
		} finally {
258
			updating = false;
259
		}
260
	}
261
262
	public void add(int index, Object element) {
263
		updating = true;
264
		try {
265
			wrappedList.add(index, element);
266
			setValues();
267
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
268
					index, true, element)));
269
		} finally {
270
			updating = false;
271
		}
272
	}
273
274
	public boolean addAll(Collection c) {
275
		if (c.isEmpty()) {
276
			return false;
277
		}
278
		updating = true;
279
		try {
280
			int index = wrappedList.size();
281
			boolean result = wrappedList.addAll(c);
282
			setValues();
283
			ListDiffEntry[] entries = new ListDiffEntry[c.size()];
284
			int i = 0;
285
			for (Iterator it = c.iterator(); it.hasNext();) {
286
				Object o = it.next();
287
				entries[i++] = Diffs.createListDiffEntry(index++, true, o);
288
			}
289
			fireListChange(Diffs.createListDiff(entries));
290
			return result;
291
		} finally {
292
			updating = false;
293
		}
294
	}
295
296
	public boolean addAll(int index, Collection c) {
297
		if (c.isEmpty()) {
298
			return false;
299
		}
300
		updating = true;
301
		try {
302
			boolean result = wrappedList.addAll(index, c);
303
			setValues();
304
			ListDiffEntry[] entries = new ListDiffEntry[c.size()];
305
			int i = 0;
306
			for (Iterator it = c.iterator(); it.hasNext();) {
307
				Object o = it.next();
308
				entries[i++] = Diffs.createListDiffEntry(index++, true, o);
309
			}
310
			fireListChange(Diffs.createListDiff(entries));
311
			return result;
312
		} finally {
313
			updating = false;
314
		}
315
	}
316
317
	public boolean remove(Object o) {
318
		getterCalled();
319
		int index = wrappedList.indexOf(o);
320
		if (index == -1) {
321
			return false;
322
		}
323
		updating = true;
324
		try {
325
			Object oldElement = wrappedList.remove(index);
326
			setValues();
327
			fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(
328
					index, false, oldElement)));
329
			return true;
330
		} finally {
331
			updating = false;
332
		}
333
	}
334
335
	public boolean removeAll(Collection c) {
336
		getterCalled();
337
		boolean changed = false;
338
		updating = true;
339
		try {
340
			List diffEntries = new ArrayList();
341
			for (Iterator it = c.iterator(); it.hasNext();) {
342
				Object o = it.next();
343
				int index = wrappedList.indexOf(o);
344
				if (index != -1) {
345
					changed = true;
346
					Object oldElement = wrappedList.remove(index);
347
					diffEntries.add(Diffs.createListDiffEntry(index, false,
348
							oldElement));
349
				}
350
			}
351
			if (changed) {
352
				setValues();
353
				fireListChange(Diffs
354
						.createListDiff((ListDiffEntry[]) diffEntries
355
								.toArray(new ListDiffEntry[diffEntries.size()])));
356
			}
357
			return changed;
358
		} finally {
359
			updating = false;
360
		}
361
	}
362
363
	public boolean retainAll(Collection c) {
364
		getterCalled();
365
		boolean changed = false;
366
		updating = true;
367
		try {
368
			List diffEntries = new ArrayList();
369
			int index = 0;
370
			for (Iterator it = wrappedList.iterator(); it.hasNext();) {
371
				Object o = it.next();
372
				boolean retain = c.contains(o);
373
				if (retain) {
374
					index++;
375
				} else {
376
					changed = true;
377
					it.remove();
378
					diffEntries.add(Diffs.createListDiffEntry(index, false, o));
379
				}
380
			}
381
			if (changed) {
382
				setValues();
383
				fireListChange(Diffs
384
						.createListDiff((ListDiffEntry[]) diffEntries
385
								.toArray(new ListDiffEntry[diffEntries.size()])));
386
			}
387
			return changed;
388
		} finally {
389
			updating = false;
390
		}
391
	}
392
393
	public void clear() {
394
		updating = true;
395
		try {
396
			List diffEntries = new ArrayList();
397
			for (Iterator it = wrappedList.iterator(); it.hasNext();) {
398
				Object o = it.next();
399
				diffEntries.add(Diffs.createListDiffEntry(0, false, o));
400
			}
401
			wrappedList.clear();
402
			setValues();
403
			fireListChange(Diffs.createListDiff((ListDiffEntry[]) diffEntries
404
					.toArray(new ListDiffEntry[diffEntries.size()])));
405
		} finally {
406
			updating = false;
407
		}
408
	}
409
410
}
(-)src/org/eclipse/core/internal/databinding/beans/JavaBeanPropertyObservableMap.java (-259 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 221704)
10
 *     Matthew Hall - bug 223164, 226289
11
 *******************************************************************************/
12
13
package org.eclipse.core.internal.databinding.beans;
14
15
import java.beans.PropertyChangeEvent;
16
import java.beans.PropertyChangeListener;
17
import java.beans.PropertyDescriptor;
18
import java.lang.reflect.InvocationTargetException;
19
import java.lang.reflect.Method;
20
import java.util.Collections;
21
import java.util.HashMap;
22
import java.util.HashSet;
23
import java.util.Iterator;
24
import java.util.Map;
25
import java.util.Set;
26
27
import org.eclipse.core.databinding.BindingException;
28
import org.eclipse.core.databinding.beans.IBeanObservable;
29
import org.eclipse.core.databinding.observable.Diffs;
30
import org.eclipse.core.databinding.observable.Realm;
31
import org.eclipse.core.databinding.observable.map.ObservableMap;
32
import org.eclipse.core.internal.databinding.Util;
33
import org.eclipse.core.runtime.Assert;
34
35
/**
36
 * @since 1.0
37
 * 
38
 */
39
public class JavaBeanPropertyObservableMap extends ObservableMap implements
40
		IBeanObservable {
41
42
	private final Object object;
43
44
	private Object keyType;
45
	private Object valueType;
46
47
	private PropertyChangeListener mapListener = new PropertyChangeListener() {
48
		public void propertyChange(final PropertyChangeEvent event) {
49
			if (!updating) {
50
				getRealm().exec(new Runnable() {
51
					public void run() {
52
						Map oldValue = wrappedMap;
53
						Map newValue = (Map) event.getNewValue();
54
						wrappedMap = new HashMap(newValue);
55
						
56
						fireMapChange(Diffs.computeMapDiff(oldValue, newValue));
57
					}
58
				});
59
			}
60
		}
61
	};
62
63
	private boolean updating = false;
64
65
	private PropertyDescriptor descriptor;
66
67
	private ListenerSupport collectionListenSupport;
68
69
	private boolean attachListeners;
70
71
	/**
72
	 * @param realm
73
	 * @param object
74
	 * @param descriptor
75
	 * @param keyType
76
	 * @param valueType
77
	 */
78
	public JavaBeanPropertyObservableMap(Realm realm, Object object,
79
			PropertyDescriptor descriptor, Object keyType, Object valueType) {
80
		this(realm, object, descriptor, keyType, valueType, true);
81
	}
82
83
	/**
84
	 * @param realm
85
	 * @param object
86
	 * @param descriptor
87
	 * @param keyType
88
	 * @param valueType
89
	 * @param attachListeners
90
	 */
91
	public JavaBeanPropertyObservableMap(Realm realm, Object object,
92
			PropertyDescriptor descriptor, Object keyType, Object valueType,
93
			boolean attachListeners) {
94
		super(realm, new HashMap());
95
		this.object = object;
96
		this.descriptor = descriptor;
97
		this.keyType = keyType;
98
		this.valueType = valueType;
99
		this.attachListeners = attachListeners;
100
		if (attachListeners) {
101
			this.collectionListenSupport = new ListenerSupport(mapListener,
102
					descriptor.getName());
103
		}
104
105
		wrappedMap.putAll(getMap());
106
	}
107
108
	public Object getKeyType() {
109
		return keyType;
110
	}
111
112
	public Object getValueType() {
113
		return valueType;
114
	}
115
116
	protected void firstListenerAdded() {
117
		if (attachListeners) {
118
			collectionListenSupport.hookListener(this.object);
119
		}
120
	}
121
122
	protected void lastListenerRemoved() {
123
		if (collectionListenSupport != null) {
124
			collectionListenSupport.dispose();
125
		}
126
	}
127
128
	private Object primGetMap() {
129
		try {
130
			Method readMethod = descriptor.getReadMethod();
131
			if (!readMethod.isAccessible()) {
132
				readMethod.setAccessible(true);
133
			}
134
			return readMethod.invoke(object, new Object[0]);
135
		} catch (IllegalArgumentException e) {
136
		} catch (IllegalAccessException e) {
137
		} catch (InvocationTargetException e) {
138
		}
139
		Assert.isTrue(false, "Could not read collection values"); //$NON-NLS-1$
140
		return null;
141
	}
142
143
	private void primSetMap(Object newValue) {
144
		Exception ex = null;
145
		try {
146
			Method writeMethod = descriptor.getWriteMethod();
147
			if (!writeMethod.isAccessible()) {
148
				writeMethod.setAccessible(true);
149
			}
150
			writeMethod.invoke(object, new Object[] { newValue });
151
			return;
152
		} catch (IllegalArgumentException e) {
153
			ex = e;
154
		} catch (IllegalAccessException e) {
155
			ex = e;
156
		} catch (InvocationTargetException e) {
157
			ex = e;
158
		}
159
		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
160
	}
161
162
	private Map getMap() {
163
		Map result = (Map) primGetMap();
164
165
		if (result == null)
166
			result = new HashMap();
167
		return result;
168
	}
169
170
	private void setMap() {
171
		primSetMap(new HashMap(wrappedMap));
172
	}
173
174
	public Object put(Object key, Object value) {
175
		checkRealm();
176
		updating = true;
177
		try {
178
			Object result = wrappedMap.put(key, value);
179
			if (!Util.equals(result, value)) {
180
				setMap();
181
				if (result == null) {
182
					fireMapChange(Diffs.createMapDiffSingleAdd(key, value));
183
				} else {
184
					fireMapChange(Diffs.createMapDiffSingleChange(key, result,
185
							value));
186
				}
187
			}
188
			return result;
189
		} finally {
190
			updating = false;
191
		}
192
	}
193
194
	public void putAll(Map map) {
195
		checkRealm();
196
		updating = true;
197
		try {
198
			Set addedKeys = new HashSet(map.size());
199
			Map changes = new HashMap(map.size());
200
			for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
201
				Map.Entry entry = (Entry) it.next();
202
				Object key = entry.getKey();
203
				Object newValue = entry.getValue();
204
				Object oldValue = wrappedMap.put(key, newValue);
205
				if (oldValue == null) {
206
					addedKeys.add(key);
207
				} else if (!Util.equals(oldValue, newValue)) {
208
					changes.put(key, oldValue);
209
				}
210
			}
211
			if (!addedKeys.isEmpty() || !changes.isEmpty()) {
212
				setMap();
213
				fireMapChange(Diffs.createMapDiff(addedKeys,
214
						Collections.EMPTY_SET, changes.keySet(), changes,
215
						wrappedMap));
216
			}
217
		} finally {
218
			updating = false;
219
		}
220
	}
221
222
	public Object remove(Object key) {
223
		checkRealm();
224
		updating = true;
225
		try {
226
			Object result = wrappedMap.remove(key);
227
			if (result!=null) {
228
				setMap();
229
				fireMapChange(Diffs.createMapDiffSingleRemove(key, result));
230
			}
231
			return result;
232
		} finally {
233
			updating = false;
234
		}
235
	}
236
237
	public void clear() {
238
		checkRealm();
239
		if (wrappedMap.isEmpty())
240
			return;
241
		updating = true;
242
		try {
243
			Map oldMap = wrappedMap;
244
			wrappedMap = new HashMap();
245
			setMap();
246
			fireMapChange(Diffs.computeMapDiff(oldMap, Collections.EMPTY_MAP));
247
		} finally {
248
			updating = false;
249
		}
250
	}
251
252
	public Object getObserved() {
253
		return object;
254
	}
255
256
	public PropertyDescriptor getPropertyDescriptor() {
257
		return descriptor;
258
	}
259
}
(-)src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableSet.java (-306 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006-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
 *     Brad Reynolds - bug 171616
11
 *     Matthew Hall - bug 221351, 223164
12
 *******************************************************************************/
13
14
package org.eclipse.core.internal.databinding.beans;
15
16
import java.beans.PropertyChangeListener;
17
import java.beans.PropertyDescriptor;
18
import java.lang.reflect.Array;
19
import java.lang.reflect.InvocationTargetException;
20
import java.lang.reflect.Method;
21
import java.util.Arrays;
22
import java.util.Collection;
23
import java.util.Collections;
24
import java.util.HashSet;
25
import java.util.Iterator;
26
import java.util.Set;
27
28
import org.eclipse.core.databinding.BindingException;
29
import org.eclipse.core.databinding.beans.IBeanObservable;
30
import org.eclipse.core.databinding.observable.Diffs;
31
import org.eclipse.core.databinding.observable.Realm;
32
import org.eclipse.core.databinding.observable.set.ObservableSet;
33
import org.eclipse.core.runtime.Assert;
34
35
/**
36
 * @since 1.0
37
 * 
38
 */
39
public class JavaBeanObservableSet extends ObservableSet implements IBeanObservable {
40
41
	private final Object object;
42
43
	private PropertyChangeListener collectionListener = new PropertyChangeListener() {
44
		public void propertyChange(java.beans.PropertyChangeEvent event) {
45
			if (!updating) {
46
				getRealm().exec(new Runnable() {
47
					public void run() {
48
						Set newElements = new HashSet(Arrays
49
								.asList(getValues()));
50
						Set addedElements = new HashSet(newElements);
51
						Set removedElements = new HashSet(wrappedSet);
52
						// remove all new elements from old elements to compute
53
						// the removed elements
54
						removedElements.removeAll(newElements);
55
						addedElements.removeAll(wrappedSet);
56
						wrappedSet = newElements;
57
						fireSetChange(Diffs.createSetDiff(addedElements,
58
								removedElements));
59
					}
60
				});
61
			}
62
		}
63
	};
64
65
	private boolean updating = false;
66
67
	private PropertyDescriptor descriptor;
68
69
	private ListenerSupport collectionListenSupport;
70
71
	private boolean attachListeners;
72
73
	/**
74
	 * @param realm
75
	 * @param object
76
	 * @param descriptor
77
	 * @param elementType
78
	 */
79
	public JavaBeanObservableSet(Realm realm, Object object,
80
			PropertyDescriptor descriptor, Class elementType) {
81
		this(realm, object, descriptor, elementType, true);
82
	}
83
84
	/**
85
	 * @param realm
86
	 * @param object
87
	 * @param descriptor
88
	 * @param elementType
89
	 * @param attachListeners
90
	 */
91
	public JavaBeanObservableSet(Realm realm, Object object,
92
			PropertyDescriptor descriptor, Class elementType,
93
			boolean attachListeners) {
94
		super(realm, new HashSet(), elementType);
95
		this.object = object;
96
		this.descriptor = descriptor;
97
		this.attachListeners = attachListeners;
98
		if (attachListeners) {
99
			this.collectionListenSupport = new ListenerSupport(
100
					collectionListener, descriptor.getName());
101
		}
102
103
		wrappedSet.addAll(Arrays.asList(getValues()));
104
	}
105
106
	protected void firstListenerAdded() {
107
		if (attachListeners) {
108
			collectionListenSupport.hookListener(this.object);
109
		}
110
	}
111
112
	protected void lastListenerRemoved() {
113
		if (collectionListenSupport != null) {
114
			collectionListenSupport.dispose();
115
		}
116
	}
117
118
	private Object primGetValues() {
119
		try {
120
			Method readMethod = descriptor.getReadMethod();
121
			if (!readMethod.isAccessible()) {
122
				readMethod.setAccessible(true);
123
			}
124
			return readMethod.invoke(object, new Object[0]);
125
		} catch (IllegalArgumentException e) {
126
		} catch (IllegalAccessException e) {
127
		} catch (InvocationTargetException e) {
128
		}
129
		Assert.isTrue(false, "Could not read collection values"); //$NON-NLS-1$
130
		return null;
131
	}
132
133
	private Object[] getValues() {
134
		Object[] values = null;
135
136
		Object result = primGetValues();
137
		if (descriptor.getPropertyType().isArray())
138
			values = (Object[]) result;
139
		else {
140
			// TODO add jUnit for POJO (var. SettableValue) collections
141
			Collection list = (Collection) result;
142
			if (list != null)
143
				values = list.toArray();
144
		}
145
		if (values == null)
146
			values = new Object[0];
147
		return values;
148
	}
149
150
	private void setValues() {
151
		if (descriptor.getPropertyType().isArray()) {
152
			Class componentType = descriptor.getPropertyType()
153
					.getComponentType();
154
			Object[] newArray = (Object[]) Array.newInstance(componentType,
155
					wrappedSet.size());
156
			wrappedSet.toArray(newArray);
157
			primSetValues(newArray);
158
		} else {
159
			// assume that it is a java.util.Set
160
			primSetValues(new HashSet(wrappedSet));
161
		}
162
	}
163
164
	public boolean add(Object o) {
165
		getterCalled();
166
		updating = true;
167
		try {
168
			boolean added = wrappedSet.add(o);
169
			if (added) {
170
				setValues();
171
				fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
172
						Collections.EMPTY_SET));
173
			}
174
			return added;
175
		} finally {
176
			updating = false;
177
		}
178
	}
179
180
	public boolean remove(Object o) {
181
		getterCalled();
182
		updating = true;
183
		try {
184
			boolean removed = wrappedSet.remove(o);
185
			if (removed) {
186
				setValues();
187
				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
188
						Collections.singleton(o)));
189
			}
190
			return removed;
191
		} finally {
192
			updating = false;
193
		}
194
	}
195
196
	public boolean addAll(Collection c) {
197
		getterCalled();
198
		updating = true;
199
		try {
200
			Set additions = new HashSet();
201
			for (Iterator iterator = c.iterator(); iterator.hasNext();) {
202
				Object element = iterator.next();
203
				if (wrappedSet.add(element))
204
					additions.add(element);
205
			}
206
			boolean changed = !additions.isEmpty();
207
			if (changed) {
208
				setValues();
209
				fireSetChange(Diffs.createSetDiff(additions,
210
						Collections.EMPTY_SET));
211
			}
212
			return changed;
213
		} finally {
214
			updating = false;
215
		}
216
	}
217
218
	public boolean removeAll(Collection c) {
219
		getterCalled();
220
		updating = true;
221
		try {
222
			Set removals = new HashSet();
223
			for (Iterator iterator = c.iterator(); iterator.hasNext();) {
224
				Object element = iterator.next();
225
				if (wrappedSet.remove(element))
226
					removals.add(element);
227
			}
228
			boolean changed = !removals.isEmpty();
229
			if (changed) {
230
				setValues();
231
				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
232
						removals));
233
			}
234
			return changed;
235
		} finally {
236
			updating = false;
237
		}
238
	}
239
240
	public boolean retainAll(Collection c) {
241
		getterCalled();
242
		updating = true;
243
		try {
244
			Set removals = new HashSet();
245
			for (Iterator iterator = wrappedSet.iterator(); iterator.hasNext();) {
246
				Object element = iterator.next();
247
				if (!c.contains(element)) {
248
					iterator.remove();
249
					removals.add(element);
250
				}
251
			}
252
			boolean changed = !removals.isEmpty();
253
			if (changed) {
254
				setValues();
255
				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
256
						removals));
257
			}
258
			return changed;
259
		} finally {
260
			updating = false;
261
		}
262
	}
263
264
	public void clear() {
265
		getterCalled();
266
		if (wrappedSet.isEmpty())
267
			return;
268
269
		updating = true;
270
		try {
271
			Set removals = new HashSet(wrappedSet);
272
			wrappedSet.clear();
273
			setValues();
274
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
275
		} finally {
276
			updating = false;
277
		}
278
	}
279
280
	private void primSetValues(Object newValue) {
281
		Exception ex = null;
282
		try {
283
			Method writeMethod = descriptor.getWriteMethod();
284
			if (!writeMethod.isAccessible()) {
285
				writeMethod.setAccessible(true);
286
			}
287
			writeMethod.invoke(object, new Object[] { newValue });
288
			return;
289
		} catch (IllegalArgumentException e) {
290
			ex = e;
291
		} catch (IllegalAccessException e) {
292
			ex = e;
293
		} catch (InvocationTargetException e) {
294
			ex = e;
295
		}
296
		throw new BindingException("Could not write collection values", ex); //$NON-NLS-1$
297
	}
298
299
	public Object getObserved() {
300
		return object;
301
	}
302
303
	public PropertyDescriptor getPropertyDescriptor() {
304
		return descriptor;
305
	}
306
}
(-)src/org/eclipse/core/internal/databinding/beans/JavaBeanObservableValue.java (-190 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Brad Reynolds - bug 164134, 171616
12
 *******************************************************************************/
13
package org.eclipse.core.internal.databinding.beans;
14
15
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyDescriptor;
17
import java.lang.reflect.InvocationTargetException;
18
import java.lang.reflect.Method;
19
20
import org.eclipse.core.databinding.BindingException;
21
import org.eclipse.core.databinding.beans.BeansObservables;
22
import org.eclipse.core.databinding.beans.IBeanObservable;
23
import org.eclipse.core.databinding.observable.Diffs;
24
import org.eclipse.core.databinding.observable.Realm;
25
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
26
import org.eclipse.core.databinding.observable.value.ValueDiff;
27
import org.eclipse.core.databinding.util.Policy;
28
import org.eclipse.core.internal.databinding.Util;
29
import org.eclipse.core.runtime.IStatus;
30
import org.eclipse.core.runtime.Status;
31
32
/**
33
 * @since 1.0
34
 * 
35
 */
36
public class JavaBeanObservableValue extends AbstractObservableValue implements IBeanObservable {
37
	private final Object object;
38
	private boolean updating = false;
39
40
	private final PropertyDescriptor propertyDescriptor;
41
	private ListenerSupport listenerSupport;
42
43
	private boolean attachListeners;
44
45
	/**
46
	 * @param realm
47
	 * @param object
48
	 * @param descriptor
49
	 */
50
	public JavaBeanObservableValue(Realm realm, Object object,
51
			PropertyDescriptor descriptor) {
52
		this(realm, object, descriptor, true);
53
	}
54
55
	/**
56
	 * @param realm
57
	 * @param object
58
	 * @param descriptor
59
	 * @param attachListeners
60
	 */
61
	public JavaBeanObservableValue(Realm realm, Object object,
62
			PropertyDescriptor descriptor, boolean attachListeners) {
63
		super(realm);
64
		this.object = object;
65
		this.propertyDescriptor = descriptor;
66
		this.attachListeners = attachListeners;
67
	}
68
69
	protected void firstListenerAdded() {
70
		if (!attachListeners) {
71
			return;
72
		}
73
			
74
		PropertyChangeListener listener = new PropertyChangeListener() {
75
			public void propertyChange(java.beans.PropertyChangeEvent event) {
76
				if (!updating) {
77
					final ValueDiff diff = Diffs.createValueDiff(event.getOldValue(),
78
											event.getNewValue());
79
					getRealm().exec(new Runnable(){
80
						public void run() {
81
							fireValueChange(diff);
82
						}});
83
				}
84
			}
85
		};
86
		
87
		if (listenerSupport == null) {
88
			listenerSupport = new ListenerSupport(listener, propertyDescriptor.getName());
89
		}
90
		
91
		listenerSupport.hookListener(object);
92
	}
93
94
	public void doSetValue(Object value) {
95
		updating = true;
96
		try {
97
			Object oldValue = doGetValue();
98
			
99
			if (Util.equals(oldValue, value)) {
100
				return;
101
			}
102
			
103
			Method writeMethod = propertyDescriptor.getWriteMethod();
104
			if (!writeMethod.isAccessible()) {
105
				writeMethod.setAccessible(true);
106
			}
107
			writeMethod.invoke(object, new Object[] { value });
108
			fireValueChange(Diffs.createValueDiff(oldValue, doGetValue()));
109
		} catch (InvocationTargetException e) {
110
			/*
111
			 * InvocationTargetException wraps any exception thrown by the
112
			 * invoked method.
113
			 */
114
			throw new RuntimeException(e.getCause());
115
		} catch (Exception e) {
116
			if (BeansObservables.DEBUG) {
117
				Policy
118
						.getLog()
119
						.log(
120
								new Status(
121
										IStatus.WARNING,
122
										Policy.JFACE_DATABINDING,
123
										IStatus.OK,
124
										"Could not change value of " + object + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
125
			}
126
		} finally {
127
			updating = false;
128
		}
129
	}
130
131
	public Object doGetValue() {
132
		try {
133
			Method readMethod = propertyDescriptor.getReadMethod();
134
			if (readMethod == null) {
135
				throw new BindingException(propertyDescriptor.getName()
136
						+ " property does not have a read method."); //$NON-NLS-1$
137
			}
138
			if (!readMethod.isAccessible()) {
139
				readMethod.setAccessible(true);
140
			}
141
			return readMethod.invoke(object, null);
142
		} catch (InvocationTargetException e) {
143
			/*
144
			 * InvocationTargetException wraps any exception thrown by the
145
			 * invoked method.
146
			 */
147
			throw new RuntimeException(e.getCause());
148
		} catch (Exception e) {
149
			if (BeansObservables.DEBUG) {
150
				Policy
151
						.getLog()
152
						.log(
153
								new Status(
154
										IStatus.WARNING,
155
										Policy.JFACE_DATABINDING,
156
										IStatus.OK,
157
										"Could not read value of " + object + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
158
			}
159
			return null;
160
		}
161
	}
162
163
	protected void lastListenerRemoved() {
164
		unhookListener();
165
	}
166
167
	private void unhookListener() {
168
		if (listenerSupport != null) {
169
			listenerSupport.dispose();
170
			listenerSupport = null;
171
		}
172
	}
173
174
	public Object getValueType() {
175
		return propertyDescriptor.getPropertyType();
176
	}
177
178
	public Object getObserved() {
179
		return object;
180
	}
181
182
	public PropertyDescriptor getPropertyDescriptor() {
183
		return propertyDescriptor;
184
	}
185
186
	public synchronized void dispose() {
187
		unhookListener();
188
		super.dispose();
189
	}
190
}
(-)src/org/eclipse/core/databinding/beans/BeansObservables.java (-100 / +45 lines)
Lines 8-24 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Brad Reynolds - bugs 164268, 171616, 147515
10
 *     Brad Reynolds - bugs 164268, 171616, 147515
11
 *     Matthew Hall - bug 221704, 234686, 246625, 226289
11
 *     Matthew Hall - bug 221704, 234686, 246625, 226289, 194734
12
 *     Thomas Kratz - bug 213787
12
 *     Thomas Kratz - bug 213787
13
 *******************************************************************************/
13
 *******************************************************************************/
14
package org.eclipse.core.databinding.beans;
14
package org.eclipse.core.databinding.beans;
15
15
16
import java.beans.BeanInfo;
17
import java.beans.IntrospectionException;
18
import java.beans.Introspector;
19
import java.beans.PropertyDescriptor;
16
import java.beans.PropertyDescriptor;
20
17
21
import org.eclipse.core.databinding.BindingException;
22
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
23
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
24
import org.eclipse.core.databinding.observable.list.IObservableList;
20
import org.eclipse.core.databinding.observable.list.IObservableList;
Lines 27-41 Link Here
27
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
23
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
28
import org.eclipse.core.databinding.observable.set.IObservableSet;
24
import org.eclipse.core.databinding.observable.set.IObservableSet;
29
import org.eclipse.core.databinding.observable.value.IObservableValue;
25
import org.eclipse.core.databinding.observable.value.IObservableValue;
26
import org.eclipse.core.databinding.property.PropertyObservables;
27
import org.eclipse.core.databinding.property.list.IListProperty;
28
import org.eclipse.core.databinding.property.map.IMapProperty;
29
import org.eclipse.core.databinding.property.set.ISetProperty;
30
import org.eclipse.core.databinding.property.value.IValueProperty;
30
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
31
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
31
import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
32
import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
32
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
33
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
33
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
34
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
34
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
35
import org.eclipse.core.internal.databinding.beans.BeanPropertyHelper;
35
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
36
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
37
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
38
import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
39
import org.eclipse.core.runtime.Assert;
36
import org.eclipse.core.runtime.Assert;
40
37
41
/**
38
/**
Lines 83-91 Link Here
83
	 */
80
	 */
84
	public static IObservableValue observeValue(Realm realm, Object bean,
81
	public static IObservableValue observeValue(Realm realm, Object bean,
85
			String propertyName) {
82
			String propertyName) {
86
		PropertyDescriptor descriptor = getPropertyDescriptor(bean.getClass(),
83
		IValueProperty property = BeanProperties.valueProperty(bean.getClass(),
87
				propertyName);
84
				propertyName);
88
		return new JavaBeanObservableValue(realm, bean, descriptor);
85
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
86
				.getPropertyDescriptor();
87
		return new BeanObservableValueDecorator(PropertyObservables
88
				.observeValue(realm, bean, property), propertyDescriptor);
89
	}
89
	}
90
90
91
	/**
91
	/**
Lines 103-111 Link Here
103
	 */
103
	 */
104
	public static IObservableMap observeMap(IObservableSet domain,
104
	public static IObservableMap observeMap(IObservableSet domain,
105
			Class beanClass, String propertyName) {
105
			Class beanClass, String propertyName) {
106
		PropertyDescriptor descriptor = getPropertyDescriptor(beanClass,
106
		IValueProperty property = BeanProperties.valueProperty(beanClass,
107
				propertyName);
107
				propertyName);
108
		return new JavaBeanObservableMap(domain, descriptor);
108
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
109
				.getPropertyDescriptor();
110
		return new BeanObservableMapDecorator(PropertyObservables.observeDetailValues(
111
				domain, property), propertyDescriptor);
109
	}
112
	}
110
113
111
	/**
114
	/**
Lines 149-158 Link Here
149
	 */
152
	 */
150
	public static IObservableMap observeMap(Realm realm, Object bean,
153
	public static IObservableMap observeMap(Realm realm, Object bean,
151
			String propertyName, Class keyType, Class valueType) {
154
			String propertyName, Class keyType, Class valueType) {
152
		PropertyDescriptor descriptor = getPropertyDescriptor(bean.getClass(),
155
		IMapProperty property = BeanProperties.mapProperty(bean.getClass(),
153
				propertyName);
156
				propertyName, keyType, valueType);
154
		return new JavaBeanPropertyObservableMap(realm, bean, descriptor,
157
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
155
				keyType, valueType);
158
				.getPropertyDescriptor();
159
		return new BeanObservableMapDecorator(PropertyObservables.observeMap(
160
				bean, property), propertyDescriptor);
156
	}
161
	}
157
162
158
	/**
163
	/**
Lines 193-219 Link Here
193
		return observeMap(Realm.getDefault(), bean, propertyName, keyType, valueType);
198
		return observeMap(Realm.getDefault(), bean, propertyName, keyType, valueType);
194
	}
199
	}
195
200
196
	/*package*/ static PropertyDescriptor getPropertyDescriptor(Class beanClass,
197
			String propertyName) {
198
		BeanInfo beanInfo;
199
		try {
200
			beanInfo = Introspector.getBeanInfo(beanClass);
201
		} catch (IntrospectionException e) {
202
			// cannot introspect, give up
203
			return null;
204
		}
205
		PropertyDescriptor[] propertyDescriptors = beanInfo
206
				.getPropertyDescriptors();
207
		for (int i = 0; i < propertyDescriptors.length; i++) {
208
			PropertyDescriptor descriptor = propertyDescriptors[i];
209
			if (descriptor.getName().equals(propertyName)) {
210
				return descriptor;
211
			}
212
		}
213
		throw new BindingException(
214
				"Could not find property with name " + propertyName + " in class " + beanClass); //$NON-NLS-1$ //$NON-NLS-2$
215
	}
216
217
	/**
201
	/**
218
	 * Returns an array of observable maps in the default realm tracking the
202
	 * Returns an array of observable maps in the default realm tracking the
219
	 * current values of the named propertys for the beans in the given set.
203
	 * current values of the named propertys for the beans in the given set.
Lines 299-310 Link Here
299
	 */
283
	 */
300
	public static IObservableList observeList(Realm realm, Object bean,
284
	public static IObservableList observeList(Realm realm, Object bean,
301
			String propertyName, Class elementType) {
285
			String propertyName, Class elementType) {
302
		PropertyDescriptor propertyDescriptor = getPropertyDescriptor(bean
286
		IListProperty property = BeanProperties.listProperty(bean.getClass(),
303
				.getClass(), propertyName);
287
				propertyName, elementType);
304
		elementType = getCollectionElementType(elementType, propertyDescriptor);
288
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
305
289
				.getPropertyDescriptor();
306
		return new JavaBeanObservableList(realm, bean, propertyDescriptor,
290
		return new BeanObservableListDecorator(PropertyObservables.observeList(
307
				elementType);
291
				realm, bean, property), propertyDescriptor);
308
	}
292
	}
309
293
310
	/**
294
	/**
Lines 487-496 Link Here
487
471
488
		IObservableValue value = MasterDetailObservables.detailValue(master,
472
		IObservableValue value = MasterDetailObservables.detailValue(master,
489
				valueFactory(realm, propertyName), propertyType);
473
				valueFactory(realm, propertyName), propertyType);
490
		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
474
		return new BeanObservableValueDecorator(value, BeanPropertyHelper
491
				value, getValueTypePropertyDescriptor(master, propertyName));
475
				.getValueTypePropertyDescriptor(master, propertyName));
492
493
		return decorator;
494
	}
476
	}
495
477
496
	/**
478
	/**
Lines 543-552 Link Here
543
		Assert.isNotNull(masterType, "masterType cannot be null"); //$NON-NLS-1$
525
		Assert.isNotNull(masterType, "masterType cannot be null"); //$NON-NLS-1$
544
		IObservableValue value = MasterDetailObservables.detailValue(master,
526
		IObservableValue value = MasterDetailObservables.detailValue(master,
545
				valueFactory(realm, propertyName), propertyType);
527
				valueFactory(realm, propertyName), propertyType);
546
		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
528
		return new BeanObservableValueDecorator(value, BeanPropertyHelper
547
				value, getPropertyDescriptor(masterType, propertyName));
529
				.getPropertyDescriptor(masterType, propertyName));
548
549
		return decorator;
550
	}
530
	}
551
531
552
	/**
532
	/**
Lines 597-607 Link Here
597
		IObservableList observableList = MasterDetailObservables.detailList(
577
		IObservableList observableList = MasterDetailObservables.detailList(
598
				master, listFactory(realm, propertyName, propertyType),
578
				master, listFactory(realm, propertyName, propertyType),
599
				propertyType);
579
				propertyType);
600
		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
580
		return new BeanObservableListDecorator(observableList,
601
				observableList, getValueTypePropertyDescriptor(master,
581
				BeanPropertyHelper.getValueTypePropertyDescriptor(master,
602
						propertyName));
582
						propertyName));
603
604
		return decorator;
605
	}
583
	}
606
584
607
	/**
585
	/**
Lines 645-655 Link Here
645
		IObservableSet observableSet = MasterDetailObservables.detailSet(
623
		IObservableSet observableSet = MasterDetailObservables.detailSet(
646
				master, setFactory(realm, propertyName, propertyType),
624
				master, setFactory(realm, propertyName, propertyType),
647
				propertyType);
625
				propertyType);
648
		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
626
		return new BeanObservableSetDecorator(observableSet, BeanPropertyHelper
649
				observableSet, getValueTypePropertyDescriptor(master,
627
				.getValueTypePropertyDescriptor(master, propertyName));
650
						propertyName));
651
652
		return decorator;
653
	}
628
	}
654
629
655
	/**
630
	/**
Lines 688-697 Link Here
688
			IObservableValue master, String propertyName) {
663
			IObservableValue master, String propertyName) {
689
		IObservableMap observableMap = MasterDetailObservables.detailMap(
664
		IObservableMap observableMap = MasterDetailObservables.detailMap(
690
				master, mapPropertyFactory(realm, propertyName));
665
				master, mapPropertyFactory(realm, propertyName));
691
		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
666
		return new BeanObservableMapDecorator(observableMap, BeanPropertyHelper
692
				observableMap, getValueTypePropertyDescriptor(master,
667
				.getValueTypePropertyDescriptor(master, propertyName));
693
						propertyName));
694
		return decorator;
695
	}
668
	}
696
669
697
	/**
670
	/**
Lines 734-745 Link Here
734
	 */
707
	 */
735
	public static IObservableSet observeSet(Realm realm, Object bean,
708
	public static IObservableSet observeSet(Realm realm, Object bean,
736
			String propertyName, Class elementType) {
709
			String propertyName, Class elementType) {
737
		PropertyDescriptor propertyDescriptor = getPropertyDescriptor(bean
710
		ISetProperty property = BeanProperties.setProperty(bean.getClass(),
738
				.getClass(), propertyName);
711
				propertyName, elementType);
739
		elementType = getCollectionElementType(elementType, propertyDescriptor);
712
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
740
713
				.getPropertyDescriptor();
741
		return new JavaBeanObservableSet(realm, bean, propertyDescriptor,
714
		return new BeanObservableSetDecorator(PropertyObservables.observeSet(
742
				elementType);
715
				realm, bean, property), propertyDescriptor);
743
	}
716
	}
744
717
745
	/**
718
	/**
Lines 874-905 Link Here
874
	public static IObservableFactory mapPropertyFactory(String propertyName) {
847
	public static IObservableFactory mapPropertyFactory(String propertyName) {
875
		return mapPropertyFactory(Realm.getDefault(), propertyName);
848
		return mapPropertyFactory(Realm.getDefault(), propertyName);
876
	}
849
	}
877
878
	/**
879
	 * @param elementType
880
	 *            can be <code>null</code>
881
	 * @param propertyDescriptor
882
	 * @return type of the items in a collection/array property
883
	 */
884
	/*package*/ static Class getCollectionElementType(Class elementType,
885
			PropertyDescriptor propertyDescriptor) {
886
		if (elementType == null) {
887
			Class propertyType = propertyDescriptor.getPropertyType();
888
			elementType = propertyType.isArray() ? propertyType
889
					.getComponentType() : Object.class;
890
		}
891
892
		return elementType;
893
	}
894
895
	/**
896
	 * @param observable
897
	 * @param propertyName
898
	 * @return property descriptor or <code>null</code>
899
	 */
900
	/* package*/ static PropertyDescriptor getValueTypePropertyDescriptor(
901
			IObservableValue observable, String propertyName) {
902
		return (observable.getValueType() != null) ? getPropertyDescriptor(
903
				(Class) observable.getValueType(), propertyName) : null;
904
	}
905
}
850
}
(-)src/org/eclipse/core/databinding/beans/PojoObservables.java (-50 / +46 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bugs 221704, 234686, 246625, 226289
10
 *     Matthew Hall - bugs 221704, 234686, 246625, 226289, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.core.databinding.beans;
13
package org.eclipse.core.databinding.beans;
Lines 23-37 Link Here
23
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
23
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
24
import org.eclipse.core.databinding.observable.set.IObservableSet;
24
import org.eclipse.core.databinding.observable.set.IObservableSet;
25
import org.eclipse.core.databinding.observable.value.IObservableValue;
25
import org.eclipse.core.databinding.observable.value.IObservableValue;
26
import org.eclipse.core.databinding.property.PropertyObservables;
27
import org.eclipse.core.databinding.property.list.IListProperty;
28
import org.eclipse.core.databinding.property.map.IMapProperty;
29
import org.eclipse.core.databinding.property.set.ISetProperty;
30
import org.eclipse.core.databinding.property.value.IValueProperty;
26
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
31
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
27
import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
32
import org.eclipse.core.internal.databinding.beans.BeanObservableMapDecorator;
28
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
33
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
29
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
34
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
30
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
35
import org.eclipse.core.internal.databinding.beans.BeanPropertyHelper;
31
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
32
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
33
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
34
import org.eclipse.core.internal.databinding.beans.JavaBeanPropertyObservableMap;
35
36
36
/**
37
/**
37
 * A factory for creating observable objects for POJOs (plain old java objects)
38
 * A factory for creating observable objects for POJOs (plain old java objects)
Lines 73-82 Link Here
73
	 */
74
	 */
74
	public static IObservableValue observeValue(Realm realm, Object pojo,
75
	public static IObservableValue observeValue(Realm realm, Object pojo,
75
			String propertyName) {
76
			String propertyName) {
76
77
		IValueProperty property = PojoProperties.valueProperty(pojo.getClass(),
77
		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
78
				propertyName);
78
				pojo.getClass(), propertyName);
79
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
79
		return new JavaBeanObservableValue(realm, pojo, descriptor, false);
80
				.getPropertyDescriptor();
81
		return new BeanObservableValueDecorator(PropertyObservables
82
				.observeValue(realm, pojo, property), propertyDescriptor);
80
	}
83
	}
81
84
82
	/**
85
	/**
Lines 94-102 Link Here
94
	 */
97
	 */
95
	public static IObservableMap observeMap(IObservableSet domain,
98
	public static IObservableMap observeMap(IObservableSet domain,
96
			Class pojoClass, String propertyName) {
99
			Class pojoClass, String propertyName) {
97
		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
100
		IValueProperty property = PojoProperties.valueProperty(pojoClass,
98
				pojoClass, propertyName);
101
				propertyName);
99
		return new JavaBeanObservableMap(domain, descriptor, false);
102
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
103
				.getPropertyDescriptor();
104
		return new BeanObservableMapDecorator(PropertyObservables.observeDetailValues(
105
				domain, property), propertyDescriptor);
100
	}
106
	}
101
107
102
	/**
108
	/**
Lines 161-170 Link Here
161
	 */
167
	 */
162
	public static IObservableMap observeMap(Realm realm, Object pojo,
168
	public static IObservableMap observeMap(Realm realm, Object pojo,
163
			String propertyName, Class keyType, Class valueType) {
169
			String propertyName, Class keyType, Class valueType) {
164
		PropertyDescriptor descriptor = BeansObservables.getPropertyDescriptor(
170
		IMapProperty property = PojoProperties.mapProperty(pojo.getClass(),
165
				pojo.getClass(), propertyName);
171
				propertyName, keyType, valueType);
166
		return new JavaBeanPropertyObservableMap(realm, pojo, descriptor,
172
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
167
				keyType, valueType, false);
173
				.getPropertyDescriptor();
174
		return new BeanObservableMapDecorator(PropertyObservables.observeMap(
175
				pojo, property), propertyDescriptor);
168
	}
176
	}
169
177
170
	/**
178
	/**
Lines 270-282 Link Here
270
	 */
278
	 */
271
	public static IObservableList observeList(Realm realm, Object pojo,
279
	public static IObservableList observeList(Realm realm, Object pojo,
272
			String propertyName, Class elementType) {
280
			String propertyName, Class elementType) {
273
		PropertyDescriptor propertyDescriptor = BeansObservables
281
		IListProperty property = PojoProperties.listProperty(pojo.getClass(),
274
				.getPropertyDescriptor(pojo.getClass(), propertyName);
282
				propertyName, elementType);
275
		elementType = BeansObservables.getCollectionElementType(elementType,
283
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
276
				propertyDescriptor);
284
				.getPropertyDescriptor();
277
285
		return new BeanObservableListDecorator(PropertyObservables.observeList(
278
		return new JavaBeanObservableList(realm, pojo, propertyDescriptor,
286
				realm, pojo, property), propertyDescriptor);
279
				elementType, false);
280
	}
287
	}
281
288
282
	/**
289
	/**
Lines 360-372 Link Here
360
	 */
367
	 */
361
	public static IObservableSet observeSet(Realm realm, Object pojo,
368
	public static IObservableSet observeSet(Realm realm, Object pojo,
362
			String propertyName, Class elementType) {
369
			String propertyName, Class elementType) {
363
		PropertyDescriptor propertyDescriptor = BeansObservables
370
		ISetProperty property = PojoProperties.setProperty(pojo.getClass(),
364
				.getPropertyDescriptor(pojo.getClass(), propertyName);
371
				propertyName, elementType);
365
		elementType = BeansObservables.getCollectionElementType(elementType,
372
		PropertyDescriptor propertyDescriptor = ((IBeanProperty) property)
366
				propertyDescriptor);
373
				.getPropertyDescriptor();
367
374
		return new BeanObservableSetDecorator(PropertyObservables.observeSet(
368
		return new JavaBeanObservableSet(realm, pojo, propertyDescriptor,
375
				realm, pojo, property), propertyDescriptor);
369
				elementType, false);
370
	}
376
	}
371
377
372
	/**
378
	/**
Lines 590-600 Link Here
590
596
591
		IObservableValue value = MasterDetailObservables.detailValue(master,
597
		IObservableValue value = MasterDetailObservables.detailValue(master,
592
				valueFactory(realm, propertyName), propertyType);
598
				valueFactory(realm, propertyName), propertyType);
593
		BeanObservableValueDecorator decorator = new BeanObservableValueDecorator(
599
		return new BeanObservableValueDecorator(value, BeanPropertyHelper
594
				value, BeansObservables.getValueTypePropertyDescriptor(master,
600
				.getValueTypePropertyDescriptor(master, propertyName));
595
						propertyName));
596
597
		return decorator;
598
	}
601
	}
599
602
600
	/**
603
	/**
Lines 637-647 Link Here
637
		IObservableList observableList = MasterDetailObservables.detailList(
640
		IObservableList observableList = MasterDetailObservables.detailList(
638
				master, listFactory(realm, propertyName, propertyType),
641
				master, listFactory(realm, propertyName, propertyType),
639
				propertyType);
642
				propertyType);
640
		BeanObservableListDecorator decorator = new BeanObservableListDecorator(
643
		return new BeanObservableListDecorator(observableList,
641
				observableList, BeansObservables
644
				BeanPropertyHelper.getValueTypePropertyDescriptor(master,
642
						.getValueTypePropertyDescriptor(master, propertyName));
645
						propertyName));
643
644
		return decorator;
645
	}
646
	}
646
647
647
	/**
648
	/**
Lines 685-695 Link Here
685
		IObservableSet observableSet = MasterDetailObservables.detailSet(
686
		IObservableSet observableSet = MasterDetailObservables.detailSet(
686
				master, setFactory(realm, propertyName, propertyType),
687
				master, setFactory(realm, propertyName, propertyType),
687
				propertyType);
688
				propertyType);
688
		BeanObservableSetDecorator decorator = new BeanObservableSetDecorator(
689
		return new BeanObservableSetDecorator(observableSet, BeanPropertyHelper
689
				observableSet, BeansObservables.getValueTypePropertyDescriptor(
690
				.getValueTypePropertyDescriptor(master, propertyName));
690
						master, propertyName));
691
692
		return decorator;
693
	}
691
	}
694
692
695
	/**
693
	/**
Lines 726-735 Link Here
726
			IObservableValue master, String propertyName) {
724
			IObservableValue master, String propertyName) {
727
		IObservableMap observableMap = MasterDetailObservables.detailMap(
725
		IObservableMap observableMap = MasterDetailObservables.detailMap(
728
				master, mapPropertyFactory(realm, propertyName));
726
				master, mapPropertyFactory(realm, propertyName));
729
		BeanObservableMapDecorator decorator = new BeanObservableMapDecorator(
727
		return new BeanObservableMapDecorator(observableMap, BeanPropertyHelper
730
				observableMap, BeansObservables.getValueTypePropertyDescriptor(
728
				.getValueTypePropertyDescriptor(master, propertyName));
731
						master, propertyName));
732
		return decorator;
733
	}
729
	}
734
730
735
	/**
731
	/**
(-)src/org/eclipse/core/databinding/beans/IBeanProperty.java (+30 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.beans;
13
14
import java.beans.PropertyDescriptor;
15
16
import org.eclipse.core.databinding.property.IProperty;
17
18
/**
19
 * Provides access to details of bean properties.
20
 * 
21
 * @since 1.2
22
 */
23
public interface IBeanProperty extends IProperty {
24
	/**
25
	 * Returns the property descriptor of the bean property being observed
26
	 * 
27
	 * @return the property descriptor of the bean property being observed
28
	 */
29
	public PropertyDescriptor getPropertyDescriptor();
30
}
(-)src/org/eclipse/core/internal/databinding/beans/BeanMapProperty.java (+133 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.beans;
13
14
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyDescriptor;
17
import java.util.Collections;
18
import java.util.HashMap;
19
import java.util.Map;
20
21
import org.eclipse.core.databinding.beans.IBeanProperty;
22
import org.eclipse.core.databinding.observable.Diffs;
23
import org.eclipse.core.databinding.observable.map.MapDiff;
24
import org.eclipse.core.databinding.property.map.SimpleMapProperty;
25
26
/**
27
 * @since 3.3
28
 * 
29
 */
30
public class BeanMapProperty extends SimpleMapProperty implements IBeanProperty {
31
	private PropertyDescriptor propertyDescriptor;
32
	private boolean attachListener;
33
34
	private ListenerSupport listenerSupport;
35
	private final Object keyType;
36
	private final Object valueType;
37
38
	/**
39
	 * @param propertyDescriptor
40
	 * @param keyType 
41
	 * @param valueType 
42
	 * @param attachListener
43
	 */
44
	public BeanMapProperty(PropertyDescriptor propertyDescriptor,
45
			Object keyType, Object valueType, boolean attachListener) {
46
		this.propertyDescriptor = propertyDescriptor;
47
		this.keyType = keyType;
48
		this.valueType = valueType;
49
		this.attachListener = attachListener;
50
	}
51
52
	private void initListenerSupport() {
53
		if (listenerSupport == null) {
54
			synchronized (this) {
55
				if (listenerSupport == null) {
56
					PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
57
						public void propertyChange(PropertyChangeEvent evt) {
58
							Object source = evt.getSource();
59
							if (isUpdating(source))
60
								return;
61
							Object oldValue = evt.getOldValue();
62
							Object newValue = evt.getNewValue();
63
							MapDiff diff = null;
64
							if (oldValue != null || newValue != null) {
65
								diff = Diffs.computeMapDiff(asMap(oldValue),
66
										asMap(newValue));
67
							}
68
							fireMapChange(source, diff);
69
						}
70
					};
71
					listenerSupport = new ListenerSupport(
72
							propertyChangeListener, propertyDescriptor
73
									.getName());
74
				}
75
			}
76
		}
77
	}
78
79
	protected void doAddListenerTo(Object source) {
80
		if (source != null && attachListener) {
81
			initListenerSupport();
82
			listenerSupport.hookListener(source);
83
		}
84
	}
85
86
	protected void doRemoveListenerFrom(Object source) {
87
		if (source != null && attachListener && listenerSupport != null) {
88
			listenerSupport.unhookListener(source);
89
		}
90
	}
91
92
	protected Map doGetMap(Object source) {
93
		if (source == null)
94
			return Collections.EMPTY_MAP;
95
		Object propertyValue = BeanPropertyHelper.getProperty(source,
96
				propertyDescriptor);
97
		return asMap(propertyValue);
98
	}
99
100
	private Map asMap(Object propertyValue) {
101
		if (propertyValue == null)
102
			return new HashMap();
103
		return (Map) propertyValue;
104
	}
105
106
	protected void doSetMap(Object source, Map map, MapDiff diff) {
107
		if (source != null) {
108
			BeanPropertyHelper.setProperty(source, propertyDescriptor, map);
109
		}
110
	}
111
112
	public synchronized void dispose() {
113
		propertyDescriptor = null;
114
		attachListener = false;
115
		if (listenerSupport != null) {
116
			listenerSupport.dispose();
117
			listenerSupport = null;
118
		}
119
		super.dispose();
120
	}
121
122
	public PropertyDescriptor getPropertyDescriptor() {
123
		return propertyDescriptor;
124
	}
125
126
	public Object getKeyType() {
127
		return keyType;
128
	}
129
130
	public Object getValueType() {
131
		return valueType;
132
	}
133
}
(-)src/org/eclipse/core/internal/databinding/beans/BeanValueProperty.java (+118 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.beans;
13
14
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyDescriptor;
17
18
import org.eclipse.core.databinding.beans.IBeanProperty;
19
import org.eclipse.core.databinding.observable.Diffs;
20
import org.eclipse.core.databinding.observable.value.ValueDiff;
21
import org.eclipse.core.databinding.property.value.SimpleValueProperty;
22
23
/**
24
 * @since 3.3
25
 * 
26
 */
27
public class BeanValueProperty extends SimpleValueProperty implements
28
		IBeanProperty {
29
	private PropertyDescriptor propertyDescriptor;
30
	private Class valueType;
31
	private boolean attachListener;
32
33
	private ListenerSupport listenerSupport;
34
35
	/**
36
	 * @param propertyDescriptor
37
	 * @param valueType
38
	 * @param attachListener
39
	 */
40
	public BeanValueProperty(PropertyDescriptor propertyDescriptor,
41
			Class valueType, boolean attachListener) {
42
		this.propertyDescriptor = propertyDescriptor;
43
		this.valueType = valueType == null ? propertyDescriptor
44
				.getPropertyType() : valueType;
45
		this.attachListener = attachListener;
46
	}
47
48
	private void initListenerSupport() {
49
		if (listenerSupport == null) {
50
			synchronized (this) {
51
				if (listenerSupport == null) {
52
					PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
53
						public void propertyChange(PropertyChangeEvent evt) {
54
							Object source = evt.getSource();
55
							if (isUpdating(source))
56
								return;
57
							Object oldValue = evt.getOldValue();
58
							Object newValue = evt.getNewValue();
59
							ValueDiff diff = null;
60
							if (oldValue != null || newValue != null) {
61
								diff = Diffs
62
										.createValueDiff(oldValue, newValue);
63
							}
64
							fireValueChange(source, diff);
65
						}
66
					};
67
					listenerSupport = new ListenerSupport(
68
							propertyChangeListener, propertyDescriptor
69
									.getName());
70
				}
71
			}
72
		}
73
	}
74
75
	protected void doAddListenerTo(Object source) {
76
		if (source != null && attachListener) {
77
			initListenerSupport();
78
			listenerSupport.hookListener(source);
79
		}
80
	}
81
82
	protected void doRemoveListenerFrom(Object source) {
83
		if (source != null && attachListener && listenerSupport != null) {
84
			listenerSupport.unhookListener(source);
85
		}
86
	}
87
88
	public Object getValueType() {
89
		return valueType;
90
	}
91
92
	public Object doGetValue(Object source) {
93
		if (source == null)
94
			return null;
95
		return BeanPropertyHelper.getProperty(source, propertyDescriptor);
96
	}
97
98
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
99
		if (source != null) {
100
			BeanPropertyHelper.setProperty(source, propertyDescriptor, value);
101
		}
102
	}
103
104
	public PropertyDescriptor getPropertyDescriptor() {
105
		return propertyDescriptor;
106
	}
107
108
	public synchronized void dispose() {
109
		propertyDescriptor = null;
110
		valueType = null;
111
		attachListener = false;
112
		if (listenerSupport != null) {
113
			listenerSupport.dispose();
114
			listenerSupport = null;
115
		}
116
		super.dispose();
117
	}
118
}
(-)src/org/eclipse/core/databinding/beans/PojoProperties.java (+159 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.beans;
13
14
import java.beans.PropertyChangeEvent;
15
16
import org.eclipse.core.databinding.property.list.IListProperty;
17
import org.eclipse.core.databinding.property.map.IMapProperty;
18
import org.eclipse.core.databinding.property.set.ISetProperty;
19
import org.eclipse.core.databinding.property.value.IValueProperty;
20
import org.eclipse.core.internal.databinding.beans.BeanListProperty;
21
import org.eclipse.core.internal.databinding.beans.BeanMapProperty;
22
import org.eclipse.core.internal.databinding.beans.BeanPropertyHelper;
23
import org.eclipse.core.internal.databinding.beans.BeanSetProperty;
24
import org.eclipse.core.internal.databinding.beans.BeanValueProperty;
25
26
/**
27
 * A factory for creating properties for POJOs (plain old java objects) that
28
 * conform to idea of an object with getters and setters but does not provide
29
 * {@link PropertyChangeEvent property change events} on change. This factory is
30
 * identical to {@link BeanProperties} except for this fact.
31
 * 
32
 * @since 1.2
33
 */
34
public class PojoProperties {
35
	/**
36
	 * Returns a value property for the given property name of the given bean
37
	 * class.
38
	 * 
39
	 * @param beanClass
40
	 *            the bean class
41
	 * @param propertyName
42
	 *            the property name
43
	 * @return a value property for the given property name of the given bean
44
	 *         class.
45
	 */
46
	public static IValueProperty valueProperty(Class beanClass,
47
			String propertyName) {
48
		return valueProperty(beanClass, propertyName, null);
49
	}
50
51
	/**
52
	 * Returns a value property for the given property name of the given bean
53
	 * class.
54
	 * 
55
	 * @param beanClass
56
	 *            the bean class
57
	 * @param propertyName
58
	 *            the property name
59
	 * @param valueType
60
	 *            the value type of the returned value property
61
	 * @return a value property for the given property name of the given bean
62
	 *         class.
63
	 */
64
	public static IValueProperty valueProperty(Class beanClass,
65
			String propertyName, Class valueType) {
66
		return new BeanValueProperty(BeanPropertyHelper.getPropertyDescriptor(
67
				beanClass, propertyName), valueType, false);
68
	}
69
70
	/**
71
	 * Returns a set property for the given property name of the given bean
72
	 * class.
73
	 * 
74
	 * @param beanClass
75
	 *            the bean class
76
	 * @param propertyName
77
	 *            the property name
78
	 * @return a set property for the given property name of the given bean
79
	 *         class.
80
	 */
81
	public static ISetProperty setProperty(Class beanClass, String propertyName) {
82
		return setProperty(beanClass, propertyName, null);
83
	}
84
85
	/**
86
	 * Returns a set property for the given property name of the given bean
87
	 * class.
88
	 * 
89
	 * @param beanClass
90
	 *            the bean class
91
	 * @param propertyName
92
	 *            the property name
93
	 * @param elementType
94
	 *            the element type of the returned set property
95
	 * @return a set property for the given property name of the given bean
96
	 *         class.
97
	 */
98
	public static ISetProperty setProperty(Class beanClass,
99
			String propertyName, Class elementType) {
100
		return new BeanSetProperty(BeanPropertyHelper.getPropertyDescriptor(
101
				beanClass, propertyName), elementType, false);
102
	}
103
104
	/**
105
	 * Returns a list property for the given property name of the given bean
106
	 * class.
107
	 * 
108
	 * @param beanClass
109
	 *            the bean class
110
	 * @param propertyName
111
	 *            the property name
112
	 * @return a list property for the given property name of the given bean
113
	 *         class.
114
	 */
115
	public static IListProperty listProperty(Class beanClass,
116
			String propertyName) {
117
		return listProperty(beanClass, propertyName, null);
118
	}
119
120
	/**
121
	 * Returns a list property for the given property name of the given bean
122
	 * class.
123
	 * 
124
	 * @param beanClass
125
	 *            the bean class
126
	 * @param propertyName
127
	 *            the property name
128
	 * @param elementType
129
	 *            the element type of the returned list property
130
	 * @return a list property for the given property name of the given bean
131
	 *         class.
132
	 */
133
	public static IListProperty listProperty(Class beanClass,
134
			String propertyName, Class elementType) {
135
		return new BeanListProperty(BeanPropertyHelper.getPropertyDescriptor(
136
				beanClass, propertyName), elementType, false);
137
	}
138
139
	/**
140
	 * Returns a map property for the given property name of the given bean
141
	 * class.
142
	 * 
143
	 * @param beanClass
144
	 *            the bean class
145
	 * @param propertyName
146
	 *            the property name
147
	 * @param keyType
148
	 *            the key type of the returned map property
149
	 * @param valueType
150
	 *            the value type of the returned map property
151
	 * @return a map property for the given property name of the given bean
152
	 *         class.
153
	 */
154
	public static IMapProperty mapProperty(Class beanClass,
155
			String propertyName, Object keyType, Object valueType) {
156
		return new BeanMapProperty(BeanPropertyHelper.getPropertyDescriptor(
157
				beanClass, propertyName), keyType, valueType, false);
158
	}
159
}
(-)src/org/eclipse/core/internal/databinding/beans/BeanListProperty.java (+150 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.beans;
13
14
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyDescriptor;
17
import java.lang.reflect.Array;
18
import java.util.ArrayList;
19
import java.util.Arrays;
20
import java.util.Collections;
21
import java.util.List;
22
23
import org.eclipse.core.databinding.beans.IBeanProperty;
24
import org.eclipse.core.databinding.observable.Diffs;
25
import org.eclipse.core.databinding.observable.list.ListDiff;
26
import org.eclipse.core.databinding.property.list.SimpleListProperty;
27
28
/**
29
 * @since 3.3
30
 * 
31
 */
32
public class BeanListProperty extends SimpleListProperty implements
33
		IBeanProperty {
34
	private PropertyDescriptor propertyDescriptor;
35
	private Class elementType;
36
	private boolean attachListener;
37
38
	private ListenerSupport listenerSupport;
39
40
	/**
41
	 * @param propertyDescriptor
42
	 * @param elementType
43
	 * @param attachListener
44
	 */
45
	public BeanListProperty(PropertyDescriptor propertyDescriptor,
46
			Class elementType, boolean attachListener) {
47
		this.propertyDescriptor = propertyDescriptor;
48
		this.elementType = elementType == null ? BeanPropertyHelper
49
				.getCollectionPropertyElementType(propertyDescriptor)
50
				: elementType;
51
		this.attachListener = attachListener;
52
	}
53
54
	private void initListenerSupport() {
55
		if (listenerSupport == null) {
56
			synchronized (this) {
57
				if (listenerSupport == null) {
58
					PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
59
						public void propertyChange(PropertyChangeEvent evt) {
60
							Object source = evt.getSource();
61
							if (isUpdating(source))
62
								return;
63
							Object oldValue = evt.getOldValue();
64
							Object newValue = evt.getNewValue();
65
							ListDiff diff = null;
66
							if (oldValue != null || newValue != null) {
67
								diff = Diffs.computeListDiff(asList(oldValue),
68
										asList(newValue));
69
							}
70
							if (!isUpdating(source)) {
71
								fireListChange(source, diff);
72
							}
73
						}
74
					};
75
					listenerSupport = new ListenerSupport(
76
							propertyChangeListener, propertyDescriptor
77
									.getName());
78
				}
79
			}
80
		}
81
	}
82
83
	protected void doAddListenerTo(Object source) {
84
		if (source != null && attachListener) {
85
			initListenerSupport();
86
			listenerSupport.hookListener(source);
87
		}
88
	}
89
90
	protected void doRemoveListenerFrom(Object source) {
91
		if (source != null && attachListener && listenerSupport != null) {
92
			listenerSupport.unhookListener(source);
93
		}
94
	}
95
96
	public Object getElementType() {
97
		return elementType;
98
	}
99
100
	protected List doGetList(Object source) {
101
		if (source == null)
102
			return Collections.EMPTY_LIST;
103
		Object propertyValue = BeanPropertyHelper.getProperty(source,
104
				propertyDescriptor);
105
		return asList(propertyValue);
106
	}
107
108
	private List asList(Object propertyValue) {
109
		if (propertyValue == null)
110
			return new ArrayList();
111
		if (propertyDescriptor.getPropertyType().isArray())
112
			return new ArrayList(Arrays.asList((Object[]) propertyValue));
113
		return (List) propertyValue;
114
	}
115
116
	protected void doSetList(Object source, List list, ListDiff diff) {
117
		if (source != null) {
118
			BeanPropertyHelper.setProperty(source, propertyDescriptor,
119
					convertListToBeanPropertyType(list));
120
		}
121
	}
122
123
	private Object convertListToBeanPropertyType(List list) {
124
		Object propertyValue = list;
125
		if (propertyDescriptor.getPropertyType().isArray()) {
126
			Class componentType = propertyDescriptor.getPropertyType()
127
					.getComponentType();
128
			Object[] array = (Object[]) Array.newInstance(componentType, list
129
					.size());
130
			list.toArray(array);
131
			propertyValue = array;
132
		}
133
		return propertyValue;
134
	}
135
136
	public PropertyDescriptor getPropertyDescriptor() {
137
		return propertyDescriptor;
138
	}
139
140
	public synchronized void dispose() {
141
		propertyDescriptor = null;
142
		elementType = null;
143
		attachListener = false;
144
		if (listenerSupport != null) {
145
			listenerSupport.dispose();
146
			listenerSupport = null;
147
		}
148
		super.dispose();
149
	}
150
}
(-)src/org/eclipse/core/internal/databinding/beans/BeanSetProperty.java (+146 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.beans;
13
14
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyDescriptor;
17
import java.lang.reflect.Array;
18
import java.util.Arrays;
19
import java.util.Collections;
20
import java.util.HashSet;
21
import java.util.Set;
22
23
import org.eclipse.core.databinding.beans.IBeanProperty;
24
import org.eclipse.core.databinding.observable.Diffs;
25
import org.eclipse.core.databinding.observable.set.SetDiff;
26
import org.eclipse.core.databinding.property.set.SimpleSetProperty;
27
28
/**
29
 * @since 3.3
30
 * 
31
 */
32
public class BeanSetProperty extends SimpleSetProperty implements IBeanProperty {
33
	private PropertyDescriptor propertyDescriptor;
34
	private Class elementType;
35
	private boolean attachListener;
36
37
	private ListenerSupport listenerSupport;
38
39
	/**
40
	 * @param propertyDescriptor
41
	 * @param elementType
42
	 * @param attachListener
43
	 */
44
	public BeanSetProperty(PropertyDescriptor propertyDescriptor,
45
			Class elementType, boolean attachListener) {
46
		this.propertyDescriptor = propertyDescriptor;
47
		this.elementType = elementType == null ? BeanPropertyHelper
48
				.getCollectionPropertyElementType(propertyDescriptor)
49
				: elementType;
50
		this.attachListener = attachListener;
51
	}
52
53
	private void initListenerSupport() {
54
		if (listenerSupport == null) {
55
			synchronized (this) {
56
				if (listenerSupport == null) {
57
					PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
58
						public void propertyChange(PropertyChangeEvent evt) {
59
							Object source = evt.getSource();
60
							if (isUpdating(source))
61
								return;
62
							Object oldValue = evt.getOldValue();
63
							Object newValue = evt.getNewValue();
64
							SetDiff diff = null;
65
							if (oldValue != null || newValue != null) {
66
								diff = Diffs.computeSetDiff(asSet(oldValue),
67
										asSet(newValue));
68
							}
69
							fireSetChange(source, diff);
70
						}
71
					};
72
					listenerSupport = new ListenerSupport(
73
							propertyChangeListener, propertyDescriptor
74
									.getName());
75
				}
76
			}
77
		}
78
	}
79
80
	protected void doAddListenerTo(Object source) {
81
		if (source != null && attachListener) {
82
			initListenerSupport();
83
			listenerSupport.hookListener(source);
84
		}
85
	}
86
87
	protected void doRemoveListenerFrom(Object source) {
88
		if (source != null && attachListener && listenerSupport != null) {
89
			listenerSupport.unhookListener(source);
90
		}
91
	}
92
93
	public Object getElementType() {
94
		return elementType;
95
	}
96
97
	public Set doGetSet(Object source) {
98
		if (source == null)
99
			return Collections.EMPTY_SET;
100
		Object propertyValue = BeanPropertyHelper.getProperty(source,
101
				propertyDescriptor);
102
		return asSet(propertyValue);
103
	}
104
105
	private Set asSet(Object propertyValue) {
106
		if (propertyValue == null)
107
			return Collections.EMPTY_SET;
108
		if (propertyDescriptor.getPropertyType().isArray())
109
			return new HashSet(Arrays.asList((Object[]) propertyValue));
110
		return (Set) propertyValue;
111
	}
112
113
	protected void doSetSet(Object source, Set set, SetDiff diff) {
114
		if (source != null) {
115
			BeanPropertyHelper.setProperty(source, propertyDescriptor,
116
					convertSetToBeanPropertyType(set));
117
		}
118
	}
119
120
	private Object convertSetToBeanPropertyType(Set set) {
121
		Object propertyValue = set;
122
		if (propertyDescriptor.getPropertyType().isArray()) {
123
			Class componentType = propertyDescriptor.getPropertyType()
124
					.getComponentType();
125
			Object[] array = (Object[]) Array.newInstance(componentType, set
126
					.size());
127
			propertyValue = set.toArray(array);
128
		}
129
		return propertyValue;
130
	}
131
132
	public PropertyDescriptor getPropertyDescriptor() {
133
		return propertyDescriptor;
134
	}
135
136
	public synchronized void dispose() {
137
		propertyDescriptor = null;
138
		elementType = null;
139
		attachListener = false;
140
		if (listenerSupport != null) {
141
			listenerSupport.dispose();
142
			listenerSupport = null;
143
		}
144
		super.dispose();
145
	}
146
}
(-)src/org/eclipse/core/databinding/beans/BeanProperties.java (+156 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.beans;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.map.IMapProperty;
16
import org.eclipse.core.databinding.property.set.ISetProperty;
17
import org.eclipse.core.databinding.property.value.IValueProperty;
18
import org.eclipse.core.internal.databinding.beans.BeanListProperty;
19
import org.eclipse.core.internal.databinding.beans.BeanMapProperty;
20
import org.eclipse.core.internal.databinding.beans.BeanPropertyHelper;
21
import org.eclipse.core.internal.databinding.beans.BeanSetProperty;
22
import org.eclipse.core.internal.databinding.beans.BeanValueProperty;
23
24
/**
25
 * A factory for creating properties for Java objects that conform to the <a
26
 * href="http://java.sun.com/products/javabeans/docs/spec.html">JavaBean
27
 * specification</a> for bound properties.
28
 * 
29
 * @since 1.2
30
 */
31
public class BeanProperties {
32
	/**
33
	 * Returns a value property for the given property name of the given bean
34
	 * class.
35
	 * 
36
	 * @param beanClass
37
	 *            the bean class
38
	 * @param propertyName
39
	 *            the property name
40
	 * @return a value property for the given property name of the given bean
41
	 *         class.
42
	 */
43
	public static IValueProperty valueProperty(Class beanClass,
44
			String propertyName) {
45
		return valueProperty(beanClass, propertyName, null);
46
	}
47
48
	/**
49
	 * Returns a value property for the given property name of the given bean
50
	 * class.
51
	 * 
52
	 * @param beanClass
53
	 *            the bean class
54
	 * @param propertyName
55
	 *            the property name
56
	 * @param valueType
57
	 *            the value type of the returned value property
58
	 * @return a value property for the given property name of the given bean
59
	 *         class.
60
	 */
61
	public static IValueProperty valueProperty(Class beanClass,
62
			String propertyName, Class valueType) {
63
		return new BeanValueProperty(BeanPropertyHelper.getPropertyDescriptor(
64
				beanClass, propertyName), valueType, true);
65
	}
66
67
	/**
68
	 * Returns a set property for the given property name of the given bean
69
	 * class.
70
	 * 
71
	 * @param beanClass
72
	 *            the bean class
73
	 * @param propertyName
74
	 *            the property name
75
	 * @return a set property for the given property name of the given bean
76
	 *         class.
77
	 */
78
	public static ISetProperty setProperty(Class beanClass, String propertyName) {
79
		return setProperty(beanClass, propertyName, null);
80
	}
81
82
	/**
83
	 * Returns a set property for the given property name of the given bean
84
	 * class.
85
	 * 
86
	 * @param beanClass
87
	 *            the bean class
88
	 * @param propertyName
89
	 *            the property name
90
	 * @param elementType
91
	 *            the element type of the returned set property
92
	 * @return a set property for the given property name of the given bean
93
	 *         class.
94
	 */
95
	public static ISetProperty setProperty(Class beanClass,
96
			String propertyName, Class elementType) {
97
		return new BeanSetProperty(BeanPropertyHelper.getPropertyDescriptor(
98
				beanClass, propertyName), elementType, true);
99
	}
100
101
	/**
102
	 * Returns a list property for the given property name of the given bean
103
	 * class.
104
	 * 
105
	 * @param beanClass
106
	 *            the bean class
107
	 * @param propertyName
108
	 *            the property name
109
	 * @return a list property for the given property name of the given bean
110
	 *         class.
111
	 */
112
	public static IListProperty listProperty(Class beanClass,
113
			String propertyName) {
114
		return listProperty(beanClass, propertyName, null);
115
	}
116
117
	/**
118
	 * Returns a list property for the given property name of the given bean
119
	 * class.
120
	 * 
121
	 * @param beanClass
122
	 *            the bean class
123
	 * @param propertyName
124
	 *            the property name
125
	 * @param elementType
126
	 *            the element type of the returned list property
127
	 * @return a list property for the given property name of the given bean
128
	 *         class.
129
	 */
130
	public static IListProperty listProperty(Class beanClass,
131
			String propertyName, Class elementType) {
132
		return new BeanListProperty(BeanPropertyHelper.getPropertyDescriptor(
133
				beanClass, propertyName), elementType, true);
134
	}
135
136
	/**
137
	 * Returns a map property for the given property name of the given bean
138
	 * class.
139
	 * 
140
	 * @param beanClass
141
	 *            the bean class
142
	 * @param propertyName
143
	 *            the property name
144
	 * @param keyType
145
	 *            the key type for the returned map property
146
	 * @param valueType
147
	 *            the value type for the returned map property
148
	 * @return a map property for the given property name of the given bean
149
	 *         class.
150
	 */
151
	public static IMapProperty mapProperty(Class beanClass,
152
			String propertyName, Object keyType, Object valueType) {
153
		return new BeanMapProperty(BeanPropertyHelper.getPropertyDescriptor(
154
				beanClass, propertyName), keyType, valueType, true);
155
	}
156
}
(-)src/org/eclipse/core/internal/databinding/beans/BeanPropertyHelper.java (+169 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.beans;
13
14
import java.beans.BeanInfo;
15
import java.beans.IntrospectionException;
16
import java.beans.Introspector;
17
import java.beans.PropertyDescriptor;
18
import java.lang.reflect.InvocationTargetException;
19
import java.lang.reflect.Method;
20
21
import org.eclipse.core.databinding.BindingException;
22
import org.eclipse.core.databinding.beans.BeansObservables;
23
import org.eclipse.core.databinding.observable.value.IObservableValue;
24
import org.eclipse.core.databinding.util.Policy;
25
import org.eclipse.core.runtime.IStatus;
26
import org.eclipse.core.runtime.Status;
27
28
/**
29
 * @since 1.2
30
 * 
31
 */
32
public class BeanPropertyHelper {
33
	/**
34
	 * Sets the contents of the given property on the given source object to the
35
	 * given value.
36
	 * 
37
	 * @param source
38
	 *            the source object which has the property being updated
39
	 * @param propertyDescriptor
40
	 *            the property being changed
41
	 * @param value
42
	 *            the new value of the property
43
	 */
44
	public static void setProperty(Object source,
45
			PropertyDescriptor propertyDescriptor, Object value) {
46
		try {
47
			Method writeMethod = propertyDescriptor.getWriteMethod();
48
			if (!writeMethod.isAccessible()) {
49
				writeMethod.setAccessible(true);
50
			}
51
			writeMethod.invoke(source, new Object[] { value });
52
		} catch (InvocationTargetException e) {
53
			/*
54
			 * InvocationTargetException wraps any exception thrown by the
55
			 * invoked method.
56
			 */
57
			throw new RuntimeException(e.getCause());
58
		} catch (Exception e) {
59
			if (BeansObservables.DEBUG) {
60
				Policy
61
						.getLog()
62
						.log(
63
								new Status(
64
										IStatus.WARNING,
65
										Policy.JFACE_DATABINDING,
66
										IStatus.OK,
67
										"Could not change value of " + source + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
68
			}
69
		}
70
	}
71
72
	/**
73
	 * Returns the contents of the given property for the given bean.
74
	 * 
75
	 * @param source
76
	 *            the source bean
77
	 * @param propertyDescriptor
78
	 *            the property to retrieve
79
	 * @return the contents of the given property for the given bean.
80
	 */
81
	public static Object getProperty(Object source,
82
			PropertyDescriptor propertyDescriptor) {
83
		try {
84
			Method readMethod = propertyDescriptor.getReadMethod();
85
			if (readMethod == null) {
86
				throw new BindingException(propertyDescriptor.getName()
87
						+ " property does not have a read method."); //$NON-NLS-1$
88
			}
89
			if (!readMethod.isAccessible()) {
90
				readMethod.setAccessible(true);
91
			}
92
			return readMethod.invoke(source, null);
93
		} catch (InvocationTargetException e) {
94
			/*
95
			 * InvocationTargetException wraps any exception thrown by the
96
			 * invoked method.
97
			 */
98
			throw new RuntimeException(e.getCause());
99
		} catch (Exception e) {
100
			if (BeansObservables.DEBUG) {
101
				Policy
102
						.getLog()
103
						.log(
104
								new Status(
105
										IStatus.WARNING,
106
										Policy.JFACE_DATABINDING,
107
										IStatus.OK,
108
										"Could not read value of " + source + "." + propertyDescriptor.getName(), e)); //$NON-NLS-1$ //$NON-NLS-2$
109
			}
110
			return null;
111
		}
112
	}
113
114
	/**
115
	 * Returns the element type of the given collection-typed property for the
116
	 * given bean.
117
	 * 
118
	 * @param descriptor
119
	 *            the property being inspected
120
	 * @return the element type of the given collection-typed property if it is
121
	 *         an array property, or Object.class otherwise.
122
	 */
123
	public static Class getCollectionPropertyElementType(
124
			PropertyDescriptor descriptor) {
125
		Class propertyType = descriptor.getPropertyType();
126
		return propertyType.isArray() ? propertyType.getComponentType()
127
				: Object.class;
128
	}
129
130
	/**
131
	 * @param beanClass
132
	 * @param propertyName
133
	 * @return the PropertyDescriptor for the named property on the given bean
134
	 *         class
135
	 */
136
	public static PropertyDescriptor getPropertyDescriptor(Class beanClass,
137
			String propertyName) {
138
		BeanInfo beanInfo;
139
		try {
140
			beanInfo = Introspector.getBeanInfo(beanClass);
141
		} catch (IntrospectionException e) {
142
			// cannot introspect, give up
143
			return null;
144
		}
145
		PropertyDescriptor[] propertyDescriptors = beanInfo
146
				.getPropertyDescriptors();
147
		for (int i = 0; i < propertyDescriptors.length; i++) {
148
			PropertyDescriptor descriptor = propertyDescriptors[i];
149
			if (descriptor.getName().equals(propertyName)) {
150
				return descriptor;
151
			}
152
		}
153
		throw new BindingException(
154
				"Could not find property with name " + propertyName + " in class " + beanClass); //$NON-NLS-1$ //$NON-NLS-2$
155
	}
156
157
	/**
158
	 * @param observable
159
	 * @param propertyName
160
	 * @return property descriptor or <code>null</code>
161
	 */
162
	/* package */public static PropertyDescriptor getValueTypePropertyDescriptor(
163
			IObservableValue observable, String propertyName) {
164
		if (observable.getValueType() != null)
165
			return getPropertyDescriptor((Class) observable.getValueType(),
166
					propertyName);
167
		return null;
168
	}
169
}
(-)src/org/eclipse/jface/tests/databinding/swt/SWTObservablesTest.java (-62 / +124 lines)
Lines 7-45 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Chris Aniszczyk <zx@code9.com> - bug 131435
10
 *     Matthew Hall - bug 248621
11
 *     Matthew Hall - bug 248621
11
 ******************************************************************************/
12
 ******************************************************************************/
12
13
13
package org.eclipse.jface.tests.databinding.swt;
14
package org.eclipse.jface.tests.databinding.swt;
14
15
16
import org.eclipse.core.databinding.observable.IDecoratingObservable;
15
import org.eclipse.core.databinding.observable.list.IObservableList;
17
import org.eclipse.core.databinding.observable.list.IObservableList;
18
import org.eclipse.core.databinding.property.IPropertyObservable;
19
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
16
import org.eclipse.jface.databinding.conformance.util.RealmTester;
20
import org.eclipse.jface.databinding.conformance.util.RealmTester;
21
import org.eclipse.jface.databinding.swt.ISWTObservable;
17
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
22
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
23
import org.eclipse.jface.databinding.swt.SWTObservables;
19
import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
24
import org.eclipse.jface.internal.databinding.swt.CComboSelectionProperty;
20
import org.eclipse.jface.internal.databinding.swt.CComboObservableList;
25
import org.eclipse.jface.internal.databinding.swt.CComboTextProperty;
21
import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
26
import org.eclipse.jface.internal.databinding.swt.CLabelTextProperty;
22
import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
27
import org.eclipse.jface.internal.databinding.swt.CTabItemTooltipTextProperty;
23
import org.eclipse.jface.internal.databinding.swt.ComboObservableList;
28
import org.eclipse.jface.internal.databinding.swt.ComboSelectionProperty;
24
import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
29
import org.eclipse.jface.internal.databinding.swt.ComboTextProperty;
25
import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
30
import org.eclipse.jface.internal.databinding.swt.ControlTooltipTextProperty;
26
import org.eclipse.jface.internal.databinding.swt.ItemObservableValue;
31
import org.eclipse.jface.internal.databinding.swt.ItemTextProperty;
27
import org.eclipse.jface.internal.databinding.swt.ItemTooltipObservableValue;
32
import org.eclipse.jface.internal.databinding.swt.LabelTextProperty;
28
import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
33
import org.eclipse.jface.internal.databinding.swt.ScaleMaximumProperty;
29
import org.eclipse.jface.internal.databinding.swt.ListObservableList;
34
import org.eclipse.jface.internal.databinding.swt.ScaleMinimumProperty;
30
import org.eclipse.jface.internal.databinding.swt.ListObservableValue;
35
import org.eclipse.jface.internal.databinding.swt.ScaleSelectionProperty;
31
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
36
import org.eclipse.jface.internal.databinding.swt.SpinnerMaximumProperty;
32
import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
37
import org.eclipse.jface.internal.databinding.swt.SpinnerMinimumProperty;
33
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
38
import org.eclipse.jface.internal.databinding.swt.SpinnerSelectionProperty;
34
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
39
import org.eclipse.jface.internal.databinding.swt.StyledTextTextProperty;
35
import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
40
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionIndexProperty;
36
import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
41
import org.eclipse.jface.internal.databinding.swt.TextEditableProperty;
42
import org.eclipse.jface.internal.databinding.swt.TextTextProperty;
37
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
43
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
38
import org.eclipse.swt.SWT;
44
import org.eclipse.swt.SWT;
39
import org.eclipse.swt.custom.CCombo;
45
import org.eclipse.swt.custom.CCombo;
40
import org.eclipse.swt.custom.CLabel;
46
import org.eclipse.swt.custom.CLabel;
41
import org.eclipse.swt.custom.CTabFolder;
47
import org.eclipse.swt.custom.CTabFolder;
42
import org.eclipse.swt.custom.CTabItem;
48
import org.eclipse.swt.custom.CTabItem;
49
import org.eclipse.swt.custom.StyledText;
43
import org.eclipse.swt.graphics.Color;
50
import org.eclipse.swt.graphics.Color;
44
import org.eclipse.swt.graphics.Font;
51
import org.eclipse.swt.graphics.Font;
45
import org.eclipse.swt.widgets.Button;
52
import org.eclipse.swt.widgets.Button;
Lines 96-149 Link Here
96
		Spinner spinner = new Spinner(shell, SWT.NONE);
103
		Spinner spinner = new Spinner(shell, SWT.NONE);
97
		ISWTObservableValue value = SWTObservables.observeSelection(spinner);
104
		ISWTObservableValue value = SWTObservables.observeSelection(spinner);
98
		assertNotNull(value);
105
		assertNotNull(value);
99
		assertTrue(value instanceof SpinnerObservableValue);
106
		assertTrue(value.getWidget() == spinner);
100
107
101
		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
108
		IPropertyObservable propertyObservable = getPropertyObservable(value);
102
		assertEquals(SWTProperties.SELECTION, spinnerObservable.getAttribute());
109
		assertTrue(propertyObservable.getProperty() instanceof SpinnerSelectionProperty);
103
	}
110
	}
104
111
105
	public void testObserveSelectionOfButton() throws Exception {
112
	public void testObserveSelectionOfButton() throws Exception {
106
		Button button = new Button(shell, SWT.PUSH);
113
		Button button = new Button(shell, SWT.PUSH);
107
		ISWTObservableValue value = SWTObservables.observeSelection(button);
114
		ISWTObservableValue value = SWTObservables.observeSelection(button);
108
		assertNotNull(value);
115
		assertNotNull(value);
109
		assertTrue(value instanceof ButtonObservableValue);
116
		assertTrue(value.getWidget() == button);
110
	}
117
	}
111
118
112
	public void testObserveSelectionOfCombo() throws Exception {
119
	public void testObserveSelectionOfCombo() throws Exception {
113
		Combo combo = new Combo(shell, SWT.NONE);
120
		Combo combo = new Combo(shell, SWT.NONE);
114
		ISWTObservableValue value = SWTObservables.observeSelection(combo);
121
		ISWTObservableValue value = SWTObservables.observeSelection(combo);
115
		assertNotNull(value);
122
		assertNotNull(value);
116
		assertTrue(value instanceof ComboObservableValue);
123
		assertTrue(value.getWidget() == combo);
117
124
118
		ComboObservableValue comboObservable = (ComboObservableValue) value;
125
		IPropertyObservable propertyObservable = getPropertyObservable(value);
119
		assertEquals(SWTProperties.SELECTION, comboObservable.getAttribute());
126
		assertTrue(propertyObservable.getProperty() instanceof ComboSelectionProperty);
120
	}
127
	}
121
128
122
	public void testObserveSelectionOfCCombo() throws Exception {
129
	public void testObserveSelectionOfCCombo() throws Exception {
123
		CCombo combo = new CCombo(shell, SWT.NONE);
130
		CCombo combo = new CCombo(shell, SWT.NONE);
124
		ISWTObservableValue value = SWTObservables.observeSelection(combo);
131
		ISWTObservableValue value = SWTObservables.observeSelection(combo);
125
		assertNotNull(value);
132
		assertNotNull(value);
126
		assertTrue(value instanceof CComboObservableValue);
133
		assertTrue(value.getWidget() == combo);
127
134
128
		CComboObservableValue ccomboObservable = (CComboObservableValue) value;
135
		IPropertyObservable property = getPropertyObservable(value);
129
		assertEquals(SWTProperties.SELECTION, ccomboObservable.getAttribute());
136
		assertTrue(property.getProperty() instanceof CComboSelectionProperty);
130
	}
137
	}
131
138
132
	public void testObserveSelectionOfList() throws Exception {
139
	public void testObserveSelectionOfList() throws Exception {
133
		List list = new List(shell, SWT.NONE);
140
		List list = new List(shell, SWT.NONE);
134
		ISWTObservableValue value = SWTObservables.observeSelection(list);
141
		ISWTObservableValue value = SWTObservables.observeSelection(list);
135
		assertNotNull(value);
142
		assertNotNull(value);
136
		assertTrue(value instanceof ListObservableValue);
143
		assertTrue(value.getWidget() == list);
137
	}
144
	}
138
	
145
	
139
	public void testObserveSelectionOfScale() throws Exception {
146
	public void testObserveSelectionOfScale() throws Exception {
140
		Scale scale = new Scale(shell, SWT.NONE);
147
		Scale scale = new Scale(shell, SWT.NONE);
141
		ISWTObservableValue value = SWTObservables.observeSelection(scale);
148
		ISWTObservableValue value = SWTObservables.observeSelection(scale);
142
		assertNotNull(value);
149
		assertNotNull(value);
143
		assertTrue(value instanceof ScaleObservableValue);
150
		assertTrue(value.getWidget() == scale);
144
		
151
		
145
		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
152
		IPropertyObservable property = getPropertyObservable(value);
146
		assertEquals(SWTProperties.SELECTION, scaleObservable.getAttribute());
153
		assertTrue(property.getProperty() instanceof ScaleSelectionProperty);
147
	}
154
	}
148
155
149
	public void testObserveSelectionOfUnsupportedControl() throws Exception {
156
	public void testObserveSelectionOfUnsupportedControl() throws Exception {
Lines 162-168 Link Here
162
		ISWTObservableValue value = SWTObservables.observeText(text,
169
		ISWTObservableValue value = SWTObservables.observeText(text,
163
				SWT.FocusOut);
170
				SWT.FocusOut);
164
		assertNotNull(value);
171
		assertNotNull(value);
165
		assertTrue(value instanceof TextObservableValue);
172
		assertTrue(value.getWidget() == text);
173
		IPropertyObservable propertyObservable = getPropertyObservable(value);
174
		assertTrue(propertyObservable.getProperty() instanceof TextTextProperty);
175
176
		assertFalse(text.isListening(SWT.FocusOut));
177
		ChangeEventTracker.observe(value);
178
		assertTrue(text.isListening(SWT.FocusOut));
179
	}
180
181
	public void testObserveTextOfStyledText() throws Exception {
182
		StyledText text = new StyledText(shell, SWT.NONE);
183
		assertFalse(text.isListening(SWT.FocusOut));
184
185
		ISWTObservableValue value = SWTObservables.observeText(text,
186
				SWT.FocusOut);
187
		assertNotNull(value);
188
		assertTrue(value.getWidget() == text);
189
		IPropertyObservable propertyObservable = getPropertyObservable(value);
190
		assertTrue(propertyObservable.getProperty() instanceof StyledTextTextProperty);
191
192
		assertFalse(text.isListening(SWT.FocusOut));
193
		ChangeEventTracker.observe(value);
166
		assertTrue(text.isListening(SWT.FocusOut));
194
		assertTrue(text.isListening(SWT.FocusOut));
167
	}
195
	}
168
196
Lines 179-219 Link Here
179
		Label label = new Label(shell, SWT.NONE);
207
		Label label = new Label(shell, SWT.NONE);
180
		ISWTObservableValue value = SWTObservables.observeText(label);
208
		ISWTObservableValue value = SWTObservables.observeText(label);
181
		assertNotNull(label);
209
		assertNotNull(label);
182
		assertTrue(value instanceof LabelObservableValue);
210
		assertTrue(value.getWidget() == label);
211
		IPropertyObservable propertyObservable = getPropertyObservable(value);
212
		assertTrue(propertyObservable.getProperty() instanceof LabelTextProperty);
183
	}
213
	}
184
214
185
	public void testObserveTextOfCLabel() throws Exception {
215
	public void testObserveTextOfCLabel() throws Exception {
186
		CLabel label = new CLabel(shell, SWT.NONE);
216
		CLabel label = new CLabel(shell, SWT.NONE);
187
		ISWTObservableValue value = SWTObservables.observeText(label);
217
		ISWTObservableValue value = SWTObservables.observeText(label);
188
		assertNotNull(label);
218
		assertNotNull(label);
189
		assertTrue(value instanceof CLabelObservableValue);
219
		assertTrue(value.getWidget() == label);
220
		IPropertyObservable propertyObservable = getPropertyObservable(value);
221
		assertTrue(propertyObservable.getProperty() instanceof CLabelTextProperty);
190
	}
222
	}
191
223
192
	public void testObserveTextOfCombo() throws Exception {
224
	public void testObserveTextOfCombo() throws Exception {
193
		Combo combo = new Combo(shell, SWT.NONE);
225
		Combo combo = new Combo(shell, SWT.NONE);
194
		ISWTObservableValue value = SWTObservables.observeText(combo);
226
		ISWTObservableValue value = SWTObservables.observeText(combo);
195
		assertNotNull(value);
227
		assertNotNull(value);
196
		assertTrue(value instanceof ComboObservableValue);
228
		assertTrue(value.getWidget() == combo);
197
229
198
		ComboObservableValue comboObservable = (ComboObservableValue) value;
230
		assertTrue(getPropertyObservable(value).getProperty() instanceof ComboTextProperty);
199
		assertEquals(SWTProperties.TEXT, comboObservable.getAttribute());
231
	}
232
233
	/**
234
	 * @param observable
235
	 * @return
236
	 */
237
	private IPropertyObservable getPropertyObservable(
238
			ISWTObservableValue observable) {
239
		IDecoratingObservable decoratingObservable = (IDecoratingObservable) observable;
240
		IPropertyObservable propertyObservable = (IPropertyObservable) decoratingObservable
241
				.getDecorated();
242
		return propertyObservable;
200
	}
243
	}
201
244
202
	public void testObserveTextOfCCombo() throws Exception {
245
	public void testObserveTextOfCCombo() throws Exception {
203
		CCombo combo = new CCombo(shell, SWT.NONE);
246
		CCombo combo = new CCombo(shell, SWT.NONE);
204
		ISWTObservableValue value = SWTObservables.observeText(combo);
247
		ISWTObservableValue value = SWTObservables.observeText(combo);
205
		assertNotNull(value);
248
		assertNotNull(value);
206
		assertTrue(value instanceof CComboObservableValue);
249
		assertTrue(value.getWidget() == combo);
207
250
208
		CComboObservableValue ccomboObservable = (CComboObservableValue) value;
251
		IDecoratingObservable decorating = (IDecoratingObservable) value;
209
		assertEquals(SWTProperties.TEXT, ccomboObservable.getAttribute());
252
		IPropertyObservable property = (IPropertyObservable) decorating
253
				.getDecorated();
254
		assertTrue(property.getProperty() instanceof CComboTextProperty);
210
	}
255
	}
211
256
212
	public void testObserveTextOfText() throws Exception {
257
	public void testObserveTextOfText() throws Exception {
213
		Text text = new Text(shell, SWT.NONE);
258
		Text text = new Text(shell, SWT.NONE);
214
		ISWTObservableValue value = SWTObservables.observeText(text);
259
		ISWTObservableValue value = SWTObservables.observeText(text);
215
		assertNotNull(value);
260
		assertNotNull(value);
216
		assertTrue(value instanceof TextObservableValue);
261
262
		assertTrue(value.getWidget() == text);
263
		IPropertyObservable propertyObservable = getPropertyObservable(value);
264
		assertTrue(propertyObservable.getProperty() instanceof TextTextProperty);
265
		
217
		assertFalse(text.isListening(SWT.Modify));
266
		assertFalse(text.isListening(SWT.Modify));
218
		assertFalse(text.isListening(SWT.FocusOut));
267
		assertFalse(text.isListening(SWT.FocusOut));
219
	}
268
	}
Lines 223-229 Link Here
223
		Item item = new CTabItem(ctf, SWT.NONE);
272
		Item item = new CTabItem(ctf, SWT.NONE);
224
		ISWTObservableValue value = SWTObservables.observeText(item);
273
		ISWTObservableValue value = SWTObservables.observeText(item);
225
		assertNotNull(value);
274
		assertNotNull(value);
226
		assertTrue(value instanceof ItemObservableValue);
275
		assertTrue(value.getWidget() == item);
276
		IPropertyObservable propertyObservable = getPropertyObservable(value);
277
		assertTrue(propertyObservable.getProperty() instanceof ItemTextProperty);
227
	}
278
	}
228
279
229
	public void testObserveTextOfUnsupportedControl() throws Exception {
280
	public void testObserveTextOfUnsupportedControl() throws Exception {
Lines 240-246 Link Here
240
		Item item = new CTabItem(ctf, SWT.NONE);
291
		Item item = new CTabItem(ctf, SWT.NONE);
241
		ISWTObservableValue value = SWTObservables.observeTooltipText(item);
292
		ISWTObservableValue value = SWTObservables.observeTooltipText(item);
242
		assertNotNull(value);
293
		assertNotNull(value);
243
		assertTrue(value instanceof ItemTooltipObservableValue);
294
		assertTrue(value.getWidget() == item);
295
		IPropertyObservable propertyObservable = getPropertyObservable(value);
296
		assertTrue(propertyObservable.getProperty() instanceof CTabItemTooltipTextProperty);
244
	}
297
	}
245
298
246
	public void testObserveTooltipOfUnsupportedControl() throws Exception {
299
	public void testObserveTooltipOfUnsupportedControl() throws Exception {
Lines 256-283 Link Here
256
		Label label = new Label(shell, SWT.NONE);
309
		Label label = new Label(shell, SWT.NONE);
257
		ISWTObservableValue value = SWTObservables.observeTooltipText(label);
310
		ISWTObservableValue value = SWTObservables.observeTooltipText(label);
258
		assertNotNull(value);
311
		assertNotNull(value);
259
		assertTrue(value instanceof ControlObservableValue);
312
		assertTrue(value.getWidget() == label);
313
		IPropertyObservable propertyObservable = getPropertyObservable(value);
314
		assertTrue(propertyObservable.getProperty() instanceof ControlTooltipTextProperty);
260
	}
315
	}
261
316
262
	public void testObserveItemsOfCombo() throws Exception {
317
	public void testObserveItemsOfCombo() throws Exception {
263
		Combo combo = new Combo(shell, SWT.NONE);
318
		Combo combo = new Combo(shell, SWT.NONE);
264
		IObservableList list = SWTObservables.observeItems(combo);
319
		IObservableList list = SWTObservables.observeItems(combo);
265
		assertNotNull(list);
320
		assertNotNull(list);
266
		assertTrue(list instanceof ComboObservableList);
321
		assertTrue(list instanceof ISWTObservable);
322
		assertTrue(((ISWTObservable) list).getWidget() == combo);
267
	}
323
	}
268
324
269
	public void testObserveItemsOfCCombo() throws Exception {
325
	public void testObserveItemsOfCCombo() throws Exception {
270
		CCombo ccombo = new CCombo(shell, SWT.NONE);
326
		CCombo ccombo = new CCombo(shell, SWT.NONE);
271
		IObservableList list = SWTObservables.observeItems(ccombo);
327
		IObservableList list = SWTObservables.observeItems(ccombo);
272
		assertNotNull(list);
328
		assertNotNull(list);
273
		assertTrue(list instanceof CComboObservableList);
329
		ISWTObservable swtObservable = (ISWTObservable) list;
330
		assertTrue(swtObservable.getWidget() == ccombo);
274
	}
331
	}
275
332
276
	public void testObserveItemsOfList() throws Exception {
333
	public void testObserveItemsOfList() throws Exception {
277
		List list = new List(shell, SWT.NONE);
334
		List list = new List(shell, SWT.NONE);
278
		IObservableList observableList = SWTObservables.observeItems(list);
335
		IObservableList observableList = SWTObservables.observeItems(list);
279
		assertNotNull(observableList);
336
		assertNotNull(observableList);
280
		assertTrue(observableList instanceof ListObservableList);
337
		ISWTObservable swtObservable = (ISWTObservable) observableList;
338
		assertTrue(swtObservable.getWidget() == list);
281
	}
339
	}
282
340
283
	public void testObserveItemsOfUnsupportedControl() throws Exception {
341
	public void testObserveItemsOfUnsupportedControl() throws Exception {
Lines 294-300 Link Here
294
		ISWTObservableValue value = SWTObservables
352
		ISWTObservableValue value = SWTObservables
295
				.observeSingleSelectionIndex(table);
353
				.observeSingleSelectionIndex(table);
296
		assertNotNull(value);
354
		assertNotNull(value);
297
		assertTrue(value instanceof TableSingleSelectionObservableValue);
355
		assertTrue(value.getWidget() == table);
356
		IPropertyObservable propertyObservable = getPropertyObservable(value);
357
		assertTrue(propertyObservable.getProperty() instanceof TableSingleSelectionIndexProperty);
298
	}
358
	}
299
359
300
	public void testObserveSingleSelectionIndexOfUnsupportedControl()
360
	public void testObserveSingleSelectionIndexOfUnsupportedControl()
Lines 312-331 Link Here
312
		Spinner spinner = new Spinner(shell, SWT.NONE);
372
		Spinner spinner = new Spinner(shell, SWT.NONE);
313
		ISWTObservableValue value = SWTObservables.observeMin(spinner);
373
		ISWTObservableValue value = SWTObservables.observeMin(spinner);
314
		assertNotNull(value);
374
		assertNotNull(value);
315
		assertTrue(value instanceof SpinnerObservableValue);
375
		assertTrue(value.getWidget() == spinner);
316
		
376
		
317
		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
377
		IPropertyObservable propertyObservable = getPropertyObservable(value);
318
		assertEquals(SWTProperties.MIN, spinnerObservable.getAttribute());
378
		assertTrue(propertyObservable.getProperty() instanceof SpinnerMinimumProperty);
319
	}
379
	}
320
	
380
	
321
	public void testObserveMinOfScale() throws Exception {
381
	public void testObserveMinOfScale() throws Exception {
322
		Scale scale = new Scale(shell, SWT.NONE);
382
		Scale scale = new Scale(shell, SWT.NONE);
323
		ISWTObservableValue value = SWTObservables.observeMin(scale);
383
		ISWTObservableValue value = SWTObservables.observeMin(scale);
324
		assertNotNull(value);
384
		assertNotNull(value);
325
		assertTrue(value instanceof ScaleObservableValue);
385
		assertTrue(value.getWidget() == scale);
326
		
386
		
327
		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
387
		IPropertyObservable propertyObservable = getPropertyObservable(value);
328
		assertEquals(SWTProperties.MIN, scaleObservable.getAttribute());
388
		assertTrue(propertyObservable.getProperty() instanceof ScaleMinimumProperty);
329
	}
389
	}
330
390
331
	public void testObserveMinOfUnsupportedControl() throws Exception {
391
	public void testObserveMinOfUnsupportedControl() throws Exception {
Lines 341-360 Link Here
341
		Spinner spinner = new Spinner(shell, SWT.NONE);
401
		Spinner spinner = new Spinner(shell, SWT.NONE);
342
		ISWTObservableValue value = SWTObservables.observeMax(spinner);
402
		ISWTObservableValue value = SWTObservables.observeMax(spinner);
343
		assertNotNull(value);
403
		assertNotNull(value);
344
		assertTrue(value instanceof SpinnerObservableValue);
404
		assertTrue(value.getWidget() == spinner);
345
		
405
		
346
		SpinnerObservableValue spinnerObservable = (SpinnerObservableValue) value;
406
		IPropertyObservable propertyObservable = getPropertyObservable(value);
347
		assertEquals(SWTProperties.MAX, spinnerObservable.getAttribute());
407
		assertTrue(propertyObservable.getProperty() instanceof SpinnerMaximumProperty);
348
	}
408
	}
349
	
409
	
350
	public void testObserveMaxOfScale() throws Exception {
410
	public void testObserveMaxOfScale() throws Exception {
351
		Scale scale = new Scale(shell, SWT.NONE);
411
		Scale scale = new Scale(shell, SWT.NONE);
352
		ISWTObservableValue value = SWTObservables.observeMax(scale);
412
		ISWTObservableValue value = SWTObservables.observeMax(scale);
353
		assertNotNull(value);
413
		assertNotNull(value);
354
		assertTrue(value instanceof ScaleObservableValue);
414
		assertTrue(value.getWidget() == scale);
355
		
415
		
356
		ScaleObservableValue scaleObservable = (ScaleObservableValue) value;
416
		IPropertyObservable propertyObservable = getPropertyObservable(value);
357
		assertEquals(SWTProperties.MAX, scaleObservable.getAttribute());
417
		assertTrue(propertyObservable.getProperty() instanceof ScaleMaximumProperty);
358
	}
418
	}
359
	
419
	
360
	public void testObserveMaxOfUnsupportedControl() throws Exception {
420
	public void testObserveMaxOfUnsupportedControl() throws Exception {
Lines 370-376 Link Here
370
		Text text = new Text(shell, SWT.NONE);
430
		Text text = new Text(shell, SWT.NONE);
371
		ISWTObservableValue value = SWTObservables.observeEditable(text);
431
		ISWTObservableValue value = SWTObservables.observeEditable(text);
372
		assertNotNull(value);
432
		assertNotNull(value);
373
		assertTrue(value instanceof TextEditableObservableValue);
433
		assertTrue(value.getWidget() == text);
434
		IPropertyObservable propertyObservable = getPropertyObservable(value);
435
		assertTrue(propertyObservable.getProperty() instanceof TextEditableProperty);
374
	}
436
	}
375
	
437
	
376
	public void testObserveEditableOfUnsupportedControl() throws Exception {
438
	public void testObserveEditableOfUnsupportedControl() throws Exception {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMaxTest.java (-4 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.ScaleProperties;
26
import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Scale;
29
import org.eclipse.swt.widgets.Scale;
Lines 96-102 Link Here
96
		}
96
		}
97
97
98
		public IObservableValue createObservableValue(Realm realm) {
98
		public IObservableValue createObservableValue(Realm realm) {
99
			return new ScaleObservableValue(realm, scale, SWTProperties.MAX);
99
			return PropertyObservables.observeValue(realm, scale,
100
					ScaleProperties.maximum());
100
		}
101
		}
101
102
102
		public void change(IObservable observable) {
103
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TableSingleSelectionObservableValueTest.java (-3 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bugs 118516, 213145
10
 *     Matthew Hall - bugs 118516, 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.core.runtime.Assert;
22
import org.eclipse.core.runtime.Assert;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
23
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
24
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
25
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
27
import org.eclipse.jface.databinding.swt.TableProperties;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Shell;
30
import org.eclipse.swt.widgets.Shell;
Lines 104-110 Link Here
104
		}
105
		}
105
106
106
		public IObservableValue createObservableValue(Realm realm) {
107
		public IObservableValue createObservableValue(Realm realm) {
107
			return new TableSingleSelectionObservableValue(realm, table);
108
			return PropertyObservables.observeValue(realm, table,
109
					TableProperties.singleSelectionIndex());
108
		}
110
		}
109
111
110
		public Object getValueType(IObservableValue observable) {
112
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/CLabelObservableValueTest.java (-3 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-28 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
25
import org.eclipse.jface.databinding.swt.CLabelProperties;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
26
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.custom.CLabel;
28
import org.eclipse.swt.custom.CLabel;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Display;
Lines 87-93 Link Here
87
		}
88
		}
88
89
89
		public IObservableValue createObservableValue(Realm realm) {
90
		public IObservableValue createObservableValue(Realm realm) {
90
			return new CLabelObservableValue(realm, label);
91
			return PropertyObservables.observeValue(realm, label,
92
					CLabelProperties.text());
91
		}
93
		}
92
94
93
		public void change(IObservable observable) {
95
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueTest.java (-4 / +4 lines)
Lines 8-20 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198904
10
 *     Ashley Cambrell - bug 198904
11
 *     Matthew Hall - bug 194734
11
 ******************************************************************************/
12
 ******************************************************************************/
12
13
13
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
15
15
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
16
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
16
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
17
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
17
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
18
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
19
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
19
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.widgets.Spinner;
21
import org.eclipse.swt.widgets.Spinner;
Lines 26-33 Link Here
26
public class SpinnerObservableValueTest extends AbstractSWTTestCase {
27
public class SpinnerObservableValueTest extends AbstractSWTTestCase {
27
	public void testDispose() throws Exception {
28
	public void testDispose() throws Exception {
28
		Spinner spinner = new Spinner(getShell(), SWT.NONE);
29
		Spinner spinner = new Spinner(getShell(), SWT.NONE);
29
		SpinnerObservableValue observableValue = new SpinnerObservableValue(
30
		ISWTObservableValue observableValue = SWTObservables.observeSelection(spinner);
30
				spinner, SWTProperties.SELECTION);
31
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
31
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
32
		observableValue.addValueChangeListener(testCounterValueChangeListener);
32
		observableValue.addValueChangeListener(testCounterValueChangeListener);
33
33
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueSelectionTest.java (-5 / +7 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.ScaleProperties;
26
import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Scale;
29
import org.eclipse.swt.widgets.Scale;
Lines 56-62 Link Here
56
	}
56
	}
57
57
58
	protected IObservable doCreateObservable() {
58
	protected IObservable doCreateObservable() {
59
		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
59
		return getObservableContractDelegate().createObservable(
60
				SWTObservables.getRealm(Display.getDefault()));
60
	}
61
	}
61
62
62
	public void testGetValue() throws Exception {
63
	public void testGetValue() throws Exception {
Lines 97-103 Link Here
97
		}
98
		}
98
99
99
		public IObservableValue createObservableValue(Realm realm) {
100
		public IObservableValue createObservableValue(Realm realm) {
100
			return new ScaleObservableValue(realm, scale, SWTProperties.SELECTION);
101
			return PropertyObservables.observeValue(realm, scale,
102
					ScaleProperties.selection());
101
		}
103
		}
102
104
103
		public void change(IObservable observable) {
105
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SWTObservableListTest.java (-115 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 208858)
10
 *     Matthew Hall - bug 213145
11
 ******************************************************************************/
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
14
15
import junit.framework.Test;
16
import junit.framework.TestSuite;
17
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservableCollection;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
23
import org.eclipse.jface.internal.databinding.swt.SWTObservableList;
24
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
25
26
/**
27
 * @since 3.3
28
 */
29
public class SWTObservableListTest extends AbstractDefaultRealmTestCase {
30
	SWTObservableListStub list;
31
32
	protected void setUp() throws Exception {
33
		super.setUp();
34
		list = new SWTObservableListStub(Realm.getDefault(), 0);
35
	}
36
37
	public void testMove_ForwardAndBackward() {
38
		String element0 = "element0";
39
		String element1 = "element1";
40
41
		list.add(element0);
42
		list.add(element1);
43
44
		// move forward
45
		assertEquals(element0, list.move(0, 1));
46
		assertEquals(element1, list.move(0, 1));
47
48
		// move backward
49
		assertEquals(element1, list.move(1, 0));
50
		assertEquals(element0, list.move(1, 0));
51
	}
52
53
	public static Test suite() {
54
		TestSuite suite = new TestSuite(SWTObservableListTest.class.toString());
55
		suite.addTestSuite(SWTObservableListTest.class);
56
		suite.addTest(MutableObservableListContractTest.suite(new Delegate()));
57
		return suite;
58
	}
59
60
	static class Delegate extends AbstractObservableCollectionContractDelegate {
61
		public IObservableCollection createObservableCollection(Realm realm,
62
				int elementCount) {
63
			return new SWTObservableListStub(realm, elementCount);
64
		}
65
66
		private int counter;
67
68
		public Object createElement(IObservableCollection collection) {
69
			return "Item" + counter++;
70
		}
71
72
		public Object getElementType(IObservableCollection collection) {
73
			return String.class;
74
		}
75
76
		public void change(IObservable observable) {
77
			((SWTObservableListStub) observable).fireChange();
78
		}
79
	}
80
81
	static class SWTObservableListStub extends SWTObservableList {
82
		String[] items;
83
84
		public SWTObservableListStub(Realm realm, int elementCount) {
85
			super(realm);
86
			items = new String[elementCount];
87
			for (int i = 0; i < items.length; i++)
88
				items[i] = Integer.toString(i);
89
		}
90
91
		protected String getItem(int index) {
92
			return items[index];
93
		}
94
95
		protected int getItemCount() {
96
			return items.length;
97
		}
98
99
		protected String[] getItems() {
100
			return items;
101
		}
102
103
		protected void setItem(int index, String string) {
104
			items[index] = string;
105
		}
106
107
		protected void setItems(String[] newItems) {
108
			items = newItems;
109
		}
110
111
		protected void fireChange() {
112
			super.fireChange();
113
		}
114
	}
115
}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TableObservableValueTest.java (-3 / +5 lines)
Lines 8-18 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198904
10
 *     Ashley Cambrell - bug 198904
11
 *     Matthew Hall - bug 194734
11
 ******************************************************************************/
12
 ******************************************************************************/
12
13
13
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
15
15
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
16
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.jface.databinding.swt.SWTObservables;
16
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
18
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
17
import org.eclipse.swt.SWT;
19
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.widgets.Table;
20
import org.eclipse.swt.widgets.Table;
Lines 24-31 Link Here
24
public class TableObservableValueTest extends AbstractSWTTestCase {
26
public class TableObservableValueTest extends AbstractSWTTestCase {
25
	public void testDispose() throws Exception {
27
	public void testDispose() throws Exception {
26
		Table table = new Table(getShell(), SWT.NONE);
28
		Table table = new Table(getShell(), SWT.NONE);
27
		TableSingleSelectionObservableValue observableValue = new TableSingleSelectionObservableValue(
29
		IObservableValue observableValue = SWTObservables
28
				table);
30
				.observeSingleSelectionIndex(table);
29
31
30
		TableItem item1 = new TableItem(table, SWT.NONE);
32
		TableItem item1 = new TableItem(table, SWT.NONE);
31
		item1.setText("Item1");
33
		item1.setText("Item1");
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueFocusOutTest.java (-3 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-27 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
25
import org.eclipse.jface.databinding.swt.TextProperties;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Text;
28
import org.eclipse.swt.widgets.Text;
Lines 52-58 Link Here
52
		}
53
		}
53
54
54
		public IObservableValue createObservableValue(Realm realm) {
55
		public IObservableValue createObservableValue(Realm realm) {
55
			return new TextObservableValue(realm, text, SWT.FocusOut);
56
			return PropertyObservables.observeValue(realm, text, TextProperties
57
					.text(SWT.FocusOut));
56
		}
58
		}
57
59
58
		public Object getValueType(IObservableValue observable) {
60
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TextEditableObservableValueTest.java (-3 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-27 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
25
import org.eclipse.jface.databinding.swt.TextProperties;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Text;
28
import org.eclipse.swt.widgets.Text;
Lines 97-103 Link Here
97
		}
98
		}
98
		
99
		
99
		public IObservableValue createObservableValue(Realm realm) {
100
		public IObservableValue createObservableValue(Realm realm) {
100
			return new TextEditableObservableValue(realm, text);
101
			return PropertyObservables.observeValue(realm, text, TextProperties
102
					.editable());
101
		}
103
		}
102
		
104
		
103
		public Object getValueType(IObservableValue observable) {
105
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ControlObservableValueTest.java (-40 / +23 lines)
Lines 8-19 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Brad Reynolds - bug 170848
10
 *     Brad Reynolds - bug 170848
11
 *     Matthew Hall - bug 194734
11
 ******************************************************************************/
12
 ******************************************************************************/
12
13
13
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
15
15
import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
16
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
16
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
17
import org.eclipse.jface.databinding.swt.SWTObservables;
17
import org.eclipse.jface.resource.JFaceResources;
18
import org.eclipse.jface.resource.JFaceResources;
18
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
19
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
19
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.SWT;
Lines 47-95 Link Here
47
	}
48
	}
48
49
49
	public void testSetValueEnabled() throws Exception {
50
	public void testSetValueEnabled() throws Exception {
50
		ControlObservableValue observableValue = new ControlObservableValue(
51
		ISWTObservableValue observableValue = SWTObservables
51
				shell, SWTProperties.ENABLED);
52
				.observeEnabled(shell);
52
		Boolean value = Boolean.FALSE;
53
		Boolean value = Boolean.FALSE;
53
		observableValue.setValue(value);
54
		observableValue.setValue(value);
54
		assertFalse(shell.isEnabled());
55
		assertFalse(shell.isEnabled());
55
	}
56
	}
56
57
57
	public void testGetValueEnabled() throws Exception {
58
	public void testGetValueEnabled() throws Exception {
58
		ControlObservableValue value = new ControlObservableValue(shell,
59
		ISWTObservableValue value = SWTObservables.observeEnabled(shell);
59
				SWTProperties.ENABLED);
60
		shell.setEnabled(false);
60
		shell.setEnabled(false);
61
		assertEquals(Boolean.FALSE, value.getValue());
61
		assertEquals(Boolean.FALSE, value.getValue());
62
	}
62
	}
63
63
64
	public void testGetValueTypeEnabled() throws Exception {
64
	public void testGetValueTypeEnabled() throws Exception {
65
		ControlObservableValue value = new ControlObservableValue(shell,
65
		ISWTObservableValue value = SWTObservables.observeEnabled(shell);
66
				SWTProperties.ENABLED);
67
		assertEquals(boolean.class, value.getValueType());
66
		assertEquals(boolean.class, value.getValueType());
68
	}
67
	}
69
68
70
	public void testSetValueVisible() throws Exception {
69
	public void testSetValueVisible() throws Exception {
71
		ControlObservableValue value = new ControlObservableValue(shell,
70
		ISWTObservableValue value = SWTObservables.observeVisible(shell);
72
				SWTProperties.VISIBLE);
73
		value.setValue(Boolean.FALSE);
71
		value.setValue(Boolean.FALSE);
74
		assertFalse(shell.isVisible());
72
		assertFalse(shell.isVisible());
75
	}
73
	}
76
74
77
	public void testGetValueVisible() throws Exception {
75
	public void testGetValueVisible() throws Exception {
78
		ControlObservableValue value = new ControlObservableValue(shell,
76
		ISWTObservableValue value = SWTObservables.observeVisible(shell);
79
				SWTProperties.VISIBLE);
80
		shell.setVisible(false);
77
		shell.setVisible(false);
81
		assertEquals(Boolean.FALSE, value.getValue());
78
		assertEquals(Boolean.FALSE, value.getValue());
82
	}
79
	}
83
80
84
	public void testGetValueTypeVisible() throws Exception {
81
	public void testGetValueTypeVisible() throws Exception {
85
		ControlObservableValue value = new ControlObservableValue(shell,
82
		ISWTObservableValue value = SWTObservables.observeVisible(shell);
86
				SWTProperties.VISIBLE);
87
		assertEquals(Boolean.TYPE, value.getValueType());
83
		assertEquals(Boolean.TYPE, value.getValueType());
88
	}
84
	}
89
85
90
	public void testSetValueForeground() throws Exception {
86
	public void testSetValueForeground() throws Exception {
91
		ControlObservableValue value = new ControlObservableValue(shell,
87
		ISWTObservableValue value = SWTObservables.observeForeground(shell);
92
				SWTProperties.FOREGROUND);
93
88
94
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
89
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
95
90
Lines 98-105 Link Here
98
	}
93
	}
99
94
100
	public void testGetValueForeground() throws Exception {
95
	public void testGetValueForeground() throws Exception {
101
		ControlObservableValue value = new ControlObservableValue(shell,
96
		ISWTObservableValue value = SWTObservables.observeForeground(shell);
102
				SWTProperties.FOREGROUND);
103
97
104
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
98
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
105
		shell.setForeground(color);
99
		shell.setForeground(color);
Lines 107-120 Link Here
107
	}
101
	}
108
102
109
	public void testGetValueTypeForgroundColor() throws Exception {
103
	public void testGetValueTypeForgroundColor() throws Exception {
110
		ControlObservableValue value = new ControlObservableValue(shell,
104
		ISWTObservableValue value = SWTObservables.observeForeground(shell);
111
				SWTProperties.FOREGROUND);
112
		assertEquals(Color.class, value.getValueType());
105
		assertEquals(Color.class, value.getValueType());
113
	}
106
	}
114
107
115
	public void testGetValueBackground() throws Exception {
108
	public void testGetValueBackground() throws Exception {
116
		ControlObservableValue value = new ControlObservableValue(shell,
109
		ISWTObservableValue value = SWTObservables.observeBackground(shell);
117
				SWTProperties.BACKGROUND);
118
110
119
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
111
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
120
		shell.setBackground(color);
112
		shell.setBackground(color);
Lines 122-129 Link Here
122
	}
114
	}
123
115
124
	public void testSetValueBackground() throws Exception {
116
	public void testSetValueBackground() throws Exception {
125
		ControlObservableValue value = new ControlObservableValue(shell,
117
		ISWTObservableValue value = SWTObservables.observeBackground(shell);
126
				SWTProperties.BACKGROUND);
127
118
128
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
119
		Color color = shell.getDisplay().getSystemColor(SWT.COLOR_BLACK);
129
120
Lines 132-151 Link Here
132
	}
123
	}
133
124
134
	public void testGetValueTypeBackgroundColor() throws Exception {
125
	public void testGetValueTypeBackgroundColor() throws Exception {
135
		ControlObservableValue value = new ControlObservableValue(shell,
126
		ISWTObservableValue value = SWTObservables.observeBackground(shell);
136
				SWTProperties.BACKGROUND);
137
		assertEquals(Color.class, value.getValueType());
127
		assertEquals(Color.class, value.getValueType());
138
	}
128
	}
139
129
140
	public void testGetValueTypeTooltip() throws Exception {
130
	public void testGetValueTypeTooltip() throws Exception {
141
		ControlObservableValue value = new ControlObservableValue(shell,
131
		ISWTObservableValue value = SWTObservables.observeTooltipText(shell);
142
				SWTProperties.TOOLTIP_TEXT);
143
		assertEquals(String.class, value.getValueType());
132
		assertEquals(String.class, value.getValueType());
144
	}
133
	}
145
134
146
	public void testSetValueFont() throws Exception {
135
	public void testSetValueFont() throws Exception {
147
		ControlObservableValue value = new ControlObservableValue(shell,
136
		ISWTObservableValue value = SWTObservables.observeFont(shell);
148
				SWTProperties.FONT);
149
137
150
		Font font = JFaceResources.getDialogFont();
138
		Font font = JFaceResources.getDialogFont();
151
139
Lines 154-161 Link Here
154
	}
142
	}
155
143
156
	public void testGetValueFont() throws Exception {
144
	public void testGetValueFont() throws Exception {
157
		ControlObservableValue value = new ControlObservableValue(shell,
145
		ISWTObservableValue value = SWTObservables.observeFont(shell);
158
				SWTProperties.FONT);
159
146
160
		Font font = JFaceResources.getDialogFont();
147
		Font font = JFaceResources.getDialogFont();
161
		shell.setFont(font);
148
		shell.setFont(font);
Lines 163-192 Link Here
163
	}
150
	}
164
151
165
	public void testGetValueTypeFont() throws Exception {
152
	public void testGetValueTypeFont() throws Exception {
166
		ControlObservableValue value = new ControlObservableValue(shell,
153
		ISWTObservableValue value = SWTObservables.observeFont(shell);
167
				SWTProperties.FONT);
168
		assertEquals(Font.class, value.getValueType());
154
		assertEquals(Font.class, value.getValueType());
169
	}
155
	}
170
156
171
	public void testSetValueTooltipText() throws Exception {
157
	public void testSetValueTooltipText() throws Exception {
172
		ControlObservableValue value = new ControlObservableValue(shell,
158
		ISWTObservableValue value = SWTObservables.observeTooltipText(shell);
173
				SWTProperties.TOOLTIP_TEXT);
174
		String text = "text";
159
		String text = "text";
175
		value.setValue(text);
160
		value.setValue(text);
176
		assertEquals(text, shell.getToolTipText());
161
		assertEquals(text, shell.getToolTipText());
177
	}
162
	}
178
163
179
	public void testGetValueTooltipText() throws Exception {
164
	public void testGetValueTooltipText() throws Exception {
180
		ControlObservableValue value = new ControlObservableValue(shell,
165
		ISWTObservableValue value = SWTObservables.observeTooltipText(shell);
181
				SWTProperties.TOOLTIP_TEXT);
182
		String text = "text";
166
		String text = "text";
183
		shell.setToolTipText(text);
167
		shell.setToolTipText(text);
184
		assertEquals(text, value.getValue());
168
		assertEquals(text, value.getValue());
185
	}
169
	}
186
170
187
	public void testGetValueTypeTooltipText() throws Exception {
171
	public void testGetValueTypeTooltipText() throws Exception {
188
		ControlObservableValue value = new ControlObservableValue(shell,
172
		ISWTObservableValue value = SWTObservables.observeTooltipText(shell);
189
				SWTProperties.TOOLTIP_TEXT);
190
		assertEquals(String.class, value.getValueType());
173
		assertEquals(String.class, value.getValueType());
191
	}
174
	}
192
}
175
}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/LabelObservableValueTest.java (-15 / +18 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-28 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
25
import org.eclipse.jface.databinding.swt.LabelProperties;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
26
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Label;
29
import org.eclipse.swt.widgets.Label;
Lines 53-72 Link Here
53
	}
54
	}
54
	
55
	
55
	protected IObservable doCreateObservable() {
56
	protected IObservable doCreateObservable() {
56
		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
57
		return getObservableContractDelegate().createObservable(
58
				SWTObservables.getRealm(Display.getDefault()));
59
	}
60
61
	public void testSetValue() throws Exception {
62
		// preconditions
63
		assertEquals("", label.getText());
64
		assertEquals("", observable.getValue());
65
66
		String value = "value";
67
		observable.setValue(value);
68
		assertEquals("label text", value, label.getText());
69
		assertEquals("observable value", value, observable.getValue());
57
	}
70
	}
58
	
71
	
59
    public void testSetValue() throws Exception {
60
    	//preconditions
61
        assertEquals("", label.getText());
62
        assertEquals("", observable.getValue());
63
        
64
        String value = "value";
65
        observable.setValue(value);
66
        assertEquals("label text", value, label.getText());
67
        assertEquals("observable value", value, observable.getValue());
68
    }
69
    
70
    public static Test suite() {
72
    public static Test suite() {
71
    	TestSuite suite = new TestSuite(LabelObservableValueTest.class.toString());
73
    	TestSuite suite = new TestSuite(LabelObservableValueTest.class.toString());
72
    	suite.addTestSuite(LabelObservableValueTest.class);
74
    	suite.addTestSuite(LabelObservableValueTest.class);
Lines 90-96 Link Here
90
		}
92
		}
91
93
92
		public IObservableValue createObservableValue(Realm realm) {
94
		public IObservableValue createObservableValue(Realm realm) {
93
			return new LabelObservableValue(realm, label);
95
			return PropertyObservables.observeValue(realm, label,
96
					LabelProperties.text());
94
		}
97
		}
95
98
96
		public void change(IObservable observable) {
99
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueTest.java (-11 / +23 lines)
Lines 10-21 Link Here
10
 *     Brad Reynolds - bug 116920
10
 *     Brad Reynolds - bug 116920
11
 *     Brad Reynolds - bug 164653
11
 *     Brad Reynolds - bug 164653
12
 *     Ashley Cambrell - bug 198904
12
 *     Ashley Cambrell - bug 198904
13
 *     Matthew Hall - bug 194734
13
 *******************************************************************************/
14
 *******************************************************************************/
14
15
15
package org.eclipse.jface.tests.internal.databinding.swt;
16
package org.eclipse.jface.tests.internal.databinding.swt;
16
17
18
import org.eclipse.core.databinding.observable.value.IObservableValue;
19
import org.eclipse.core.databinding.property.PropertyObservables;
17
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
20
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
18
import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
21
import org.eclipse.jface.databinding.swt.TextProperties;
19
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
22
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
20
import org.eclipse.swt.SWT;
23
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.widgets.Shell;
24
import org.eclipse.swt.widgets.Shell;
Lines 45-60 Link Here
45
	 */
48
	 */
46
	public void testConstructorUpdateEventTypes() {
49
	public void testConstructorUpdateEventTypes() {
47
		try {
50
		try {
48
			new TextObservableValue(text, SWT.NONE);
51
			TextProperties.text(SWT.None);
49
			new TextObservableValue(text, SWT.FocusOut);
52
			TextProperties.text(SWT.FocusOut);
50
			new TextObservableValue(text, SWT.Modify);
53
			TextProperties.text(SWT.Modify);
51
			assertTrue(true);
54
			assertTrue(true);
52
		} catch (IllegalArgumentException e) {
55
		} catch (IllegalArgumentException e) {
53
			fail();
56
			fail();
54
		}
57
		}
55
58
56
		try {
59
		try {
57
			new TextObservableValue(text, SWT.Verify);
60
			TextProperties.text(SWT.Verify);
58
			fail();
61
			fail();
59
		} catch (IllegalArgumentException e) {
62
		} catch (IllegalArgumentException e) {
60
			assertTrue(true);
63
			assertTrue(true);
Lines 67-92 Link Here
67
	 * @throws Exception
70
	 * @throws Exception
68
	 */
71
	 */
69
	public void testGetValueBeforeFocusOutChangeEventsFire() throws Exception {
72
	public void testGetValueBeforeFocusOutChangeEventsFire() throws Exception {
70
		TextObservableValue observableValue = new TextObservableValue(text, SWT.FocusOut);
73
		IObservableValue observableValue = PropertyObservables.observeValue(
74
				text, TextProperties.text(SWT.FocusOut));
71
		observableValue.addValueChangeListener(listener);
75
		observableValue.addValueChangeListener(listener);
72
		
76
		
73
		String a = "a";
77
		String a = "a";
74
		String b = "b";
78
		String b = "b";
75
		
79
		
76
		text.setText(a);
80
		text.setText(a);
77
		assertEquals(a, observableValue.getValue()); //fetch the value updating the buffered value
81
78
		
82
		assertEquals(0, listener.count);
83
84
		// fetching the value updates the buffered value
85
		assertEquals(a, observableValue.getValue()); 
86
		assertEquals(1, listener.count);
87
79
		text.setText(b);
88
		text.setText(b);
89
90
		assertEquals(1, listener.count);
91
80
		text.notifyListeners(SWT.FocusOut, null);
92
		text.notifyListeners(SWT.FocusOut, null);
81
		
93
		
82
		assertEquals(1, listener.count);
94
		assertEquals(2, listener.count);
83
		assertEquals(a, listener.event.diff.getOldValue());
95
		assertEquals(a, listener.event.diff.getOldValue());
84
		assertEquals(b, listener.event.diff.getNewValue());
96
		assertEquals(b, listener.event.diff.getNewValue());
85
	}
97
	}
86
98
87
	public void testDispose() throws Exception {
99
	public void testDispose() throws Exception {
88
		TextObservableValue observableValue = new TextObservableValue(text,
100
		IObservableValue observableValue = PropertyObservables.observeValue(
89
				SWT.Modify);
101
				text, TextProperties.text(SWT.Modify));
90
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
102
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
91
		observableValue.addValueChangeListener(testCounterValueChangeListener);
103
		observableValue.addValueChangeListener(testCounterValueChangeListener);
92
104
(-)src/org/eclipse/jface/tests/internal/databinding/swt/CComboSingleSelectionObservableValueTest.java (-10 / +10 lines)
Lines 8-14 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198903
10
 *     Ashley Cambrell - bug 198903
11
 *     Matthew Hall - bug 213145
11
 *     Matthew Hall - bug 213145, 194734
12
 ******************************************************************************/
12
 ******************************************************************************/
13
13
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-28 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.ISWTObservable;
25
import org.eclipse.jface.databinding.swt.CComboProperties;
25
import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionObservableValue;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
27
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.custom.CCombo;
29
import org.eclipse.swt.custom.CCombo;
Lines 34-41 Link Here
34
public class CComboSingleSelectionObservableValueTest extends AbstractSWTTestCase {
35
public class CComboSingleSelectionObservableValueTest extends AbstractSWTTestCase {
35
	public void testSetValue() throws Exception {
36
	public void testSetValue() throws Exception {
36
		CCombo combo = new CCombo(getShell(), SWT.NONE);
37
		CCombo combo = new CCombo(getShell(), SWT.NONE);
37
		CComboSingleSelectionObservableValue observableValue = new CComboSingleSelectionObservableValue(
38
		IObservableValue observableValue = SWTObservables
38
				combo);
39
				.observeSingleSelectionIndex(combo);
39
		combo.add("Item1");
40
		combo.add("Item1");
40
		combo.add("Item2");
41
		combo.add("Item2");
41
42
Lines 75-87 Link Here
75
		}
76
		}
76
77
77
		public IObservableValue createObservableValue(Realm realm) {
78
		public IObservableValue createObservableValue(Realm realm) {
78
			return new CComboSingleSelectionObservableValue(realm, combo);
79
			return PropertyObservables.observeValue(realm, combo,
80
					CComboProperties.singleSelectionIndex());
79
		}
81
		}
80
82
81
		public void change(IObservable observable) {
83
		public void change(IObservable observable) {
82
			int index = _createValue((IObservableValue) observable);
84
			IObservableValue value = (IObservableValue)observable;
83
			combo.select(index);
85
			value.setValue(createValue(value));
84
			combo.notifyListeners(SWT.Selection, null);
85
		}
86
		}
86
87
87
		public Object getValueType(IObservableValue observable) {
88
		public Object getValueType(IObservableValue observable) {
Lines 93-99 Link Here
93
		}
94
		}
94
		
95
		
95
		private int _createValue(IObservableValue observable) {
96
		private int _createValue(IObservableValue observable) {
96
			CCombo combo = ((CCombo) ((ISWTObservable) observable).getWidget());
97
			int value = Math.max(0, combo.getSelectionIndex());
97
			int value = Math.max(0, combo.getSelectionIndex());
98
			
98
			
99
			//returns either 0 or 1 depending upon current value
99
			//returns either 0 or 1 depending upon current value
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SWTDelayedObservableValueDecoratorTest.java (-45 / +8 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Matthew Hall - initial API and implementation (bug 212223)
9
 *     Matthew Hall - initial API and implementation (bug 212223)
10
 *     Matthew Hall - bug 213145, 245647
10
 *     Matthew Hall - bug 213145, 245647, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 15-36 Link Here
15
import junit.framework.Test;
15
import junit.framework.Test;
16
import junit.framework.TestSuite;
16
import junit.framework.TestSuite;
17
17
18
import org.eclipse.core.databinding.observable.Diffs;
19
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.WritableValue;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
25
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
27
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
28
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
28
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
29
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.widgets.Display;
30
import org.eclipse.swt.widgets.Display;
31
import org.eclipse.swt.widgets.Event;
31
import org.eclipse.swt.widgets.Event;
32
import org.eclipse.swt.widgets.Shell;
32
import org.eclipse.swt.widgets.Shell;
33
import org.eclipse.swt.widgets.Widget;
34
33
35
/**
34
/**
36
 * Tests for DelayedObservableValue
35
 * Tests for DelayedObservableValue
Lines 43-57 Link Here
43
	private Shell shell;
42
	private Shell shell;
44
	private Object oldValue;
43
	private Object oldValue;
45
	private Object newValue;
44
	private Object newValue;
46
	private SWTObservableValueStub target;
45
	private ISWTObservableValue target;
47
	private ISWTObservableValue delayed;
46
	private ISWTObservableValue delayed;
48
47
49
	protected void setUp() throws Exception {
48
	protected void setUp() throws Exception {
50
		super.setUp();
49
		super.setUp();
51
		display = Display.getCurrent();
50
		display = Display.getCurrent();
52
		shell = new Shell(display);
51
		shell = new Shell(display);
53
		target = new SWTObservableValueStub(SWTObservables.getRealm(display),
52
		target = new SWTObservableValueDecorator(new WritableValue(
54
				shell);
53
				SWTObservables.getRealm(display)), shell);
55
		oldValue = new Object();
54
		oldValue = new Object();
56
		newValue = new Object();
55
		newValue = new Object();
57
		target.setValue(oldValue);
56
		target.setValue(oldValue);
Lines 93-135 Link Here
93
		assertEquals(newValue, tracker.event.diff.getNewValue());
92
		assertEquals(newValue, tracker.event.diff.getNewValue());
94
	}
93
	}
95
94
96
	static class SWTObservableValueStub extends AbstractSWTObservableValue {
97
		private Object value;
98
		private boolean stale;
99
100
		Object overrideValue;
101
102
		public SWTObservableValueStub(Realm realm, Widget widget) {
103
			super(realm, widget);
104
		}
105
106
		protected Object doGetValue() {
107
			return value;
108
		}
109
110
		protected void doSetValue(Object value) {
111
			Object oldValue = this.value;
112
			if (overrideValue != null)
113
				value = overrideValue;
114
			this.value = value;
115
			stale = false;
116
			fireValueChange(Diffs.createValueDiff(oldValue, value));
117
		}
118
119
		public Object getValueType() {
120
			return Object.class;
121
		}
122
123
		protected void fireStale() {
124
			stale = true;
125
			super.fireStale();
126
		}
127
128
		public boolean isStale() {
129
			return stale;
130
		}
131
	}
132
133
	public static Test suite() {
95
	public static Test suite() {
134
		TestSuite suite = new TestSuite(
96
		TestSuite suite = new TestSuite(
135
				SWTDelayedObservableValueDecoratorTest.class.getName());
97
				SWTDelayedObservableValueDecoratorTest.class.getName());
Lines 155-161 Link Here
155
117
156
		public IObservableValue createObservableValue(Realm realm) {
118
		public IObservableValue createObservableValue(Realm realm) {
157
			return SWTObservables.observeDelayedValue(0,
119
			return SWTObservables.observeDelayedValue(0,
158
					new SWTObservableValueStub(realm, shell));
120
					new SWTObservableValueDecorator(new WritableValue(realm,
121
							null, Object.class), shell));
159
		}
122
		}
160
123
161
		public Object getValueType(IObservableValue observable) {
124
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMinTest.java (-5 / +7 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.SpinnerProperties;
26
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Shell;
29
import org.eclipse.swt.widgets.Shell;
Lines 56-62 Link Here
56
	}
56
	}
57
	
57
	
58
	protected IObservable doCreateObservable() {
58
	protected IObservable doCreateObservable() {
59
		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
59
		return getObservableContractDelegate().createObservable(
60
				SWTObservables.getRealm(Display.getDefault()));
60
	}
61
	}
61
62
62
	public void testGetValue() throws Exception {
63
	public void testGetValue() throws Exception {
Lines 95-101 Link Here
95
		}
96
		}
96
97
97
		public IObservableValue createObservableValue(Realm realm) {
98
		public IObservableValue createObservableValue(Realm realm) {
98
			return new SpinnerObservableValue(realm, spinner, SWTProperties.MIN);
99
			return PropertyObservables.observeValue(realm, spinner,
100
					SpinnerProperties.minimum());
99
		}
101
		}
100
102
101
		public void change(IObservable observable) {
103
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueMaxTest.java (-5 / +7 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.SpinnerProperties;
26
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Shell;
29
import org.eclipse.swt.widgets.Shell;
Lines 56-62 Link Here
56
	}
56
	}
57
	
57
	
58
	protected IObservable doCreateObservable() {
58
	protected IObservable doCreateObservable() {
59
		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
59
		return getObservableContractDelegate().createObservable(
60
				SWTObservables.getRealm(Display.getDefault()));
60
	}
61
	}
61
62
62
	public void testGetValue() throws Exception {
63
	public void testGetValue() throws Exception {
Lines 95-101 Link Here
95
		}
96
		}
96
97
97
		public IObservableValue createObservableValue(Realm realm) {
98
		public IObservableValue createObservableValue(Realm realm) {
98
			return new SpinnerObservableValue(realm, spinner, SWTProperties.MAX);
99
			return PropertyObservables.observeValue(realm, spinner,
100
					SpinnerProperties.maximum());
99
		}
101
		}
100
102
101
		public void change(IObservable observable) {
103
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ButtonObservableValueTest.java (-11 / +11 lines)
Lines 8-14 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198904
10
 *     Ashley Cambrell - bug 198904
11
 *     Matthew Hall - bug 213145
11
 *     Matthew Hall - bug 213145, 194734
12
 ******************************************************************************/
12
 ******************************************************************************/
13
13
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-28 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
26
import org.eclipse.jface.databinding.swt.ButtonProperties;
27
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
28
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
29
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
27
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Button;
31
import org.eclipse.swt.widgets.Button;
Lines 33-51 Link Here
33
 */
36
 */
34
public class ButtonObservableValueTest extends AbstractSWTTestCase {
37
public class ButtonObservableValueTest extends AbstractSWTTestCase {
35
	private Button button;
38
	private Button button;
36
	private ButtonObservableValue observableValue;
39
	private ISWTObservableValue observableValue;
37
	private ValueChangeEventTracker listener;
40
	private ValueChangeEventTracker listener;
38
	
41
	
39
	/* (non-Javadoc)
40
	 * @see junit.framework.TestCase#setUp()
41
	 */
42
	protected void setUp() throws Exception {
42
	protected void setUp() throws Exception {
43
		super.setUp();
43
		super.setUp();
44
		
44
		
45
		Shell shell = getShell();
45
		Shell shell = getShell();
46
		button = new Button(shell, SWT.CHECK);
46
		button = new Button(shell, SWT.CHECK);
47
		observableValue = new ButtonObservableValue(
47
		observableValue = SWTObservables.observeSelection(button);
48
				button);
49
		listener = new ValueChangeEventTracker();
48
		listener = new ValueChangeEventTracker();
50
	}
49
	}
51
	
50
	
Lines 130-136 Link Here
130
		}
129
		}
131
130
132
		public IObservableValue createObservableValue(Realm realm) {
131
		public IObservableValue createObservableValue(Realm realm) {
133
			return new ButtonObservableValue(realm, button);
132
			return PropertyObservables.observeValue(realm, button,
133
					ButtonProperties.selection());
134
		}
134
		}
135
135
136
		public Object getValueType(IObservableValue observable) {
136
		public Object getValueType(IObservableValue observable) {
Lines 138-145 Link Here
138
		}
138
		}
139
139
140
		public void change(IObservable observable) {
140
		public void change(IObservable observable) {
141
			button.setSelection(changeValue(button));
141
			((IObservableValue) observable).setValue(Boolean
142
			button.notifyListeners(SWT.Selection, null);
142
					.valueOf(changeValue(button)));
143
		}
143
		}
144
		
144
		
145
		public Object createValue(IObservableValue observable) {
145
		public Object createValue(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ScaleObservableValueMinTest.java (-4 / +4 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.ScaleProperties;
26
import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Scale;
29
import org.eclipse.swt.widgets.Scale;
Lines 95-101 Link Here
95
		}
95
		}
96
96
97
		public IObservableValue createObservableValue(Realm realm) {
97
		public IObservableValue createObservableValue(Realm realm) {
98
			return new ScaleObservableValue(realm, scale, SWTProperties.MIN);
98
			return PropertyObservables.observeValue(realm, scale, ScaleProperties.minimum());
99
		}
99
		}
100
100
101
		public void change(IObservable observable) {
101
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ListSingleSelectionObservableValueTest.java (-5 / +7 lines)
Lines 7-17 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Ashley Cambrell - initial API and implementation
9
 *     Ashley Cambrell - initial API and implementation
10
 *     Matthew Hall - bug 194734
10
 ******************************************************************************/
11
 ******************************************************************************/
11
12
12
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
14
14
import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionObservableValue;
15
import org.eclipse.core.databinding.observable.value.IObservableValue;
16
import org.eclipse.jface.databinding.swt.SWTObservables;
15
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
17
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
16
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.widgets.List;
19
import org.eclipse.swt.widgets.List;
Lines 23-30 Link Here
23
public class ListSingleSelectionObservableValueTest extends AbstractSWTTestCase {
25
public class ListSingleSelectionObservableValueTest extends AbstractSWTTestCase {
24
	public void testSetValue() throws Exception {
26
	public void testSetValue() throws Exception {
25
		List list = new List(getShell(), SWT.NONE);
27
		List list = new List(getShell(), SWT.NONE);
26
		ListSingleSelectionObservableValue observableValue = new ListSingleSelectionObservableValue(
28
		IObservableValue observableValue = SWTObservables
27
				list);
29
				.observeSingleSelectionIndex(list);
28
		list.add("Item1");
30
		list.add("Item1");
29
31
30
		assertEquals(-1, list.getSelectionIndex());
32
		assertEquals(-1, list.getSelectionIndex());
Lines 39-46 Link Here
39
41
40
	public void testDispose() throws Exception {
42
	public void testDispose() throws Exception {
41
		List list = new List(getShell(), SWT.NONE);
43
		List list = new List(getShell(), SWT.NONE);
42
		ListSingleSelectionObservableValue observableValue = new ListSingleSelectionObservableValue(
44
		IObservableValue observableValue = SWTObservables
43
				list);
45
				.observeSingleSelectionIndex(list);
44
		list.add("Item1");
46
		list.add("Item1");
45
		list.add("Item2");
47
		list.add("Item2");
46
48
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ShellObservableValueTest.java (-5 / +8 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Matthew Hall - initial API and implementation (bug 212235)
9
 *     Matthew Hall - initial API and implementation (bug 212235)
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-27 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
22
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
23
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
24
import org.eclipse.jface.internal.databinding.swt.ShellObservableValue;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.ShellProperties;
25
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
27
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
26
import org.eclipse.swt.widgets.Shell;
28
import org.eclipse.swt.widgets.Shell;
27
29
Lines 34-46 Link Here
34
	String oldValue;
36
	String oldValue;
35
	String newValue;
37
	String newValue;
36
	Shell shell;
38
	Shell shell;
37
	ShellObservableValue observable;
39
	IObservableValue observable;
38
	ValueChangeEventTracker tracker;
40
	ValueChangeEventTracker tracker;
39
41
40
	protected void setUp() throws Exception {
42
	protected void setUp() throws Exception {
41
		super.setUp();
43
		super.setUp();
42
		shell = new Shell();
44
		shell = new Shell();
43
		observable = new ShellObservableValue(shell);
45
		observable = SWTObservables.observeText(shell);
44
		oldValue = "old";
46
		oldValue = "old";
45
		newValue = "new";
47
		newValue = "new";
46
		shell.setText(oldValue);
48
		shell.setText(oldValue);
Lines 109-115 Link Here
109
		}
111
		}
110
112
111
		public IObservableValue createObservableValue(Realm realm) {
113
		public IObservableValue createObservableValue(Realm realm) {
112
			return new ShellObservableValue(realm, shell);
114
			return PropertyObservables.observeValue(realm, shell,
115
					ShellProperties.text());
113
		}
116
		}
114
117
115
		public Object getValueType(IObservableValue observable) {
118
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ComboSingleSelectionObservableValueTest.java (-3 / +5 lines)
Lines 7-16 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Ashley Cambrell - initial API and implementation (bug 198903)
9
 *     Ashley Cambrell - initial API and implementation (bug 198903)
10
 *     Matthew Hall - bug 194734
10
 ******************************************************************************/
11
 ******************************************************************************/
11
package org.eclipse.jface.tests.internal.databinding.swt;
12
package org.eclipse.jface.tests.internal.databinding.swt;
12
13
13
import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
14
import org.eclipse.core.databinding.observable.value.IObservableValue;
15
import org.eclipse.jface.databinding.swt.SWTObservables;
14
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
16
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
15
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.widgets.Combo;
18
import org.eclipse.swt.widgets.Combo;
Lines 23-30 Link Here
23
		AbstractSWTTestCase {
25
		AbstractSWTTestCase {
24
	public void testSetValue() throws Exception {
26
	public void testSetValue() throws Exception {
25
		Combo combo = new Combo(getShell(), SWT.NONE);
27
		Combo combo = new Combo(getShell(), SWT.NONE);
26
		ComboSingleSelectionObservableValue observableValue = new ComboSingleSelectionObservableValue(
28
		IObservableValue observableValue = SWTObservables
27
				combo);
29
				.observeSingleSelectionIndex(combo);
28
		combo.add("Item1");
30
		combo.add("Item1");
29
		combo.add("Item2");
31
		combo.add("Item2");
30
32
(-)src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTextTest.java (-7 / +9 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-31 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.swt.ISWTObservable;
26
import org.eclipse.jface.databinding.swt.CComboProperties;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
28
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
28
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
29
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.custom.CCombo;
30
import org.eclipse.swt.custom.CCombo;
31
import org.eclipse.swt.widgets.Display;
31
import org.eclipse.swt.widgets.Display;
Lines 88-99 Link Here
88
		}
88
		}
89
89
90
		public IObservableValue createObservableValue(Realm realm) {
90
		public IObservableValue createObservableValue(Realm realm) {
91
			return new CComboObservableValue(realm, combo, SWTProperties.TEXT);
91
			return new SWTObservableValueDecorator(
92
					PropertyObservables.observeValue(realm, combo,
93
							CComboProperties.text()), combo);
92
		}
94
		}
93
95
94
		public void change(IObservable observable) {
96
		public void change(IObservable observable) {
95
			CCombo combo = (CCombo) ((ISWTObservable) observable).getWidget();
97
			IObservableValue ov = (IObservableValue) observable;
96
			combo.setText(combo.getText() + "a");
98
			ov.setValue(createValue(ov));
97
		}
99
		}
98
100
99
		public Object getValueType(IObservableValue observable) {
101
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTextTest.java (-7 / +9 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-31 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.swt.ISWTObservable;
26
import org.eclipse.jface.databinding.swt.ComboProperties;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
28
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
28
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
29
import org.eclipse.swt.SWT;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.widgets.Combo;
30
import org.eclipse.swt.widgets.Combo;
31
import org.eclipse.swt.widgets.Display;
31
import org.eclipse.swt.widgets.Display;
Lines 89-100 Link Here
89
		}
89
		}
90
90
91
		public IObservableValue createObservableValue(Realm realm) {
91
		public IObservableValue createObservableValue(Realm realm) {
92
			return new ComboObservableValue(realm, combo, SWTProperties.TEXT);
92
			return new SWTObservableValueDecorator(
93
					PropertyObservables.observeValue(realm, combo,
94
							ComboProperties.text()), combo);
93
		}
95
		}
94
96
95
		public void change(IObservable observable) {
97
		public void change(IObservable observable) {
96
			Combo combo = (Combo) ((ISWTObservable) observable).getWidget();
98
			((IObservableValue) observable)
97
			combo.setText(combo.getText() + "a");
99
					.setValue(createValue((IObservableValue) observable));
98
		}
100
		}
99
101
100
		public Object getValueType(IObservableValue observable) {
102
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/SpinnerObservableValueSelectionTest.java (-5 / +7 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 18-29 Link Here
18
import org.eclipse.core.databinding.observable.IObservable;
18
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.ObservableDelegateTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
25
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
26
import org.eclipse.jface.databinding.swt.SpinnerProperties;
26
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Display;
29
import org.eclipse.swt.widgets.Shell;
29
import org.eclipse.swt.widgets.Shell;
Lines 56-62 Link Here
56
	}
56
	}
57
57
58
	protected IObservable doCreateObservable() {
58
	protected IObservable doCreateObservable() {
59
		return getObservableContractDelegate().createObservable(SWTObservables.getRealm(Display.getDefault()));
59
		return getObservableContractDelegate().createObservable(
60
				SWTObservables.getRealm(Display.getDefault()));
60
	}
61
	}
61
62
62
	public void testGetValue() throws Exception {
63
	public void testGetValue() throws Exception {
Lines 95-101 Link Here
95
		}
96
		}
96
97
97
		public IObservableValue createObservableValue(Realm realm) {
98
		public IObservableValue createObservableValue(Realm realm) {
98
			return new SpinnerObservableValue(realm, spinner, SWTProperties.SELECTION);
99
			return PropertyObservables.observeValue(realm, spinner,
100
					SpinnerProperties.selection());
99
		}
101
		}
100
102
101
		public void change(IObservable observable) {
103
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueTest.java (-16 / +22 lines)
Lines 8-20 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198904
10
 *     Ashley Cambrell - bug 198904
11
 *     Matthew Hall - bug 194734
11
 ******************************************************************************/
12
 ******************************************************************************/
12
13
13
package org.eclipse.jface.tests.internal.databinding.swt;
14
package org.eclipse.jface.tests.internal.databinding.swt;
14
15
16
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.core.databinding.property.PropertyObservables;
18
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
19
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
16
import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
20
import org.eclipse.jface.databinding.swt.ComboProperties;
17
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
21
import org.eclipse.jface.databinding.swt.SWTObservables;
22
import org.eclipse.jface.internal.databinding.swt.ComboSelectionProperty;
23
import org.eclipse.jface.internal.databinding.swt.ComboTextProperty;
18
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
24
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
19
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.SWT;
20
import org.eclipse.swt.widgets.Combo;
26
import org.eclipse.swt.widgets.Combo;
Lines 26-33 Link Here
26
public class ComboObservableValueTest extends AbstractSWTTestCase {
32
public class ComboObservableValueTest extends AbstractSWTTestCase {
27
	public void testDispose() throws Exception {
33
	public void testDispose() throws Exception {
28
		Combo combo = new Combo(getShell(), SWT.NONE);
34
		Combo combo = new Combo(getShell(), SWT.NONE);
29
		ComboObservableValue observableValue = new ComboObservableValue(combo,
35
		IObservableValue observableValue = SWTObservables.observeText(combo);
30
				SWTProperties.TEXT);
31
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
36
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
32
		observableValue.addValueChangeListener(testCounterValueChangeListener);
37
		observableValue.addValueChangeListener(testCounterValueChangeListener);
33
38
Lines 51-75 Link Here
51
	}
56
	}
52
57
53
	public void testSetValueWithNull() {
58
	public void testSetValueWithNull() {
54
		testSetValueWithNull(SWTProperties.TEXT);
59
		testSetValueWithNull(ComboProperties.text());
55
		testSetValueWithNull(SWTProperties.SELECTION);
60
		testSetValueWithNull(ComboProperties.selection());
56
	}
61
	}
57
62
58
	protected void testSetValueWithNull(String observableMode) {
63
	protected void testSetValueWithNull(IValueProperty property) {
59
		Combo combo = new Combo(getShell(), SWT.NONE);
64
		Combo combo = new Combo(getShell(), SWT.NONE);
60
		combo.setItems(new String[] {"one", "two", "three"});
65
		combo.setItems(new String[] { "one", "two", "three" });
61
		ComboObservableValue observable = new ComboObservableValue(
66
		IObservableValue observable = PropertyObservables.observeValue(combo,
62
				combo, observableMode);
67
				property);
63
68
64
		observable.doSetValue("two");
69
		observable.setValue("two");
65
		assertEquals("two", combo.getText());
70
		assertEquals("two", combo.getText());
66
		if (observableMode.equals(SWTProperties.SELECTION)) {
71
		if (property instanceof ComboSelectionProperty) {
67
			assertEquals("expect selection at index 1 in mode " + observableMode, 1, combo.getSelectionIndex());
72
			assertEquals("expect selection at index 1 in selection mode", 1,
73
					combo.getSelectionIndex());
68
		}
74
		}
69
75
70
		if (observableMode.equals(SWTProperties.TEXT)) {
76
		if (property instanceof ComboTextProperty) {
71
			observable.doSetValue(null);
77
			observable.setValue(null);
72
			assertEquals("expect empty text in mode " + observableMode, "", combo.getText());
78
			assertEquals("expect empty text in text mode", "", combo.getText());
73
		}
79
		}
74
	}
80
	}
75
}
81
}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueSelectionTest.java (-9 / +10 lines)
Lines 19-31 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
26
import org.eclipse.jface.databinding.swt.CComboProperties;
25
import org.eclipse.jface.databinding.swt.ISWTObservable;
27
import org.eclipse.jface.databinding.swt.ISWTObservable;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
28
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
29
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
28
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.custom.CCombo;
31
import org.eclipse.swt.custom.CCombo;
31
import org.eclipse.swt.widgets.Display;
32
import org.eclipse.swt.widgets.Display;
Lines 57-63 Link Here
57
		IObservableValue observable = (IObservableValue) delegate
58
		IObservableValue observable = (IObservableValue) delegate
58
				.createObservable(SWTObservables.getRealm(Display.getDefault()));
59
				.createObservable(SWTObservables.getRealm(Display.getDefault()));
59
60
60
		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
61
		ValueChangeEventTracker listener = ValueChangeEventTracker
62
				.observe(observable);
61
		combo.select(0);
63
		combo.select(0);
62
64
63
		assertEquals("Observable was not notified.", 1, listener.count);
65
		assertEquals("Observable was not notified.", 1, listener.count);
Lines 88-102 Link Here
88
		}
90
		}
89
91
90
		public IObservableValue createObservableValue(Realm realm) {
92
		public IObservableValue createObservableValue(Realm realm) {
91
			return new CComboObservableValue(realm, combo,
93
			return new SWTObservableValueDecorator(PropertyObservables
92
					SWTProperties.SELECTION);
94
					.observeValue(realm, combo, CComboProperties
95
							.selection()), combo);
93
		}
96
		}
94
97
95
		public void change(IObservable observable) {
98
		public void change(IObservable observable) {
96
			int index = combo
99
			IObservableValue ov = (IObservableValue) observable;
97
					.indexOf((String) createValue((IObservableValue) observable));
100
			ov.setValue(createValue(ov));
98
99
			combo.select(index);
100
		}
101
		}
101
102
102
		public Object getValueType(IObservableValue observable) {
103
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/CComboObservableValueTest.java (-12 / +16 lines)
Lines 9-21 Link Here
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Ashley Cambrell - bug 198904
10
 *     Ashley Cambrell - bug 198904
11
 *     Eric Rizzo - bug 134884
11
 *     Eric Rizzo - bug 134884
12
 *     Matthew Hall - bug 194734
12
 ******************************************************************************/
13
 ******************************************************************************/
13
14
14
package org.eclipse.jface.tests.internal.databinding.swt;
15
package org.eclipse.jface.tests.internal.databinding.swt;
15
16
17
import org.eclipse.core.databinding.observable.value.IObservableValue;
18
import org.eclipse.core.databinding.property.PropertyObservables;
19
import org.eclipse.core.databinding.property.value.IValueProperty;
16
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
20
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
17
import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
21
import org.eclipse.jface.databinding.swt.CComboProperties;
18
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
22
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
23
import org.eclipse.jface.databinding.swt.SWTObservables;
19
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
24
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
20
import org.eclipse.swt.SWT;
25
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.custom.CCombo;
26
import org.eclipse.swt.custom.CCombo;
Lines 26-33 Link Here
26
public class CComboObservableValueTest extends AbstractSWTTestCase {
31
public class CComboObservableValueTest extends AbstractSWTTestCase {
27
	public void testDispose() throws Exception {
32
	public void testDispose() throws Exception {
28
		CCombo combo = new CCombo(getShell(), SWT.NONE);
33
		CCombo combo = new CCombo(getShell(), SWT.NONE);
29
		CComboObservableValue observableValue = new CComboObservableValue(
34
		ISWTObservableValue observableValue = SWTObservables.observeText(combo);
30
				combo, SWTProperties.TEXT);
31
35
32
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
36
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
33
		observableValue.addValueChangeListener(testCounterValueChangeListener);
37
		observableValue.addValueChangeListener(testCounterValueChangeListener);
Lines 52-72 Link Here
52
	}
56
	}
53
57
54
	public void testSetValueWithNull() {
58
	public void testSetValueWithNull() {
55
		testSetValueWithNull(SWTProperties.TEXT);
59
		testSetValueWithNull(CComboProperties.text());
56
		testSetValueWithNull(SWTProperties.SELECTION);
60
		testSetValueWithNull(CComboProperties.selection());
57
	}
61
	}
58
62
59
	protected void testSetValueWithNull(String observableMode) {
63
	protected void testSetValueWithNull(IValueProperty property) {
60
		CCombo combo = new CCombo(getShell(), SWT.NONE);
64
		CCombo combo = new CCombo(getShell(), SWT.NONE);
61
		combo.setItems(new String[] {"one", "two", "three"});
65
		combo.setItems(new String[] { "one", "two", "three" });
62
		CComboObservableValue observable = new CComboObservableValue(
66
		IObservableValue observable = PropertyObservables.observeValue(
63
				combo, observableMode);
67
				combo, property);
64
68
65
		observable.doSetValue("two");
69
		observable.setValue("two");
66
		assertEquals("two", combo.getText());
70
		assertEquals("two", combo.getText());
67
		assertEquals(1, combo.getSelectionIndex());
71
		assertEquals(1, combo.getSelectionIndex());
68
72
69
		observable.doSetValue(null);
73
		observable.setValue(null);
70
		assertEquals("", combo.getText());
74
		assertEquals("", combo.getText());
71
		assertEquals(-1, combo.getSelectionIndex());
75
		assertEquals(-1, combo.getSelectionIndex());
72
	}
76
	}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/TextObservableValueModifyTest.java (-3 / +5 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-27 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
25
import org.eclipse.jface.databinding.swt.TextProperties;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Text;
28
import org.eclipse.swt.widgets.Text;
Lines 52-58 Link Here
52
		}
53
		}
53
54
54
		public IObservableValue createObservableValue(Realm realm) {
55
		public IObservableValue createObservableValue(Realm realm) {
55
			return new TextObservableValue(realm, text, SWT.Modify);
56
			return PropertyObservables.observeValue(realm, text, TextProperties
57
					.text(SWT.Modify));
56
		}
58
		}
57
59
58
		public Object getValueType(IObservableValue observable) {
60
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/swt/ComboObservableValueSelectionTest.java (-7 / +8 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.tests.internal.databinding.swt;
13
package org.eclipse.jface.tests.internal.databinding.swt;
Lines 19-31 Link Here
19
import org.eclipse.core.databinding.observable.IObservable;
19
import org.eclipse.core.databinding.observable.IObservable;
20
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.PropertyObservables;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
26
import org.eclipse.jface.databinding.swt.ComboProperties;
25
import org.eclipse.jface.databinding.swt.ISWTObservable;
27
import org.eclipse.jface.databinding.swt.ISWTObservable;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
28
import org.eclipse.jface.databinding.swt.SWTObservables;
27
import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
29
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
28
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
29
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.SWT;
30
import org.eclipse.swt.widgets.Combo;
31
import org.eclipse.swt.widgets.Combo;
31
import org.eclipse.swt.widgets.Display;
32
import org.eclipse.swt.widgets.Display;
Lines 91-106 Link Here
91
		}
92
		}
92
93
93
		public IObservableValue createObservableValue(Realm realm) {
94
		public IObservableValue createObservableValue(Realm realm) {
94
			return new ComboObservableValue(realm, combo,
95
			return new SWTObservableValueDecorator(PropertyObservables
95
					SWTProperties.SELECTION);
96
					.observeValue(realm, combo, ComboProperties
97
							.selection()), combo);
96
		}
98
		}
97
99
98
		public void change(IObservable observable) {
100
		public void change(IObservable observable) {
99
			int index = combo
101
			int index = combo
100
					.indexOf((String) createValue((IObservableValue) observable));
102
					.indexOf((String) createValue((IObservableValue) observable));
101
103
102
			combo.select(index);
104
			((IObservableValue) observable).setValue(combo.getItem(index));
103
			combo.notifyListeners(SWT.Selection, null);
104
		}
105
		}
105
106
106
		public Object getValueType(IObservableValue observable) {
107
		public Object getValueType(IObservableValue observable) {
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedListTest.java (-32 / +25 lines)
Lines 7-18 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bugs 221351, 213145
10
 *     Matthew Hall - bugs 221351, 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
14
14
15
import java.beans.IntrospectionException;
16
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeEvent;
17
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyChangeListener;
18
import java.beans.PropertyDescriptor;
17
import java.beans.PropertyDescriptor;
Lines 23-35 Link Here
23
import junit.framework.Test;
22
import junit.framework.Test;
24
import junit.framework.TestSuite;
23
import junit.framework.TestSuite;
25
24
25
import org.eclipse.core.databinding.beans.BeanProperties;
26
import org.eclipse.core.databinding.beans.BeansObservables;
27
import org.eclipse.core.databinding.beans.IBeanObservable;
28
import org.eclipse.core.databinding.beans.IBeanProperty;
26
import org.eclipse.core.databinding.observable.IObservable;
29
import org.eclipse.core.databinding.observable.IObservable;
27
import org.eclipse.core.databinding.observable.IObservableCollection;
30
import org.eclipse.core.databinding.observable.IObservableCollection;
28
import org.eclipse.core.databinding.observable.Realm;
31
import org.eclipse.core.databinding.observable.Realm;
29
import org.eclipse.core.databinding.observable.list.IObservableList;
32
import org.eclipse.core.databinding.observable.list.IObservableList;
30
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
33
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
31
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
34
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
32
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
33
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
35
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
34
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
36
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
35
import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
37
import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
Lines 42-48 Link Here
42
 */
44
 */
43
public class JavaBeanObservableArrayBasedListTest extends
45
public class JavaBeanObservableArrayBasedListTest extends
44
		AbstractDefaultRealmTestCase {
46
		AbstractDefaultRealmTestCase {
45
	private JavaBeanObservableList list;
47
	private IObservableList list;
48
	private IBeanObservable beanObservable;
46
49
47
	private PropertyDescriptor propertyDescriptor;
50
	private PropertyDescriptor propertyDescriptor;
48
51
Lines 59-77 Link Here
59
		super.setUp();
62
		super.setUp();
60
63
61
		propertyName = "array";
64
		propertyName = "array";
62
		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
65
		propertyDescriptor = ((IBeanProperty) BeanProperties.listProperty(
66
				Bean.class, propertyName)).getPropertyDescriptor();
63
		bean = new Bean(new Object[0]);
67
		bean = new Bean(new Object[0]);
64
68
65
		list = new JavaBeanObservableList(SWTObservables.getRealm(Display
69
		list = BeansObservables.observeList(SWTObservables.getRealm(Display
66
				.getDefault()), bean, propertyDescriptor, Bean.class);
70
				.getDefault()), bean, propertyName);
71
		beanObservable = (IBeanObservable) list;
67
	}
72
	}
68
73
69
	public void testGetObserved() throws Exception {
74
	public void testGetObserved() throws Exception {
70
		assertSame(bean, list.getObserved());
75
		assertSame(bean, beanObservable.getObserved());
71
	}
76
	}
72
77
73
	public void testGetPropertyDescriptor() throws Exception {
78
	public void testGetPropertyDescriptor() throws Exception {
74
		assertSame(propertyDescriptor, list.getPropertyDescriptor());
79
		assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
75
	}
80
	}
76
81
77
	public void testRegistersListenerAfterFirstListenerIsAdded()
82
	public void testRegistersListenerAfterFirstListenerIsAdded()
Lines 308-323 Link Here
308
	}
313
	}
309
314
310
	public void testRemoveAll() throws Exception {
315
	public void testRemoveAll() throws Exception {
311
		List elements = Arrays.asList(new String[] { "1", "2" });
316
		list.addAll(Arrays.asList(new String[] { "1", "2", "3", "4" }));
312
		list.addAll(elements);
313
		list.addAll(elements);
314
315
		assertEquals(4, bean.getArray().length);
317
		assertEquals(4, bean.getArray().length);
316
		list.removeAll(elements);
318
319
		list.removeAll(Arrays.asList(new String[] { "2", "4" }));
317
320
318
		assertEquals(2, bean.getArray().length);
321
		assertEquals(2, bean.getArray().length);
319
		assertEquals(elements.get(0), bean.getArray()[0]);
322
		assertEquals("1", bean.getArray()[0]);
320
		assertEquals(elements.get(1), bean.getArray()[1]);
323
		assertEquals("3", bean.getArray()[1]);
321
	}
324
	}
322
325
323
	public void testRemoveAllListChangeEvent() throws Exception {
326
	public void testRemoveAllListChangeEvent() throws Exception {
Lines 471-478 Link Here
471
		PropertyChangeEvent event = listener.evt;
474
		PropertyChangeEvent event = listener.evt;
472
		assertEquals("event did not fire", 1, listener.count);
475
		assertEquals("event did not fire", 1, listener.count);
473
		assertEquals("array", event.getPropertyName());
476
		assertEquals("array", event.getPropertyName());
474
		assertTrue("old value", Arrays.equals(old, (Object[]) event.getOldValue()));
477
		assertTrue("old value", Arrays.equals(old, (Object[]) event
475
		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event.getNewValue()));
478
				.getOldValue()));
479
		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event
480
				.getNewValue()));
476
		assertFalse("lists are equal", Arrays.equals(bean.getArray(), old));
481
		assertFalse("lists are equal", Arrays.equals(bean.getArray(), old));
477
	}
482
	}
478
483
Lines 482-492 Link Here
482
487
483
		PropertyChangeEvent evt;
488
		PropertyChangeEvent evt;
484
489
485
		/*
486
		 * (non-Javadoc)
487
		 * 
488
		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
489
		 */
490
		public void propertyChange(PropertyChangeEvent evt) {
490
		public void propertyChange(PropertyChangeEvent evt) {
491
			count++;
491
			count++;
492
			this.evt = evt;
492
			this.evt = evt;
Lines 504-520 Link Here
504
		public IObservableCollection createObservableCollection(Realm realm,
504
		public IObservableCollection createObservableCollection(Realm realm,
505
				int elementCount) {
505
				int elementCount) {
506
			String propertyName = "array";
506
			String propertyName = "array";
507
			PropertyDescriptor propertyDescriptor;
508
			try {
509
				propertyDescriptor = new PropertyDescriptor(propertyName,
510
						Bean.class);
511
			} catch (IntrospectionException e) {
512
				throw new RuntimeException(e);
513
			}
514
			Object bean = new Bean(new Object[0]);
507
			Object bean = new Bean(new Object[0]);
515
508
516
			IObservableList list = new JavaBeanObservableList(realm, bean,
509
			IObservableList list = BeansObservables.observeList(realm, bean,
517
					propertyDescriptor, String.class);
510
					propertyName, String.class);
518
			for (int i = 0; i < elementCount; i++)
511
			for (int i = 0; i < elementCount; i++)
519
				list.add(createElement(list));
512
				list.add(createElement(list));
520
			return list;
513
			return list;
(-)src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableListDecoratorTest.java (-14 / +8 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bugs 208858, 213145, 246625
10
 *     Matthew Hall - bugs 208858, 213145, 246625, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
Lines 18-30 Link Here
18
import junit.framework.TestCase;
18
import junit.framework.TestCase;
19
import junit.framework.TestSuite;
19
import junit.framework.TestSuite;
20
20
21
import org.eclipse.core.databinding.beans.BeansObservables;
21
import org.eclipse.core.databinding.observable.IObservable;
22
import org.eclipse.core.databinding.observable.IObservable;
22
import org.eclipse.core.databinding.observable.IObservableCollection;
23
import org.eclipse.core.databinding.observable.IObservableCollection;
23
import org.eclipse.core.databinding.observable.Realm;
24
import org.eclipse.core.databinding.observable.Realm;
24
import org.eclipse.core.databinding.observable.list.IObservableList;
25
import org.eclipse.core.databinding.observable.list.IObservableList;
25
import org.eclipse.core.databinding.observable.list.WritableList;
26
import org.eclipse.core.databinding.observable.list.WritableList;
26
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
27
import org.eclipse.core.internal.databinding.beans.BeanObservableListDecorator;
27
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
28
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
28
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
29
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
29
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
30
import org.eclipse.jface.databinding.swt.SWTObservables;
30
import org.eclipse.jface.databinding.swt.SWTObservables;
Lines 36-71 Link Here
36
public class BeanObservableListDecoratorTest extends TestCase {
36
public class BeanObservableListDecoratorTest extends TestCase {
37
	private Bean bean;
37
	private Bean bean;
38
	private PropertyDescriptor propertyDescriptor;
38
	private PropertyDescriptor propertyDescriptor;
39
	private JavaBeanObservableList observableList;
39
	private IObservableList observableList;
40
	private BeanObservableListDecorator decorator;
40
	private BeanObservableListDecorator decorator;
41
41
42
	/*
43
	 * (non-Javadoc)
44
	 * 
45
	 * @see junit.framework.TestCase#setUp()
46
	 */
47
	protected void setUp() throws Exception {
42
	protected void setUp() throws Exception {
48
		super.setUp();
43
		super.setUp();
49
		
44
		
50
		bean = new Bean();
45
		bean = new Bean();
51
		propertyDescriptor = new PropertyDescriptor(
46
		propertyDescriptor = new PropertyDescriptor(
52
				"list", Bean.class,"getList","setList");
47
				"list", Bean.class,"getList","setList");
53
		observableList = new JavaBeanObservableList(
48
		observableList = BeansObservables.observeList(
54
				SWTObservables.getRealm(Display.getDefault()), bean,
49
				SWTObservables.getRealm(Display.getDefault()), bean, "list");
55
				propertyDescriptor, Bean.class);
56
		decorator = new BeanObservableListDecorator(observableList, propertyDescriptor);
50
		decorator = new BeanObservableListDecorator(observableList, propertyDescriptor);
57
	}
51
	}
58
52
59
	public void testGetDelegate() throws Exception {
53
	public void testGetDelegate() throws Exception {
60
		assertEquals(observableList, decorator.getDecorated());
54
		assertSame(observableList, decorator.getDecorated());
61
	}
55
	}
62
56
63
	public void testGetObserved() throws Exception {
57
	public void testGetObserved() throws Exception {
64
		assertEquals(bean, decorator.getObserved());
58
		assertSame(bean, decorator.getObserved());
65
	}
59
	}
66
60
67
	public void testGetPropertyDescriptor() throws Exception {
61
	public void testGetPropertyDescriptor() throws Exception {
68
		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
62
		assertSame(propertyDescriptor, decorator.getPropertyDescriptor());
69
	}
63
	}
70
64
71
	public static Test suite() {
65
	public static Test suite() {
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableListTest.java (-36 / +26 lines)
Lines 7-18 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bugs 221351, 213145
10
 *     Matthew Hall - bugs 221351, 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
14
14
15
import java.beans.IntrospectionException;
16
import java.beans.PropertyChangeEvent;
15
import java.beans.PropertyChangeEvent;
17
import java.beans.PropertyChangeListener;
16
import java.beans.PropertyChangeListener;
18
import java.beans.PropertyDescriptor;
17
import java.beans.PropertyDescriptor;
Lines 24-36 Link Here
24
import junit.framework.Test;
23
import junit.framework.Test;
25
import junit.framework.TestSuite;
24
import junit.framework.TestSuite;
26
25
26
import org.eclipse.core.databinding.beans.BeanProperties;
27
import org.eclipse.core.databinding.beans.BeansObservables;
28
import org.eclipse.core.databinding.beans.IBeanObservable;
29
import org.eclipse.core.databinding.beans.IBeanProperty;
30
import org.eclipse.core.databinding.beans.PojoObservables;
27
import org.eclipse.core.databinding.observable.IObservable;
31
import org.eclipse.core.databinding.observable.IObservable;
28
import org.eclipse.core.databinding.observable.IObservableCollection;
32
import org.eclipse.core.databinding.observable.IObservableCollection;
29
import org.eclipse.core.databinding.observable.Realm;
33
import org.eclipse.core.databinding.observable.Realm;
30
import org.eclipse.core.databinding.observable.list.IObservableList;
34
import org.eclipse.core.databinding.observable.list.IObservableList;
31
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
35
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
32
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
36
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
33
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
34
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
37
import org.eclipse.jface.databinding.conformance.MutableObservableListContractTest;
35
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
38
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
36
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
39
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
Lines 43-49 Link Here
43
 * @since 1.1
46
 * @since 1.1
44
 */
47
 */
45
public class JavaBeanObservableListTest extends AbstractDefaultRealmTestCase {
48
public class JavaBeanObservableListTest extends AbstractDefaultRealmTestCase {
46
	private JavaBeanObservableList list;
49
	private IObservableList list;
50
	private IBeanObservable beanObservable;
47
51
48
	private PropertyDescriptor propertyDescriptor;
52
	private PropertyDescriptor propertyDescriptor;
49
53
Lines 60-78 Link Here
60
		super.setUp();
64
		super.setUp();
61
65
62
		propertyName = "list";
66
		propertyName = "list";
63
		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
67
		propertyDescriptor = ((IBeanProperty) BeanProperties.listProperty(
68
				Bean.class, propertyName)).getPropertyDescriptor();
64
		bean = new Bean(new ArrayList());
69
		bean = new Bean(new ArrayList());
65
70
66
		list = new JavaBeanObservableList(SWTObservables.getRealm(Display
71
		list = BeansObservables.observeList(SWTObservables.getRealm(Display
67
				.getDefault()), bean, propertyDescriptor, String.class);
72
				.getDefault()), bean, propertyName);
73
		beanObservable = (IBeanObservable) list;
68
	}
74
	}
69
75
70
	public void testGetObserved() throws Exception {
76
	public void testGetObserved() throws Exception {
71
		assertEquals(bean, list.getObserved());
77
		assertEquals(bean, beanObservable.getObserved());
72
	}
78
	}
73
79
74
	public void testGetPropertyDescriptor() throws Exception {
80
	public void testGetPropertyDescriptor() throws Exception {
75
		assertEquals(propertyDescriptor, list.getPropertyDescriptor());
81
		assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
76
	}
82
	}
77
83
78
	public void testRegistersListenerAfterFirstListenerIsAdded()
84
	public void testRegistersListenerAfterFirstListenerIsAdded()
Lines 322-337 Link Here
322
	}
328
	}
323
329
324
	public void testRemoveAll() throws Exception {
330
	public void testRemoveAll() throws Exception {
325
		List elements = Arrays.asList(new String[] { "1", "2" });
331
		list.addAll(Arrays.asList(new String[] { "1", "2", "3", "4" }));
326
		list.addAll(elements);
327
		list.addAll(elements);
328
329
		assertEquals(4, bean.getList().size());
332
		assertEquals(4, bean.getList().size());
330
		list.removeAll(elements);
333
334
		list.removeAll(Arrays.asList(new String[] { "2", "4" }));
331
335
332
		assertEquals(2, bean.getList().size());
336
		assertEquals(2, bean.getList().size());
333
		assertEquals(elements.get(0), bean.getList().get(0));
337
		assertEquals("1", bean.getList().get(0));
334
		assertEquals(elements.get(1), bean.getList().get(1));
338
		assertEquals("3", bean.getList().get(1));
335
	}
339
	}
336
340
337
	public void testRemoveAllListChangeEvent() throws Exception {
341
	public void testRemoveAllListChangeEvent() throws Exception {
Lines 467-475 Link Here
467
471
468
	public void testConstructor_RegistersListener() throws Exception {
472
	public void testConstructor_RegistersListener() throws Exception {
469
		Bean bean = new Bean();
473
		Bean bean = new Bean();
470
		JavaBeanObservableList observable = new JavaBeanObservableList(Realm
474
		IObservableList observable = BeansObservables.observeList(Realm
471
				.getDefault(), bean,
475
				.getDefault(), bean, "list");
472
				new PropertyDescriptor("list", Bean.class), Bean.class);
473
476
474
		assertFalse(bean.hasListeners("list"));
477
		assertFalse(bean.hasListeners("list"));
475
		ChangeEventTracker.observe(observable);
478
		ChangeEventTracker.observe(observable);
Lines 478-486 Link Here
478
481
479
	public void testConstructor_SkipsRegisterListener() throws Exception {
482
	public void testConstructor_SkipsRegisterListener() throws Exception {
480
		Bean bean = new Bean();
483
		Bean bean = new Bean();
481
		JavaBeanObservableList observable = new JavaBeanObservableList(Realm
484
		IObservableList observable = PojoObservables.observeList(Realm
482
				.getDefault(), bean,
485
				.getDefault(), bean, "list");
483
				new PropertyDescriptor("list", Bean.class), Bean.class, false);
484
486
485
		assertFalse(bean.hasListeners("list"));
487
		assertFalse(bean.hasListeners("list"));
486
		ChangeEventTracker.observe(observable);
488
		ChangeEventTracker.observe(observable);
Lines 517-527 Link Here
517
519
518
		PropertyChangeEvent evt;
520
		PropertyChangeEvent evt;
519
521
520
		/*
521
		 * (non-Javadoc)
522
		 * 
523
		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
524
		 */
525
		public void propertyChange(PropertyChangeEvent evt) {
522
		public void propertyChange(PropertyChangeEvent evt) {
526
			count++;
523
			count++;
527
			this.evt = evt;
524
			this.evt = evt;
Lines 539-555 Link Here
539
		public IObservableCollection createObservableCollection(Realm realm,
536
		public IObservableCollection createObservableCollection(Realm realm,
540
				int elementCount) {
537
				int elementCount) {
541
			String propertyName = "list";
538
			String propertyName = "list";
542
			PropertyDescriptor propertyDescriptor;
543
			try {
544
				propertyDescriptor = new PropertyDescriptor(propertyName,
545
						Bean.class);
546
			} catch (IntrospectionException e) {
547
				throw new RuntimeException(e);
548
			}
549
			Object bean = new Bean(new ArrayList());
539
			Object bean = new Bean(new ArrayList());
550
540
551
			IObservableList list = new JavaBeanObservableList(realm, bean,
541
			IObservableList list = BeansObservables.observeList(realm, bean,
552
					propertyDescriptor, String.class);
542
					propertyName, String.class);
553
			for (int i = 0; i < elementCount; i++)
543
			for (int i = 0; i < elementCount; i++)
554
				list.add(createElement(list));
544
				list.add(createElement(list));
555
			return list;
545
			return list;
(-)src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableValueDecoratorTest.java (-18 / +11 lines)
Lines 7-21 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 246625
10
 *     Matthew Hall - bug 246625, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
14
14
15
import java.beans.PropertyDescriptor;
15
import java.beans.PropertyDescriptor;
16
16
17
import org.eclipse.core.databinding.beans.BeansObservables;
18
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
19
import org.eclipse.core.internal.databinding.beans.BeanObservableValueDecorator;
18
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
19
import org.eclipse.jface.databinding.swt.SWTObservables;
20
import org.eclipse.jface.databinding.swt.SWTObservables;
20
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
21
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
21
import org.eclipse.swt.widgets.Display;
22
import org.eclipse.swt.widgets.Display;
Lines 25-62 Link Here
25
 */
26
 */
26
public class BeanObservableValueDecoratorTest extends AbstractDefaultRealmTestCase {
27
public class BeanObservableValueDecoratorTest extends AbstractDefaultRealmTestCase {
27
	private Bean bean;
28
	private Bean bean;
28
	private JavaBeanObservableValue observableValue;
29
	private IObservableValue observableValue;
29
	private BeanObservableValueDecorator decorator;
30
	private BeanObservableValueDecorator decorator;
30
	private PropertyDescriptor propertyDescriptor;
31
	private PropertyDescriptor propertyDescriptor;
31
	
32
	
32
	/*
33
	 * (non-Javadoc)
34
	 * 
35
	 * @see junit.framework.TestCase#setUp()
36
	 */
37
	protected void setUp() throws Exception {
33
	protected void setUp() throws Exception {
38
		super.setUp();
34
		super.setUp();
39
		
35
		
40
		bean = new Bean();
36
		bean = new Bean();
41
		propertyDescriptor = new PropertyDescriptor("value",
37
		propertyDescriptor = new PropertyDescriptor("value", Bean.class);
42
				Bean.class);
38
		observableValue = BeansObservables.observeValue(SWTObservables
43
		observableValue = new JavaBeanObservableValue(
39
				.getRealm(Display.getDefault()), bean, "value");
44
				SWTObservables.getRealm(Display.getDefault()), bean,
40
		decorator = new BeanObservableValueDecorator(observableValue,
45
				propertyDescriptor);
41
				propertyDescriptor);
46
		decorator = new BeanObservableValueDecorator(
47
				observableValue, observableValue
48
						.getPropertyDescriptor());
49
	}
42
	}
50
43
51
	public void testGetDelegate() throws Exception {
44
	public void testGetDelegate() throws Exception {
52
		assertEquals(observableValue, decorator.getDecorated());
45
		assertSame(observableValue, decorator.getDecorated());
53
	}
46
	}
54
	
47
	
55
	public void testGetObserved() throws Exception {
48
	public void testGetObserved() throws Exception {
56
		assertEquals(bean, decorator.getObserved());
49
		assertSame(bean, decorator.getObserved());
57
	}
50
	}
58
51
59
	public void testGetPropertyDescriptor() throws Exception {
52
	public void testGetPropertyDescriptor() throws Exception {
60
		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
53
		assertSame(propertyDescriptor, decorator.getPropertyDescriptor());
61
	}
54
	}
62
}
55
}
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableMapTest.java (-9 / +22 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bugs 213145, 241585
10
 *     Matthew Hall - bugs 213145, 241585, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
Lines 19-30 Link Here
19
import junit.framework.TestCase;
19
import junit.framework.TestCase;
20
import junit.framework.TestSuite;
20
import junit.framework.TestSuite;
21
21
22
import org.eclipse.core.databinding.beans.BeanProperties;
23
import org.eclipse.core.databinding.beans.BeansObservables;
24
import org.eclipse.core.databinding.beans.IBeanObservable;
25
import org.eclipse.core.databinding.beans.IBeanProperty;
26
import org.eclipse.core.databinding.beans.PojoObservables;
22
import org.eclipse.core.databinding.observable.Realm;
27
import org.eclipse.core.databinding.observable.Realm;
23
import org.eclipse.core.databinding.observable.map.IMapChangeListener;
28
import org.eclipse.core.databinding.observable.map.IMapChangeListener;
29
import org.eclipse.core.databinding.observable.map.IObservableMap;
24
import org.eclipse.core.databinding.observable.map.MapChangeEvent;
30
import org.eclipse.core.databinding.observable.map.MapChangeEvent;
25
import org.eclipse.core.databinding.observable.map.MapDiff;
31
import org.eclipse.core.databinding.observable.map.MapDiff;
26
import org.eclipse.core.databinding.observable.set.WritableSet;
32
import org.eclipse.core.databinding.observable.set.WritableSet;
27
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
28
import org.eclipse.core.tests.databinding.observable.ThreadRealm;
33
import org.eclipse.core.tests.databinding.observable.ThreadRealm;
29
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
34
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
30
import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
35
import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
Lines 42-48 Link Here
42
47
43
	private PropertyDescriptor propertyDescriptor;
48
	private PropertyDescriptor propertyDescriptor;
44
49
45
	private JavaBeanObservableMap map;
50
	private IObservableMap map;
51
	private IBeanObservable beanObservable;
46
52
47
	protected void setUp() throws Exception {
53
	protected void setUp() throws Exception {
48
		ThreadRealm realm = new ThreadRealm();
54
		ThreadRealm realm = new ThreadRealm();
Lines 54-61 Link Here
54
		set.add(model1);
60
		set.add(model1);
55
		set.add(model2);
61
		set.add(model2);
56
62
57
		propertyDescriptor = new PropertyDescriptor("value", Bean.class);
63
		String propertyName = "value";
58
		map = new JavaBeanObservableMap(set, propertyDescriptor);
64
		propertyDescriptor = ((IBeanProperty) BeanProperties.valueProperty(
65
				Bean.class, propertyName)).getPropertyDescriptor();
66
		map = BeansObservables.observeMap(set, Bean.class, propertyName);
67
		beanObservable = (IBeanObservable) map;
59
	}
68
	}
60
69
61
	public void testGetValue() throws Exception {
70
	public void testGetValue() throws Exception {
Lines 135-145 Link Here
135
	}
144
	}
136
	
145
	
137
	public void testGetObserved() throws Exception {
146
	public void testGetObserved() throws Exception {
138
		assertEquals(set, map.getObserved());
147
		assertEquals(set, beanObservable.getObserved());
139
	}
148
	}
140
	
149
	
141
	public void testGetPropertyDescriptor() throws Exception {
150
	public void testGetPropertyDescriptor() throws Exception {
142
		assertEquals(propertyDescriptor, map.getPropertyDescriptor());
151
		assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
143
	}
152
	}
144
	
153
	
145
	public void testConstructor_SkipRegisterListeners() throws Exception {
154
	public void testConstructor_SkipRegisterListeners() throws Exception {
Lines 148-154 Link Here
148
		Bean bean = new Bean();
157
		Bean bean = new Bean();
149
		set.add(bean);
158
		set.add(bean);
150
		
159
		
151
		JavaBeanObservableMap observable = new JavaBeanObservableMap(set, new PropertyDescriptor("value", Bean.class), false);
160
		IObservableMap observable = PojoObservables.observeMap(set, Bean.class,
161
				"value");
162
		assertFalse(bean.hasListeners("value"));
152
		ChangeEventTracker.observe(observable);
163
		ChangeEventTracker.observe(observable);
153
164
154
		assertFalse(bean.hasListeners("value"));
165
		assertFalse(bean.hasListeners("value"));
Lines 160-166 Link Here
160
		Bean bean = new Bean();
171
		Bean bean = new Bean();
161
		set.add(bean);
172
		set.add(bean);
162
		
173
		
163
		JavaBeanObservableMap observable = new JavaBeanObservableMap(set, new PropertyDescriptor("value", Bean.class));
174
		IObservableMap observable = BeansObservables.observeMap(set,
175
				Bean.class, "value");
176
		assertFalse(bean.hasListeners("value"));
164
		ChangeEventTracker.observe(observable);
177
		ChangeEventTracker.observe(observable);
165
178
166
		assertTrue(bean.hasListeners("value"));
179
		assertTrue(bean.hasListeners("value"));
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableValueTest.java (-26 / +22 lines)
Lines 9-33 Link Here
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Brad Reynolds - bug 171616
10
 *     Brad Reynolds - bug 171616
11
 *     Katarzyna Marszalek - test case for bug 198519
11
 *     Katarzyna Marszalek - test case for bug 198519
12
 *     Matthew Hall - bug 213145
12
 *     Matthew Hall - bugs 213145, 194734
13
 ******************************************************************************/
13
 ******************************************************************************/
14
14
15
package org.eclipse.core.tests.internal.databinding.beans;
15
package org.eclipse.core.tests.internal.databinding.beans;
16
16
17
import java.beans.IntrospectionException;
18
import java.beans.PropertyDescriptor;
17
import java.beans.PropertyDescriptor;
19
18
20
import junit.framework.Test;
19
import junit.framework.Test;
21
import junit.framework.TestSuite;
20
import junit.framework.TestSuite;
22
21
22
import org.eclipse.core.databinding.beans.BeanProperties;
23
import org.eclipse.core.databinding.beans.BeansObservables;
23
import org.eclipse.core.databinding.beans.BeansObservables;
24
import org.eclipse.core.databinding.beans.IBeanObservable;
25
import org.eclipse.core.databinding.beans.IBeanProperty;
26
import org.eclipse.core.databinding.beans.PojoObservables;
24
import org.eclipse.core.databinding.observable.ChangeEvent;
27
import org.eclipse.core.databinding.observable.ChangeEvent;
25
import org.eclipse.core.databinding.observable.IChangeListener;
28
import org.eclipse.core.databinding.observable.IChangeListener;
26
import org.eclipse.core.databinding.observable.IObservable;
29
import org.eclipse.core.databinding.observable.IObservable;
27
import org.eclipse.core.databinding.observable.Realm;
30
import org.eclipse.core.databinding.observable.Realm;
28
import org.eclipse.core.databinding.observable.value.ComputedValue;
31
import org.eclipse.core.databinding.observable.value.ComputedValue;
29
import org.eclipse.core.databinding.observable.value.IObservableValue;
32
import org.eclipse.core.databinding.observable.value.IObservableValue;
30
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
31
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
33
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
32
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
34
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
33
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
35
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
Lines 39-73 Link Here
39
 */
41
 */
40
public class JavaBeanObservableValueTest extends AbstractDefaultRealmTestCase {
42
public class JavaBeanObservableValueTest extends AbstractDefaultRealmTestCase {
41
	private Bean bean;
43
	private Bean bean;
42
	private JavaBeanObservableValue observableValue;
44
	private IObservableValue observableValue;
45
	private IBeanObservable beanObservable;
43
	private PropertyDescriptor propertyDescriptor;
46
	private PropertyDescriptor propertyDescriptor;
44
	private String propertyName;
47
	private String propertyName;
45
48
46
	/* (non-Javadoc)
47
	 * @see junit.framework.TestCase#setUp()
48
	 */
49
	protected void setUp() throws Exception {
49
	protected void setUp() throws Exception {
50
		super.setUp();
50
		super.setUp();
51
		
51
		
52
		bean = new Bean();
52
		bean = new Bean();
53
		propertyName = "value";
53
		propertyName = "value";
54
		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
54
		propertyDescriptor = ((IBeanProperty) BeanProperties.valueProperty(
55
		observableValue = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor);
55
				Bean.class, propertyName)).getPropertyDescriptor();
56
		observableValue = BeansObservables.observeValue(bean, propertyName);
57
		beanObservable = (IBeanObservable) observableValue;
56
	}
58
	}
57
59
58
	public void testGetObserved() throws Exception {
60
	public void testGetObserved() throws Exception {
59
		assertEquals(bean, observableValue.getObserved());
61
		assertEquals(bean, beanObservable.getObserved());
60
	}
62
	}
61
63
62
	public void testGetPropertyDescriptor() throws Exception {
64
	public void testGetPropertyDescriptor() throws Exception {
63
    	assertEquals(propertyDescriptor, observableValue.getPropertyDescriptor());
65
    	assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
64
	}
66
	}
65
67
66
	public void testSetValueThrowsExceptionThrownByBean() throws Exception {
68
	public void testSetValueThrowsExceptionThrownByBean() throws Exception {
67
		ThrowsSetException temp = new ThrowsSetException();
69
		ThrowsSetException temp = new ThrowsSetException();
68
		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm
70
		IObservableValue observable = BeansObservables.observeValue(temp,
69
				.getDefault(), temp,
71
				"value");
70
				new PropertyDescriptor("value", ThrowsSetException.class));
71
72
72
		try {
73
		try {
73
			observable.setValue("");
74
			observable.setValue("");
Lines 79-87 Link Here
79
	
80
	
80
	public void testGetValueThrowsExceptionThrownByBean() throws Exception {
81
	public void testGetValueThrowsExceptionThrownByBean() throws Exception {
81
		ThrowsGetException temp = new ThrowsGetException();
82
		ThrowsGetException temp = new ThrowsGetException();
82
		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm
83
		IObservableValue observable = BeansObservables.observeValue(temp,
83
				.getDefault(), temp,
84
				"value");
84
				new PropertyDescriptor("value", ThrowsGetException.class));
85
85
86
		try {
86
		try {
87
			observable.getValue();
87
			observable.getValue();
Lines 108-121 Link Here
108
	}
108
	}
109
109
110
	public void testConstructor_RegistersListeners() throws Exception {
110
	public void testConstructor_RegistersListeners() throws Exception {
111
		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor);
111
		IObservableValue observable = BeansObservables.observeValue(bean,
112
				propertyName);
112
		ChangeEventTracker.observe(observable);
113
		ChangeEventTracker.observe(observable);
113
		
114
		
114
		assertTrue(bean.hasListeners(propertyName));
115
		assertTrue(bean.hasListeners(propertyName));
115
	}
116
	}
116
	
117
	
117
	public void testConstructor_SkipRegisterListeners() throws Exception {
118
	public void testConstructor_SkipRegisterListeners() throws Exception {
118
		JavaBeanObservableValue observable = new JavaBeanObservableValue(Realm.getDefault(), bean, propertyDescriptor, false);
119
		IObservableValue observable = PojoObservables.observeValue(bean,
120
				propertyName);
119
		ChangeEventTracker.observe(observable);
121
		ChangeEventTracker.observe(observable);
120
		
122
		
121
		assertFalse(bean.hasListeners(propertyName));
123
		assertFalse(bean.hasListeners(propertyName));
Lines 138-150 Link Here
138
		}
140
		}
139
		
141
		
140
		public IObservableValue createObservableValue(Realm realm) {
142
		public IObservableValue createObservableValue(Realm realm) {
141
			try {
143
			return BeansObservables.observeValue(realm, bean, "value");
142
				PropertyDescriptor propertyDescriptor = new PropertyDescriptor("value", Bean.class);
143
				return new JavaBeanObservableValue(realm, bean,
144
						propertyDescriptor);					
145
			} catch (IntrospectionException e) {
146
				throw new RuntimeException(e);
147
			}
148
		}
144
		}
149
		
145
		
150
		public void change(IObservable observable) {
146
		public void change(IObservable observable) {
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableSetTest.java (-28 / +22 lines)
Lines 7-18 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bugs 221351, 213145
10
 *     Matthew Hall - bugs 221351, 213145, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
14
14
15
import java.beans.IntrospectionException;
16
import java.beans.PropertyDescriptor;
15
import java.beans.PropertyDescriptor;
17
import java.util.Arrays;
16
import java.util.Arrays;
18
import java.util.HashSet;
17
import java.util.HashSet;
Lines 21-33 Link Here
21
import junit.framework.TestCase;
20
import junit.framework.TestCase;
22
import junit.framework.TestSuite;
21
import junit.framework.TestSuite;
23
22
23
import org.eclipse.core.databinding.beans.BeanProperties;
24
import org.eclipse.core.databinding.beans.BeansObservables;
25
import org.eclipse.core.databinding.beans.IBeanObservable;
26
import org.eclipse.core.databinding.beans.IBeanProperty;
27
import org.eclipse.core.databinding.beans.PojoObservables;
24
import org.eclipse.core.databinding.observable.IObservable;
28
import org.eclipse.core.databinding.observable.IObservable;
25
import org.eclipse.core.databinding.observable.IObservableCollection;
29
import org.eclipse.core.databinding.observable.IObservableCollection;
26
import org.eclipse.core.databinding.observable.Realm;
30
import org.eclipse.core.databinding.observable.Realm;
27
import org.eclipse.core.databinding.observable.set.IObservableSet;
31
import org.eclipse.core.databinding.observable.set.IObservableSet;
28
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
32
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
29
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
33
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
30
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
31
import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
34
import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
32
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
35
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
33
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
36
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
Lines 39-72 Link Here
39
 * @since 3.3
42
 * @since 3.3
40
 */
43
 */
41
public class JavaBeanObservableSetTest extends TestCase {
44
public class JavaBeanObservableSetTest extends TestCase {
42
	private JavaBeanObservableSet observableSet;
45
	private IObservableSet observableSet;
46
	private IBeanObservable beanObservable;
43
	private Bean bean;
47
	private Bean bean;
44
	private PropertyDescriptor propertyDescriptor;
48
	private PropertyDescriptor propertyDescriptor;
45
	private String propertyName;
49
	private String propertyName;
46
	private SetChangeListener listener;
50
	private SetChangeListener listener;
47
51
48
	/*
49
	 * (non-Javadoc)
50
	 * 
51
	 * @see junit.framework.TestCase#setUp()
52
	 */
53
	protected void setUp() throws Exception {
52
	protected void setUp() throws Exception {
54
		bean = new Bean();
53
		bean = new Bean();
55
		propertyName = "set";
54
		propertyName = "set";
56
		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
55
		propertyDescriptor = ((IBeanProperty) BeanProperties.setProperty(
56
				Bean.class, propertyName)).getPropertyDescriptor();
57
57
58
		observableSet = new JavaBeanObservableSet(SWTObservables
58
		observableSet = BeansObservables
59
				.getRealm(Display.getDefault()), bean, propertyDescriptor,
59
				.observeSet(SWTObservables.getRealm(Display.getDefault()),
60
				Bean.class);
60
						bean, propertyName, Bean.class);
61
		beanObservable = (IBeanObservable) observableSet;
61
		listener = new SetChangeListener();
62
		listener = new SetChangeListener();
62
	}
63
	}
63
64
64
	public void testGetObserved() throws Exception {
65
	public void testGetObserved() throws Exception {
65
		assertEquals(bean, observableSet.getObserved());
66
		assertEquals(bean, beanObservable.getObserved());
66
	}
67
	}
67
68
68
	public void testGetPropertyDescriptor() throws Exception {
69
	public void testGetPropertyDescriptor() throws Exception {
69
		assertEquals(propertyDescriptor, observableSet.getPropertyDescriptor());
70
		assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
70
	}
71
	}
71
	
72
	
72
	public void testGetElementType() throws Exception {
73
	public void testGetElementType() throws Exception {
Lines 97-104 Link Here
97
	public void testConstructor_RegisterListeners() throws Exception {
98
	public void testConstructor_RegisterListeners() throws Exception {
98
		bean = new Bean();
99
		bean = new Bean();
99
100
100
		observableSet = new JavaBeanObservableSet(new CurrentRealm(true), bean,
101
		observableSet = BeansObservables.observeSet(new CurrentRealm(true),
101
				propertyDescriptor, Bean.class);
102
				bean, propertyName);
102
		assertFalse(bean.hasListeners(propertyName));
103
		assertFalse(bean.hasListeners(propertyName));
103
		ChangeEventTracker.observe(observableSet);
104
		ChangeEventTracker.observe(observableSet);
104
		assertTrue(bean.hasListeners(propertyName));
105
		assertTrue(bean.hasListeners(propertyName));
Lines 107-114 Link Here
107
	public void testConstructor_SkipsRegisterListeners() throws Exception {
108
	public void testConstructor_SkipsRegisterListeners() throws Exception {
108
		bean = new Bean();
109
		bean = new Bean();
109
110
110
		observableSet = new JavaBeanObservableSet(new CurrentRealm(true), bean,
111
		observableSet = PojoObservables.observeSet(new CurrentRealm(true),
111
				propertyDescriptor, Bean.class, false);
112
				bean, propertyName);
112
		assertFalse(bean.hasListeners(propertyName));
113
		assertFalse(bean.hasListeners(propertyName));
113
		ChangeEventTracker.observe(observableSet);
114
		ChangeEventTracker.observe(observableSet);
114
		assertFalse(bean.hasListeners(propertyName));
115
		assertFalse(bean.hasListeners(propertyName));
Lines 134-149 Link Here
134
				int elementCount) {
135
				int elementCount) {
135
			Bean bean = new Bean();
136
			Bean bean = new Bean();
136
			String propertyName = "set";
137
			String propertyName = "set";
137
			PropertyDescriptor propertyDescriptor;
138
			try {
139
				propertyDescriptor = new PropertyDescriptor(propertyName,
140
						Bean.class);
141
			} catch (IntrospectionException e) {
142
				throw new RuntimeException(e);
143
			}
144
138
145
			IObservableSet set = new JavaBeanObservableSet(realm,
139
			IObservableSet set = BeansObservables.observeSet(realm, bean,
146
					bean, propertyDescriptor, String.class);
140
					propertyName, String.class);
147
			for (int i = 0; i < elementCount; i++)
141
			for (int i = 0; i < elementCount; i++)
148
				set.add(createElement(set));
142
				set.add(createElement(set));
149
			return set;
143
			return set;
(-)src/org/eclipse/core/tests/internal/databinding/beans/BeanObservableSetDecoratorTest.java (-19 / +13 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Brad Reynolds - initial API and implementation
9
 *     Brad Reynolds - initial API and implementation
10
 *     Matthew Hall - bug 246625
10
 *     Matthew Hall - bug 246625, 194734
11
 ******************************************************************************/
11
 ******************************************************************************/
12
12
13
package org.eclipse.core.tests.internal.databinding.beans;
13
package org.eclipse.core.tests.internal.databinding.beans;
Lines 16-23 Link Here
16
16
17
import junit.framework.TestCase;
17
import junit.framework.TestCase;
18
18
19
import org.eclipse.core.databinding.beans.BeansObservables;
20
import org.eclipse.core.databinding.observable.set.IObservableSet;
19
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
21
import org.eclipse.core.internal.databinding.beans.BeanObservableSetDecorator;
20
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
21
import org.eclipse.jface.databinding.swt.SWTObservables;
22
import org.eclipse.jface.databinding.swt.SWTObservables;
22
import org.eclipse.swt.widgets.Display;
23
import org.eclipse.swt.widgets.Display;
23
24
Lines 26-62 Link Here
26
 */
27
 */
27
public class BeanObservableSetDecoratorTest extends TestCase {
28
public class BeanObservableSetDecoratorTest extends TestCase {
28
	private PropertyDescriptor propertyDescriptor;
29
	private PropertyDescriptor propertyDescriptor;
29
	private JavaBeanObservableSet observableSet;
30
	private IObservableSet observableSet;
30
	private BeanObservableSetDecorator decorator;
31
	private BeanObservableSetDecorator decorator;
31
	private Bean bean;
32
	private Bean bean;
32
33
33
	/*
34
	 * (non-Javadoc)
35
	 * 
36
	 * @see junit.framework.TestCase#setUp()
37
	 */
38
	protected void setUp() throws Exception {
34
	protected void setUp() throws Exception {
39
		super.setUp();
35
		super.setUp();
40
36
41
		bean = new Bean();
37
		bean = new Bean();
42
		propertyDescriptor = new PropertyDescriptor("set",
38
		propertyDescriptor = new PropertyDescriptor("set", Bean.class);
43
				Bean.class);
39
		observableSet = BeansObservables.observeSet(SWTObservables
44
		observableSet = new JavaBeanObservableSet(
40
				.getRealm(Display.getDefault()), bean, "set");
45
				SWTObservables.getRealm(Display.getDefault()), bean,
41
		decorator = new BeanObservableSetDecorator(observableSet,
46
				propertyDescriptor, String.class);
42
				propertyDescriptor);
47
		decorator = new BeanObservableSetDecorator(
48
				observableSet, propertyDescriptor);
49
	}
43
	}
50
44
51
	public void testGetDelegate() throws Exception {
45
	public void testGetDecorated() throws Exception {
52
		assertEquals(observableSet, decorator.getDecorated());
46
		assertSame(observableSet, decorator.getDecorated());
53
	}
47
	}
54
48
55
	public void testGetObserved() throws Exception {
49
	public void testGetObserved() throws Exception {
56
		assertEquals(bean, decorator.getObserved());
50
		assertSame(bean, decorator.getObserved());
57
	}
51
	}
58
52
59
	public void testGetPropertyDescriptor() throws Exception {
53
	public void testGetPropertyDescriptor() throws Exception {
60
		assertEquals(propertyDescriptor, decorator.getPropertyDescriptor());
54
		assertSame(propertyDescriptor, decorator.getPropertyDescriptor());
61
	}
55
	}
62
}
56
}
(-)src/org/eclipse/core/tests/internal/databinding/beans/JavaBeanObservableArrayBasedSetTest.java (-24 / +18 lines)
Lines 8-19 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *     Matthew Hall - initial API and implementation (bug 221351)
9
 *     Matthew Hall - initial API and implementation (bug 221351)
10
 *     Brad Reynolds - through JavaBeanObservableArrayBasedListTest.java
10
 *     Brad Reynolds - through JavaBeanObservableArrayBasedListTest.java
11
 *     Matthew Hall - bug 213145
11
 *     Matthew Hall - bugs 213145, 194734
12
 ******************************************************************************/
12
 ******************************************************************************/
13
13
14
package org.eclipse.core.tests.internal.databinding.beans;
14
package org.eclipse.core.tests.internal.databinding.beans;
15
15
16
import java.beans.IntrospectionException;
17
import java.beans.PropertyChangeEvent;
16
import java.beans.PropertyChangeEvent;
18
import java.beans.PropertyChangeListener;
17
import java.beans.PropertyChangeListener;
19
import java.beans.PropertyDescriptor;
18
import java.beans.PropertyDescriptor;
Lines 25-36 Link Here
25
import junit.framework.Test;
24
import junit.framework.Test;
26
import junit.framework.TestSuite;
25
import junit.framework.TestSuite;
27
26
27
import org.eclipse.core.databinding.beans.BeanProperties;
28
import org.eclipse.core.databinding.beans.BeansObservables;
29
import org.eclipse.core.databinding.beans.IBeanObservable;
30
import org.eclipse.core.databinding.beans.IBeanProperty;
28
import org.eclipse.core.databinding.observable.IObservable;
31
import org.eclipse.core.databinding.observable.IObservable;
29
import org.eclipse.core.databinding.observable.IObservableCollection;
32
import org.eclipse.core.databinding.observable.IObservableCollection;
30
import org.eclipse.core.databinding.observable.Realm;
33
import org.eclipse.core.databinding.observable.Realm;
31
import org.eclipse.core.databinding.observable.set.IObservableSet;
34
import org.eclipse.core.databinding.observable.set.IObservableSet;
32
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
35
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
33
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
34
import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
36
import org.eclipse.jface.databinding.conformance.MutableObservableSetContractTest;
35
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
37
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableCollectionContractDelegate;
36
import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
38
import org.eclipse.jface.databinding.conformance.util.SetChangeEventTracker;
Lines 43-49 Link Here
43
 */
45
 */
44
public class JavaBeanObservableArrayBasedSetTest extends
46
public class JavaBeanObservableArrayBasedSetTest extends
45
		AbstractDefaultRealmTestCase {
47
		AbstractDefaultRealmTestCase {
46
	private JavaBeanObservableSet set;
48
	private IObservableSet set;
49
	private IBeanObservable beanObservable;
47
50
48
	private PropertyDescriptor propertyDescriptor;
51
	private PropertyDescriptor propertyDescriptor;
49
52
Lines 55-73 Link Here
55
		super.setUp();
58
		super.setUp();
56
59
57
		propertyName = "array";
60
		propertyName = "array";
58
		propertyDescriptor = new PropertyDescriptor(propertyName, Bean.class);
61
		propertyDescriptor = ((IBeanProperty) BeanProperties.setProperty(
62
				Bean.class, propertyName)).getPropertyDescriptor();
59
		bean = new Bean(new HashSet());
63
		bean = new Bean(new HashSet());
60
64
61
		set = new JavaBeanObservableSet(SWTObservables.getRealm(Display
65
		set = BeansObservables.observeSet(SWTObservables.getRealm(Display
62
				.getDefault()), bean, propertyDescriptor, String.class);
66
				.getDefault()), bean, propertyName);
67
		beanObservable = (IBeanObservable) set;
63
	}
68
	}
64
69
65
	public void testGetObserved() throws Exception {
70
	public void testGetObserved() throws Exception {
66
		assertEquals(bean, set.getObserved());
71
		assertEquals(bean, beanObservable.getObserved());
67
	}
72
	}
68
73
69
	public void testGetPropertyDescriptor() throws Exception {
74
	public void testGetPropertyDescriptor() throws Exception {
70
		assertEquals(propertyDescriptor, set.getPropertyDescriptor());
75
		assertEquals(propertyDescriptor, beanObservable.getPropertyDescriptor());
71
	}
76
	}
72
77
73
	public void testRegistersListenerAfterFirstListenerIsAdded()
78
	public void testRegistersListenerAfterFirstListenerIsAdded()
Lines 292-298 Link Here
292
		assertEquals("array", event.getPropertyName());
297
		assertEquals("array", event.getPropertyName());
293
		assertTrue("old value", Arrays.equals(old, (Object[]) event
298
		assertTrue("old value", Arrays.equals(old, (Object[]) event
294
				.getOldValue()));
299
				.getOldValue()));
295
		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event.getNewValue()));
300
		assertTrue("new value", Arrays.equals(bean.getArray(), (Object[]) event
301
				.getNewValue()));
296
		assertFalse("lists are equal", Arrays.equals(bean.getArray(), old));
302
		assertFalse("lists are equal", Arrays.equals(bean.getArray(), old));
297
	}
303
	}
298
304
Lines 302-312 Link Here
302
308
303
		PropertyChangeEvent evt;
309
		PropertyChangeEvent evt;
304
310
305
		/*
306
		 * (non-Javadoc)
307
		 * 
308
		 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
309
		 */
310
		public void propertyChange(PropertyChangeEvent evt) {
311
		public void propertyChange(PropertyChangeEvent evt) {
311
			count++;
312
			count++;
312
			this.evt = evt;
313
			this.evt = evt;
Lines 324-340 Link Here
324
		public IObservableCollection createObservableCollection(Realm realm,
325
		public IObservableCollection createObservableCollection(Realm realm,
325
				int elementCount) {
326
				int elementCount) {
326
			String propertyName = "array";
327
			String propertyName = "array";
327
			PropertyDescriptor propertyDescriptor;
328
			try {
329
				propertyDescriptor = new PropertyDescriptor(propertyName,
330
						Bean.class);
331
			} catch (IntrospectionException e) {
332
				throw new RuntimeException(e);
333
			}
334
			Object bean = new Bean(new Object[0]);
328
			Object bean = new Bean(new Object[0]);
335
329
336
			IObservableSet list = new JavaBeanObservableSet(realm, bean,
330
			IObservableSet list = BeansObservables.observeSet(realm, bean,
337
					propertyDescriptor, String.class);
331
					propertyName, String.class);
338
			for (int i = 0; i < elementCount; i++)
332
			for (int i = 0; i < elementCount; i++)
339
				list.add(createElement(list));
333
				list.add(createElement(list));
340
			return list;
334
			return list;
(-)src/org/eclipse/jface/tests/databinding/BindingTestSuite.java (-4 / +12 lines)
Lines 13-20 Link Here
13
 *     Ashley Cambrell - bugs 198903, 198904
13
 *     Ashley Cambrell - bugs 198903, 198904
14
 *     Matthew Hall - bugs 210115, 212468, 212223, 206839, 208858, 208322,
14
 *     Matthew Hall - bugs 210115, 212468, 212223, 206839, 208858, 208322,
15
 *                    212518, 215531, 221351, 184830, 213145, 218269, 239015,
15
 *                    212518, 215531, 221351, 184830, 213145, 218269, 239015,
16
 *                    237703, 237718, 222289, 247394, 233306, 247647
16
 *                    237703, 237718, 222289, 247394, 233306, 247647, 194734
17
 *     Ovidio Mallo - bug 237163, bug 235195
17
 *     Ovidio Mallo - bug 237163, bug 235195
18
 *     Chris Aniszczyk - bug 131435
18
 *******************************************************************************/
19
 *******************************************************************************/
19
package org.eclipse.jface.tests.databinding;
20
package org.eclipse.jface.tests.databinding;
20
21
Lines 64-69 Link Here
64
import org.eclipse.core.tests.databinding.observable.value.ComputedValueTest;
65
import org.eclipse.core.tests.databinding.observable.value.ComputedValueTest;
65
import org.eclipse.core.tests.databinding.observable.value.DecoratingObservableValueTest;
66
import org.eclipse.core.tests.databinding.observable.value.DecoratingObservableValueTest;
66
import org.eclipse.core.tests.databinding.observable.value.WritableValueTest;
67
import org.eclipse.core.tests.databinding.observable.value.WritableValueTest;
68
import org.eclipse.core.tests.databinding.property.PropertyTest;
67
import org.eclipse.core.tests.databinding.util.PolicyTest;
69
import org.eclipse.core.tests.databinding.util.PolicyTest;
68
import org.eclipse.core.tests.databinding.validation.MultiValidatorTest;
70
import org.eclipse.core.tests.databinding.validation.MultiValidatorTest;
69
import org.eclipse.core.tests.databinding.validation.ValidationStatusTest;
71
import org.eclipse.core.tests.databinding.validation.ValidationStatusTest;
Lines 159-165 Link Here
159
import org.eclipse.jface.tests.internal.databinding.swt.LabelObservableValueTest;
161
import org.eclipse.jface.tests.internal.databinding.swt.LabelObservableValueTest;
160
import org.eclipse.jface.tests.internal.databinding.swt.ListSingleSelectionObservableValueTest;
162
import org.eclipse.jface.tests.internal.databinding.swt.ListSingleSelectionObservableValueTest;
161
import org.eclipse.jface.tests.internal.databinding.swt.SWTDelayedObservableValueDecoratorTest;
163
import org.eclipse.jface.tests.internal.databinding.swt.SWTDelayedObservableValueDecoratorTest;
162
import org.eclipse.jface.tests.internal.databinding.swt.SWTObservableListTest;
163
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMaxTest;
164
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMaxTest;
164
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMinTest;
165
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueMinTest;
165
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueSelectionTest;
166
import org.eclipse.jface.tests.internal.databinding.swt.ScaleObservableValueSelectionTest;
Lines 168-173 Link Here
168
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueMinTest;
169
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueMinTest;
169
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueSelectionTest;
170
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueSelectionTest;
170
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueTest;
171
import org.eclipse.jface.tests.internal.databinding.swt.SpinnerObservableValueTest;
172
import org.eclipse.jface.tests.internal.databinding.swt.StyledTextObservableValueFocusOutTest;
173
import org.eclipse.jface.tests.internal.databinding.swt.StyledTextObservableValueModifyTest;
174
import org.eclipse.jface.tests.internal.databinding.swt.StyledTextObservableValueTest;
171
import org.eclipse.jface.tests.internal.databinding.swt.TableObservableValueTest;
175
import org.eclipse.jface.tests.internal.databinding.swt.TableObservableValueTest;
172
import org.eclipse.jface.tests.internal.databinding.swt.TableSingleSelectionObservableValueTest;
176
import org.eclipse.jface.tests.internal.databinding.swt.TableSingleSelectionObservableValueTest;
173
import org.eclipse.jface.tests.internal.databinding.swt.TextEditableObservableValueTest;
177
import org.eclipse.jface.tests.internal.databinding.swt.TextEditableObservableValueTest;
Lines 256-261 Link Here
256
		addTest(DecoratingObservableValueTest.suite());
260
		addTest(DecoratingObservableValueTest.suite());
257
		addTest(WritableValueTest.suite());
261
		addTest(WritableValueTest.suite());
258
		
262
		
263
		//org.eclipse.core.tests.databinding.property
264
		addTestSuite(PropertyTest.class);
265
		
259
		//org.eclipse.core.tests.databinding.validation
266
		//org.eclipse.core.tests.databinding.validation
260
		addTestSuite(MultiValidatorTest.class);
267
		addTestSuite(MultiValidatorTest.class);
261
		addTestSuite(ValidationStatusTest.class);
268
		addTestSuite(ValidationStatusTest.class);
Lines 377-384 Link Here
377
		addTestSuite(ComboSingleSelectionObservableValueTest.class);
384
		addTestSuite(ComboSingleSelectionObservableValueTest.class);
378
		addTest(SWTDelayedObservableValueDecoratorTest.suite());
385
		addTest(SWTDelayedObservableValueDecoratorTest.suite());
379
		
386
		
380
		addTest(SWTObservableListTest.suite());
381
		
382
		addTestSuite(ControlObservableValueTest.class);
387
		addTestSuite(ControlObservableValueTest.class);
383
		addTest(LabelObservableValueTest.suite());
388
		addTest(LabelObservableValueTest.suite());
384
		addTestSuite(ListSingleSelectionObservableValueTest.class);
389
		addTestSuite(ListSingleSelectionObservableValueTest.class);
Lines 399-404 Link Here
399
		addTest(TextObservableValueFocusOutTest.suite());
404
		addTest(TextObservableValueFocusOutTest.suite());
400
		addTest(TextObservableValueModifyTest.suite());
405
		addTest(TextObservableValueModifyTest.suite());
401
		addTestSuite(TextObservableValueTest.class);
406
		addTestSuite(TextObservableValueTest.class);
407
		addTest(StyledTextObservableValueFocusOutTest.suite());
408
		addTest(StyledTextObservableValueModifyTest.suite());
409
		addTestSuite(StyledTextObservableValueTest.class);
402
		
410
		
403
		//org.eclipse.jface.tests.internal.databinding.internal.viewers
411
		//org.eclipse.jface.tests.internal.databinding.internal.viewers
404
		addTest(ObservableViewerElementSetTest.suite());
412
		addTest(ObservableViewerElementSetTest.suite());
(-)src/org/eclipse/core/tests/databinding/beans/PojoObservablesTest.java (-18 / +16 lines)
Lines 7-16 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 194734
10
 *******************************************************************************/
11
 *******************************************************************************/
11
12
12
package org.eclipse.core.tests.databinding.beans;
13
package org.eclipse.core.tests.databinding.beans;
13
14
15
import org.eclipse.core.databinding.beans.IBeanObservable;
14
import org.eclipse.core.databinding.beans.PojoObservables;
16
import org.eclipse.core.databinding.beans.PojoObservables;
15
import org.eclipse.core.databinding.observable.Realm;
17
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.list.IObservableList;
18
import org.eclipse.core.databinding.observable.list.IObservableList;
Lines 19-28 Link Here
19
import org.eclipse.core.databinding.observable.set.IObservableSet;
21
import org.eclipse.core.databinding.observable.set.IObservableSet;
20
import org.eclipse.core.databinding.observable.set.WritableSet;
22
import org.eclipse.core.databinding.observable.set.WritableSet;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
23
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableList;
23
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableMap;
24
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableSet;
25
import org.eclipse.core.internal.databinding.beans.JavaBeanObservableValue;
26
import org.eclipse.core.tests.internal.databinding.beans.Bean;
24
import org.eclipse.core.tests.internal.databinding.beans.Bean;
27
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
25
import org.eclipse.jface.databinding.conformance.util.ChangeEventTracker;
28
import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
26
import org.eclipse.jface.databinding.conformance.util.CurrentRealm;
Lines 47-58 Link Here
47
		propertyName = "value";
45
		propertyName = "value";
48
	}
46
	}
49
47
50
	public void testObserveValue_ReturnsJavaBeanObservableValue()
48
	public void testObserveValue_ReturnsIBeanObservable()
51
			throws Exception {
49
			throws Exception {
52
		IObservableValue value = PojoObservables.observeValue(pojo, propertyName);
50
		IObservableValue value = PojoObservables.observeValue(pojo, propertyName);
53
51
54
		assertNotNull(value);
52
		assertNotNull(value);
55
		assertTrue(value instanceof JavaBeanObservableValue);
53
		assertTrue(value instanceof IBeanObservable);
56
	}
54
	}
57
55
58
	public void testObserveValue_DoesNotAttachListeners() throws Exception {
56
	public void testObserveValue_DoesNotAttachListeners() throws Exception {
Lines 62-78 Link Here
62
		assertFalse(pojo.hasListeners(propertyName));
60
		assertFalse(pojo.hasListeners(propertyName));
63
	}
61
	}
64
62
65
	public void testObservableValueWithRealm_ReturnsJavaBeanObservable()
63
	public void testObservableValueWithRealm_ReturnsIBeanObservable()
66
			throws Exception {
64
			throws Exception {
67
		CurrentRealm realm = new CurrentRealm(true);
65
		CurrentRealm realm = new CurrentRealm(true);
68
		IObservableValue value = PojoObservables.observeValue(realm, pojo,
66
		IObservableValue value = PojoObservables.observeValue(realm, pojo,
69
				propertyName);
67
				propertyName);
70
68
71
		assertNotNull(value);
69
		assertNotNull(value);
72
		assertTrue(value instanceof JavaBeanObservableValue);
70
		assertTrue(value instanceof IBeanObservable);
73
	}
71
	}
74
72
75
	public void testObservableMap_ReturnsJavaBeanObservableMap()
73
	public void testObservableMap_ReturnsIBeanObservable()
76
			throws Exception {
74
			throws Exception {
77
		IObservableSet set = new WritableSet();
75
		IObservableSet set = new WritableSet();
78
		set.add(new Bean());
76
		set.add(new Bean());
Lines 80-86 Link Here
80
		IObservableMap map = PojoObservables.observeMap(set, Bean.class,
78
		IObservableMap map = PojoObservables.observeMap(set, Bean.class,
81
				propertyName);
79
				propertyName);
82
		assertNotNull(map);
80
		assertNotNull(map);
83
		assertTrue(map instanceof JavaBeanObservableMap);
81
		assertTrue(map instanceof IBeanObservable);
84
	}
82
	}
85
	
83
	
86
	public void testObservableMap_DoesNotAttachListeners() throws Exception {
84
	public void testObservableMap_DoesNotAttachListeners() throws Exception {
Lines 101-109 Link Here
101
		assertEquals(2, maps.length);
99
		assertEquals(2, maps.length);
102
	}
100
	}
103
	
101
	
104
	public void testObserveListWithElementType_ReturnsJavaBeanObservableList() throws Exception {
102
	public void testObserveListWithElementType_ReturnsIBeanObservable() throws Exception {
105
		IObservableList list = PojoObservables.observeList(Realm.getDefault(), pojo, "list", String.class);
103
		IObservableList list = PojoObservables.observeList(Realm.getDefault(), pojo, "list", String.class);
106
		assertTrue(list instanceof JavaBeanObservableList);
104
		assertTrue(list instanceof IBeanObservable);
107
	}
105
	}
108
	
106
	
109
	public void testObserveListWithElementType_DoesNotAttachListeners() throws Exception {
107
	public void testObserveListWithElementType_DoesNotAttachListeners() throws Exception {
Lines 113-121 Link Here
113
		assertFalse(pojo.hasListeners("list"));
111
		assertFalse(pojo.hasListeners("list"));
114
	}
112
	}
115
	
113
	
116
	public void testObserveList_ReturnsJavaBeanObservableList() throws Exception {
114
	public void testObserveList_ReturnsIBeanObservable() throws Exception {
117
		IObservableList observable = PojoObservables.observeList(Realm.getDefault(), pojo, "list");
115
		IObservableList observable = PojoObservables.observeList(Realm.getDefault(), pojo, "list");
118
		assertTrue(observable instanceof JavaBeanObservableList);
116
		assertTrue(observable instanceof IBeanObservable);
119
	}
117
	}
120
	
118
	
121
	public void testObserveList_DoesNotAttachListeners() throws Exception {
119
	public void testObserveList_DoesNotAttachListeners() throws Exception {
Lines 125-133 Link Here
125
		assertFalse(pojo.hasListeners("list"));
123
		assertFalse(pojo.hasListeners("list"));
126
	}
124
	}
127
	
125
	
128
	public void testObserveSetWithElementType_ReturnsJavaBeanObservableList() throws Exception {
126
	public void testObserveSetWithElementType_ReturnsIBeanObservable() throws Exception {
129
		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set", String.class);
127
		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set", String.class);
130
		assertTrue(list instanceof JavaBeanObservableSet);
128
		assertTrue(list instanceof IBeanObservable);
131
	}
129
	}
132
	
130
	
133
	public void testObserveSetWithElementType_DoesNotAttachListeners() throws Exception {
131
	public void testObserveSetWithElementType_DoesNotAttachListeners() throws Exception {
Lines 137-145 Link Here
137
		assertFalse(pojo.hasListeners("set"));
135
		assertFalse(pojo.hasListeners("set"));
138
	}
136
	}
139
	
137
	
140
	public void testObserveSet_ReturnsJavaBeanObservableList() throws Exception {
138
	public void testObserveSet_ReturnsIBeanObservable() throws Exception {
141
		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set");
139
		IObservableSet list = PojoObservables.observeSet(Realm.getDefault(), pojo, "set");
142
		assertTrue(list instanceof JavaBeanObservableSet);
140
		assertTrue(list instanceof IBeanObservable);
143
	}
141
	}
144
	
142
	
145
	public void testObserveSet_DoesNotAttachListeners() throws Exception {
143
	public void testObserveSet_DoesNotAttachListeners() throws Exception {
(-)src/org/eclipse/jface/tests/databinding/viewers/ViewersObservablesTest.java (-4 / +11 lines)
Lines 7-21 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Matthew Hall - initial API and implementation (bug 206839)
9
 *     Matthew Hall - initial API and implementation (bug 206839)
10
 *     Matthew Hall - bug 194734
10
 ******************************************************************************/
11
 ******************************************************************************/
11
12
12
package org.eclipse.jface.tests.databinding.viewers;
13
package org.eclipse.jface.tests.databinding.viewers;
13
14
15
import org.eclipse.core.databinding.observable.IDecoratingObservable;
14
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.Realm;
15
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.core.databinding.property.IPropertyObservable;
16
import org.eclipse.jface.databinding.swt.SWTObservables;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
19
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
17
import org.eclipse.jface.databinding.viewers.ViewersObservables;
20
import org.eclipse.jface.databinding.viewers.ViewersObservables;
18
import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
21
import org.eclipse.jface.internal.databinding.viewers.ViewerInputProperty;
19
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
22
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
20
import org.eclipse.jface.viewers.TableViewer;
23
import org.eclipse.jface.viewers.TableViewer;
21
import org.eclipse.swt.SWT;
24
import org.eclipse.swt.SWT;
Lines 48-54 Link Here
48
	}
51
	}
49
52
50
	public void testObserveInput_InstanceOfViewerInputObservableValue() {
53
	public void testObserveInput_InstanceOfViewerInputObservableValue() {
51
		IObservableValue observable = ViewersObservables.observeInput(viewer);
54
		IViewerObservableValue observable = (IViewerObservableValue) ViewersObservables
52
		assertTrue(observable instanceof ViewerInputObservableValue);
55
				.observeInput(viewer);
56
		assertTrue(observable.getViewer() == viewer);
57
		IPropertyObservable propertyObservable = (IPropertyObservable) ((IDecoratingObservable) observable)
58
				.getDecorated();
59
		assertTrue(propertyObservable.getProperty() instanceof ViewerInputProperty);
53
	}
60
	}
54
}
61
}
(-)src/org/eclipse/jface/tests/internal/databinding/viewers/ViewerInputObservableValueTest.java (-16 / +21 lines)
Lines 7-13 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *    Matthew Hall - initial API and implementation (bug 206839)
9
 *    Matthew Hall - initial API and implementation (bug 206839)
10
 *     Matthew Hall - bug 213145
10
 *     Matthew Hall - bug 213145, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
package org.eclipse.jface.tests.internal.databinding.viewers;
12
package org.eclipse.jface.tests.internal.databinding.viewers;
13
13
Lines 18-27 Link Here
18
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.databinding.observable.value.IObservableValue;
19
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
20
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
21
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
22
import org.eclipse.jface.databinding.conformance.MutableObservableValueContractTest;
22
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
23
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
24
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
24
import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
25
import org.eclipse.jface.databinding.viewers.ViewerProperties;
26
import org.eclipse.jface.databinding.viewers.ViewersObservables;
25
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
27
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
26
import org.eclipse.jface.viewers.IStructuredContentProvider;
28
import org.eclipse.jface.viewers.IStructuredContentProvider;
27
import org.eclipse.jface.viewers.TableViewer;
29
import org.eclipse.jface.viewers.TableViewer;
Lines 55-88 Link Here
55
57
56
	public void testConstructor_IllegalArgumentException() {
58
	public void testConstructor_IllegalArgumentException() {
57
		try {
59
		try {
58
			new ViewerInputObservableValue(Realm.getDefault(), null);
60
			ViewersObservables.observeInput(null);
59
			fail("Expected IllegalArgumentException for null argument");
61
			fail("Expected IllegalArgumentException for null argument");
60
		} catch (IllegalArgumentException expected) {
62
		} catch (IllegalArgumentException expected) {
61
		}
63
		}
62
	}
64
	}
63
65
64
	public void testSetInputOnViewer_FiresNoChangeEvents() {
66
	public void testSetInputOnViewer_FiresChangeEventOnGetValue() {
65
		IObservableValue observable = new ViewerInputObservableValue(Realm
67
		IObservableValue observable = ViewersObservables.observeInput(viewer);
66
				.getDefault(), viewer);
68
		ValueChangeEventTracker listener = ValueChangeEventTracker
67
		ValueChangeEventTracker listener = ValueChangeEventTracker.observe(observable);
69
				.observe(observable);
68
70
69
		assertNull(viewer.getInput());
71
		assertNull(viewer.getInput());
70
		assertEquals(0, listener.count);
72
		assertEquals(0, listener.count);
71
73
72
		viewer.setInput(model);
74
		viewer.setInput(model);
73
75
74
		assertEquals(model, observable.getValue());
76
		assertEquals(model, viewer.getInput());
75
		assertEquals(0, listener.count);
77
		assertEquals(0, listener.count);
76
78
79
		// Call to getValue() causes observable to discover change
80
		assertEquals(model, observable.getValue());
81
		assertEquals(1, listener.count);
82
77
		viewer.setInput(null);
83
		viewer.setInput(null);
84
		assertEquals(null, viewer.getInput());
78
85
79
		assertEquals(null, observable.getValue());
86
		assertEquals(null, observable.getValue());
80
		assertEquals(0, listener.count);
87
		assertEquals(2, listener.count);
81
	}
88
	}
82
89
83
	public void testGetSetValue_FiresChangeEvents() {
90
	public void testGetSetValue_FiresChangeEvents() {
84
		IObservableValue observable = new ViewerInputObservableValue(Realm
91
		IObservableValue observable = ViewersObservables.observeInput(viewer);
85
				.getDefault(), viewer);
86
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
92
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
87
		observable.addValueChangeListener(listener);
93
		observable.addValueChangeListener(listener);
88
94
Lines 103-116 Link Here
103
	}
109
	}
104
110
105
	public void testGetValueType_AlwaysNull() throws Exception {
111
	public void testGetValueType_AlwaysNull() throws Exception {
106
		IObservableValue observable = new ViewerInputObservableValue(Realm
112
		IObservableValue observable = ViewersObservables.observeInput(viewer);
107
				.getDefault(), viewer);
108
		assertEquals(null, observable.getValueType());
113
		assertEquals(null, observable.getValueType());
109
	}
114
	}
110
115
111
	public void testDispose() throws Exception {
116
	public void testDispose() throws Exception {
112
		IObservableValue observable = new ViewerInputObservableValue(Realm
117
		IObservableValue observable = ViewersObservables.observeInput(viewer);
113
				.getDefault(), viewer);
114
		observable.dispose();
118
		observable.dispose();
115
		assertNull(observable.getRealm());
119
		assertNull(observable.getRealm());
116
		try {
120
		try {
Lines 165-171 Link Here
165
		}
169
		}
166
170
167
		public IObservableValue createObservableValue(Realm realm) {
171
		public IObservableValue createObservableValue(Realm realm) {
168
			return new ViewerInputObservableValue(realm, viewer);
172
			return PropertyObservables.observeValue(realm, viewer,
173
					ViewerProperties.input());
169
		}
174
		}
170
175
171
		public void change(IObservable observable) {
176
		public void change(IObservable observable) {
(-)src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderMultiSelectionObservableListTest.java (-12 / +10 lines)
Lines 8-22 Link Here
8
 * Contributors:
8
 * Contributors:
9
 *    Brad Reynolds - initial API and implementation
9
 *    Brad Reynolds - initial API and implementation
10
 *     Brad Reynolds - bug 116920
10
 *     Brad Reynolds - bug 116920
11
 *     Matthew Hall - bug 194734
11
 *******************************************************************************/
12
 *******************************************************************************/
12
package org.eclipse.jface.tests.internal.databinding.viewers;
13
package org.eclipse.jface.tests.internal.databinding.viewers;
13
14
14
import junit.framework.TestCase;
15
import junit.framework.TestCase;
15
16
17
import org.eclipse.core.databinding.observable.list.IObservableList;
16
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
18
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
17
import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
19
import org.eclipse.jface.databinding.conformance.util.ListChangeEventTracker;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
20
import org.eclipse.jface.databinding.viewers.ViewersObservables;
19
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;
20
import org.eclipse.jface.viewers.ISelectionProvider;
21
import org.eclipse.jface.viewers.ISelectionProvider;
21
import org.eclipse.jface.viewers.IStructuredContentProvider;
22
import org.eclipse.jface.viewers.IStructuredContentProvider;
22
import org.eclipse.jface.viewers.IStructuredSelection;
23
import org.eclipse.jface.viewers.IStructuredSelection;
Lines 24-30 Link Here
24
import org.eclipse.jface.viewers.TableViewer;
25
import org.eclipse.jface.viewers.TableViewer;
25
import org.eclipse.jface.viewers.Viewer;
26
import org.eclipse.jface.viewers.Viewer;
26
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.widgets.Display;
28
import org.eclipse.swt.widgets.Shell;
28
import org.eclipse.swt.widgets.Shell;
29
29
30
/**
30
/**
Lines 37-43 Link Here
37
37
38
	private TableViewer viewer;
38
	private TableViewer viewer;
39
39
40
	private static String[] model = new String[] { "0", "1", "2", "3" };
40
	private static String[] model = new String[] { "element0", "element1", "element2", "element3" };
41
41
42
	protected void setUp() throws Exception {
42
	protected void setUp() throws Exception {
43
		Shell shell = new Shell();
43
		Shell shell = new Shell();
Lines 55-62 Link Here
55
55
56
	public void testConstructorIllegalArgumentException() {
56
	public void testConstructorIllegalArgumentException() {
57
		try {
57
		try {
58
			new SelectionProviderMultipleSelectionObservableList(SWTObservables
58
			ViewersObservables.observeMultiSelection(null);
59
					.getRealm(Display.getDefault()), null, Object.class);
60
			fail();
59
			fail();
61
		} catch (IllegalArgumentException e) {
60
		} catch (IllegalArgumentException e) {
62
		}
61
		}
Lines 70-78 Link Here
70
	 * </ul>
69
	 * </ul>
71
	 */
70
	 */
72
	public void testAddRemove() {
71
	public void testAddRemove() {
73
		SelectionProviderMultipleSelectionObservableList observable = new SelectionProviderMultipleSelectionObservableList(
72
		IObservableList observable = ViewersObservables
74
				SWTObservables.getRealm(Display.getDefault()),
73
				.observeMultiSelection(selectionProvider);
75
				selectionProvider, Object.class);
76
		ListChangeEventTracker listener = new ListChangeEventTracker();
74
		ListChangeEventTracker listener = new ListChangeEventTracker();
77
		observable.addListChangeListener(listener);
75
		observable.addListChangeListener(listener);
78
		assertEquals(0, observable.size());
76
		assertEquals(0, observable.size());
Lines 126-140 Link Here
126
		// This is a bit surprising (we added at index 0 but the event says index 1).
124
		// This is a bit surprising (we added at index 0 but the event says index 1).
127
		// It is to the fact that the observable list tracks the underlying selection
125
		// It is to the fact that the observable list tracks the underlying selection
128
		// provider's notion of which element is at which index.
126
		// provider's notion of which element is at which index.
129
		assertDiffEntry(listener.event.diff.getDifferences()[0], 1, model[2], true);
127
		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[2], true);
130
		assertEquals(observable, listener.event.getObservableList());
128
		assertEquals(observable, listener.event.getObservableList());
131
		assertEquals(2, ((IStructuredSelection)viewer.getSelection()).size());
129
		assertEquals(2, ((IStructuredSelection)viewer.getSelection()).size());
132
130
133
		observable.clear();
131
		observable.clear();
134
		assertEquals(7, listener.count);
132
		assertEquals(7, listener.count);
135
		assertEquals(2, listener.event.diff.getDifferences().length);
133
		assertEquals(2, listener.event.diff.getDifferences().length);
136
		assertDiffEntry(listener.event.diff.getDifferences()[0], 1, model[2], false);
134
		assertDiffEntry(listener.event.diff.getDifferences()[0], 0, model[1], false);
137
		assertDiffEntry(listener.event.diff.getDifferences()[1], 0, model[1], false);
135
		assertDiffEntry(listener.event.diff.getDifferences()[1], 0, model[2], false);
138
		assertEquals(observable, listener.event.getObservableList());
136
		assertEquals(observable, listener.event.getObservableList());
139
		assertEquals(0, ((IStructuredSelection)viewer.getSelection()).size());
137
		assertEquals(0, ((IStructuredSelection)viewer.getSelection()).size());
140
}
138
}
(-)src/org/eclipse/jface/tests/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValueTest.java (-11 / +8 lines)
Lines 9-29 Link Here
9
 *    Brad Reynolds - initial API and implementation
9
 *    Brad Reynolds - initial API and implementation
10
 *    Brad Reynolds - bug 116920
10
 *    Brad Reynolds - bug 116920
11
 *    Ashley Cambrell - bug 198906
11
 *    Ashley Cambrell - bug 198906
12
 *    Matthew Hall - bug 194734
12
 *******************************************************************************/
13
 *******************************************************************************/
13
package org.eclipse.jface.tests.internal.databinding.viewers;
14
package org.eclipse.jface.tests.internal.databinding.viewers;
14
15
15
import junit.framework.TestCase;
16
import junit.framework.TestCase;
16
17
18
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
19
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
20
import org.eclipse.jface.databinding.viewers.ViewersObservables;
19
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderSingleSelectionObservableValue;
20
import org.eclipse.jface.viewers.ISelectionProvider;
21
import org.eclipse.jface.viewers.ISelectionProvider;
21
import org.eclipse.jface.viewers.IStructuredContentProvider;
22
import org.eclipse.jface.viewers.IStructuredContentProvider;
22
import org.eclipse.jface.viewers.StructuredSelection;
23
import org.eclipse.jface.viewers.StructuredSelection;
23
import org.eclipse.jface.viewers.TableViewer;
24
import org.eclipse.jface.viewers.TableViewer;
24
import org.eclipse.jface.viewers.Viewer;
25
import org.eclipse.jface.viewers.Viewer;
25
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.SWT;
26
import org.eclipse.swt.widgets.Display;
27
import org.eclipse.swt.widgets.Shell;
27
import org.eclipse.swt.widgets.Shell;
28
28
29
/**
29
/**
Lines 65-72 Link Here
65
65
66
	public void testConstructorIllegalArgumentException() {
66
	public void testConstructorIllegalArgumentException() {
67
		try {
67
		try {
68
			new SelectionProviderSingleSelectionObservableValue(SWTObservables
68
			ViewersObservables.observeSingleSelection(null);
69
					.getRealm(Display.getDefault()), null);
70
			fail();
69
			fail();
71
		} catch (IllegalArgumentException e) {
70
		} catch (IllegalArgumentException e) {
72
		}
71
		}
Lines 80-88 Link Here
80
	 * </ul>
79
	 * </ul>
81
	 */
80
	 */
82
	public void testGetSetValue() {
81
	public void testGetSetValue() {
83
		SelectionProviderSingleSelectionObservableValue observable = new SelectionProviderSingleSelectionObservableValue(
82
		IObservableValue observable = ViewersObservables
84
				SWTObservables.getRealm(Display.getDefault()),
83
				.observeSingleSelection(selectionProvider);
85
				selectionProvider);
86
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
84
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
87
		observable.addValueChangeListener(listener);
85
		observable.addValueChangeListener(listener);
88
		assertNull(observable.getValue());
86
		assertNull(observable.getValue());
Lines 110-118 Link Here
110
	}
108
	}
111
109
112
	public void testDispose() throws Exception {
110
	public void testDispose() throws Exception {
113
		SelectionProviderSingleSelectionObservableValue observable = new SelectionProviderSingleSelectionObservableValue(
111
		IObservableValue observable = ViewersObservables
114
				SWTObservables.getRealm(Display.getDefault()),
112
				.observeSingleSelection(selectionProvider);
115
				selectionProvider);
116
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
113
		ValueChangeEventTracker listener = new ValueChangeEventTracker();
117
		observable.addValueChangeListener(listener);
114
		observable.addValueChangeListener(listener);
118
115
(-)src/org/eclipse/jface/tests/internal/databinding/swt/StyledTextObservableValueFocusOutTest.java (+81 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Code 9 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
 *     Code 9 Corporation - initial API and implementation
10
 *     Chris Aniszczyk <zx@code9.com> - bug 131435
11
 *     Matthew Hall - bug 194734
12
 *******************************************************************************/
13
14
package org.eclipse.jface.tests.internal.databinding.swt;
15
16
import junit.framework.Test;
17
import junit.framework.TestCase;
18
import junit.framework.TestSuite;
19
20
import org.eclipse.core.databinding.observable.IObservable;
21
import org.eclipse.core.databinding.observable.Realm;
22
import org.eclipse.core.databinding.observable.value.IObservableValue;
23
import org.eclipse.core.databinding.property.PropertyObservables;
24
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
25
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
26
import org.eclipse.jface.databinding.swt.StyledTextProperties;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.custom.StyledText;
29
import org.eclipse.swt.widgets.Shell;
30
31
/**
32
 * Tests for the FocusOut version of StyledTextObservableValue.
33
 */
34
public class StyledTextObservableValueFocusOutTest extends TestCase {
35
	public static Test suite() {
36
		TestSuite suite = new TestSuite(
37
				StyledTextObservableValueFocusOutTest.class.toString());
38
		suite.addTest(SWTMutableObservableValueContractTest
39
				.suite(new Delegate()));
40
		return suite;
41
	}
42
43
	/* package */static class Delegate extends
44
			AbstractObservableValueContractDelegate {
45
		private Shell shell;
46
47
		private StyledText text;
48
49
		public void setUp() {
50
			shell = new Shell();
51
			text = new StyledText(shell, SWT.NONE);
52
		}
53
54
		public void tearDown() {
55
			shell.dispose();
56
		}
57
58
		public IObservableValue createObservableValue(Realm realm) {
59
			return PropertyObservables.observeValue(realm, text,
60
					StyledTextProperties.text(SWT.FocusOut));
61
		}
62
63
		public Object getValueType(IObservableValue observable) {
64
			return String.class;
65
		}
66
67
		public void change(IObservable observable) {
68
			text.setFocus();
69
70
			IObservableValue observableValue = (IObservableValue) observable;
71
			text.setText((String) createValue(observableValue));
72
73
			text.notifyListeners(SWT.FocusOut, null);
74
		}
75
76
		public Object createValue(IObservableValue observable) {
77
			String value = (String) observable.getValue();
78
			return value + "a";
79
		}
80
	}
81
}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/StyledTextObservableValueTest.java (+112 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Code 9 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
 *     Code 9 Corporation - initial API and implementation
10
 *     Chris Aniszczyk <zx@code9.com> - bug 131435
11
 *     Matthew Hall - bug 194734
12
 *******************************************************************************/
13
14
package org.eclipse.jface.tests.internal.databinding.swt;
15
16
import org.eclipse.core.databinding.observable.value.IObservableValue;
17
import org.eclipse.jface.databinding.conformance.util.ValueChangeEventTracker;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
19
import org.eclipse.jface.internal.databinding.swt.StyledTextTextProperty;
20
import org.eclipse.jface.tests.databinding.AbstractDefaultRealmTestCase;
21
import org.eclipse.swt.SWT;
22
import org.eclipse.swt.custom.StyledText;
23
import org.eclipse.swt.widgets.Shell;
24
25
/**
26
 * Tests to assert the inputs of the StyledTextObservableValue constructor.
27
 */
28
public class StyledTextObservableValueTest extends AbstractDefaultRealmTestCase {
29
	private StyledText text;
30
	private ValueChangeEventTracker listener;
31
32
	protected void setUp() throws Exception {
33
		super.setUp();
34
35
		Shell shell = new Shell();
36
		text = new StyledText(shell, SWT.NONE);
37
38
		listener = new ValueChangeEventTracker();
39
	}
40
41
	/**
42
	 * Asserts that only valid SWT event types are accepted on construction of
43
	 * StyledTextObservableValue.
44
	 */
45
	public void testConstructorUpdateEventTypes() {
46
		try {
47
			new StyledTextTextProperty(SWT.NONE);
48
			new StyledTextTextProperty(SWT.FocusOut);
49
			new StyledTextTextProperty(SWT.Modify);
50
			assertTrue(true);
51
		} catch (IllegalArgumentException e) {
52
			fail();
53
		}
54
55
		try {
56
			new StyledTextTextProperty(SWT.Verify);
57
			fail();
58
		} catch (IllegalArgumentException e) {
59
			assertTrue(true);
60
		}
61
	}
62
63
	/**
64
	 * s
65
	 * 
66
	 * @throws Exception
67
	 */
68
	public void testGetValueBeforeFocusOutChangeEventsFire() throws Exception {
69
		IObservableValue observableValue = SWTObservables.observeText(text,
70
				SWT.FocusOut);
71
		observableValue.addValueChangeListener(listener);
72
73
		String a = "a";
74
		String b = "b";
75
76
		text.setText(a);
77
		
78
		// fetching the value updates the buffered value
79
		assertEquals(a, observableValue.getValue()); 
80
		assertEquals(1, listener.count);
81
82
		text.setText(b);
83
84
		text.notifyListeners(SWT.FocusOut, null);
85
86
		assertEquals(2, listener.count);
87
		assertEquals(a, listener.event.diff.getOldValue());
88
		assertEquals(b, listener.event.diff.getNewValue());
89
	}
90
91
	public void testDispose() throws Exception {
92
		IObservableValue observableValue = SWTObservables.observeText(text,
93
				SWT.Modify);
94
		ValueChangeEventTracker testCounterValueChangeListener = new ValueChangeEventTracker();
95
		observableValue.addValueChangeListener(testCounterValueChangeListener);
96
97
		String expected1 = "Test123";
98
		text.setText(expected1);
99
100
		assertEquals(1, testCounterValueChangeListener.count);
101
		assertEquals(expected1, text.getText());
102
		assertEquals(expected1, observableValue.getValue());
103
104
		observableValue.dispose();
105
106
		String expected2 = "NewValue123";
107
		text.setText(expected2);
108
109
		assertEquals(1, testCounterValueChangeListener.count);
110
		assertEquals(expected2, text.getText());
111
	}
112
}
(-)src/org/eclipse/core/tests/databinding/property/PropertyTest.java (+185 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.tests.databinding.property;
13
14
import org.eclipse.core.databinding.property.IPropertyChangeListener;
15
import org.eclipse.core.databinding.property.Property;
16
import org.eclipse.core.databinding.property.PropertyChangeEvent;
17
18
import junit.framework.TestCase;
19
20
/**
21
 * @since 3.2
22
 * 
23
 */
24
public class PropertyTest extends TestCase {
25
	private Source source;
26
	private SourceProperty property;
27
	private ChangeListener listener;
28
29
	protected void setUp() throws Exception {
30
		source = new Source();
31
		property = new SourceProperty();
32
		listener = new ChangeListener();
33
	}
34
35
	public void testAddListenerTo() {
36
		assertFalse(source.hasListener());
37
		property.addChangeListener(source, listener);
38
		assertTrue(source.hasListener());
39
40
		assertEquals(0, listener.count);
41
42
		source.change();
43
44
		assertEquals(1, listener.count);
45
		assertEquals(new ChangeEvent(source, "Version 1"), listener.event);
46
	}
47
48
	public void testAddListenerTo_MultipleListeners() {
49
		assertFalse(source.hasListener());
50
51
		property.addChangeListener(source, listener);
52
53
		assertTrue(source.hasListener());
54
55
		ChangeListener listener2 = new ChangeListener();
56
		property.addChangeListener(source, listener2);
57
58
		assertTrue(source.hasListener());
59
60
		property.removeChangeListener(source, listener);
61
62
		assertTrue(source.hasListener());
63
64
		property.removeChangeListener(source, listener2);
65
66
		assertFalse(source.hasListener());
67
	}
68
69
	public void testRemoveListenerFrom() {
70
		property.addChangeListener(source, listener);
71
		assertTrue(source.hasListener());
72
		property.removeChangeListener(source, listener);
73
		assertFalse(source.hasListener());
74
75
		source.change();
76
77
		assertEquals(0, listener.count);
78
	}
79
80
	public void testIsDisposed() {
81
		assertFalse(property.isDisposed());
82
		property.dispose();
83
		assertTrue(property.isDisposed());
84
	}
85
86
	public void testDispose() {
87
		property.addChangeListener(source, listener);
88
		assertTrue(source.hasListener());
89
		property.dispose();
90
		assertFalse(source.hasListener());
91
	}
92
93
	static class Source {
94
		private int version = 0;
95
96
		private ISourceListener listener;
97
98
		void change() {
99
			++version;
100
			if (listener != null)
101
				listener.notify(this, "Version " + version);
102
		}
103
104
		boolean hasListener() {
105
			return listener != null;
106
		}
107
	}
108
109
	interface ISourceListener {
110
		void notify(Object source, String message);
111
	}
112
113
	static class SourceProperty extends Property {
114
		private ISourceListener listener = new ISourceListener() {
115
			public void notify(Object source, String message) {
116
				firePropertyChange(new ChangeEvent(source, message));
117
			}
118
		};
119
120
		public void addChangeListener(Object source, IChangeListener listener) {
121
			addPropertyChangeListener(source, listener);
122
		}
123
124
		public void removeChangeListener(Object source, IChangeListener listener) {
125
			removePropertyChangeListener(source, listener);
126
		}
127
128
		protected void addListenerTo(Object source) {
129
			((Source) source).listener = listener;
130
		}
131
132
		protected void removeListenerFrom(Object source) {
133
			((Source) source).listener = null;
134
		}
135
136
		void change(Object source) {
137
			((Source) source).change();
138
		}
139
	}
140
141
	static interface IChangeListener extends IPropertyChangeListener {
142
		void handlePropertyStubChange(ChangeEvent event);
143
	}
144
145
	static class ChangeListener implements IChangeListener {
146
		int count = 0;
147
		ChangeEvent event;
148
149
		public void handlePropertyStubChange(ChangeEvent event) {
150
			count++;
151
			this.event = event;
152
		}
153
	}
154
155
	static class ChangeEvent extends PropertyChangeEvent {
156
		private static final long serialVersionUID = 1L;
157
158
		final String message;
159
160
		ChangeEvent(Object source, String message) {
161
			super(source);
162
			this.message = message;
163
		}
164
165
		protected void dispatch(IPropertyChangeListener listener) {
166
			((IChangeListener) listener).handlePropertyStubChange(this);
167
		}
168
169
		public boolean equals(Object obj) {
170
			if (obj == this)
171
				return true;
172
			if (!super.equals(obj))
173
				return false;
174
175
			ChangeEvent that = (ChangeEvent) obj;
176
			return message.equals(that.message);
177
		}
178
179
		public int hashCode() {
180
			int hash = super.hashCode();
181
			hash = hash * 37 + message.hashCode();
182
			return hash;
183
		}
184
	}
185
}
(-)src/org/eclipse/jface/tests/internal/databinding/swt/StyledTextObservableValueModifyTest.java (+79 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Code 9 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
 *     Code 9 Corporation - initial API and implementation
10
 *     Chris Aniszczyk <zx@code9.com> - bug 131435
11
 *     Matthew Hall - bug 194734
12
 *******************************************************************************/
13
14
package org.eclipse.jface.tests.internal.databinding.swt;
15
16
import junit.framework.Test;
17
import junit.framework.TestCase;
18
import junit.framework.TestSuite;
19
20
import org.eclipse.core.databinding.observable.IObservable;
21
import org.eclipse.core.databinding.observable.Realm;
22
import org.eclipse.core.databinding.observable.value.IObservableValue;
23
import org.eclipse.core.databinding.property.PropertyObservables;
24
import org.eclipse.jface.databinding.conformance.delegate.AbstractObservableValueContractDelegate;
25
import org.eclipse.jface.databinding.conformance.swt.SWTMutableObservableValueContractTest;
26
import org.eclipse.jface.databinding.swt.StyledTextProperties;
27
import org.eclipse.swt.SWT;
28
import org.eclipse.swt.custom.StyledText;
29
import org.eclipse.swt.widgets.Shell;
30
31
/**
32
 * Tests for the Modify version of StyledTextObservableValue.
33
 */
34
public class StyledTextObservableValueModifyTest extends TestCase {
35
	public static Test suite() {
36
		TestSuite suite = new TestSuite(
37
				StyledTextObservableValueModifyTest.class.toString());
38
		suite.addTest(SWTMutableObservableValueContractTest
39
				.suite(new Delegate()));
40
		return suite;
41
	}
42
43
	/* package */static class Delegate extends
44
			AbstractObservableValueContractDelegate {
45
		private Shell shell;
46
47
		private StyledText text;
48
49
		public void setUp() {
50
			shell = new Shell();
51
			text = new StyledText(shell, SWT.NONE);
52
		}
53
54
		public void tearDown() {
55
			shell.dispose();
56
		}
57
58
		public IObservableValue createObservableValue(Realm realm) {
59
			return PropertyObservables.observeValue(realm, text,
60
					StyledTextProperties.text(SWT.Modify));
61
		}
62
63
		public Object getValueType(IObservableValue observable) {
64
			return String.class;
65
		}
66
67
		public void change(IObservable observable) {
68
			text.setFocus();
69
70
			IObservableValue observableValue = (IObservableValue) observable;
71
			text.setText((String) createValue(observableValue));
72
		}
73
74
		public Object createValue(IObservableValue observable) {
75
			String value = (String) observable.getValue();
76
			return value + "a";
77
		}
78
	}
79
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListObservableValue.java (-109 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.Diffs;
16
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.widgets.Event;
19
import org.eclipse.swt.widgets.List;
20
import org.eclipse.swt.widgets.Listener;
21
22
/**
23
 * @since 3.2
24
 * 
25
 */
26
public class ListObservableValue extends AbstractSWTObservableValue {
27
28
	private final List list;
29
30
	private boolean updating = false;
31
32
	private String currentValue;
33
34
	private Listener listener;
35
36
	/**
37
	 * @param list
38
	 */
39
	public ListObservableValue(List list) {
40
		super(list);
41
		this.list = list;
42
		this.currentValue = (String) doGetValue();
43
44
		if ((list.getStyle() & SWT.MULTI) > 0)
45
			throw new IllegalArgumentException(
46
					"SWT.SINGLE support only for a List selection"); //$NON-NLS-1$
47
48
		listener = new Listener() {
49
50
			public void handleEvent(Event event) {
51
				if (!updating) {
52
					Object oldValue = currentValue;
53
					currentValue = (String) doGetValue();
54
					fireValueChange(Diffs.createValueDiff(oldValue,
55
							currentValue));
56
				}
57
			}
58
59
		};
60
		list.addListener(SWT.Selection, listener);
61
	}
62
63
	public void doSetValue(Object value) {
64
		String oldValue = null;
65
		if (list.getSelection() != null && list.getSelection().length > 0)
66
			oldValue = list.getSelection()[0];
67
		try {
68
			updating = true;
69
			String items[] = list.getItems();
70
			int index = -1;
71
			if (items != null && value != null) {
72
				for (int i = 0; i < items.length; i++) {
73
					if (value.equals(items[i])) {
74
						index = i;
75
						break;
76
					}
77
				}
78
				list.select(index); // -1 will not "unselect"
79
			}
80
			currentValue = (String) value;
81
		} finally {
82
			updating = false;
83
		}
84
		fireValueChange(Diffs.createValueDiff(oldValue, value));
85
	}
86
87
	public Object doGetValue() {
88
		int index = list.getSelectionIndex();
89
		if (index >= 0)
90
			return list.getItem(index);
91
		return null;
92
	}
93
94
	public Object getValueType() {
95
		return String.class;
96
	}
97
98
	/*
99
	 * (non-Javadoc)
100
	 *
101
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
102
	 */
103
	public synchronized void dispose() {
104
		super.dispose();
105
		if (listener != null && !list.isDisposed()) {
106
			list.removeListener(SWT.Selection, listener);
107
		}
108
	}
109
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboSingleSelectionObservableValue.java (-81 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.swt.custom.CCombo;
17
import org.eclipse.swt.events.SelectionEvent;
18
import org.eclipse.swt.events.SelectionListener;
19
20
/**
21
 * @since 1.0
22
 *
23
 */
24
public class CComboSingleSelectionObservableValue extends
25
		SingleSelectionObservableValue {
26
27
	private SelectionListener selectionListener;
28
29
	/**
30
	 * @param combo
31
	 */
32
	public CComboSingleSelectionObservableValue(CCombo combo) {
33
		super(combo);
34
	}
35
	
36
	/**
37
	 * @param realm
38
	 * @param combo
39
	 */
40
	public CComboSingleSelectionObservableValue(Realm realm, CCombo combo) {
41
		super(realm, combo);
42
	}
43
44
	private CCombo getCCombo() {
45
		return (CCombo) getWidget();
46
	}
47
48
	protected void doAddSelectionListener(final Runnable runnable) {
49
		selectionListener = new SelectionListener() {
50
			public void widgetDefaultSelected(SelectionEvent e) {
51
				runnable.run();
52
			}
53
54
			public void widgetSelected(SelectionEvent e) {
55
				runnable.run();
56
			}
57
		};
58
		getCCombo().addSelectionListener(selectionListener);
59
	}
60
61
	protected int doGetSelectionIndex() {
62
		return getCCombo().getSelectionIndex();
63
	}
64
65
	protected void doSetSelectionIndex(int index) {
66
		getCCombo().setText(getCCombo().getItem(index));
67
	}
68
69
	/*
70
	 * (non-Javadoc)
71
	 *
72
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
73
	 */
74
	public synchronized void dispose() {
75
		super.dispose();
76
		if (selectionListener != null && !getCCombo().isDisposed()) {
77
			getCCombo().removeSelectionListener(selectionListener);
78
		}
79
80
	}
81
}
(-)src/org/eclipse/jface/internal/databinding/swt/ShellObservableValue.java (-74 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 207844)
10
 *     IBM Corporation - initial API and implementation
11
 *     Brad Reynolds - initial API and implementation
12
 *     Matthew Hall - bug 212235
13
 *******************************************************************************/
14
package org.eclipse.jface.internal.databinding.swt;
15
16
import org.eclipse.core.databinding.observable.Diffs;
17
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.core.databinding.observable.value.IObservableValue;
19
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
20
import org.eclipse.swt.widgets.Shell;
21
22
/**
23
 * An {@link IObservableValue} that tracks the text of a Shell.
24
 * 
25
 * @since 1.2
26
 */
27
public class ShellObservableValue extends AbstractSWTObservableValue {
28
29
	private final Shell shell;
30
31
	/**
32
	 * Constructs a ShellObservableValue which tracks the text of the given
33
	 * Shell.
34
	 * 
35
	 * @param shell
36
	 *            the shell to track
37
	 */
38
	public ShellObservableValue(Shell shell) {
39
		super(shell);
40
		this.shell = shell;
41
	}
42
43
	/**
44
	 * Constructs a ShellObservableValue belonging to the given realm, which
45
	 * tracks the text of the given shell.
46
	 * 
47
	 * @param realm
48
	 *            the realm of the constructed observable
49
	 * @param shell
50
	 *            the shell to track
51
	 */
52
	public ShellObservableValue(Realm realm, Shell shell) {
53
		super(realm, shell);
54
		this.shell = shell;
55
	}
56
57
	protected void doSetValue(final Object value) {
58
		String oldValue = shell.getText();
59
		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
60
		shell.setText(newValue);
61
62
		if (!newValue.equals(oldValue)) {
63
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
64
		}
65
	}
66
67
	protected Object doGetValue() {
68
		return shell.getText();
69
	}
70
71
	public Object getValueType() {
72
		return String.class;
73
	}
74
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboObservableList.java (-51 lines)
Removed Link Here
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
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.swt;
12
13
import org.eclipse.jface.databinding.swt.SWTObservables;
14
import org.eclipse.swt.custom.CCombo;
15
16
/**
17
 * @since 3.2
18
 * 
19
 */
20
public class CComboObservableList extends SWTObservableList {
21
22
	private final CCombo ccombo;
23
24
	/**
25
	 * @param ccombo
26
	 */
27
	public CComboObservableList(CCombo ccombo) {
28
		super(SWTObservables.getRealm(ccombo.getDisplay()));
29
		this.ccombo = ccombo;
30
	}
31
32
	protected int getItemCount() {
33
		return ccombo.getItemCount();
34
	}
35
36
	protected void setItems(String[] newItems) {
37
		ccombo.setItems(newItems);
38
	}
39
40
	protected String[] getItems() {
41
		return ccombo.getItems();
42
	}
43
44
	protected String getItem(int index) {
45
		return ccombo.getItem(index);
46
	}
47
48
	protected void setItem(int index, String string) {
49
		ccombo.setItem(index, string);
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/ScaleObservableValue.java (-150 lines)
Removed Link Here
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
 *     Peter Centgraf - bug 175763
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.runtime.Assert;
17
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
18
import org.eclipse.swt.events.SelectionAdapter;
19
import org.eclipse.swt.events.SelectionEvent;
20
import org.eclipse.swt.events.SelectionListener;
21
import org.eclipse.swt.widgets.Scale;
22
23
/**
24
 * @since 1.0
25
 * 
26
 */
27
public class ScaleObservableValue extends AbstractSWTObservableValue {
28
29
	private final Scale scale;
30
31
	private final String attribute;
32
33
	private boolean updating = false;
34
35
	private int currentSelection;
36
	
37
	private SelectionListener listener;
38
39
	/**
40
	 * @param scale
41
	 * @param attribute
42
	 */
43
	public ScaleObservableValue(Scale scale, String attribute) {
44
		super(scale);
45
		this.scale = scale;
46
		this.attribute = attribute;
47
		init();
48
	}
49
	
50
	/**
51
	 * @param realm
52
	 * @param scale
53
	 * @param attribute
54
	 */
55
	public ScaleObservableValue(Realm realm, Scale scale, String attribute) {
56
		super(realm, scale);
57
		this.scale = scale;
58
		this.attribute = attribute;
59
		init();
60
	}
61
	
62
	private void init() {		
63
		if (attribute.equals(SWTProperties.SELECTION)) {
64
			currentSelection = scale.getSelection();
65
			scale.addSelectionListener(listener = new SelectionAdapter() {
66
				public void widgetSelected(SelectionEvent e) {
67
					if (!updating) {
68
						int newSelection = ScaleObservableValue.this.scale
69
						.getSelection();
70
						notifyIfChanged(currentSelection, newSelection);
71
						currentSelection = newSelection;
72
					}
73
				}
74
			});
75
		} else if (!attribute.equals(SWTProperties.MIN)
76
				&& !attribute.equals(SWTProperties.MAX)) {
77
			throw new IllegalArgumentException(
78
					"Attribute name not valid: " + attribute); //$NON-NLS-1$
79
		}
80
	}
81
82
	public void doSetValue(final Object value) {
83
		int oldValue;
84
		int newValue;
85
		try {
86
			updating = true;
87
			newValue = ((Integer) value).intValue();
88
			if (attribute.equals(SWTProperties.SELECTION)) {
89
				oldValue = scale.getSelection();
90
				scale.setSelection(newValue);
91
				currentSelection = newValue;
92
			} else if (attribute.equals(SWTProperties.MIN)) {
93
				oldValue = scale.getMinimum();
94
				scale.setMinimum(newValue);
95
			} else if (attribute.equals(SWTProperties.MAX)) {
96
				oldValue = scale.getMaximum();
97
				scale.setMaximum(newValue);
98
			} else {
99
				Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
100
				return;
101
			}
102
			
103
			notifyIfChanged(oldValue, newValue);
104
		} finally {
105
			updating = false;
106
		}
107
	}
108
109
	public Object doGetValue() {
110
		int value = 0;
111
		if (attribute.equals(SWTProperties.SELECTION)) {
112
			value = scale.getSelection();
113
		} else if (attribute.equals(SWTProperties.MIN)) {
114
			value = scale.getMinimum();
115
		} else if (attribute.equals(SWTProperties.MAX)) {
116
			value = scale.getMaximum();
117
		}
118
		return new Integer(value);
119
	}
120
121
	public Object getValueType() {
122
		return Integer.TYPE;
123
	}
124
125
	/**
126
	 * @return attribute being observed
127
	 */
128
	public String getAttribute() {
129
		return attribute;
130
	}
131
	
132
	/* (non-Javadoc)
133
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
134
	 */
135
	public synchronized void dispose() {
136
		super.dispose();
137
		
138
		if (listener != null && !scale.isDisposed()) {
139
			scale.removeSelectionListener(listener);
140
		}
141
		listener = null;
142
	}
143
	
144
	private void notifyIfChanged(int oldValue, int newValue) {
145
		if (oldValue != newValue) {
146
			fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
147
					new Integer(newValue)));
148
		}
149
	}
150
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboObservableValue.java (-166 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *     Matthew Hall - bug 118516
13
 *     Eric Rizzo - bug 134884
14
 *******************************************************************************/
15
package org.eclipse.jface.internal.databinding.swt;
16
17
import org.eclipse.core.databinding.observable.Diffs;
18
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.core.runtime.Assert;
20
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
21
import org.eclipse.swt.custom.CCombo;
22
import org.eclipse.swt.events.ModifyEvent;
23
import org.eclipse.swt.events.ModifyListener;
24
25
/**
26
 * @since 3.2
27
 * 
28
 */
29
public class CComboObservableValue extends AbstractSWTObservableValue {
30
31
	/**
32
	 * 
33
	 */
34
35
	private final CCombo ccombo;
36
37
	private final String attribute;
38
39
	private boolean updating = false;
40
41
	private String currentValue;
42
43
	private ModifyListener modifyListener;
44
45
	/**
46
	 * @param ccombo
47
	 * @param attribute
48
	 */
49
	public CComboObservableValue(CCombo ccombo, String attribute) {
50
		super(ccombo);
51
		this.ccombo = ccombo;
52
		this.attribute = attribute;
53
		init();
54
	}
55
56
	/**
57
	 * @param realm
58
	 * @param ccombo
59
	 * @param attribute
60
	 */
61
	public CComboObservableValue(Realm realm, CCombo ccombo, String attribute) {
62
		super(realm, ccombo);
63
		this.ccombo = ccombo;
64
		this.attribute = attribute;
65
		init();
66
	}
67
	
68
	private void init() {		
69
		if (attribute.equals(SWTProperties.SELECTION)
70
				|| attribute.equals(SWTProperties.TEXT)) {
71
			this.currentValue = ccombo.getText();
72
			modifyListener = new ModifyListener() {
73
74
				public void modifyText(ModifyEvent e) {
75
					if (!updating) {
76
						String oldValue = currentValue;
77
						currentValue = CComboObservableValue.this.ccombo
78
								.getText();
79
						
80
						notifyIfChanged(oldValue, currentValue);
81
					}
82
				}
83
			};
84
			ccombo.addModifyListener(modifyListener);
85
		} else
86
			throw new IllegalArgumentException();
87
	}
88
89
	public void doSetValue(final Object value) {
90
		String oldValue = ccombo.getText();
91
		try {
92
			updating = true;
93
			if (attribute.equals(SWTProperties.TEXT)) {
94
				String stringValue = value != null ? value.toString() : ""; //$NON-NLS-1$
95
				ccombo.setText(stringValue);
96
			} else if (attribute.equals(SWTProperties.SELECTION)) {
97
				String items[] = ccombo.getItems();
98
				int index = -1;
99
				if (value == null) {
100
					ccombo.select(-1);
101
				} else if (items != null) {
102
					for (int i = 0; i < items.length; i++) {
103
						if (value.equals(items[i])) {
104
							index = i;
105
							break;
106
						}
107
					}
108
					if (index == -1) {
109
						ccombo.setText((String) value);
110
					} else {
111
						ccombo.select(index); // -1 will not "unselect"
112
					}
113
				}
114
			}
115
		} finally {
116
			updating = false;
117
			currentValue = ccombo.getText();
118
		}
119
		
120
		notifyIfChanged(oldValue, currentValue);
121
	}
122
123
	public Object doGetValue() {
124
		if (attribute.equals(SWTProperties.TEXT))
125
			return ccombo.getText();
126
127
		Assert.isTrue(attribute.equals(SWTProperties.SELECTION),
128
				"unexpected attribute: " + attribute); //$NON-NLS-1$
129
		// The problem with a ccombo, is that it changes the text and
130
		// fires before it update its selection index
131
		return ccombo.getText();
132
	}
133
134
	public Object getValueType() {
135
		Assert.isTrue(attribute.equals(SWTProperties.TEXT)
136
				|| attribute.equals(SWTProperties.SELECTION),
137
				"unexpected attribute: " + attribute); //$NON-NLS-1$
138
		return String.class;
139
	}
140
141
	/**
142
	 * @return attribute being observed
143
	 */
144
	public String getAttribute() {
145
		return attribute;
146
	}
147
148
	/*
149
	 * (non-Javadoc)
150
	 *
151
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
152
	 */
153
	public synchronized void dispose() {
154
		super.dispose();
155
156
		if (modifyListener != null && !ccombo.isDisposed()) {
157
			ccombo.removeModifyListener(modifyListener);
158
		}
159
	}
160
	
161
	private void notifyIfChanged(String oldValue, String newValue) {
162
		if (!oldValue.equals(newValue)) {
163
			fireValueChange(Diffs.createValueDiff(oldValue, ccombo.getText()));			
164
		}
165
	}
166
}
(-)src/org/eclipse/jface/internal/databinding/swt/TableSingleSelectionObservableValue.java (-80 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.swt.events.SelectionEvent;
17
import org.eclipse.swt.events.SelectionListener;
18
import org.eclipse.swt.widgets.Table;
19
20
/**
21
 * @since 1.0
22
 * 
23
 */
24
public class TableSingleSelectionObservableValue extends
25
		SingleSelectionObservableValue {
26
27
	private SelectionListener selectionListener;
28
29
	/**
30
	 * @param table
31
	 */
32
	public TableSingleSelectionObservableValue(Table table) {
33
		super(table);
34
	}
35
	
36
	/**
37
	 * @param realm
38
	 * @param table
39
	 */
40
	public TableSingleSelectionObservableValue(Realm realm, Table table) {
41
		super(realm, table);
42
	}
43
44
	private Table getTable() {
45
		return (Table) getWidget();
46
	}
47
48
	protected void doAddSelectionListener(final Runnable runnable) {
49
		selectionListener = new SelectionListener() {
50
			public void widgetDefaultSelected(SelectionEvent e) {
51
				runnable.run();
52
			}
53
54
			public void widgetSelected(SelectionEvent e) {
55
				runnable.run();
56
			}
57
		};
58
		getTable().addSelectionListener(selectionListener);
59
	}
60
61
	protected int doGetSelectionIndex() {
62
		return getTable().getSelectionIndex();
63
	}
64
65
	protected void doSetSelectionIndex(int index) {
66
		getTable().setSelection(index);
67
	}
68
69
	/*
70
	 * (non-Javadoc)
71
	 *
72
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
73
	 */
74
	public synchronized void dispose() {
75
		super.dispose();
76
		if (selectionListener != null && !getTable().isDisposed()) {
77
			getTable().removeSelectionListener(selectionListener);
78
		}
79
	}
80
}
(-)src/org/eclipse/jface/internal/databinding/swt/SWTObservableList.java (-193 lines)
Removed Link Here
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
 *     Matthew Hall - bug 208858
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import java.util.ArrayList;
15
import java.util.Arrays;
16
import java.util.Collection;
17
import java.util.List;
18
19
import org.eclipse.core.databinding.BindingException;
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.ObservableTracker;
22
import org.eclipse.core.databinding.observable.Realm;
23
import org.eclipse.core.databinding.observable.list.AbstractObservableList;
24
25
/**
26
 * Abstract base class of CComboObservableList, ComboObservableList, and
27
 * ListObservableList.
28
 * 
29
 * @since 3.2
30
 * 
31
 */
32
public abstract class SWTObservableList extends AbstractObservableList {
33
34
	/**
35
	 * 
36
	 */
37
	public SWTObservableList() {
38
		super();
39
	}
40
41
	/**
42
	 * @param realm
43
	 */
44
	public SWTObservableList(Realm realm) {
45
		super(realm);
46
	}
47
48
	public void add(int index, Object element) {
49
		int size = doGetSize();
50
		if (index < 0 || index > size)
51
			index = size;
52
		String[] newItems = new String[size + 1];
53
		System.arraycopy(getItems(), 0, newItems, 0, index);
54
		newItems[index] = (String) element;
55
		System.arraycopy(getItems(), index, newItems, index + 1, size - index);
56
		setItems(newItems);
57
		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
58
				true, element)));
59
	}
60
61
	public int doGetSize() {
62
		return getItemCount();
63
	}
64
65
	public Object get(int index) {
66
		getterCalled();
67
		return getItem(index);
68
	}
69
70
	public Object getElementType() {
71
		return String.class;
72
	}
73
74
	/**
75
	 * @param index
76
	 * @return the item at the given index
77
	 */
78
	protected abstract String getItem(int index);
79
80
	/**
81
	 * @return the item count
82
	 */
83
	protected abstract int getItemCount();
84
85
	/**
86
	 * @return the items
87
	 */
88
	protected abstract String[] getItems();
89
90
	private void getterCalled() {
91
		ObservableTracker.getterCalled(this);
92
	}
93
94
	public Object remove(int index) {
95
		getterCalled();
96
		int size = doGetSize();
97
		if (index < 0 || index > size - 1)
98
			throw new BindingException(
99
					"Request to remove an element out of the collection bounds"); //$NON-NLS-1$
100
101
		String[] newItems = new String[size - 1];
102
		String oldElement = getItem(index);
103
		if (newItems.length > 0) {
104
			System.arraycopy(getItems(), 0, newItems, 0, index);
105
			if (size - 1 > index) {
106
				System.arraycopy(getItems(), index + 1, newItems, index, size
107
						- index - 1);
108
			}
109
		}
110
		setItems(newItems);
111
		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
112
				false, oldElement)));
113
		return oldElement;
114
	}
115
116
	public Object set(int index, Object element) {
117
		String oldElement = getItem(index);
118
		setItem(index, (String) element);
119
		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(index,
120
				false, oldElement), Diffs.createListDiffEntry(index, true,
121
				element)));
122
		return oldElement;
123
	}
124
125
	public Object move(int oldIndex, int newIndex) {
126
		checkRealm();
127
		if (oldIndex == newIndex)
128
			return get(oldIndex);
129
		int size = doGetSize();
130
		if (oldIndex < 0 || oldIndex >= size)
131
			throw new IndexOutOfBoundsException(
132
					"oldIndex: " + oldIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
133
		if (newIndex < 0 || newIndex >= size)
134
			throw new IndexOutOfBoundsException(
135
					"newIndex: " + newIndex + ", size:" + size); //$NON-NLS-1$ //$NON-NLS-2$
136
137
		String[] items = getItems();
138
		String[] newItems = new String[size];
139
		String element = items[oldIndex];
140
		if (newItems.length > 0) {
141
			System.arraycopy(items, 0, newItems, 0, size);
142
			if (oldIndex < newIndex) {
143
				System.arraycopy(items, oldIndex + 1, newItems, oldIndex,
144
						newIndex - oldIndex);
145
			} else {
146
				System.arraycopy(items, newIndex, newItems, newIndex + 1,
147
						oldIndex - newIndex);
148
			}
149
			newItems[newIndex] = element;
150
		}
151
		setItems(newItems);
152
		fireListChange(Diffs.createListDiff(Diffs.createListDiffEntry(oldIndex,
153
				false, element), Diffs.createListDiffEntry(newIndex, true,
154
				element)));
155
		return element;
156
	}
157
158
	public boolean removeAll(Collection c) {
159
		checkRealm();
160
		List oldItems = Arrays.asList(getItems());
161
		List newItems = new ArrayList(oldItems);
162
		boolean removedAll = newItems.removeAll(c);
163
		if (removedAll) {
164
			setItems((String[]) newItems.toArray(new String[newItems.size()]));
165
			fireListChange(Diffs.computeListDiff(oldItems, newItems));
166
		}
167
		return removedAll;
168
	}
169
170
	public boolean retainAll(Collection c) {
171
		checkRealm();
172
		List oldItems = Arrays.asList(getItems());
173
		List newItems = new ArrayList(oldItems);
174
		boolean retainedAll = newItems.retainAll(c);
175
		if (retainedAll) {
176
			setItems((String[]) newItems.toArray(new String[newItems.size()]));
177
			fireListChange(Diffs.computeListDiff(oldItems, newItems));
178
		}
179
		return retainedAll;
180
	}
181
182
	/**
183
	 * @param index
184
	 * @param string
185
	 */
186
	protected abstract void setItem(int index, String string);
187
188
	/**
189
	 * @param newItems
190
	 */
191
	protected abstract void setItems(String[] newItems);
192
193
}
(-)src/org/eclipse/jface/internal/databinding/swt/TextEditableObservableValue.java (-75 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007, 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
 *******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
17
import org.eclipse.swt.widgets.Text;
18
19
/**
20
 * Observable value for the editable property of a Text.
21
 * 
22
 * @since 1.1
23
 */
24
public class TextEditableObservableValue extends AbstractSWTObservableValue {
25
	private Text text;
26
	
27
	/**
28
	 * @param text
29
	 */
30
	public TextEditableObservableValue(Text text) {
31
		super(text);	
32
		this.text = text;
33
	}
34
	
35
	/**
36
	 * @param realm
37
	 * @param text
38
	 */
39
	public TextEditableObservableValue(Realm realm, Text text) {
40
		super(realm, text);
41
		this.text = text;
42
	}
43
44
	/* (non-Javadoc)
45
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#doGetValue()
46
	 */
47
	protected Object doGetValue() {
48
		return (text.getEditable()) ? Boolean.TRUE : Boolean.FALSE;
49
	}
50
	
51
	/* (non-Javadoc)
52
	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
53
	 */
54
	public Object getValueType() {
55
		return Boolean.TYPE;
56
	}
57
	
58
	/* (non-Javadoc)
59
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#doSetValue(java.lang.Object)
60
	 */
61
	protected void doSetValue(Object value) {
62
		if (value == null) {
63
			throw new IllegalArgumentException("Parameter value was null."); //$NON-NLS-1$
64
		}
65
		
66
		Boolean oldValue = new Boolean(text.getEditable());
67
		Boolean newValue = (Boolean) value;
68
		
69
		text.setEditable(newValue.booleanValue());
70
		
71
		if (!oldValue.equals(newValue)) {
72
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
73
		}
74
	}
75
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboObservableList.java (-51 lines)
Removed Link Here
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
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.swt;
12
13
import org.eclipse.jface.databinding.swt.SWTObservables;
14
import org.eclipse.swt.widgets.Combo;
15
16
/**
17
 * @since 3.2
18
 * 
19
 */
20
public class ComboObservableList extends SWTObservableList {
21
22
	private final Combo combo;
23
24
	/**
25
	 * @param combo
26
	 */
27
	public ComboObservableList(Combo combo) {
28
		super(SWTObservables.getRealm(combo.getDisplay()));
29
		this.combo = combo;
30
	}
31
32
	protected int getItemCount() {
33
		return combo.getItemCount();
34
	}
35
36
	protected void setItems(String[] newItems) {
37
		combo.setItems(newItems);
38
	}
39
40
	protected String[] getItems() {
41
		return combo.getItems();
42
	}
43
44
	protected String getItem(int index) {
45
		return combo.getItem(index);
46
	}
47
48
	protected void setItem(int index, String string) {
49
		combo.setItem(index, string);
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/ItemObservableValue.java (-61 lines)
Removed Link Here
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
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.swt;
12
13
import org.eclipse.core.databinding.observable.Diffs;
14
import org.eclipse.core.databinding.observable.Realm;
15
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
16
import org.eclipse.swt.widgets.Item;
17
18
/**
19
 * @since 3.5
20
 * 
21
 */
22
public class ItemObservableValue extends AbstractSWTObservableValue {
23
24
	private final Item item;
25
26
	/**
27
	 * @param item
28
	 */
29
	public ItemObservableValue(Item item) {
30
		super(item);
31
		this.item = item;
32
	}
33
	
34
	/**
35
	 * @param realm
36
	 * @param item
37
	 */
38
	public ItemObservableValue(Realm realm, Item item) {
39
		super(realm, item);
40
		this.item = item;
41
	}
42
43
	public void doSetValue(final Object value) {
44
		String oldValue = item.getText();
45
		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
46
		item.setText(newValue);
47
		
48
		if (!newValue.equals(oldValue)) {
49
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
50
		}
51
	}
52
53
	public Object doGetValue() {
54
		return item.getText();
55
	}
56
57
	public Object getValueType() {
58
		return String.class;
59
	}
60
61
}
(-)src/org/eclipse/jface/internal/databinding/swt/TextObservableValue.java (-198 lines)
Removed Link Here
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
 *     Brad Reynolds (bug 135446)
11
 *     Brad Reynolds - bug 164653
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.Diffs;
16
import org.eclipse.core.databinding.observable.IObservable;
17
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.jface.databinding.swt.SWTObservables;
19
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTVetoableValue;
20
import org.eclipse.swt.SWT;
21
import org.eclipse.swt.events.VerifyEvent;
22
import org.eclipse.swt.events.VerifyListener;
23
import org.eclipse.swt.widgets.Event;
24
import org.eclipse.swt.widgets.Listener;
25
import org.eclipse.swt.widgets.Text;
26
27
/**
28
 * {@link IObservable} implementation that wraps a {@link Text} widget. The time
29
 * at which listeners should be notified about changes to the text is specified
30
 * on construction.
31
 * 
32
 * <dl>
33
 * <dt>Events:</dt>
34
 * <dd> If the update event type (specified on construction) is
35
 * <code>SWT.Modify</code> a value change event will be fired on every key
36
 * stroke. If the update event type is <code>SWT.FocusOut</code> a value
37
 * change event will be fired on focus out. When in either mode if the user is
38
 * entering text and presses [Escape] the value will be reverted back to the
39
 * last value set using doSetValue(). Regardless of the update event type a
40
 * value changing event will fire on verify to enable vetoing of changes.</dd>
41
 * </dl>
42
 * 
43
 * @since 1.0
44
 */
45
public class TextObservableValue extends AbstractSWTVetoableValue {
46
47
	/**
48
	 * {@link Text} widget that this is being observed.
49
	 */
50
	private final Text text;
51
52
	/**
53
	 * Flag to track when the model is updating the widget. When
54
	 * <code>true</code> the handlers for the SWT events should not process
55
	 * the event as this would cause an infinite loop.
56
	 */
57
	private boolean updating = false;
58
59
	/**
60
	 * SWT event that on firing this observable will fire change events to its
61
	 * listeners.
62
	 */
63
	private final int updateEventType;
64
65
	/**
66
	 * Valid types for the {@link #updateEventType}.
67
	 */
68
	private static final int[] validUpdateEventTypes = new int[] { SWT.Modify,
69
			SWT.FocusOut, SWT.None };
70
71
	/**
72
	 * Previous value of the Text.
73
	 */
74
	private String oldValue;
75
76
	private Listener updateListener = new Listener() {
77
		public void handleEvent(Event event) {
78
			if (!updating) {
79
				String newValue = text.getText();
80
81
				if (!newValue.equals(oldValue)) {
82
					fireValueChange(Diffs.createValueDiff(oldValue, newValue));					
83
					oldValue = newValue;
84
				}
85
			}
86
		}
87
	};
88
89
	private VerifyListener verifyListener;
90
91
	/**
92
	 * Constructs a new instance bound to the given <code>text</code> widget
93
	 * and configured to fire change events to its listeners at the time of the
94
	 * <code>updateEventType</code>.
95
	 * 
96
	 * @param text
97
	 * @param updateEventType
98
	 *            SWT event constant as to what SWT event to update the model in
99
	 *            response to. Appropriate values are: <code>SWT.Modify</code>,
100
	 *            <code>SWT.FocusOut</code>, <code>SWT.None</code>.
101
	 * @throws IllegalArgumentException
102
	 *             if <code>updateEventType</code> is an incorrect type.
103
	 */
104
	public TextObservableValue(final Text text, int updateEventType) {
105
		this(SWTObservables.getRealm(text.getDisplay()), text, updateEventType);
106
	}
107
	
108
	/**
109
	 * Constructs a new instance.
110
	 * 
111
	 * @param realm can not be <code>null</code>
112
	 * @param text
113
	 * @param updateEventType
114
	 */
115
	public TextObservableValue(final Realm realm, Text text, int updateEventType) {
116
		super(realm, text);
117
		
118
		boolean eventValid = false;
119
		for (int i = 0; !eventValid && i < validUpdateEventTypes.length; i++) {
120
			eventValid = (updateEventType == validUpdateEventTypes[i]);
121
		}
122
		if (!eventValid) {
123
			throw new IllegalArgumentException(
124
					"UpdateEventType [" + updateEventType + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
125
		}
126
		this.text = text;
127
		this.updateEventType = updateEventType;
128
		if (updateEventType != SWT.None) {
129
			text.addListener(updateEventType, updateListener);
130
		}
131
		
132
		oldValue = text.getText();
133
		
134
		verifyListener = new VerifyListener() {
135
			public void verifyText(VerifyEvent e) {
136
				if (!updating) {
137
					String currentText = TextObservableValue.this.text
138
							.getText();
139
					String newText = currentText.substring(0, e.start) + e.text
140
							+ currentText.substring(e.end);
141
					if (!fireValueChanging(Diffs.createValueDiff(currentText,
142
							newText))) {
143
						e.doit = false;
144
					}
145
				}
146
			}
147
		};
148
		text.addVerifyListener(verifyListener);
149
	}
150
151
	/**
152
	 * Sets the bound {@link Text Text's} text to the passed <code>value</code>.
153
	 * 
154
	 * @param value
155
	 *            new value, String expected
156
	 * @see org.eclipse.core.databinding.observable.value.AbstractVetoableValue#doSetApprovedValue(java.lang.Object)
157
	 * @throws ClassCastException
158
	 *             if the value is anything other than a String
159
	 */
160
	protected void doSetApprovedValue(final Object value) {
161
		try {
162
			updating = true;
163
			text.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
164
			oldValue = text.getText();
165
		} finally {
166
			updating = false;
167
		}
168
	}
169
170
	/**
171
	 * Returns the current value of the {@link Text}.
172
	 * 
173
	 * @see org.eclipse.core.databinding.observable.value.AbstractVetoableValue#doGetValue()
174
	 */
175
	public Object doGetValue() {
176
		return oldValue = text.getText();
177
	}
178
179
	/**
180
	 * Returns the type of the value from {@link #doGetValue()}, i.e.
181
	 * String.class
182
	 * 
183
	 * @see org.eclipse.core.databinding.observable.value.IObservableValue#getValueType()
184
	 */
185
	public Object getValueType() {
186
		return String.class;
187
	}
188
189
	public synchronized void dispose() {
190
		if (!text.isDisposed()) {
191
			if (updateEventType != SWT.None) {
192
				text.removeListener(updateEventType, updateListener);
193
			}
194
			text.removeVerifyListener(verifyListener);
195
		}
196
		super.dispose();
197
	}
198
}
(-)src/org/eclipse/jface/internal/databinding/swt/SpinnerObservableValue.java (-151 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *     Matthew Hall - bug 118516
13
 *******************************************************************************/
14
package org.eclipse.jface.internal.databinding.swt;
15
16
import org.eclipse.core.databinding.observable.Diffs;
17
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.core.runtime.Assert;
19
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
20
import org.eclipse.swt.events.ModifyEvent;
21
import org.eclipse.swt.events.ModifyListener;
22
import org.eclipse.swt.widgets.Spinner;
23
24
/**
25
 * @since 1.0
26
 * 
27
 */
28
public class SpinnerObservableValue extends AbstractSWTObservableValue {
29
30
	private final Spinner spinner;
31
32
	private final String attribute;
33
34
	private boolean updating = false;
35
36
	private int currentSelection;
37
38
	private ModifyListener modifyListener;
39
40
	/**
41
	 * @param spinner
42
	 * @param attribute
43
	 */
44
	public SpinnerObservableValue(Spinner spinner, String attribute) {
45
		super(spinner);
46
		this.spinner = spinner;
47
		this.attribute = attribute;
48
		init();
49
	}
50
	
51
	/**
52
	 * @param realm
53
	 * @param spinner
54
	 * @param attribute
55
	 */
56
	public SpinnerObservableValue(Realm realm, Spinner spinner, String attribute) {
57
		super(realm, spinner);
58
		this.spinner = spinner;
59
		this.attribute = attribute;
60
		init();
61
	}
62
	
63
	private void init() {		
64
		if (attribute.equals(SWTProperties.SELECTION)) {
65
			currentSelection = spinner.getSelection();
66
			modifyListener = new ModifyListener() {
67
				public void modifyText(ModifyEvent e) {
68
					if (!updating) {
69
						int newSelection = SpinnerObservableValue.this.spinner
70
						.getSelection();
71
						notifyIfChanged(currentSelection, newSelection);
72
						currentSelection = newSelection;
73
					}
74
				}
75
			};
76
			spinner.addModifyListener(modifyListener);
77
		} else if (!attribute.equals(SWTProperties.MIN)
78
				&& !attribute.equals(SWTProperties.MAX)) {
79
			throw new IllegalArgumentException(
80
					"Attribute name not valid: " + attribute); //$NON-NLS-1$
81
		}
82
	}
83
84
	public void doSetValue(final Object value) {
85
		int oldValue;
86
		int newValue;
87
		try {
88
			updating = true;
89
			newValue = ((Integer) value).intValue();
90
			if (attribute.equals(SWTProperties.SELECTION)) {
91
				oldValue = spinner.getSelection();
92
				spinner.setSelection(newValue);
93
				currentSelection = newValue;
94
			} else if (attribute.equals(SWTProperties.MIN)) {
95
				oldValue = spinner.getMinimum();
96
				spinner.setMinimum(newValue);
97
			} else if (attribute.equals(SWTProperties.MAX)) {
98
				oldValue = spinner.getMaximum();
99
				spinner.setMaximum(newValue);
100
			} else {
101
				Assert.isTrue(false, "invalid attribute name:" + attribute); //$NON-NLS-1$
102
				return;
103
			}
104
			notifyIfChanged(oldValue, newValue);
105
		} finally {
106
			updating = false;
107
		}
108
	}
109
110
	public Object doGetValue() {
111
		int value = 0;
112
		if (attribute.equals(SWTProperties.SELECTION)) {
113
			value = spinner.getSelection();
114
		} else if (attribute.equals(SWTProperties.MIN)) {
115
			value = spinner.getMinimum();
116
		} else if (attribute.equals(SWTProperties.MAX)) {
117
			value = spinner.getMaximum();
118
		}
119
		return new Integer(value);
120
	}
121
122
	public Object getValueType() {
123
		return Integer.TYPE;
124
	}
125
126
	/**
127
	 * @return attribute being observed
128
	 */
129
	public String getAttribute() {
130
		return attribute;
131
	}
132
133
	/*
134
	 * (non-Javadoc)
135
	 *
136
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
137
	 */
138
	public synchronized void dispose() {
139
		super.dispose();
140
		if (modifyListener != null && !spinner.isDisposed()) {
141
			spinner.removeModifyListener(modifyListener);
142
		}
143
	}
144
	
145
	private void notifyIfChanged(int oldValue, int newValue) {
146
		if (oldValue != newValue) {
147
			fireValueChange(Diffs.createValueDiff(new Integer(oldValue),
148
					new Integer(newValue)));
149
		}
150
	}
151
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListObservableList.java (-51 lines)
Removed Link Here
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
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.swt;
12
13
import org.eclipse.jface.databinding.swt.SWTObservables;
14
import org.eclipse.swt.widgets.List;
15
16
/**
17
 * @since 3.2
18
 * 
19
 */
20
public class ListObservableList extends SWTObservableList {
21
22
	private final List list;
23
24
	/**
25
	 * @param list
26
	 */
27
	public ListObservableList(List list) {
28
		super(SWTObservables.getRealm(list.getDisplay()));
29
		this.list = list;
30
	}
31
32
	protected int getItemCount() {
33
		return list.getItemCount();
34
	}
35
36
	protected void setItems(String[] newItems) {
37
		list.setItems(newItems);
38
	}
39
40
	protected String[] getItems() {
41
		return list.getItems();
42
	}
43
44
	protected String getItem(int index) {
45
		return list.getItem(index);
46
	}
47
48
	protected void setItem(int index, String string) {
49
		list.setItem(index, string);
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/ItemTooltipObservableValue.java (-104 lines)
Removed Link Here
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
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.swt;
12
13
import org.eclipse.core.databinding.observable.Diffs;
14
import org.eclipse.core.databinding.observable.Realm;
15
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
16
import org.eclipse.swt.custom.CTabItem;
17
import org.eclipse.swt.widgets.Item;
18
import org.eclipse.swt.widgets.TabItem;
19
import org.eclipse.swt.widgets.TableColumn;
20
import org.eclipse.swt.widgets.ToolItem;
21
import org.eclipse.swt.widgets.TrayItem;
22
import org.eclipse.swt.widgets.TreeColumn;
23
24
/**
25
 * @since 3.5
26
 * 
27
 */
28
public class ItemTooltipObservableValue extends AbstractSWTObservableValue {
29
30
	private final Item item;
31
32
	/**
33
	 * @param item
34
	 */
35
	public ItemTooltipObservableValue(Item item) {
36
		super(item);
37
		this.item = item;
38
	}
39
	
40
	/**
41
	 * @param realm
42
	 * @param item
43
	 */
44
	public ItemTooltipObservableValue(Realm realm, Item item) {
45
		super(realm, item);
46
		this.item = item;
47
	}
48
49
	public void doSetValue(final Object value) {
50
		String oldValue = (String) doGetValue();
51
52
		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
53
		if (item instanceof CTabItem) {
54
			((CTabItem)item).setToolTipText(newValue);
55
		}
56
		else if (item instanceof TabItem) {
57
			((TabItem)item).setToolTipText(newValue);
58
		}
59
		else if (item instanceof TableColumn) {
60
			((TableColumn)item).setToolTipText(newValue);
61
		}
62
		else if (item instanceof ToolItem) {
63
			((ToolItem)item).setToolTipText(newValue);
64
		}
65
		else if (item instanceof TrayItem) {
66
			((TrayItem)item).setToolTipText(newValue);
67
		}
68
		else if (item instanceof TreeColumn) {
69
			((TreeColumn)item).setToolTipText(newValue);
70
		}
71
		
72
		if (!newValue.equals(oldValue)) {
73
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
74
		}
75
	}
76
77
	public Object doGetValue() {
78
		if (item instanceof CTabItem) {
79
			return ((CTabItem)item).getToolTipText();
80
		}
81
		else if (item instanceof TabItem) {
82
			return ((TabItem)item).getToolTipText();
83
		}
84
		else if (item instanceof TableColumn) {
85
			return ((TableColumn)item).getToolTipText();
86
		}
87
		else if (item instanceof ToolItem) {
88
			return ((ToolItem)item).getToolTipText();
89
		}
90
		else if (item instanceof TrayItem) {
91
			return ((TrayItem)item).getToolTipText();
92
		}
93
		else if (item instanceof TreeColumn) {
94
			return ((TreeColumn)item).getToolTipText();
95
		}
96
		
97
		return null;
98
	}
99
100
	public Object getValueType() {
101
		return String.class;
102
	}
103
104
}
(-)src/org/eclipse/jface/internal/databinding/swt/SWTProperties.java (-77 lines)
Removed Link Here
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
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
/**
16
 * Constants used to describe properties of SWT controls.
17
 * 
18
 * @since 1.0
19
 *
20
 */
21
public interface SWTProperties {
22
23
	/**
24
	 * Applies to Control
25
	 */
26
	public static final String ENABLED = "enabled"; //$NON-NLS-1$
27
	/**
28
	 * Applies to Control
29
	 */
30
	public static final String VISIBLE = "visible"; //$NON-NLS-1$
31
	/**
32
	 * Applies to Control
33
	 */
34
	public static final String TOOLTIP_TEXT = "tooltip"; //$NON-NLS-1$	
35
	/**
36
	 * Applies to
37
	 */
38
	public static final String ITEMS = "items"; //$NON-NLS-1$
39
	/**
40
	 * Applies to Spinner
41
	 */
42
	public static final String MAX = "max"; //$NON-NLS-1$
43
	/**
44
	 * Applies to Spinner
45
	 */
46
	public static final String MIN = "min"; //$NON-NLS-1$
47
	/**
48
	 * Applies to Spinner, Button
49
	 */
50
	public static final String SELECTION = "selection"; //$NON-NLS-1$
51
	/**
52
	 * Applies to Spinner, Button
53
	 */
54
	public static final String SELECTION_INDEX = "index"; //$NON-NLS-1$
55
	/**
56
	 * Applies to Text, Label, Combo
57
	 */
58
	public static final String TEXT = "text"; //$NON-NLS-1$
59
	
60
	/**
61
	 * Applies to Label, CLabel.
62
	 */
63
	public static final String IMAGE = "image"; //$NON-NLS-1$
64
	/**
65
	 * Applies to Control
66
	 */
67
	public static final String FOREGROUND = "foreground"; //$NON-NLS-1$
68
	/**
69
	 * Applies to Control
70
	 */
71
	public static final String BACKGROUND = "background"; //$NON-NLS-1$
72
	/**
73
	 * Applies to Control
74
	 */
75
	public static final String FONT = "font"; //$NON-NLS-1$
76
77
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlObservableValue.java (-106 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Matt Carter - bug 170668
12
 *     Brad Reynolds - bug 170848
13
 *******************************************************************************/
14
package org.eclipse.jface.internal.databinding.swt;
15
16
import java.util.HashMap;
17
import java.util.Map;
18
19
import org.eclipse.core.databinding.observable.Diffs;
20
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
21
import org.eclipse.swt.graphics.Color;
22
import org.eclipse.swt.graphics.Font;
23
import org.eclipse.swt.widgets.Control;
24
25
/**
26
 * @since 1.0
27
 * 
28
 */
29
public class ControlObservableValue extends AbstractSWTObservableValue {
30
31
	private final Control control;
32
33
	private final String attribute;
34
35
	private Object valueType;
36
	
37
	private static final Map SUPPORTED_ATTRIBUTES = new HashMap();
38
	static {
39
		SUPPORTED_ATTRIBUTES.put(SWTProperties.ENABLED, Boolean.TYPE);
40
		SUPPORTED_ATTRIBUTES.put(SWTProperties.VISIBLE, Boolean.TYPE);
41
		SUPPORTED_ATTRIBUTES.put(SWTProperties.TOOLTIP_TEXT, String.class);
42
		SUPPORTED_ATTRIBUTES.put(SWTProperties.FOREGROUND, Color.class);
43
		SUPPORTED_ATTRIBUTES.put(SWTProperties.BACKGROUND, Color.class);
44
		SUPPORTED_ATTRIBUTES.put(SWTProperties.FONT, Font.class);
45
	}
46
	
47
	/**
48
	 * @param control
49
	 * @param attribute
50
	 */
51
	public ControlObservableValue(Control control, String attribute) {
52
		super(control);
53
		this.control = control;
54
		this.attribute = attribute;
55
		if (SUPPORTED_ATTRIBUTES.keySet().contains(attribute)) {
56
			this.valueType = SUPPORTED_ATTRIBUTES.get(attribute); 
57
		} else {
58
			throw new IllegalArgumentException();
59
		}
60
	}
61
62
	public void doSetValue(Object value) {
63
		Object oldValue = doGetValue();
64
		if (attribute.equals(SWTProperties.ENABLED)) {
65
			control.setEnabled(((Boolean) value).booleanValue());
66
		} else if (attribute.equals(SWTProperties.VISIBLE)) {
67
			control.setVisible(((Boolean) value).booleanValue());
68
		} else if (attribute.equals(SWTProperties.TOOLTIP_TEXT)) {
69
			control.setToolTipText((String) value);
70
		} else if (attribute.equals(SWTProperties.FOREGROUND)) {
71
			control.setForeground((Color) value);
72
		} else if (attribute.equals(SWTProperties.BACKGROUND)) {
73
			control.setBackground((Color) value);
74
		} else if (attribute.equals(SWTProperties.FONT)) {
75
			control.setFont((Font) value);
76
		}
77
		fireValueChange(Diffs.createValueDiff(oldValue, value));
78
	}
79
80
	public Object doGetValue() {
81
		if (attribute.equals(SWTProperties.ENABLED)) {
82
			return control.getEnabled() ? Boolean.TRUE : Boolean.FALSE;
83
		}
84
		if (attribute.equals(SWTProperties.VISIBLE)) {
85
			return control.getVisible() ? Boolean.TRUE : Boolean.FALSE;
86
		}
87
		if (attribute.equals(SWTProperties.TOOLTIP_TEXT)) {
88
			return control.getToolTipText();			
89
		}
90
		if (attribute.equals(SWTProperties.FOREGROUND))	 {
91
			return control.getForeground();
92
		}
93
		if (attribute.equals(SWTProperties.BACKGROUND)) {
94
			return control.getBackground();
95
		}
96
		if (attribute.equals(SWTProperties.FONT)) {
97
			return control.getFont();
98
		}
99
		
100
		return null;
101
	}
102
103
	public Object getValueType() {
104
		return valueType;
105
	}
106
}
(-)src/org/eclipse/jface/internal/databinding/swt/CLabelObservableValue.java (-62 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
17
import org.eclipse.swt.custom.CLabel;
18
19
/**
20
 * @since 1.0
21
 * 
22
 */
23
public class CLabelObservableValue extends AbstractSWTObservableValue {
24
25
	private final CLabel label;
26
27
	/**
28
	 * @param label
29
	 */
30
	public CLabelObservableValue(CLabel label) {
31
		super(label);
32
		this.label = label;
33
	}
34
	
35
	/**
36
	 * @param realm
37
	 * @param label
38
	 */
39
	public CLabelObservableValue(Realm realm, CLabel label) {
40
		super(realm, label);
41
		this.label = label;
42
	}
43
44
	public void doSetValue(final Object value) {
45
		String oldValue = label.getText();
46
		String newValue = value == null ? "" : value.toString();  //$NON-NLS-1$
47
		label.setText(newValue);
48
49
		if (!newValue.equals(oldValue)) {
50
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
51
		}
52
	}
53
54
	public Object doGetValue() {
55
		return label.getText();
56
	}
57
58
	public Object getValueType() {
59
		return String.class;
60
	}
61
62
}
(-)src/org/eclipse/jface/internal/databinding/swt/SWTObservableValueDecorator.java (-1 / +1 lines)
Lines 6-12 Link Here
6
 * http://www.eclipse.org/legal/epl-v10.html
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     Matthew Hall - initial API and implementation (bug 245647)
9
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
10
 ******************************************************************************/
11
11
12
package org.eclipse.jface.internal.databinding.swt;
12
package org.eclipse.jface.internal.databinding.swt;
(-)src/org/eclipse/jface/internal/databinding/swt/SingleSelectionObservableValue.java (-103 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
17
import org.eclipse.swt.widgets.Control;
18
19
/**
20
 * @since 1.0
21
 * 
22
 */
23
abstract public class SingleSelectionObservableValue extends
24
		AbstractSWTObservableValue {
25
26
	private boolean updating = false;
27
28
	private int currentSelection;
29
30
	/**
31
	 * @param control
32
	 *            the control
33
	 */
34
	public SingleSelectionObservableValue(Control control) {
35
		super(control);
36
		init();
37
	}
38
	
39
	/**
40
	 * @param realm
41
	 * @param control
42
	 */
43
	public SingleSelectionObservableValue(Realm realm, Control control) {
44
		super(realm, control);
45
		init();
46
	}
47
	
48
	private void init() {		
49
		currentSelection = doGetSelectionIndex();
50
		doAddSelectionListener(new Runnable(){
51
			public void run() {
52
				if (!updating) {
53
					int newSelection = doGetSelectionIndex();
54
					notifyIfChanged(currentSelection, newSelection);
55
					currentSelection = newSelection;
56
				}
57
			}
58
		});
59
	}
60
61
	/**
62
	 * @param runnable
63
	 */
64
	protected abstract void doAddSelectionListener(Runnable runnable);
65
66
	public void doSetValue(Object value) {
67
		try {
68
			updating = true;
69
			int intValue = ((Integer) value).intValue();
70
			doSetSelectionIndex(intValue);
71
			notifyIfChanged(currentSelection, intValue);
72
			currentSelection = intValue;
73
		} finally {
74
			updating = false;
75
		}
76
	}
77
78
	/**
79
	 * @param intValue
80
	 *            the selection index
81
	 */
82
	protected abstract void doSetSelectionIndex(int intValue);
83
84
	public Object doGetValue() {
85
		return new Integer(doGetSelectionIndex());
86
	}
87
88
	/**
89
	 * @return the selection index
90
	 */
91
	protected abstract int doGetSelectionIndex();
92
93
	public Object getValueType() {
94
		return Integer.TYPE;
95
	}
96
97
	private void notifyIfChanged(int oldValue, int newValue) {
98
		if (oldValue != newValue) {
99
			fireValueChange(Diffs.createValueDiff(new Integer(
100
					oldValue), new Integer(newValue)));
101
		}
102
	}
103
}
(-)src/org/eclipse/jface/internal/databinding/swt/ButtonObservableValue.java (-110 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.Diffs;
16
import org.eclipse.core.databinding.observable.Realm;
17
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
18
import org.eclipse.swt.SWT;
19
import org.eclipse.swt.widgets.Button;
20
import org.eclipse.swt.widgets.Event;
21
import org.eclipse.swt.widgets.Listener;
22
23
/**
24
 * @since 1.0
25
 * 
26
 */
27
public class ButtonObservableValue extends AbstractSWTObservableValue {
28
29
	private final Button button;
30
31
	private boolean selectionValue;
32
33
	private Listener updateListener = new Listener() {
34
		public void handleEvent(Event event) {
35
			boolean oldSelectionValue = selectionValue;
36
			selectionValue = button.getSelection();
37
						
38
			notifyIfChanged(oldSelectionValue, selectionValue);
39
		}
40
	};
41
42
	/**
43
	 * @param button
44
	 */
45
	public ButtonObservableValue(Button button) {
46
		super(button);
47
		this.button = button;
48
		init();
49
	}
50
	
51
	/**
52
	 * @param realm
53
	 * @param button
54
	 */
55
	public ButtonObservableValue(Realm realm, Button button) {
56
		super(realm, button);
57
		this.button = button;
58
		init();
59
	}
60
	
61
	private void init() {
62
		button.addListener(SWT.Selection, updateListener);
63
		button.addListener(SWT.DefaultSelection, updateListener);
64
		this.selectionValue = button.getSelection();
65
	}
66
67
	public void doSetValue(final Object value) {
68
		boolean oldSelectionValue = selectionValue;
69
		selectionValue = value == null ? false : ((Boolean) value)
70
				.booleanValue();
71
		
72
		button.setSelection(selectionValue);
73
		notifyIfChanged(oldSelectionValue, selectionValue);
74
	}
75
76
	public Object doGetValue() {
77
		return button.getSelection() ? Boolean.TRUE : Boolean.FALSE;
78
	}
79
80
	public Object getValueType() {
81
		return Boolean.TYPE;
82
	}
83
	
84
	/*
85
	 * (non-Javadoc)
86
	 *
87
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
88
	 */
89
	public synchronized void dispose() {
90
		super.dispose();
91
92
		if (!button.isDisposed()) {
93
			button.removeListener(SWT.Selection, updateListener);
94
			button.removeListener(SWT.DefaultSelection, updateListener);
95
		}
96
	}
97
98
	/**
99
	 * Notifies consumers with a value change event only if a change occurred.
100
	 * 
101
	 * @param oldValue
102
	 * @param newValue
103
	 */
104
	private void notifyIfChanged(boolean oldValue, boolean newValue) {
105
		if (oldValue != newValue) {
106
			fireValueChange(Diffs.createValueDiff(oldValue ? Boolean.TRUE : Boolean.FALSE,
107
					newValue ? Boolean.TRUE : Boolean.FALSE));
108
		}		
109
	}
110
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboObservableValue.java (-155 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *     Matthew Hall - bug 118516
13
 *******************************************************************************/
14
package org.eclipse.jface.internal.databinding.swt;
15
16
import org.eclipse.core.databinding.observable.Diffs;
17
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.core.runtime.Assert;
19
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
20
import org.eclipse.swt.events.ModifyEvent;
21
import org.eclipse.swt.events.ModifyListener;
22
import org.eclipse.swt.widgets.Combo;
23
24
/**
25
 * @since 3.2
26
 * 
27
 */
28
public class ComboObservableValue extends AbstractSWTObservableValue {
29
30
	private final Combo combo;
31
	private final String attribute;
32
	private boolean updating = false;
33
	private String currentValue;
34
	private ModifyListener modifyListener;
35
36
	/**
37
	 * @param combo
38
	 * @param attribute
39
	 */
40
	public ComboObservableValue(Combo combo, String attribute) {
41
		super(combo);
42
		this.combo = combo;
43
		this.attribute = attribute;
44
		init();
45
	}
46
		
47
	/**
48
	 * @param realm
49
	 * @param combo
50
	 * @param attribute
51
	 */
52
	public ComboObservableValue(Realm realm, Combo combo, String attribute) {
53
		super(realm, combo);
54
		this.combo = combo;
55
		this.attribute = attribute;
56
		init();
57
	}
58
	
59
	private void init() {		
60
		if (attribute.equals(SWTProperties.SELECTION)
61
				|| attribute.equals(SWTProperties.TEXT)) {
62
			this.currentValue = combo.getText();
63
			modifyListener = new ModifyListener() {
64
65
				public void modifyText(ModifyEvent e) {
66
					if (!updating) {
67
						String oldValue = currentValue;
68
						currentValue = ComboObservableValue.this.combo
69
								.getText();
70
						
71
						notifyIfChanged(oldValue, currentValue);
72
					}
73
				}
74
			};
75
			combo.addModifyListener(modifyListener);
76
		} else
77
			throw new IllegalArgumentException();
78
	}
79
80
	public void doSetValue(final Object value) {
81
		String oldValue = combo.getText();
82
		try {
83
			updating = true;
84
			if (attribute.equals(SWTProperties.TEXT)) {
85
				String stringValue = value != null ? value.toString() : ""; //$NON-NLS-1$
86
				combo.setText(stringValue);
87
			} else if (attribute.equals(SWTProperties.SELECTION)) {
88
				String items[] = combo.getItems();
89
				int index = -1;
90
				if (items != null && value != null) {
91
					for (int i = 0; i < items.length; i++) {
92
						if (value.equals(items[i])) {
93
							index = i;
94
							break;
95
						}
96
					}
97
					if (index == -1) {
98
						combo.setText((String) value);
99
					} else {
100
						combo.select(index); // -1 will not "unselect"
101
					}
102
				}
103
			}
104
		} finally {
105
			updating = false;
106
			currentValue = combo.getText();
107
		}
108
		
109
		notifyIfChanged(oldValue, currentValue);
110
	}
111
112
	public Object doGetValue() {
113
		if (attribute.equals(SWTProperties.TEXT))
114
			return combo.getText();
115
116
		Assert.isTrue(attribute.equals(SWTProperties.SELECTION),
117
				"unexpected attribute: " + attribute); //$NON-NLS-1$
118
		// The problem with a ccombo, is that it changes the text and
119
		// fires before it update its selection index
120
		return combo.getText();
121
	}
122
123
	public Object getValueType() {
124
		Assert.isTrue(attribute.equals(SWTProperties.TEXT)
125
				|| attribute.equals(SWTProperties.SELECTION),
126
				"unexpected attribute: " + attribute); //$NON-NLS-1$
127
		return String.class;
128
	}
129
130
	/**
131
	 * @return attribute being observed
132
	 */
133
	public String getAttribute() {
134
		return attribute;
135
	}
136
137
	/*
138
	 * (non-Javadoc)
139
	 *
140
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
141
	 */
142
	public synchronized void dispose() {
143
		super.dispose();
144
145
		if (modifyListener != null && !combo.isDisposed()) {
146
			combo.removeModifyListener(modifyListener);
147
		}
148
	}
149
	
150
	private void notifyIfChanged(String oldValue, String newValue) {
151
		if (!oldValue.equals(newValue)) {
152
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
153
		}
154
	}
155
}
(-)src/org/eclipse/jface/internal/databinding/swt/LabelObservableValue.java (-62 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
17
import org.eclipse.swt.widgets.Label;
18
19
/**
20
 * @since 3.3
21
 * 
22
 */
23
public class LabelObservableValue extends AbstractSWTObservableValue {
24
25
	private final Label label;
26
27
	/**
28
	 * @param label
29
	 */
30
	public LabelObservableValue(Label label) {
31
		super(label);
32
		this.label = label;
33
	}
34
	
35
	/**
36
	 * @param realm
37
	 * @param label
38
	 */
39
	public LabelObservableValue(Realm realm, Label label) {
40
		super(realm, label);
41
		this.label = label;
42
	}
43
44
	public void doSetValue(final Object value) {
45
		String oldValue = label.getText();
46
		String newValue = value == null ? "" : value.toString(); //$NON-NLS-1$
47
		label.setText(newValue);
48
		
49
		if (!newValue.equals(oldValue)) {
50
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
51
		}
52
	}
53
54
	public Object doGetValue() {
55
		return label.getText();
56
	}
57
58
	public Object getValueType() {
59
		return String.class;
60
	}
61
62
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboSingleSelectionObservableValue.java (-71 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bugs 198903, 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.swt.events.SelectionEvent;
16
import org.eclipse.swt.events.SelectionListener;
17
import org.eclipse.swt.widgets.Combo;
18
19
/**
20
 * @since 1.0
21
 *
22
 */
23
public class ComboSingleSelectionObservableValue extends
24
		SingleSelectionObservableValue {
25
26
	private SelectionListener selectionListener;
27
28
	/**
29
	 * @param combo
30
	 */
31
	public ComboSingleSelectionObservableValue(Combo combo) {
32
		super(combo);
33
	}
34
35
	private Combo getCombo() {
36
		return (Combo) getWidget();
37
	}
38
39
	protected void doAddSelectionListener(final Runnable runnable) {
40
		selectionListener = new SelectionListener() {
41
			public void widgetDefaultSelected(SelectionEvent e) {
42
				runnable.run();
43
			}
44
45
			public void widgetSelected(SelectionEvent e) {
46
				runnable.run();
47
			}
48
		};
49
		getCombo().addSelectionListener(selectionListener);
50
	}
51
52
	protected int doGetSelectionIndex() {
53
		return getCombo().getSelectionIndex();
54
	}
55
56
	protected void doSetSelectionIndex(int index) {
57
		getCombo().select(index);
58
	}
59
60
	/*
61
	 * (non-Javadoc)
62
	 *
63
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
64
	 */
65
	public synchronized void dispose() {
66
		super.dispose();
67
		if (selectionListener != null && !getCombo().isDisposed()) {
68
			getCombo().removeSelectionListener(selectionListener);
69
		}
70
	}
71
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListSingleSelectionObservableValue.java (-71 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 164653
11
 *     Ashley Cambrell - bug 198904
12
 *******************************************************************************/
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.swt.events.SelectionEvent;
16
import org.eclipse.swt.events.SelectionListener;
17
import org.eclipse.swt.widgets.List;
18
19
/**
20
 * @since 1.0
21
 * 
22
 */
23
public class ListSingleSelectionObservableValue extends
24
		SingleSelectionObservableValue {
25
26
	private SelectionListener selectionListener;
27
28
	/**
29
	 * @param combo
30
	 */
31
	public ListSingleSelectionObservableValue(List combo) {
32
		super(combo);
33
	}
34
35
	private List getList() {
36
		return (List) getWidget();
37
	}
38
39
	protected void doAddSelectionListener(final Runnable runnable) {
40
		selectionListener = new SelectionListener() {
41
			public void widgetDefaultSelected(SelectionEvent e) {
42
				runnable.run();
43
			}
44
45
			public void widgetSelected(SelectionEvent e) {
46
				runnable.run();
47
			}
48
		};
49
		getList().addSelectionListener(selectionListener);
50
	}
51
52
	protected int doGetSelectionIndex() {
53
		return getList().getSelectionIndex();
54
	}
55
56
	protected void doSetSelectionIndex(int index) {
57
		getList().setSelection(index);
58
	}
59
60
	/*
61
	 * (non-Javadoc)
62
	 *
63
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
64
	 */
65
	public synchronized void dispose() {
66
		super.dispose();
67
		if (selectionListener != null && !getList().isDisposed()) {
68
			getList().removeSelectionListener(selectionListener);
69
		}
70
	}
71
}
(-)src/org/eclipse/jface/databinding/viewers/ViewersObservables.java (-41 / +91 lines)
Lines 7-32 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 206839, 124684, 239302, 245647
10
 *     Matthew Hall - bug 206839, 124684, 239302, 245647, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.jface.databinding.viewers;
13
package org.eclipse.jface.databinding.viewers;
14
14
15
import org.eclipse.core.databinding.observable.Observables;
15
import org.eclipse.core.databinding.observable.Observables;
16
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.list.IObservableList;
17
import org.eclipse.core.databinding.observable.list.IObservableList;
17
import org.eclipse.core.databinding.observable.set.IObservableSet;
18
import org.eclipse.core.databinding.observable.set.IObservableSet;
18
import org.eclipse.core.databinding.observable.value.IObservableValue;
19
import org.eclipse.core.databinding.observable.value.IObservableValue;
20
import org.eclipse.core.databinding.property.PropertyObservables;
21
import org.eclipse.core.databinding.property.list.IListProperty;
22
import org.eclipse.core.databinding.property.set.ISetProperty;
23
import org.eclipse.core.databinding.property.value.IValueProperty;
19
import org.eclipse.jface.databinding.swt.SWTObservables;
24
import org.eclipse.jface.databinding.swt.SWTObservables;
20
import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
25
import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
21
import org.eclipse.jface.internal.databinding.viewers.CheckableCheckedElementsObservableSet;
26
import org.eclipse.jface.internal.databinding.viewers.ViewerObservableListDecorator;
22
import org.eclipse.jface.internal.databinding.viewers.CheckboxViewerCheckedElementsObservableSet;
27
import org.eclipse.jface.internal.databinding.viewers.ViewerObservableSetDecorator;
23
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionObservableList;
24
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderSingleSelectionObservableValue;
25
import org.eclipse.jface.internal.databinding.viewers.ViewerFiltersObservableSet;
26
import org.eclipse.jface.internal.databinding.viewers.ViewerInputObservableValue;
27
import org.eclipse.jface.internal.databinding.viewers.ViewerMultipleSelectionObservableList;
28
import org.eclipse.jface.internal.databinding.viewers.ViewerObservableValueDecorator;
28
import org.eclipse.jface.internal.databinding.viewers.ViewerObservableValueDecorator;
29
import org.eclipse.jface.internal.databinding.viewers.ViewerSingleSelectionObservableValue;
30
import org.eclipse.jface.viewers.CheckboxTableViewer;
29
import org.eclipse.jface.viewers.CheckboxTableViewer;
31
import org.eclipse.jface.viewers.CheckboxTreeViewer;
30
import org.eclipse.jface.viewers.CheckboxTreeViewer;
32
import org.eclipse.jface.viewers.ICheckable;
31
import org.eclipse.jface.viewers.ICheckable;
Lines 42-47 Link Here
42
 * @since 1.1
41
 * @since 1.1
43
 */
42
 */
44
public class ViewersObservables {
43
public class ViewersObservables {
44
	private static Realm getDefaultRealm() {
45
		return SWTObservables.getRealm(Display.getDefault());
46
	}
47
48
	private static Realm getRealm(Viewer viewer) {
49
		return SWTObservables.getRealm(viewer.getControl().getDisplay());
50
	}
51
52
	private static void checkNull(Object obj) {
53
		if (obj == null)
54
			throw new IllegalArgumentException();
55
	}
56
57
	private static IObservableValue observeProperty(Object source,
58
			IValueProperty property) {
59
		checkNull(source);
60
		if (source instanceof Viewer) {
61
			return observeViewerProperty((Viewer) source, property);
62
		}
63
		return PropertyObservables.observeValue(getDefaultRealm(), source,
64
				property);
65
	}
66
67
	private static IViewerObservableValue observeViewerProperty(Viewer viewer,
68
			IValueProperty property) {
69
		checkNull(viewer);
70
		return new ViewerObservableValueDecorator(PropertyObservables
71
				.observeValue(getRealm(viewer), viewer, property), viewer);
72
	}
73
74
	private static IObservableSet observeProperty(Object source,
75
			ISetProperty property) {
76
		checkNull(source);
77
		if (source instanceof Viewer) {
78
			return observeViewerProperty((Viewer) source, property);
79
		}
80
		return PropertyObservables.observeSet(getDefaultRealm(), source,
81
				property);
82
	}
83
84
	private static IViewerObservableSet observeViewerProperty(Viewer viewer,
85
			ISetProperty property) {
86
		checkNull(viewer);
87
		return new ViewerObservableSetDecorator(PropertyObservables.observeSet(
88
				getRealm(viewer), viewer, property), viewer);
89
	}
90
91
	private static IObservableList observeProperty(Object source,
92
			IListProperty property) {
93
		checkNull(source);
94
		if (source instanceof Viewer) {
95
			return observeViewerProperty((Viewer) source, property);
96
		}
97
		Realm realm = getDefaultRealm();
98
		return PropertyObservables.observeList(realm, source, property);
99
	}
100
101
	private static IViewerObservableList observeViewerProperty(Viewer viewer,
102
			IListProperty property) {
103
		checkNull(viewer);
104
		Realm realm = getRealm(viewer);
105
		return new ViewerObservableListDecorator(PropertyObservables
106
				.observeList(realm, viewer, property), viewer);
107
	}
108
45
	/**
109
	/**
46
	 * Returns an observable which delays notification of value change events
110
	 * Returns an observable which delays notification of value change events
47
	 * from <code>observable</code> until <code>delay</code> milliseconds have
111
	 * from <code>observable</code> until <code>delay</code> milliseconds have
Lines 85-96 Link Here
85
	 */
149
	 */
86
	public static IObservableValue observeSingleSelection(
150
	public static IObservableValue observeSingleSelection(
87
			ISelectionProvider selectionProvider) {
151
			ISelectionProvider selectionProvider) {
88
		if (selectionProvider instanceof Viewer) {
152
		return observeProperty(selectionProvider, SelectionProviderProperties
89
			return observeSingleSelection((Viewer) selectionProvider);
153
				.singleSelection());
90
		}
91
		return new SelectionProviderSingleSelectionObservableValue(
92
				SWTObservables.getRealm(Display.getDefault()),
93
				selectionProvider);
94
	}
154
	}
95
155
96
	/**
156
	/**
Lines 114-125 Link Here
114
	 */
174
	 */
115
	public static IObservableList observeMultiSelection(
175
	public static IObservableList observeMultiSelection(
116
			ISelectionProvider selectionProvider) {
176
			ISelectionProvider selectionProvider) {
117
		if (selectionProvider instanceof Viewer) {
177
		return observeProperty(selectionProvider, SelectionProviderProperties
118
			return observeMultiSelection((Viewer) selectionProvider);
178
				.multipleSelection());
119
		}
120
		return new SelectionProviderMultipleSelectionObservableList(
121
				SWTObservables.getRealm(Display.getDefault()),
122
				selectionProvider, Object.class);
123
	}
179
	}
124
180
125
	/**
181
	/**
Lines 136-144 Link Here
136
	 * @since 1.2
192
	 * @since 1.2
137
	 */
193
	 */
138
	public static IViewerObservableValue observeSingleSelection(Viewer viewer) {
194
	public static IViewerObservableValue observeSingleSelection(Viewer viewer) {
139
		return new ViewerSingleSelectionObservableValue(
195
		return observeViewerProperty(viewer, SelectionProviderProperties
140
				SWTObservables.getRealm(Display.getDefault()),
196
				.singleSelection());
141
				viewer);
142
	}
197
	}
143
	
198
	
144
	/**
199
	/**
Lines 160-170 Link Here
160
	 * 
215
	 * 
161
	 * @since 1.2
216
	 * @since 1.2
162
	 */
217
	 */
163
	public static IViewerObservableList observeMultiSelection(
218
	public static IViewerObservableList observeMultiSelection(Viewer viewer) {
164
			Viewer viewer) {
219
		return observeViewerProperty(viewer, SelectionProviderProperties
165
		return new ViewerMultipleSelectionObservableList(
220
				.multipleSelection());
166
				SWTObservables.getRealm(Display.getDefault()),
167
				viewer, Object.class);
168
	}
221
	}
169
	
222
	
170
	/**
223
	/**
Lines 179-186 Link Here
179
	 * @since 1.2
232
	 * @since 1.2
180
	 */
233
	 */
181
	public static IObservableValue observeInput(Viewer viewer) {
234
	public static IObservableValue observeInput(Viewer viewer) {
182
		return new ViewerInputObservableValue(SWTObservables.getRealm(viewer
235
		return observeViewerProperty(viewer, ViewerProperties.input());
183
				.getControl().getDisplay()), viewer);
184
	}
236
	}
185
237
186
	/**
238
	/**
Lines 205-212 Link Here
205
			return observeCheckedElements((CheckboxTreeViewer) checkable,
257
			return observeCheckedElements((CheckboxTreeViewer) checkable,
206
					elementType);
258
					elementType);
207
		}
259
		}
208
		return new CheckableCheckedElementsObservableSet(SWTObservables
260
		return observeProperty(checkable, CheckableProperties
209
				.getRealm(Display.getDefault()), checkable, elementType);
261
				.checkedElements(elementType));
210
	}
262
	}
211
263
212
	/**
264
	/**
Lines 224-232 Link Here
224
	 */
276
	 */
225
	public static IViewerObservableSet observeCheckedElements(
277
	public static IViewerObservableSet observeCheckedElements(
226
			CheckboxTableViewer viewer, Object elementType) {
278
			CheckboxTableViewer viewer, Object elementType) {
227
		return new CheckboxViewerCheckedElementsObservableSet(SWTObservables
279
		return observeViewerProperty(viewer, CheckboxTableViewerProperties
228
				.getRealm(viewer.getControl().getDisplay()), viewer,
280
				.checkedElements(elementType));
229
				elementType);
230
	}
281
	}
231
282
232
	/**
283
	/**
Lines 244-252 Link Here
244
	 */
295
	 */
245
	public static IViewerObservableSet observeCheckedElements(
296
	public static IViewerObservableSet observeCheckedElements(
246
			CheckboxTreeViewer viewer, Object elementType) {
297
			CheckboxTreeViewer viewer, Object elementType) {
247
		return new CheckboxViewerCheckedElementsObservableSet(SWTObservables
298
		return observeViewerProperty(viewer, CheckboxTreeViewerProperties
248
				.getRealm(viewer.getControl().getDisplay()), viewer,
299
				.checkedElements(elementType));
249
				elementType);
250
	}
300
	}
251
301
252
	/**
302
	/**
Lines 267-273 Link Here
267
	 * @since 1.3
317
	 * @since 1.3
268
	 */
318
	 */
269
	public static IViewerObservableSet observeFilters(StructuredViewer viewer) {
319
	public static IViewerObservableSet observeFilters(StructuredViewer viewer) {
270
		return new ViewerFiltersObservableSet(SWTObservables.getRealm(viewer
320
		return observeViewerProperty(viewer, StructuredViewerProperties
271
				.getControl().getDisplay()), viewer);
321
				.filters());
272
	}
322
	}
273
}
323
}
(-)src/org/eclipse/jface/internal/databinding/internal/swt/LinkObservableValue.java (-47 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Michael Krauter, Catuno GmbH 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
 *     Michael Krauter, Catuno GmbH - initial API and implementation (bug 180223)
10
 *******************************************************************************/
11
package org.eclipse.jface.internal.databinding.internal.swt;
12
13
import org.eclipse.core.databinding.observable.Diffs;
14
import org.eclipse.jface.internal.databinding.provisional.swt.AbstractSWTObservableValue;
15
import org.eclipse.swt.widgets.Link;
16
17
/**
18
 * @since 1.2
19
 * 
20
 */
21
public class LinkObservableValue extends AbstractSWTObservableValue {
22
23
	private final Link link;
24
25
	/**
26
	 * @param link
27
	 */
28
	public LinkObservableValue(Link link) {
29
		super(link);
30
		this.link = link;
31
	}
32
33
	public void doSetValue(final Object value) {
34
		String oldValue = link.getText();
35
		link.setText(value == null ? "" : value.toString()); //$NON-NLS-1$
36
		fireValueChange(Diffs.createValueDiff(oldValue, link.getText()));
37
	}
38
39
	public Object doGetValue() {
40
		return link.getText();
41
	}
42
43
	public Object getValueType() {
44
		return String.class;
45
	}
46
47
}
(-)src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionObservableList.java (-111 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 Peter Centgraf 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
 *     Peter Centgraf - initial API and implementation, bug 124683
10
 *     Boris Bokowski, IBM Corporation - initial API and implementation
11
 *******************************************************************************/
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.ArrayList;
15
import java.util.Collections;
16
import java.util.List;
17
18
import org.eclipse.core.databinding.observable.Diffs;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.list.ListDiff;
21
import org.eclipse.core.databinding.observable.list.WritableList;
22
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.ISelectionChangedListener;
24
import org.eclipse.jface.viewers.ISelectionProvider;
25
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.SelectionChangedEvent;
27
import org.eclipse.jface.viewers.StructuredSelection;
28
29
/**
30
 * Observes multiple-selection of an {@link ISelectionProvider}.
31
 * 
32
 * @since 1.2
33
 */
34
public class SelectionProviderMultipleSelectionObservableList extends
35
		WritableList {
36
37
	protected ISelectionProvider selectionProvider;
38
	protected boolean handlingSelection;
39
	protected boolean updating;
40
	protected SelectionListener selectionListener = new SelectionListener();
41
42
	class SelectionListener implements ISelectionChangedListener {
43
		public void selectionChanged(SelectionChangedEvent event) {
44
			if (updating) {
45
				return;
46
			}
47
			handlingSelection = true;
48
			try {
49
				updateWrappedList(new ArrayList(getSelectionList(event.getSelection())));
50
			} finally {
51
				handlingSelection = false;
52
			}
53
		}
54
	}
55
56
	/**
57
	 * Create a new observable list based on the current selection of the given
58
	 * selection provider. Assumes that the selection provider provides
59
	 * structured selections.
60
	 * 
61
	 * @param realm
62
	 * @param selectionProvider
63
	 * @param elementType
64
	 */
65
	public SelectionProviderMultipleSelectionObservableList(Realm realm,
66
			ISelectionProvider selectionProvider, Object elementType) {
67
		super(realm, new ArrayList(getSelectionList(selectionProvider)), elementType);
68
		this.selectionProvider = selectionProvider;
69
		selectionProvider.addSelectionChangedListener(selectionListener);
70
	}
71
72
	protected void fireListChange(ListDiff diff) {
73
		if (handlingSelection) {
74
			super.fireListChange(diff);
75
		} else {
76
			// this is a bit of a hack - we are changing the diff to match the order
77
			// of elements returned by the selection provider after we've set the
78
			// selection.
79
			updating = true;
80
			try {
81
				List oldList = getSelectionList(selectionProvider);
82
				selectionProvider
83
						.setSelection(new StructuredSelection(wrappedList));
84
				wrappedList = new ArrayList(getSelectionList(selectionProvider));
85
				super.fireListChange(Diffs.computeListDiff(oldList, wrappedList));
86
			} finally {
87
				updating = false;
88
			}
89
		}
90
	}
91
92
	protected static List getSelectionList(ISelectionProvider selectionProvider) {
93
		if (selectionProvider == null) {
94
			throw new IllegalArgumentException();
95
		}
96
		return getSelectionList(selectionProvider.getSelection());
97
	}
98
99
	protected static List getSelectionList(ISelection sel) {
100
		if (sel instanceof IStructuredSelection) {
101
			return ((IStructuredSelection) sel).toList();
102
		}
103
		return Collections.EMPTY_LIST;
104
	}
105
106
	public synchronized void dispose() {
107
		selectionProvider.removeSelectionChangedListener(selectionListener);
108
		selectionProvider = null;
109
		super.dispose();
110
	}
111
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerMultipleSelectionObservableList.java (-47 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 137877
11
 *     Brad Reynolds - bug 164653
12
 *     Brad Reynolds - bug 147515
13
 *     Ashley Cambrell - bug 198906
14
 *******************************************************************************/
15
16
package org.eclipse.jface.internal.databinding.viewers;
17
18
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.jface.databinding.viewers.IViewerObservableList;
20
import org.eclipse.jface.viewers.Viewer;
21
22
/**
23
 * Observes single selection of a <code>Viewer</code>.
24
 * 
25
 * @since 1.2
26
 */
27
public class ViewerMultipleSelectionObservableList extends
28
		SelectionProviderMultipleSelectionObservableList implements
29
		IViewerObservableList {
30
31
	private Viewer viewer;
32
33
	/**
34
	 * @param realm
35
	 * @param viewer
36
	 * @param elementType
37
	 */
38
	public ViewerMultipleSelectionObservableList(Realm realm, Viewer viewer,
39
			Object elementType) {
40
		super(realm, viewer, elementType);
41
		this.viewer = viewer;
42
	}
43
44
	public Viewer getViewer() {
45
		return viewer;
46
	}
47
}
(-)src/org/eclipse/jface/internal/databinding/viewers/CheckboxViewerCheckedElementsObservableSet.java (-90 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 124684)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Arrays;
15
import java.util.Set;
16
17
import org.eclipse.core.databinding.observable.Realm;
18
import org.eclipse.jface.databinding.viewers.IViewerObservableSet;
19
import org.eclipse.jface.viewers.CheckboxTableViewer;
20
import org.eclipse.jface.viewers.CheckboxTreeViewer;
21
import org.eclipse.jface.viewers.StructuredViewer;
22
import org.eclipse.jface.viewers.Viewer;
23
24
/**
25
 * An observable set that tracks the checked elements in a CheckboxTableViewer
26
 * or CheckboxTreeViewer
27
 * 
28
 * @since 1.2
29
 */
30
public class CheckboxViewerCheckedElementsObservableSet extends
31
		CheckableCheckedElementsObservableSet implements IViewerObservableSet {
32
	private StructuredViewer viewer;
33
34
	/**
35
	 * Constructs a new instance on the given realm and checkable.
36
	 * 
37
	 * @param realm
38
	 *            the observable's realm
39
	 * @param viewer
40
	 *            the CheckboxTableViewer viewer to track.
41
	 * @param elementType
42
	 *            type of elements in the set
43
	 */
44
	public CheckboxViewerCheckedElementsObservableSet(Realm realm,
45
			CheckboxTableViewer viewer, Object elementType) {
46
		super(realm, viewer, elementType, createElementSet(viewer));
47
		this.viewer = viewer;
48
	}
49
50
	/**
51
	 * Constructs a new instance on the given realm and checkable.
52
	 * 
53
	 * @param realm
54
	 *            the observable's realm
55
	 * @param viewer
56
	 *            the CheckboxTreeViewer viewer to track.
57
	 * @param elementType
58
	 *            type of elements in the set
59
	 */
60
	public CheckboxViewerCheckedElementsObservableSet(Realm realm,
61
			CheckboxTreeViewer viewer, Object elementType) {
62
		super(realm, viewer, elementType, createElementSet(viewer));
63
		this.viewer = viewer;
64
	}
65
66
	Set createDiffSet() {
67
		return ViewerElementSet.withComparer(viewer.getComparer());
68
	}
69
70
	private static Set createElementSet(CheckboxTableViewer viewer) {
71
		Set set = ViewerElementSet.withComparer(viewer.getComparer());
72
		set.addAll(Arrays.asList(viewer.getCheckedElements()));
73
		return set;
74
	}
75
76
	private static Set createElementSet(CheckboxTreeViewer viewer) {
77
		Set set = ViewerElementSet.withComparer(viewer.getComparer());
78
		set.addAll(Arrays.asList(viewer.getCheckedElements()));
79
		return set;
80
	}
81
82
	public Viewer getViewer() {
83
		return viewer;
84
	}
85
86
	public synchronized void dispose() {
87
		viewer = null;
88
		super.dispose();
89
	}
90
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerFiltersObservableSet.java (-174 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2005, 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 239302)
10
 *******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Arrays;
15
import java.util.Collection;
16
import java.util.Collections;
17
import java.util.HashSet;
18
import java.util.Iterator;
19
import java.util.Set;
20
21
import org.eclipse.core.databinding.observable.Diffs;
22
import org.eclipse.core.databinding.observable.Realm;
23
import org.eclipse.core.databinding.observable.set.ObservableSet;
24
import org.eclipse.jface.databinding.viewers.IViewerObservableSet;
25
import org.eclipse.jface.viewers.StructuredViewer;
26
import org.eclipse.jface.viewers.Viewer;
27
import org.eclipse.jface.viewers.ViewerFilter;
28
29
/**
30
 * An observable set that tracks the filters of the given viewer. Note that this
31
 * set will not track changes that are made using direct API on StructuredViewer
32
 * (by calling
33
 * {@link StructuredViewer#addFilter(org.eclipse.jface.viewers.ViewerFilter)
34
 * addFilter()},
35
 * {@link StructuredViewer#removeFilter(org.eclipse.jface.viewers.ViewerFilter)
36
 * removeFilter()}, or
37
 * {@link StructuredViewer#setFilters(org.eclipse.jface.viewers.ViewerFilter[])
38
 * setFilters()}) -- it is assumed that filters are only changed through the
39
 * set.
40
 * 
41
 * @since 1.2
42
 */
43
public class ViewerFiltersObservableSet extends ObservableSet implements
44
		IViewerObservableSet {
45
46
	private StructuredViewer viewer;
47
48
	/**
49
	 * @param realm
50
	 * @param viewer
51
	 */
52
	public ViewerFiltersObservableSet(Realm realm, StructuredViewer viewer) {
53
		super(realm, new HashSet(Arrays.asList(viewer.getFilters())),
54
				ViewerFilter.class);
55
		this.viewer = viewer;
56
	}
57
58
	public Viewer getViewer() {
59
		return viewer;
60
	}
61
62
	private void replaceFilters() {
63
		viewer.getControl().setRedraw(false);
64
		try {
65
			viewer.setFilters((ViewerFilter[]) wrappedSet
66
					.toArray(new ViewerFilter[wrappedSet.size()]));
67
		} finally {
68
			viewer.getControl().setRedraw(true);
69
		}
70
	}
71
72
	private void addFilter(ViewerFilter filter) {
73
		viewer.getControl().setRedraw(false);
74
		try {
75
			viewer.addFilter(filter);
76
		} finally {
77
			viewer.getControl().setRedraw(true);
78
		}
79
	}
80
81
	private void removeFilter(ViewerFilter filter) {
82
		viewer.getControl().setRedraw(false);
83
		try {
84
			viewer.removeFilter(filter);
85
		} finally {
86
			viewer.getControl().setRedraw(true);
87
		}
88
	}
89
90
	public boolean add(Object element) {
91
		checkRealm();
92
		boolean added = wrappedSet.add(element);
93
		if (added) {
94
			addFilter((ViewerFilter) element);
95
			fireSetChange(Diffs.createSetDiff(Collections.singleton(element),
96
					Collections.EMPTY_SET));
97
		}
98
		return added;
99
	}
100
101
	public boolean addAll(Collection c) {
102
		getterCalled();
103
		Set additions = new HashSet();
104
		Iterator it = c.iterator();
105
		while (it.hasNext()) {
106
			Object element = it.next();
107
			if (wrappedSet.add(element)) {
108
				additions.add(element);
109
			}
110
		}
111
		if (additions.size() > 0) {
112
			replaceFilters();
113
			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
114
			return true;
115
		}
116
		return false;
117
	}
118
119
	public void clear() {
120
		getterCalled();
121
		Set removes = new HashSet(wrappedSet);
122
		wrappedSet.clear();
123
		replaceFilters();
124
		fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
125
	}
126
127
	public boolean remove(Object o) {
128
		getterCalled();
129
		boolean removed = wrappedSet.remove(o);
130
		if (removed) {
131
			removeFilter((ViewerFilter) o);
132
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
133
					Collections.singleton(o)));
134
		}
135
		return removed;
136
	}
137
138
	public boolean removeAll(Collection c) {
139
		getterCalled();
140
		Set removes = new HashSet();
141
		Iterator it = c.iterator();
142
		while (it.hasNext()) {
143
			Object element = it.next();
144
			if (wrappedSet.remove(element)) {
145
				removes.add(element);
146
			}
147
		}
148
		if (removes.size() > 0) {
149
			replaceFilters();
150
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
151
			return true;
152
		}
153
		return false;
154
	}
155
156
	public boolean retainAll(Collection c) {
157
		getterCalled();
158
		Set removes = new HashSet();
159
		Iterator it = wrappedSet.iterator();
160
		while (it.hasNext()) {
161
			Object element = it.next();
162
			if (!c.contains(element)) {
163
				it.remove();
164
				removes.add(element);
165
			}
166
		}
167
		if (removes.size() > 0) {
168
			replaceFilters();
169
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removes));
170
			return true;
171
		}
172
		return false;
173
	}
174
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerSingleSelectionObservableValue.java (-45 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 137877
11
 *     Brad Reynolds - bug 164653
12
 *     Brad Reynolds - bug 147515
13
 *     Ashley Cambrell - bug 198906
14
 *******************************************************************************/
15
16
package org.eclipse.jface.internal.databinding.viewers;
17
18
import org.eclipse.core.databinding.observable.Realm;
19
import org.eclipse.jface.databinding.viewers.IViewerObservableValue;
20
import org.eclipse.jface.viewers.Viewer;
21
22
/**
23
 * Observes single selection of a <code>Viewer</code>.
24
 * 
25
 * @since 1.2
26
 */
27
public class ViewerSingleSelectionObservableValue extends
28
		SelectionProviderSingleSelectionObservableValue implements
29
		IViewerObservableValue {
30
31
	private Viewer viewer;
32
33
	/**
34
	 * @param realm
35
	 * @param viewer
36
	 */
37
	public ViewerSingleSelectionObservableValue(Realm realm, Viewer viewer) {
38
		super(realm, viewer);
39
		this.viewer = viewer;
40
	}
41
42
	public Viewer getViewer() {
43
		return viewer;
44
	}
45
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerInputObservableValue.java (-73 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 206839)
10
 *******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
17
import org.eclipse.jface.util.Util;
18
import org.eclipse.jface.viewers.Viewer;
19
20
/**
21
 * Observes the input of a <code>Viewer</code>.
22
 * <p>
23
 * This observer is blind to changes in the viewer's input unless its
24
 * {@link #setValue(Object)} method is called directly.
25
 * 
26
 * @since 1.2
27
 */
28
public class ViewerInputObservableValue extends AbstractObservableValue {
29
30
  private final Viewer viewer;
31
32
  /**
33
   * Constructs a new instance associated with the provided <code>viewer</code>.
34
   * 
35
   * @param realm
36
   * @param viewer
37
   */
38
  public ViewerInputObservableValue( Realm realm, Viewer viewer ) {
39
    super( realm );
40
    if ( viewer == null ) {
41
      throw new IllegalArgumentException( "The 'viewer' parameter is null." ); //$NON-NLS-1$
42
    }
43
44
    this.viewer = viewer;
45
  }
46
47
  /**
48
   * Sets the input to the provided <code>value</code>. Value change events are
49
   * fired after input is set in the viewer.
50
   * 
51
   * @param value object to set as input
52
   */
53
  protected void doSetValue( final Object value ) {
54
    Object oldValue = doGetValue();
55
    viewer.setInput( value );
56
    if ( !Util.equals( oldValue, value ) ) {
57
      fireValueChange( Diffs.createValueDiff( oldValue, value ) );
58
    }
59
  }
60
61
  /**
62
   * Retrieves the current input.
63
   * 
64
   * @return the current input
65
   */
66
  protected Object doGetValue() {
67
    return viewer.getInput();
68
  }
69
70
  public Object getValueType() {
71
    return null;
72
  }
73
}
(-)src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderSingleSelectionObservableValue.java (-147 lines)
Removed Link Here
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
 *     Brad Reynolds - bug 137877
11
 *     Brad Reynolds - bug 164653
12
 *     Brad Reynolds - bug 147515
13
 *     Ashley Cambrell - bug 198906
14
 *******************************************************************************/
15
16
package org.eclipse.jface.internal.databinding.viewers;
17
18
import org.eclipse.core.databinding.observable.Diffs;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
21
import org.eclipse.jface.util.Util;
22
import org.eclipse.jface.viewers.ISelection;
23
import org.eclipse.jface.viewers.ISelectionChangedListener;
24
import org.eclipse.jface.viewers.ISelectionProvider;
25
import org.eclipse.jface.viewers.IStructuredSelection;
26
import org.eclipse.jface.viewers.SelectionChangedEvent;
27
import org.eclipse.jface.viewers.StructuredSelection;
28
29
/**
30
 * Observes single selection of an <code>ISelectionProvider</code>.
31
 *
32
 * @since 1.1
33
 */
34
public class SelectionProviderSingleSelectionObservableValue extends
35
		AbstractObservableValue {
36
37
	private final ISelectionProvider selectionProvider;
38
39
	private boolean updating = false;
40
41
	private Object currentSelection;
42
43
	private ISelectionChangedListener selectionChangedListener;
44
45
	/**
46
	 * Constructs a new instance associated with the provided
47
	 * <code>selectionProvider</code>. In order to initialize itself properly
48
	 * the constructor invokes {@link #doGetValue()}. This could be dangerous
49
	 * for subclasses, see {@link #doGetValue()} for an explanation.
50
	 *
51
	 * @param realm
52
	 *
53
	 * @param selectionProvider
54
	 * @see #doGetValue()
55
	 */
56
	public SelectionProviderSingleSelectionObservableValue(Realm realm,
57
			ISelectionProvider selectionProvider) {
58
		super(realm);
59
		if (selectionProvider == null) {
60
			throw new IllegalArgumentException(
61
					"The 'selectionProvider' parameter is null."); //$NON-NLS-1$
62
		}
63
64
		this.selectionProvider = selectionProvider;
65
		this.currentSelection = doGetValue();
66
67
		selectionChangedListener = new ISelectionChangedListener() {
68
			public void selectionChanged(SelectionChangedEvent event) {
69
				if (!updating) {
70
					Object oldSelection = currentSelection;
71
					currentSelection = doGetValue();
72
					fireValueChange(Diffs.createValueDiff(oldSelection,
73
							currentSelection));
74
				}
75
			}
76
		};
77
		selectionProvider.addSelectionChangedListener(selectionChangedListener);
78
	}
79
80
	/**
81
	 * Sets the selection to the provided <code>value</code>. Value change
82
	 * events are fired after selection is set in the selection provider.
83
	 *
84
	 * @param value
85
	 *            object to set as selected, <code>null</code> if wanting to
86
	 *            remove selection
87
	 */
88
	public void doSetValue(final Object value) {
89
		try {
90
			updating = true;
91
92
			Object oldSelection = currentSelection;
93
			selectionProvider
94
					.setSelection(value == null ? StructuredSelection.EMPTY
95
							: new StructuredSelection(value));
96
			currentSelection = doGetValue();
97
			if (!Util.equals(oldSelection, currentSelection)) {
98
				fireValueChange(Diffs.createValueDiff(oldSelection,
99
						currentSelection));
100
			}
101
		} finally {
102
			updating = false;
103
		}
104
	}
105
106
	/**
107
	 * Retrieves the current selection.
108
	 * <p>
109
	 * If a subclass overrides this method it must not depend upon the subclass
110
	 * to have been fully initialized before this method is invoked.
111
	 * <code>doGetValue()</code> is invoked by the
112
	 * {@link #SelectionProviderSingleSelectionObservableValue(Realm, ISelectionProvider) constructor}
113
	 * which means the subclass's constructor will not have fully executed
114
	 * before this method is invoked.
115
	 * </p>
116
	 *
117
	 * @return selection will be an instance of
118
	 *         <code>IStructuredSelection</code> if a selection exists,
119
	 *         <code>null</code> if no selection
120
	 * @see #SelectionProviderSingleSelectionObservableValue(Realm,
121
	 *      ISelectionProvider)
122
	 */
123
	protected Object doGetValue() {
124
		ISelection selection = selectionProvider.getSelection();
125
		if (selection instanceof IStructuredSelection) {
126
			IStructuredSelection sel = (IStructuredSelection) selection;
127
			return sel.getFirstElement();
128
		}
129
130
		return null;
131
	}
132
133
	public Object getValueType() {
134
		return null;
135
	}
136
137
	/*
138
	 * (non-Javadoc)
139
	 *
140
	 * @see org.eclipse.core.databinding.observable.value.AbstractObservableValue#dispose()
141
	 */
142
	public synchronized void dispose() {
143
		selectionProvider
144
				.removeSelectionChangedListener(selectionChangedListener);
145
		super.dispose();
146
	}
147
}
(-)src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsObservableSet.java (-219 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 124684)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Collection;
15
import java.util.Collections;
16
import java.util.HashSet;
17
import java.util.Iterator;
18
import java.util.Set;
19
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.Realm;
22
import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
23
import org.eclipse.core.runtime.Assert;
24
import org.eclipse.jface.viewers.CheckStateChangedEvent;
25
import org.eclipse.jface.viewers.ICheckStateListener;
26
import org.eclipse.jface.viewers.ICheckable;
27
28
/**
29
 * 
30
 * @since 1.2
31
 */
32
public class CheckableCheckedElementsObservableSet extends
33
		AbstractObservableSet {
34
	private ICheckable checkable;
35
	private Set wrappedSet;
36
	private Object elementType;
37
	private ICheckStateListener listener;
38
39
	/**
40
	 * Constructs a new instance on the given realm and checkable.
41
	 * 
42
	 * @param realm
43
	 *            the observable's realm
44
	 * @param checkable
45
	 *            the ICheckable to track
46
	 * @param elementType
47
	 *            type of elements in the set
48
	 */
49
	public CheckableCheckedElementsObservableSet(Realm realm,
50
			ICheckable checkable, Object elementType) {
51
		this(realm, checkable, elementType, new HashSet());
52
	}
53
54
	/**
55
	 * Constructs a new instance of the given realm, and checkable,
56
	 * 
57
	 * @param realm
58
	 *            the observable's realm
59
	 * @param checkable
60
	 *            the ICheckable to track
61
	 * @param elementType
62
	 *            type of elements in the set
63
	 * @param wrappedSet
64
	 *            the set being wrapped
65
	 */
66
	public CheckableCheckedElementsObservableSet(Realm realm,
67
			ICheckable checkable, Object elementType, final Set wrappedSet) {
68
		super(realm);
69
		Assert.isNotNull(checkable, "Checkable cannot be null"); //$NON-NLS-1$
70
		Assert.isNotNull(wrappedSet, "Wrapped set cannot be null"); //$NON-NLS-1$
71
		this.checkable = checkable;
72
		this.wrappedSet = wrappedSet;
73
		this.elementType = elementType;
74
75
		listener = new ICheckStateListener() {
76
			public void checkStateChanged(CheckStateChangedEvent event) {
77
				Object element = event.getElement();
78
				if (event.getChecked()) {
79
					if (wrappedSet.add(element))
80
						fireSetChange(Diffs.createSetDiff(Collections
81
								.singleton(element), Collections.EMPTY_SET));
82
				} else {
83
					if (wrappedSet.remove(element))
84
						fireSetChange(Diffs.createSetDiff(
85
								Collections.EMPTY_SET, Collections
86
										.singleton(element)));
87
				}
88
			}
89
		};
90
		checkable.addCheckStateListener(listener);
91
	}
92
93
	protected Set getWrappedSet() {
94
		return wrappedSet;
95
	}
96
97
	Set createDiffSet() {
98
		return new HashSet();
99
	}
100
101
	public Object getElementType() {
102
		return elementType;
103
	}
104
105
	public boolean add(Object o) {
106
		getterCalled();
107
		boolean added = wrappedSet.add(o);
108
		if (added) {
109
			checkable.setChecked(o, true);
110
			fireSetChange(Diffs.createSetDiff(Collections.singleton(o),
111
					Collections.EMPTY_SET));
112
		}
113
		return added;
114
	}
115
116
	public boolean remove(Object o) {
117
		getterCalled();
118
		boolean removed = wrappedSet.remove(o);
119
		if (removed) {
120
			checkable.setChecked(o, false);
121
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
122
					Collections.singleton(o)));
123
		}
124
		return removed;
125
	}
126
127
	public boolean addAll(Collection c) {
128
		getterCalled();
129
		Set additions = createDiffSet();
130
		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
131
			Object element = iterator.next();
132
			if (wrappedSet.add(element)) {
133
				checkable.setChecked(element, true);
134
				additions.add(element);
135
			}
136
		}
137
		boolean changed = !additions.isEmpty();
138
		if (changed)
139
			fireSetChange(Diffs.createSetDiff(additions, Collections.EMPTY_SET));
140
		return changed;
141
	}
142
143
	public boolean removeAll(Collection c) {
144
		getterCalled();
145
		Set removals = createDiffSet();
146
		for (Iterator iterator = c.iterator(); iterator.hasNext();) {
147
			Object element = iterator.next();
148
			if (wrappedSet.remove(element)) {
149
				checkable.setChecked(element, false);
150
				removals.add(element);
151
			}
152
		}
153
		boolean changed = !removals.isEmpty();
154
		if (changed)
155
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
156
		return changed;
157
	}
158
159
	public boolean retainAll(Collection c) {
160
		getterCalled();
161
162
		// To ensure that elements are compared correctly, e.g. ViewerElementSet
163
		Set toRetain = createDiffSet();
164
		toRetain.addAll(c);
165
166
		Set removals = createDiffSet();
167
		for (Iterator iterator = wrappedSet.iterator(); iterator.hasNext();) {
168
			Object element = iterator.next();
169
			if (!toRetain.contains(element)) {
170
				iterator.remove();
171
				checkable.setChecked(element, false);
172
				removals.add(element);
173
			}
174
		}
175
		boolean changed = !removals.isEmpty();
176
		if (changed)
177
			fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET, removals));
178
		return changed;
179
	}
180
181
	public void clear() {
182
		removeAll(wrappedSet);
183
	}
184
185
	public Iterator iterator() {
186
		getterCalled();
187
		final Iterator wrappedIterator = wrappedSet.iterator();
188
		return new Iterator() {
189
			private Object last = null;
190
191
			public boolean hasNext() {
192
				getterCalled();
193
				return wrappedIterator.hasNext();
194
			}
195
196
			public Object next() {
197
				getterCalled();
198
				return last = wrappedIterator.next();
199
			}
200
201
			public void remove() {
202
				getterCalled();
203
				wrappedIterator.remove();
204
				checkable.setChecked(last, false);
205
				fireSetChange(Diffs.createSetDiff(Collections.EMPTY_SET,
206
						Collections.singleton(last)));
207
			}
208
		};
209
	}
210
211
	public synchronized void dispose() {
212
		if (checkable != null) {
213
			checkable.removeCheckStateListener(listener);
214
			checkable = null;
215
			listener = null;
216
		}
217
		super.dispose();
218
	}
219
}
(-)src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTObservableValue.java (-69 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 The Pampered Chef, Inc. 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
 *     The Pampered Chef, Inc. - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.provisional.swt;
13
14
import org.eclipse.core.databinding.observable.Realm;
15
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
16
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
17
import org.eclipse.jface.databinding.swt.SWTObservables;
18
import org.eclipse.swt.events.DisposeEvent;
19
import org.eclipse.swt.events.DisposeListener;
20
import org.eclipse.swt.widgets.Widget;
21
22
/**
23
 * NON-API - An abstract superclass for observable values that gurantees that the 
24
 * observable will be disposed when the control to which it is attached is
25
 * disposed.
26
 * 
27
 * @since 1.1
28
 */
29
public abstract class AbstractSWTObservableValue extends AbstractObservableValue implements ISWTObservableValue {
30
31
	private final Widget widget;
32
33
	/**
34
	 * Standard constructor for an SWT ObservableValue.  Makes sure that
35
	 * the observable gets disposed when the SWT widget is disposed.
36
	 * 
37
	 * @param widget
38
	 */
39
	protected AbstractSWTObservableValue(Widget widget) {
40
		this(SWTObservables.getRealm(widget.getDisplay()), widget);
41
	}
42
	
43
	/**
44
	 * Constructor that allows for the setting of the realm. Makes sure that the
45
	 * observable gets disposed when the SWT widget is disposed.
46
	 * 
47
	 * @param realm
48
	 * @param widget
49
	 * @since 1.2
50
	 */
51
	protected AbstractSWTObservableValue(Realm realm, Widget widget) {
52
		super(realm);
53
		this.widget = widget;
54
		widget.addDisposeListener(disposeListener);
55
	}
56
	
57
	private DisposeListener disposeListener = new DisposeListener() {
58
		public void widgetDisposed(DisposeEvent e) {
59
			AbstractSWTObservableValue.this.dispose();
60
		}
61
	};
62
63
	/**
64
	 * @return Returns the widget.
65
	 */
66
	public Widget getWidget() {
67
		return widget;
68
	}
69
}
(-)src/org/eclipse/jface/internal/databinding/provisional/swt/AbstractSWTVetoableValue.java (-71 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2006 The Pampered Chef, Inc. 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
 *     The Pampered Chef, Inc. - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.provisional.swt;
13
14
import org.eclipse.core.databinding.observable.Realm;
15
import org.eclipse.core.databinding.observable.value.AbstractVetoableValue;
16
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
17
import org.eclipse.jface.databinding.swt.SWTObservables;
18
import org.eclipse.swt.events.DisposeEvent;
19
import org.eclipse.swt.events.DisposeListener;
20
import org.eclipse.swt.widgets.Widget;
21
22
/**
23
 * NON-API - An abstract superclass for vetoable values that gurantees that the 
24
 * observable will be disposed when the control to which it is attached is
25
 * disposed.
26
 * 
27
 * @since 1.1
28
 */
29
public abstract class AbstractSWTVetoableValue extends AbstractVetoableValue implements ISWTObservableValue {
30
31
	private final Widget widget;
32
33
	/**
34
	 * Standard constructor for an SWT VetoableValue.  Makes sure that
35
	 * the observable gets disposed when the SWT widget is disposed.
36
	 * 
37
	 * @param widget
38
	 */
39
	protected AbstractSWTVetoableValue(Widget widget) {
40
		this(SWTObservables.getRealm(widget.getDisplay()), widget);
41
	}
42
	
43
	/**
44
	 * Constructs a new instance for the provided <code>realm</code> and <code>widget</code>.
45
	 * 
46
	 * @param realm
47
	 * @param widget
48
	 * @since 1.2
49
	 */
50
	protected AbstractSWTVetoableValue(Realm realm, Widget widget) {
51
		super(realm);
52
		this.widget = widget;
53
		if (widget == null) {
54
			throw new IllegalArgumentException("The widget parameter is null."); //$NON-NLS-1$
55
		}
56
		widget.addDisposeListener(disposeListener);
57
	}
58
	
59
	private DisposeListener disposeListener = new DisposeListener() {
60
		public void widgetDisposed(DisposeEvent e) {
61
			AbstractSWTVetoableValue.this.dispose();
62
		}
63
	};
64
65
	/**
66
	 * @return Returns the widget.
67
	 */
68
	public Widget getWidget() {
69
		return widget;
70
	}
71
}
(-)src/org/eclipse/jface/databinding/swt/SWTObservables.java (-98 / +197 lines)
Lines 9-17 Link Here
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matt Carter - bug 170668
10
 *     Matt Carter - bug 170668
11
 *     Brad Reynolds - bug 170848
11
 *     Brad Reynolds - bug 170848
12
 *     Matthew Hall - bugs 180746, 207844, 245647, 248621, 232917
12
 *     Matthew Hall - bugs 180746, 207844, 245647, 248621, 232917, 194734
13
 *     Michael Krauter - bug 180223
13
 *     Michael Krauter - bug 180223
14
 *     Boris Bokowski - bug 245647
14
 *     Boris Bokowski - bug 245647
15
 *     Tom Schindl - bug 246462
15
 *******************************************************************************/
16
 *******************************************************************************/
16
package org.eclipse.jface.databinding.swt;
17
package org.eclipse.jface.databinding.swt;
17
18
Lines 24-57 Link Here
24
import org.eclipse.core.databinding.observable.value.IObservableValue;
25
import org.eclipse.core.databinding.observable.value.IObservableValue;
25
import org.eclipse.core.databinding.observable.value.IVetoableValue;
26
import org.eclipse.core.databinding.observable.value.IVetoableValue;
26
import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
27
import org.eclipse.core.databinding.observable.value.ValueChangingEvent;
27
import org.eclipse.jface.internal.databinding.internal.swt.LinkObservableValue;
28
import org.eclipse.core.databinding.property.PropertyObservables;
28
import org.eclipse.jface.internal.databinding.swt.ButtonObservableValue;
29
import org.eclipse.core.databinding.property.list.IListProperty;
29
import org.eclipse.jface.internal.databinding.swt.CComboObservableList;
30
import org.eclipse.core.databinding.property.value.IValueProperty;
30
import org.eclipse.jface.internal.databinding.swt.CComboObservableValue;
31
import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionObservableValue;
32
import org.eclipse.jface.internal.databinding.swt.CLabelObservableValue;
33
import org.eclipse.jface.internal.databinding.swt.ComboObservableList;
34
import org.eclipse.jface.internal.databinding.swt.ComboObservableValue;
35
import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionObservableValue;
36
import org.eclipse.jface.internal.databinding.swt.ControlObservableValue;
37
import org.eclipse.jface.internal.databinding.swt.ItemObservableValue;
38
import org.eclipse.jface.internal.databinding.swt.ItemTooltipObservableValue;
39
import org.eclipse.jface.internal.databinding.swt.LabelObservableValue;
40
import org.eclipse.jface.internal.databinding.swt.ListObservableList;
41
import org.eclipse.jface.internal.databinding.swt.ListObservableValue;
42
import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionObservableValue;
43
import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
31
import org.eclipse.jface.internal.databinding.swt.SWTDelayedObservableValueDecorator;
44
import org.eclipse.jface.internal.databinding.swt.SWTProperties;
32
import org.eclipse.jface.internal.databinding.swt.SWTObservableListDecorator;
45
import org.eclipse.jface.internal.databinding.swt.ScaleObservableValue;
33
import org.eclipse.jface.internal.databinding.swt.SWTObservableValueDecorator;
46
import org.eclipse.jface.internal.databinding.swt.ShellObservableValue;
34
import org.eclipse.jface.internal.databinding.swt.SWTVetoableValueDecorator;
47
import org.eclipse.jface.internal.databinding.swt.SpinnerObservableValue;
48
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionObservableValue;
49
import org.eclipse.jface.internal.databinding.swt.TextEditableObservableValue;
50
import org.eclipse.jface.internal.databinding.swt.TextObservableValue;
51
import org.eclipse.swt.SWT;
35
import org.eclipse.swt.SWT;
52
import org.eclipse.swt.custom.CCombo;
36
import org.eclipse.swt.custom.CCombo;
53
import org.eclipse.swt.custom.CLabel;
37
import org.eclipse.swt.custom.CLabel;
54
import org.eclipse.swt.custom.CTabItem;
38
import org.eclipse.swt.custom.CTabItem;
39
import org.eclipse.swt.custom.StyledText;
55
import org.eclipse.swt.widgets.Button;
40
import org.eclipse.swt.widgets.Button;
56
import org.eclipse.swt.widgets.Combo;
41
import org.eclipse.swt.widgets.Combo;
57
import org.eclipse.swt.widgets.Control;
42
import org.eclipse.swt.widgets.Control;
Lines 139-160 Link Here
139
				.observeDelayedValue(delay, observable), observable.getWidget());
124
				.observeDelayedValue(delay, observable), observable.getWidget());
140
	}
125
	}
141
126
127
	private static ISWTObservableValue observeWidgetProperty(Widget widget,
128
			IValueProperty property) {
129
		return new SWTObservableValueDecorator(PropertyObservables
130
				.observeValue(getRealm(widget.getDisplay()), widget, property),
131
				widget);
132
	}
133
142
	/**
134
	/**
135
	 * Returns an observable value tracking the enabled state of the given
136
	 * control
137
	 * 
143
	 * @param control
138
	 * @param control
139
	 *            the control to observe
144
	 * @return an observable value tracking the enabled state of the given
140
	 * @return an observable value tracking the enabled state of the given
145
	 *         control
141
	 *         control
146
	 */
142
	 */
147
	public static ISWTObservableValue observeEnabled(Control control) {
143
	public static ISWTObservableValue observeEnabled(Control control) {
148
		return new ControlObservableValue(control, SWTProperties.ENABLED);
144
		return observeWidgetProperty(control, ControlProperties.enabled());
149
	}
145
	}
150
146
151
	/**
147
	/**
148
	 * Returns an observable value tracking the visible state of the given
149
	 * control
150
	 * 
152
	 * @param control
151
	 * @param control
152
	 *            the control to observe
153
	 * @return an observable value tracking the visible state of the given
153
	 * @return an observable value tracking the visible state of the given
154
	 *         control
154
	 *         control
155
	 */
155
	 */
156
	public static ISWTObservableValue observeVisible(Control control) {
156
	public static ISWTObservableValue observeVisible(Control control) {
157
		return new ControlObservableValue(control, SWTProperties.VISIBLE);
157
		return observeWidgetProperty(control, ControlProperties.visible());
158
	}
158
	}
159
159
160
	/**
160
	/**
Lines 176-202 Link Here
176
	 */
176
	 */
177
	public static ISWTObservableValue observeTooltipText(Widget widget) {
177
	public static ISWTObservableValue observeTooltipText(Widget widget) {
178
		if (widget instanceof Control) {
178
		if (widget instanceof Control) {
179
			return new ControlObservableValue((Control)widget, SWTProperties.TOOLTIP_TEXT);
179
			return observeTooltipText((Control) widget);
180
		} else if (widget instanceof CTabItem
181
				|| widget instanceof TabItem
182
				|| widget instanceof TableColumn
183
				|| widget instanceof ToolItem
184
				|| widget instanceof TrayItem
185
				|| widget instanceof TreeColumn) {
186
			return new ItemTooltipObservableValue((Item) widget);
187
		}
180
		}
188
		
181
189
		throw new IllegalArgumentException(
182
		IValueProperty property;
190
				"Item [" + widget.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
183
		if (widget instanceof CTabItem) {
184
			property = CTabItemProperties.tooltipText();
185
		} else if (widget instanceof TabItem) {
186
			property = TabItemProperties.tooltipText();
187
		} else if (widget instanceof TableColumn) {
188
			property = TableColumnProperties.tooltipText();
189
		} else if (widget instanceof ToolItem) {
190
			property = ToolItemProperties.tooltipText();
191
		} else if (widget instanceof TrayItem) {
192
			property = TrayItemProperties.tooltipText();
193
		} else if (widget instanceof TreeColumn) {
194
			property = TreeColumnProperties.tooltipText();
195
		} else {
196
			throw new IllegalArgumentException(
197
					"Item [" + widget.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
198
		}
199
200
		return observeWidgetProperty(widget, property);
191
	}
201
	}
192
202
193
	/**
203
	/**
204
	 * Returns an observable value tracking the tooltip text of the given
205
	 * control
206
	 * 
194
	 * @param control
207
	 * @param control
208
	 *            the control to observe
195
	 * @return an observable value tracking the tooltip text of the given
209
	 * @return an observable value tracking the tooltip text of the given
196
	 *         control
210
	 *         control
197
	 */
211
	 */
198
	public static ISWTObservableValue observeTooltipText(Control control) {
212
	public static ISWTObservableValue observeTooltipText(Control control) {
199
		return observeTooltipText((Widget) control);
213
		return observeWidgetProperty(control, ControlProperties.toolTipText());
200
	}
214
	}
201
215
202
	/**
216
	/**
Lines 217-242 Link Here
217
	 *             if <code>control</code> type is unsupported
231
	 *             if <code>control</code> type is unsupported
218
	 */
232
	 */
219
	public static ISWTObservableValue observeSelection(Control control) {
233
	public static ISWTObservableValue observeSelection(Control control) {
234
		IValueProperty property;
220
		if (control instanceof Spinner) {
235
		if (control instanceof Spinner) {
221
			return new SpinnerObservableValue((Spinner) control,
236
			property = SpinnerProperties.selection();
222
					SWTProperties.SELECTION);
223
		} else if (control instanceof Button) {
237
		} else if (control instanceof Button) {
224
			return new ButtonObservableValue((Button) control);
238
			property = ButtonProperties.selection();
225
		} else if (control instanceof Combo) {
239
		} else if (control instanceof Combo) {
226
			return new ComboObservableValue((Combo) control,
240
			property = ComboProperties.selection();
227
					SWTProperties.SELECTION);
228
		} else if (control instanceof CCombo) {
241
		} else if (control instanceof CCombo) {
229
			return new CComboObservableValue((CCombo) control,
242
			property = CComboProperties.selection();
230
					SWTProperties.SELECTION);
231
		} else if (control instanceof List) {
243
		} else if (control instanceof List) {
232
			return new ListObservableValue((List) control);
244
			property = ListProperties.selection();
233
		} else if (control instanceof Scale) {
245
		} else if (control instanceof Scale) {
234
			return new ScaleObservableValue((Scale) control,
246
			property = ScaleProperties.selection();
235
					SWTProperties.SELECTION);
247
		} else {
248
			throw new IllegalArgumentException(
249
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
236
		}
250
		}
237
251
238
		throw new IllegalArgumentException(
252
		return observeWidgetProperty(control, property);
239
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
240
	}
253
	}
241
254
242
	/**
255
	/**
Lines 253-267 Link Here
253
	 *             if <code>control</code> type is unsupported
266
	 *             if <code>control</code> type is unsupported
254
	 */
267
	 */
255
	public static ISWTObservableValue observeMin(Control control) {
268
	public static ISWTObservableValue observeMin(Control control) {
269
		IValueProperty property;
256
		if (control instanceof Spinner) {
270
		if (control instanceof Spinner) {
257
			return new SpinnerObservableValue((Spinner) control,
271
			property = SpinnerProperties.minimum();
258
					SWTProperties.MIN);
259
		} else if (control instanceof Scale) {
272
		} else if (control instanceof Scale) {
260
			return new ScaleObservableValue((Scale) control, SWTProperties.MIN);
273
			property = ScaleProperties.minimum();
274
		} else {
275
			throw new IllegalArgumentException(
276
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
261
		}
277
		}
262
278
263
		throw new IllegalArgumentException(
279
		return observeWidgetProperty(control, property);
264
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
265
	}
280
	}
266
281
267
	/**
282
	/**
Lines 278-292 Link Here
278
	 *             if <code>control</code> type is unsupported
293
	 *             if <code>control</code> type is unsupported
279
	 */
294
	 */
280
	public static ISWTObservableValue observeMax(Control control) {
295
	public static ISWTObservableValue observeMax(Control control) {
296
		IValueProperty property;
281
		if (control instanceof Spinner) {
297
		if (control instanceof Spinner) {
282
			return new SpinnerObservableValue((Spinner) control,
298
			property = SpinnerProperties.maximum();
283
					SWTProperties.MAX);
284
		} else if (control instanceof Scale) {
299
		} else if (control instanceof Scale) {
285
			return new ScaleObservableValue((Scale) control, SWTProperties.MAX);
300
			property = ScaleProperties.maximum();
301
		} else {
302
			throw new IllegalArgumentException(
303
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
286
		}
304
		}
287
305
288
		throw new IllegalArgumentException(
306
		return observeWidgetProperty(control, property);
289
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
290
	}
307
	}
291
308
292
	/**
309
	/**
Lines 294-299 Link Here
294
	 * <code>control</code>. The supported types are:
311
	 * <code>control</code>. The supported types are:
295
	 * <ul>
312
	 * <ul>
296
	 * <li>org.eclipse.swt.widgets.Text</li>
313
	 * <li>org.eclipse.swt.widgets.Text</li>
314
	 * <li>org.eclipse.swt.custom.StyledText (as of 1.3)</li>
297
	 * </ul>
315
	 * </ul>
298
	 * 
316
	 * 
299
	 * @param control
317
	 * @param control
Lines 303-314 Link Here
303
	 *             if <code>control</code> type is unsupported
321
	 *             if <code>control</code> type is unsupported
304
	 */
322
	 */
305
	public static ISWTObservableValue observeText(Control control, int event) {
323
	public static ISWTObservableValue observeText(Control control, int event) {
324
		IValueProperty property;
306
		if (control instanceof Text) {
325
		if (control instanceof Text) {
307
			return new TextObservableValue((Text) control, event);
326
			property = TextProperties.text(event);
327
		} else if (control instanceof StyledText) {
328
			property = StyledTextProperties.text(event);
329
		} else {
330
			throw new IllegalArgumentException(
331
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
308
		}
332
		}
309
333
310
		throw new IllegalArgumentException(
334
		return new SWTVetoableValueDecorator(PropertyObservables.observeValue(
311
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
335
				control, property), control);
312
	}
336
	}
313
337
314
	/**
338
	/**
Lines 333-355 Link Here
333
	 * @since 1.3
357
	 * @since 1.3
334
	 */
358
	 */
335
	public static ISWTObservableValue observeText(Widget widget) {
359
	public static ISWTObservableValue observeText(Widget widget) {
336
		if (widget instanceof Label) {
360
		if (widget instanceof Control) {
337
			return new LabelObservableValue((Label) widget);
361
			return observeText((Control) widget);
338
		} else if (widget instanceof Link) {
339
			return new LinkObservableValue((Link) widget);
340
		} else if (widget instanceof CLabel) {
341
			return new CLabelObservableValue((CLabel) widget);
342
		} else if (widget instanceof Combo) {
343
			return new ComboObservableValue((Combo) widget, SWTProperties.TEXT);
344
		} else if (widget instanceof CCombo) {
345
			return new CComboObservableValue((CCombo) widget,
346
					SWTProperties.TEXT);
347
		} else if (widget instanceof Shell) {
348
			return new ShellObservableValue((Shell) widget);
349
		} else if (widget instanceof Text) {
350
			return new TextObservableValue((Text) widget, SWT.None);
351
		} else if (widget instanceof Item) {
362
		} else if (widget instanceof Item) {
352
			return new ItemObservableValue((Item)widget);
363
			return observeWidgetProperty(widget, ItemProperties.text());
353
		}
364
		}
354
365
355
		throw new IllegalArgumentException(
366
		throw new IllegalArgumentException(
Lines 367-372 Link Here
367
	 * <li>org.eclipse.swt.custom.CCombo</li>
378
	 * <li>org.eclipse.swt.custom.CCombo</li>
368
	 * <li>org.eclipse.swt.widgets.Shell</li>
379
	 * <li>org.eclipse.swt.widgets.Shell</li>
369
	 * <li>org.eclipse.swt.widgets.Text (as of 1.3)</li>
380
	 * <li>org.eclipse.swt.widgets.Text (as of 1.3)</li>
381
	 * <li>org.eclipse.swt.custom.StyledText (as of 1.3)</li>
370
	 * </ul>
382
	 * </ul>
371
	 * 
383
	 * 
372
	 * @param control
384
	 * @param control
Lines 375-381 Link Here
375
	 *             if <code>control</code> type is unsupported
387
	 *             if <code>control</code> type is unsupported
376
	 */
388
	 */
377
	public static ISWTObservableValue observeText(Control control) {
389
	public static ISWTObservableValue observeText(Control control) {
378
		return observeText((Widget) control);
390
		if (control instanceof Text || control instanceof StyledText) {
391
			return observeText(control, SWT.None);
392
		}
393
394
		IValueProperty property;
395
		if (control instanceof Label) {
396
			property = LabelProperties.text();
397
		} else if (control instanceof Link) {
398
			property = LinkProperties.text();
399
		} else if (control instanceof CLabel) {
400
			property = CLabelProperties.text();
401
		} else if (control instanceof Combo) {
402
			property = ComboProperties.text();
403
		} else if (control instanceof CCombo) {
404
			property = CComboProperties.text();
405
		} else if (control instanceof Shell) {
406
			property = ShellProperties.text();
407
		} else {
408
			throw new IllegalArgumentException(
409
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
410
		}
411
412
		return observeWidgetProperty(control, property);
379
	}
413
	}
380
414
381
	/**
415
	/**
Lines 393-408 Link Here
393
	 *             if <code>control</code> type is unsupported
427
	 *             if <code>control</code> type is unsupported
394
	 */
428
	 */
395
	public static IObservableList observeItems(Control control) {
429
	public static IObservableList observeItems(Control control) {
430
		IListProperty property;
396
		if (control instanceof Combo) {
431
		if (control instanceof Combo) {
397
			return new ComboObservableList((Combo) control);
432
			property = ComboProperties.items();
398
		} else if (control instanceof CCombo) {
433
		} else if (control instanceof CCombo) {
399
			return new CComboObservableList((CCombo) control);
434
			property = CComboProperties.items();
400
		} else if (control instanceof List) {
435
		} else if (control instanceof List) {
401
			return new ListObservableList((List) control);
436
			property = ListProperties.items();
437
		} else {
438
			throw new IllegalArgumentException(
439
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
402
		}
440
		}
403
441
404
		throw new IllegalArgumentException(
442
		return new SWTObservableListDecorator(PropertyObservables.observeList(
405
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
443
				control, property), control);
406
	}
444
	}
407
445
408
	/**
446
	/**
Lines 422-439 Link Here
422
	 */
460
	 */
423
	public static ISWTObservableValue observeSingleSelectionIndex(
461
	public static ISWTObservableValue observeSingleSelectionIndex(
424
			Control control) {
462
			Control control) {
463
		IValueProperty property;
425
		if (control instanceof Table) {
464
		if (control instanceof Table) {
426
			return new TableSingleSelectionObservableValue((Table) control);
465
			property = TableProperties.singleSelectionIndex();
427
		} else if (control instanceof Combo) {
466
		} else if (control instanceof Combo) {
428
			return new ComboSingleSelectionObservableValue((Combo) control);
467
			property = ComboProperties.singleSelectionIndex();
429
		} else if (control instanceof CCombo) {
468
		} else if (control instanceof CCombo) {
430
			return new CComboSingleSelectionObservableValue((CCombo) control);
469
			property = CComboProperties.singleSelectionIndex();
431
		} else if (control instanceof List) {
470
		} else if (control instanceof List) {
432
			return new ListSingleSelectionObservableValue((List) control);
471
			property = ListProperties.singleSelectionIndex();
472
		} else {
473
			throw new IllegalArgumentException(
474
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
433
		}
475
		}
434
476
435
		throw new IllegalArgumentException(
477
		return observeWidgetProperty(control, property);
436
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
437
	}
478
	}
438
479
439
	/**
480
	/**
Lines 442-465 Link Here
442
	 *         control
483
	 *         control
443
	 */
484
	 */
444
	public static ISWTObservableValue observeForeground(Control control) {
485
	public static ISWTObservableValue observeForeground(Control control) {
445
		return new ControlObservableValue(control, SWTProperties.FOREGROUND);
486
		return observeWidgetProperty(control, ControlProperties.foreground());
446
	}
487
	}
447
488
448
	/**
489
	/**
490
	 * Returns an observable value tracking the background color of the given
491
	 * control
492
	 * 
449
	 * @param control
493
	 * @param control
494
	 *            the control to observe
450
	 * @return an observable value tracking the background color of the given
495
	 * @return an observable value tracking the background color of the given
451
	 *         control
496
	 *         control
452
	 */
497
	 */
453
	public static ISWTObservableValue observeBackground(Control control) {
498
	public static ISWTObservableValue observeBackground(Control control) {
454
		return new ControlObservableValue(control, SWTProperties.BACKGROUND);
499
		return observeWidgetProperty(control, ControlProperties.background());
455
	}
500
	}
456
501
457
	/**
502
	/**
503
	 * Returns an observable value tracking the font of the given control.
504
	 * 
458
	 * @param control
505
	 * @param control
506
	 *            the control to observe
459
	 * @return an observable value tracking the font of the given control
507
	 * @return an observable value tracking the font of the given control
460
	 */
508
	 */
461
	public static ISWTObservableValue observeFont(Control control) {
509
	public static ISWTObservableValue observeFont(Control control) {
462
		return new ControlObservableValue(control, SWTProperties.FONT);
510
		return observeWidgetProperty(control, ControlProperties.font());
511
	}
512
513
	/**
514
	 * Returns an observable value tracking the size of the given control.
515
	 * 
516
	 * @param control
517
	 *            the control to observe
518
	 * @return an observable value tracking the size of the given control
519
	 * @since 1.3
520
	 */
521
	public static ISWTObservableValue observeSize(Control control) {
522
		return observeWidgetProperty(control, ControlProperties.size());
523
	}
524
525
	/**
526
	 * Returns an observable value tracking the location of the given control.
527
	 * 
528
	 * @param control
529
	 *            the control to observe
530
	 * @return an observable value tracking the location of the given control
531
	 * @since 1.3
532
	 */
533
	public static ISWTObservableValue observeLocation(Control control) {
534
		return observeWidgetProperty(control, ControlProperties.location());
535
	}
536
537
	/**
538
	 * Returns an observable value tracking the focus of the given control.
539
	 * 
540
	 * @param control
541
	 *            the control to observe
542
	 * @return an observable value tracking the focus of the given control
543
	 * @since 1.3
544
	 */
545
	public static ISWTObservableValue observeFocused(Control control) {
546
		return observeWidgetProperty(control, ControlProperties.focused());
547
	}
548
549
	/**
550
	 * Returns an observable value tracking the bounds of the given control.
551
	 * 
552
	 * @param control
553
	 *            the control to observe
554
	 * @return an observable value tracking the bounds of the given control
555
	 * @since 1.3
556
	 */
557
	public static ISWTObservableValue observeBounds(Control control) {
558
		return observeWidgetProperty(control, ControlProperties.bounds());
463
	}
559
	}
464
	
560
	
465
	/**
561
	/**
Lines 475-486 Link Here
475
	 *             if <code>control</code> type is unsupported
571
	 *             if <code>control</code> type is unsupported
476
	 */
572
	 */
477
	public static ISWTObservableValue observeEditable(Control control) {
573
	public static ISWTObservableValue observeEditable(Control control) {
574
		IValueProperty property;
478
		if (control instanceof Text) {
575
		if (control instanceof Text) {
479
			return new TextEditableObservableValue((Text) control);
576
			property = TextProperties.editable();
577
		} else {
578
			throw new IllegalArgumentException(
579
					"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
480
		}
580
		}
481
		
581
482
		throw new IllegalArgumentException(
582
		return observeWidgetProperty(control, property);
483
				"Widget [" + control.getClass().getName() + "] is not supported."); //$NON-NLS-1$//$NON-NLS-2$
484
	}
583
	}
485
584
486
	private static class DisplayRealm extends Realm {
585
	private static class DisplayRealm extends Realm {
(-)src/org/eclipse/jface/internal/databinding/swt/SWTObservableListDecorator.java (+57 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
15
import org.eclipse.core.databinding.observable.list.IObservableList;
16
import org.eclipse.jface.databinding.swt.ISWTObservable;
17
import org.eclipse.swt.SWT;
18
import org.eclipse.swt.widgets.Event;
19
import org.eclipse.swt.widgets.Listener;
20
import org.eclipse.swt.widgets.Widget;
21
22
/**
23
 * @since 3.3
24
 * 
25
 */
26
public class SWTObservableListDecorator extends DecoratingObservableList
27
		implements ISWTObservable {
28
	private Widget widget;
29
30
	/**
31
	 * @param decorated
32
	 * @param widget
33
	 */
34
	public SWTObservableListDecorator(IObservableList decorated, Widget widget) {
35
		super(decorated, true);
36
		this.widget = widget;
37
		widget.addListener(SWT.Dispose, disposeListener);
38
	}
39
40
	private Listener disposeListener = new Listener() {
41
		public void handleEvent(Event event) {
42
			SWTObservableListDecorator.this.dispose();
43
		}
44
	};
45
46
	public void dispose() {
47
		this.widget = null;
48
		super.dispose();
49
	}
50
51
	/**
52
	 * @return Returns the widget.
53
	 */
54
	public Widget getWidget() {
55
		return widget;
56
	}
57
}
(-)src/org/eclipse/jface/databinding/swt/ToolItemProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ToolItemTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT ToolItems
19
 * 
20
 * @since 1.3
21
 */
22
public class ToolItemProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT ToolItems.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT ToolItems.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new ToolItemTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/ButtonProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ButtonSelectionProperty;
16
17
/**
18
 * A factory for creating properties of SWT Buttons.
19
 * 
20
 * @since 1.3
21
 */
22
public class ButtonProperties {
23
	/**
24
	 * Returns a value property for the selection state of a SWT Button.
25
	 * 
26
	 * @return a value property for the selection state of a SWT Button.
27
	 */
28
	public static IValueProperty selection() {
29
		return new ButtonSelectionProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderMultipleSelectionProperty.java (+60 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Collections;
15
import java.util.List;
16
17
import org.eclipse.core.databinding.observable.list.ListDiff;
18
import org.eclipse.core.databinding.property.list.SimpleListProperty;
19
import org.eclipse.jface.viewers.ISelection;
20
import org.eclipse.jface.viewers.ISelectionChangedListener;
21
import org.eclipse.jface.viewers.ISelectionProvider;
22
import org.eclipse.jface.viewers.IStructuredSelection;
23
import org.eclipse.jface.viewers.SelectionChangedEvent;
24
import org.eclipse.jface.viewers.StructuredSelection;
25
26
/**
27
 * @since 3.3
28
 * 
29
 */
30
public class SelectionProviderMultipleSelectionProperty extends
31
		SimpleListProperty implements ISelectionChangedListener {
32
	protected void doAddListenerTo(Object source) {
33
		((ISelectionProvider) source).addSelectionChangedListener(this);
34
	}
35
36
	protected void doRemoveListenerFrom(Object source) {
37
		((ISelectionProvider) source).removeSelectionChangedListener(this);
38
	}
39
40
	public void selectionChanged(SelectionChangedEvent event) {
41
		fireListChange(event.getSelectionProvider(), null);
42
	}
43
44
	public Object getElementType() {
45
		return Object.class;
46
	}
47
48
	protected List doGetList(Object source) {
49
		ISelection selection = ((ISelectionProvider) source).getSelection();
50
		if (selection instanceof IStructuredSelection) {
51
			return ((IStructuredSelection) selection).toList();
52
		}
53
		return Collections.EMPTY_LIST;
54
	}
55
56
	protected void doSetList(Object source, List list, ListDiff diff) {
57
		((ISelectionProvider) source)
58
				.setSelection(new StructuredSelection(list));
59
	}
60
}
(-)src/org/eclipse/jface/databinding/viewers/CheckboxTableViewerProperties.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.set.ISetProperty;
15
import org.eclipse.jface.internal.databinding.viewers.CheckboxTableViewerCheckedElementsProperty;
16
17
/**
18
 * A factory for creating properties of JFace CheckboxTableViewer
19
 * 
20
 * @since 1.3
21
 */
22
public class CheckboxTableViewerProperties {
23
	/**
24
	 * Returns a set property for the checked elements of a JFace
25
	 * CheckboxTableViewer.
26
	 * 
27
	 * @param elementType
28
	 *            the element type of the returned property
29
	 * 
30
	 * @return a set property for the checked elements of a JFace
31
	 *         CheckboxTableViewer.
32
	 */
33
	public static ISetProperty checkedElements(Object elementType) {
34
		return new CheckboxTableViewerCheckedElementsProperty(elementType);
35
	}
36
}
(-)src/org/eclipse/jface/databinding/viewers/StructuredViewerProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.set.ISetProperty;
15
import org.eclipse.jface.internal.databinding.viewers.StructuredViewerFiltersProperty;
16
17
/**
18
 * A factory for creating properties of JFace StructuredViewers
19
 * 
20
 * @since 1.3
21
 */
22
public class StructuredViewerProperties {
23
	/**
24
	 * Returns a value property for the input of a JFace StructuredViewer.
25
	 * 
26
	 * @return a value property for the input of a JFace StructuredViewer.
27
	 */
28
	public static ISetProperty filters() {
29
		return new StructuredViewerFiltersProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/CLabelProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.CLabelTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT Labels.
19
 * 
20
 * @since 1.3
21
 */
22
public class CLabelProperties {
23
	/**
24
	 * Returns a value property for the text of a SWT Label.
25
	 * 
26
	 * @return a value property for the text of a SWT Label.
27
	 */
28
	public static IValueProperty text() {
29
		return new CLabelTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlEnabledProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Control;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ControlEnabledProperty extends WidgetBooleanValueProperty {
21
	public boolean doGetBooleanValue(Object source) {
22
		return ((Control) source).getEnabled();
23
	}
24
25
	void doSetBooleanValue(Object source, boolean value) {
26
		((Control) source).setEnabled(value);
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlFocusedProperty.java (+38 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 *     Tom Schindl - initial API and implementation
11
 ******************************************************************************/
12
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.widgets.Control;
17
18
/**
19
 * @since 3.3
20
 * 
21
 */
22
public class ControlFocusedProperty extends WidgetBooleanValueProperty {
23
	/**
24
	 * 
25
	 */
26
	public ControlFocusedProperty() {
27
		super(new int[] { SWT.FocusIn, SWT.FocusOut });
28
	}
29
30
	public boolean doGetBooleanValue(Object source) {
31
		return ((Control) source).isFocusControl();
32
	}
33
34
	public void doSetBooleanValue(Object source, boolean value) {
35
		if (value)
36
			((Control) source).setFocus();
37
	}
38
}
(-)src/org/eclipse/jface/internal/databinding/swt/CTabItemTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.custom.CTabItem;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class CTabItemTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((CTabItem) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((CTabItem) source).setText(value == null ? "" : (String) value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/databinding/swt/StyledTextProperties.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.StyledTextTextProperty;
16
import org.eclipse.swt.SWT;
17
18
/**
19
 * A factory for creating properties of SWT StyledTexts.
20
 * 
21
 * @since 1.3
22
 */
23
public class StyledTextProperties {
24
	/**
25
	 * Returns a value property for the text of a SWT StyledText.
26
	 * 
27
	 * @param event
28
	 *            the SWT event type to register for change events. May be
29
	 *            {@link SWT#None}, {@link SWT#Modify} or {@link SWT#FocusOut}.
30
	 * 
31
	 * @return a value property for the text of a SWT StyledText.
32
	 */
33
	public static IValueProperty text(int event) {
34
		return new StyledTextTextProperty(event);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlLocationProperty.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 *     Tom Schindl - initial API and implementation
11
 ******************************************************************************/
12
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.value.ValueDiff;
16
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.graphics.Point;
18
import org.eclipse.swt.widgets.Control;
19
20
/**
21
 * @since 3.3
22
 * 
23
 */
24
public class ControlLocationProperty extends WidgetValueProperty {
25
	/**
26
	 * 
27
	 */
28
	public ControlLocationProperty() {
29
		super(SWT.Move, Point.class);
30
	}
31
32
	public Object doGetValue(Object source) {
33
		return ((Control) source).getLocation();
34
	}
35
36
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
37
		((Control) source).setLocation((Point) value);
38
	}
39
}
(-)src/org/eclipse/jface/internal/databinding/swt/TreeItemTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.TreeItem;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class TreeItemTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((TreeItem) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((TreeItem) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/databinding/swt/ScaleProperties.java (+51 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ScaleMaximumProperty;
16
import org.eclipse.jface.internal.databinding.swt.ScaleMinimumProperty;
17
import org.eclipse.jface.internal.databinding.swt.ScaleSelectionProperty;
18
19
/**
20
 * A factory for creating properties of SWT Scales.
21
 * 
22
 * @since 1.3
23
 */
24
public class ScaleProperties {
25
	/**
26
	 * Returns a value property for the selected value of a SWT Scale.
27
	 * 
28
	 * @return a value property for the selected value of a SWT Scale.
29
	 */
30
	public static IValueProperty selection() {
31
		return new ScaleSelectionProperty();
32
	}
33
34
	/**
35
	 * Returns a value property for the minimum value of a SWT Scale.
36
	 * 
37
	 * @return a value property for the minimum value of a SWT Scale.
38
	 */
39
	public static IValueProperty minimum() {
40
		return new ScaleMinimumProperty();
41
	}
42
43
	/**
44
	 * Returns a value property for the maximum value of a SWT Scale.
45
	 * 
46
	 * @return a value property for the maximum value of a SWT Scale.
47
	 */
48
	public static IValueProperty maximum() {
49
		return new ScaleMaximumProperty();
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/ButtonSelectionProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Button;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ButtonSelectionProperty extends WidgetBooleanValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ButtonSelectionProperty() {
26
		super(SWT.Selection);
27
	}
28
29
	boolean doGetBooleanValue(Object source) {
30
		return ((Button) source).getSelection();
31
	}
32
33
	void doSetBooleanValue(Object source, boolean value) {
34
		((Button) source).setSelection(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/TabItemTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.TabItem;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class TabItemTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((TabItem) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((TabItem) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlFontProperty.java (+37 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.swt.graphics.Font;
16
import org.eclipse.swt.widgets.Control;
17
18
/**
19
 * @since 3.3
20
 * 
21
 */
22
public class ControlFontProperty extends WidgetValueProperty {
23
	/**
24
	 * 
25
	 */
26
	public ControlFontProperty() {
27
		super(Font.class);
28
	}
29
30
	public Object doGetValue(Object source) {
31
		return ((Control) source).getFont();
32
	}
33
34
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
35
		((Control) source).setFont((Font) value);
36
	}
37
}
(-)src/org/eclipse/jface/internal/databinding/swt/ScaleMaximumProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Scale;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ScaleMaximumProperty extends WidgetIntValueProperty {
21
	int doGetIntValue(Object source) {
22
		return ((Scale) source).getMaximum();
23
	}
24
25
	void doSetIntValue(Object source, int value) {
26
		((Scale) source).setMaximum(value);
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListSelectionProperty.java (+51 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.List;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ListSelectionProperty extends WidgetStringValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ListSelectionProperty() {
26
		super(SWT.Selection);
27
	}
28
29
	String doGetStringValue(Object source) {
30
		List list = (List) source;
31
		int index = list.getSelectionIndex();
32
		if (index >= 0)
33
			return list.getItem(index);
34
		return null;
35
	}
36
37
	void doSetStringValue(Object source, String value) {
38
		List list = (List) source;
39
		String items[] = list.getItems();
40
		int index = -1;
41
		if (items != null && value != null) {
42
			for (int i = 0; i < items.length; i++) {
43
				if (value.equals(items[i])) {
44
					index = i;
45
					break;
46
				}
47
			}
48
			list.select(index);
49
		}
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/ItemTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Item;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ItemTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((Item) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((Item) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/databinding/viewers/CheckboxTreeViewerProperties.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.set.ISetProperty;
15
import org.eclipse.jface.internal.databinding.viewers.CheckboxTreeViewerCheckedElementsProperty;
16
17
/**
18
 * A factory for creating properties of JFace CheckboxTreeViewer
19
 * 
20
 * @since 1.3
21
 */
22
public class CheckboxTreeViewerProperties {
23
	/**
24
	 * Returns a set property for the checked elements of a JFace
25
	 * CheckboxTreeViewer.
26
	 * 
27
	 * @param elementType
28
	 *            the element type of the returned property
29
	 * 
30
	 * @return a set property for the checked elements of a JFace
31
	 *         CheckboxTreeViewer.
32
	 */
33
	public static ISetProperty checkedElements(Object elementType) {
34
		return new CheckboxTreeViewerCheckedElementsProperty(elementType);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/LinkTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Link;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class LinkTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((Link) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((Link) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/databinding/swt/ControlProperties.java (+121 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ControlBackgroundProperty;
16
import org.eclipse.jface.internal.databinding.swt.ControlBoundsProperty;
17
import org.eclipse.jface.internal.databinding.swt.ControlEnabledProperty;
18
import org.eclipse.jface.internal.databinding.swt.ControlFocusedProperty;
19
import org.eclipse.jface.internal.databinding.swt.ControlFontProperty;
20
import org.eclipse.jface.internal.databinding.swt.ControlForegroundProperty;
21
import org.eclipse.jface.internal.databinding.swt.ControlLocationProperty;
22
import org.eclipse.jface.internal.databinding.swt.ControlSizeProperty;
23
import org.eclipse.jface.internal.databinding.swt.ControlTooltipTextProperty;
24
import org.eclipse.jface.internal.databinding.swt.ControlVisibleProperty;
25
26
/**
27
 * A factory for creating properties of SWT controls.
28
 * 
29
 * @since 1.3
30
 */
31
public class ControlProperties {
32
	/**
33
	 * Returns a value property for the enablement state of a SWT Control.
34
	 * 
35
	 * @return a value property for the enablement state of a SWT Control.
36
	 */
37
	public static IValueProperty enabled() {
38
		return new ControlEnabledProperty();
39
	}
40
41
	/**
42
	 * Returns a value property for the visibility state of a SWT Control.
43
	 * 
44
	 * @return a value property for the visibility state of a SWT Control.
45
	 */
46
	public static IValueProperty visible() {
47
		return new ControlVisibleProperty();
48
	}
49
50
	/**
51
	 * Returns a value property for the tooltip text of a SWT Control.
52
	 * 
53
	 * @return a value property for the tooltip text of a SWT Control.
54
	 */
55
	public static IValueProperty toolTipText() {
56
		return new ControlTooltipTextProperty();
57
	}
58
59
	/**
60
	 * Returns a value property for the foreground color of a SWT Control.
61
	 * 
62
	 * @return a value property for the foreground color of a SWT Control.
63
	 */
64
	public static IValueProperty foreground() {
65
		return new ControlForegroundProperty();
66
	}
67
68
	/**
69
	 * Returns a value property for the background color of a SWT Control.
70
	 * 
71
	 * @return a value property for the background color of a SWT Control.
72
	 */
73
	public static IValueProperty background() {
74
		return new ControlBackgroundProperty();
75
	}
76
77
	/**
78
	 * Returns a value property for the font of a SWT Control.
79
	 * 
80
	 * @return a value property for the font of a SWT Control.
81
	 */
82
	public static IValueProperty font() {
83
		return new ControlFontProperty();
84
	}
85
86
	/**
87
	 * Returns a value property for the size of a SWT Control.
88
	 * 
89
	 * @return a value property for the size of a SWT Control.
90
	 */
91
	public static IValueProperty size() {
92
		return new ControlSizeProperty();
93
	}
94
95
	/**
96
	 * Returns a value property for the location of a SWT Control.
97
	 * 
98
	 * @return a value property for the location of a SWT Control.
99
	 */
100
	public static IValueProperty location() {
101
		return new ControlLocationProperty();
102
	}
103
104
	/**
105
	 * Returns a value property for the bounds of a SWT Control.
106
	 * 
107
	 * @return a value property for the bounds of a SWT Control.
108
	 */
109
	public static IValueProperty bounds() {
110
		return new ControlBoundsProperty();
111
	}
112
113
	/**
114
	 * Returns a value property for the focus state of a SWT Control.
115
	 * 
116
	 * @return a value property for the focus state of a SWT Control.
117
	 */
118
	public static IValueProperty focused() {
119
		return new ControlFocusedProperty();
120
	}
121
}
(-)src/org/eclipse/jface/internal/databinding/swt/TableColumnTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.TableColumn;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class TableColumnTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((TableColumn) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((TableColumn) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlBackgroundProperty.java (+37 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.swt.graphics.Color;
16
import org.eclipse.swt.widgets.Control;
17
18
/**
19
 * @since 3.3
20
 * 
21
 */
22
public class ControlBackgroundProperty extends WidgetValueProperty {
23
	/**
24
	 * 
25
	 */
26
	public ControlBackgroundProperty() {
27
		super(Color.class);
28
	}
29
30
	public Object doGetValue(Object source) {
31
		return ((Control) source).getBackground();
32
	}
33
34
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
35
		((Control) source).setBackground((Color) value);
36
	}
37
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboSelectionProperty.java (+51 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Combo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ComboSelectionProperty extends WidgetStringValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ComboSelectionProperty() {
26
		super(SWT.Modify);
27
	}
28
29
	String doGetStringValue(Object source) {
30
		return ((Combo) source).getText();
31
	}
32
33
	void doSetStringValue(Object source, String value) {
34
		Combo combo = (Combo) source;
35
		String items[] = combo.getItems();
36
		int index = -1;
37
		if (items != null && value != null) {
38
			for (int i = 0; i < items.length; i++) {
39
				if (value.equals(items[i])) {
40
					index = i;
41
					break;
42
				}
43
			}
44
			if (index == -1) {
45
				combo.setText(value);
46
			} else {
47
				combo.select(index); // -1 will not "unselect"
48
			}
49
		}
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/viewers/CheckboxTreeViewerCheckedElementsProperty.java (+50 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Arrays;
15
import java.util.Set;
16
17
import org.eclipse.core.databinding.observable.set.SetDiff;
18
import org.eclipse.jface.viewers.CheckboxTreeViewer;
19
import org.eclipse.jface.viewers.ICheckable;
20
21
/**
22
 * @since 3.3
23
 * 
24
 */
25
public class CheckboxTreeViewerCheckedElementsProperty extends
26
		CheckableCheckedElementsProperty {
27
	/**
28
	 * @param elementType
29
	 */
30
	public CheckboxTreeViewerCheckedElementsProperty(Object elementType) {
31
		super(elementType);
32
	}
33
34
	protected Set createElementSet(ICheckable checkable) {
35
		return ViewerElementSet.withComparer(((CheckboxTreeViewer) checkable)
36
				.getComparer());
37
	}
38
39
	protected Set doGetSet(ICheckable checkable) {
40
		CheckboxTreeViewer viewer = (CheckboxTreeViewer) checkable;
41
		Set set = createElementSet(viewer);
42
		set.addAll(Arrays.asList(viewer.getCheckedElements()));
43
		return set;
44
	}
45
46
	protected void doSetSet(Object source, Set set, SetDiff diff) {
47
		CheckboxTreeViewer viewer = (CheckboxTreeViewer) source;
48
		viewer.setCheckedElements(set.toArray());
49
	}
50
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlStringListProperty.java (+43 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import java.util.Arrays;
15
import java.util.List;
16
17
import org.eclipse.core.databinding.observable.list.ListDiff;
18
import org.eclipse.core.databinding.property.list.SimpleListProperty;
19
import org.eclipse.swt.widgets.Control;
20
21
/**
22
 * @since 3.3
23
 * 
24
 */
25
public abstract class ControlStringListProperty extends SimpleListProperty {
26
	protected void doSetList(Object source, List list, ListDiff diff) {
27
		String[] strings = (String[]) list.toArray(new String[list.size()]);
28
		doSetStringList((Control) source, strings);
29
	}
30
31
	abstract void doSetStringList(Control control, String[] list);
32
33
	protected List doGetList(Object source) {
34
		String[] list = doGetStringList((Control) source);
35
		return Arrays.asList(list);
36
	}
37
38
	abstract String[] doGetStringList(Control control);
39
40
	public Object getElementType() {
41
		return String.class;
42
	}
43
}
(-)src/org/eclipse/jface/internal/databinding/swt/CLabelTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.custom.CLabel;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class CLabelTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((CLabel) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((CLabel) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerObservableSetDecorator.java (+40 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import org.eclipse.core.databinding.observable.set.DecoratingObservableSet;
15
import org.eclipse.core.databinding.observable.set.IObservableSet;
16
import org.eclipse.jface.databinding.viewers.IViewerObservableSet;
17
import org.eclipse.jface.viewers.Viewer;
18
19
/**
20
 * @since 3.3
21
 * 
22
 */
23
public class ViewerObservableSetDecorator extends DecoratingObservableSet
24
		implements IViewerObservableSet {
25
	private final Viewer viewer;
26
27
	/**
28
	 * @param decorated
29
	 * @param viewer
30
	 */
31
	public ViewerObservableSetDecorator(IObservableSet decorated, Viewer viewer) {
32
		super(decorated, true);
33
		this.viewer = viewer;
34
	}
35
36
	public Viewer getViewer() {
37
		return viewer;
38
	}
39
40
}
(-)src/org/eclipse/jface/databinding/swt/SpinnerProperties.java (+51 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.SpinnerMaximumProperty;
16
import org.eclipse.jface.internal.databinding.swt.SpinnerMinimumProperty;
17
import org.eclipse.jface.internal.databinding.swt.SpinnerSelectionProperty;
18
19
/**
20
 * A factory for creating properties of SWT Spinners.
21
 * 
22
 * @since 1.3
23
 */
24
public class SpinnerProperties {
25
	/**
26
	 * Returns a value property for the selected value of a SWT Spinner.
27
	 * 
28
	 * @return a value property for the selected value of a SWT Spinner.
29
	 */
30
	public static IValueProperty selection() {
31
		return new SpinnerSelectionProperty();
32
	}
33
34
	/**
35
	 * Returns a value property for the minimum value of a SWT Spinner.
36
	 * 
37
	 * @return a value property for the minimum value of a SWT Spinner.
38
	 */
39
	public static IValueProperty minimum() {
40
		return new SpinnerMinimumProperty();
41
	}
42
43
	/**
44
	 * Returns a value property for the maximum value of a SWT Spinner.
45
	 * 
46
	 * @return a value property for the maximum value of a SWT Spinner.
47
	 */
48
	public static IValueProperty maximum() {
49
		return new SpinnerMaximumProperty();
50
	}
51
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboItemsProperty.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.custom.CCombo;
15
import org.eclipse.swt.widgets.Control;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class CComboItemsProperty extends ControlStringListProperty {
22
	protected void doSetStringList(Control control, String[] list) {
23
		((CCombo) control).setItems(list);
24
	}
25
26
	public String[] doGetStringList(Control control) {
27
		return ((CCombo) control).getItems();
28
	}
29
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboSingleSelectionIndexProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Combo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ComboSingleSelectionIndexProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ComboSingleSelectionIndexProperty() {
26
		super(new int[] { SWT.Selection, SWT.DefaultSelection });
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((Combo) source).getSelectionIndex();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((Combo) source).select(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/ToolItemTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.ToolItem;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ToolItemTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((ToolItem) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((ToolItem) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/SWTVetoableValueDecorator.java (+138 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.IDecoratingObservable;
16
import org.eclipse.core.databinding.observable.IObservable;
17
import org.eclipse.core.databinding.observable.IStaleListener;
18
import org.eclipse.core.databinding.observable.ObservableTracker;
19
import org.eclipse.core.databinding.observable.StaleEvent;
20
import org.eclipse.core.databinding.observable.value.AbstractVetoableValue;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
23
import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
24
import org.eclipse.core.runtime.Assert;
25
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
26
import org.eclipse.swt.SWT;
27
import org.eclipse.swt.widgets.Event;
28
import org.eclipse.swt.widgets.Listener;
29
import org.eclipse.swt.widgets.Widget;
30
31
/**
32
 * @since 3.3
33
 * 
34
 */
35
public class SWTVetoableValueDecorator extends AbstractVetoableValue implements
36
		ISWTObservableValue, IDecoratingObservable {
37
38
	private IObservableValue decorated;
39
	private Widget widget;
40
41
	private IValueChangeListener valueListener = new IValueChangeListener() {
42
		public void handleValueChange(ValueChangeEvent event) {
43
			fireValueChange(event.diff);
44
		}
45
	};
46
47
	private IStaleListener staleListener = new IStaleListener() {
48
		public void handleStale(StaleEvent staleEvent) {
49
			fireStale();
50
		}
51
	};
52
53
	private Listener verifyListener = new Listener() {
54
		public void handleEvent(Event event) {
55
			String currentText = (String) decorated.getValue();
56
			String newText = currentText.substring(0, event.start) + event.text
57
					+ currentText.substring(event.end);
58
			if (!fireValueChanging(Diffs.createValueDiff(currentText, newText))) {
59
				event.doit = false;
60
			}
61
		}
62
	};
63
64
	private Listener disposeListener = new Listener() {
65
		public void handleEvent(Event event) {
66
			SWTVetoableValueDecorator.this.dispose();
67
		}
68
	};
69
70
	/**
71
	 * @param decorated
72
	 * @param widget
73
	 */
74
	public SWTVetoableValueDecorator(IObservableValue decorated, Widget widget) {
75
		super(decorated.getRealm());
76
		this.decorated = decorated;
77
		this.widget = widget;
78
		Assert
79
				.isTrue(decorated.getValueType().equals(String.class),
80
						"SWTVetoableValueDecorator can only decorate observable values of String type"); //$NON-NLS-1$
81
		widget.addListener(SWT.Dispose, disposeListener);
82
	}
83
84
	private void getterCalled() {
85
		ObservableTracker.getterCalled(this);
86
	}
87
88
	protected void firstListenerAdded() {
89
		decorated.addValueChangeListener(valueListener);
90
		decorated.addStaleListener(staleListener);
91
		widget.addListener(SWT.Verify, verifyListener);
92
	}
93
94
	protected void lastListenerRemoved() {
95
		decorated.removeValueChangeListener(valueListener);
96
		decorated.removeStaleListener(staleListener);
97
		if (widget != null && !widget.isDisposed())
98
			widget.removeListener(SWT.Verify, verifyListener);
99
	}
100
101
	protected void doSetApprovedValue(Object value) {
102
		checkRealm();
103
		decorated.setValue(value);
104
	}
105
106
	protected Object doGetValue() {
107
		getterCalled();
108
		return decorated.getValue();
109
	}
110
111
	public Object getValueType() {
112
		return decorated.getValueType();
113
	}
114
115
	public boolean isStale() {
116
		getterCalled();
117
		return decorated.isStale();
118
	}
119
120
	public void dispose() {
121
		if (decorated != null) {
122
			decorated.dispose();
123
			decorated = null;
124
		}
125
		if (widget != null && !widget.isDisposed())
126
			widget.removeListener(SWT.Verify, verifyListener);
127
		this.widget = null;
128
		super.dispose();
129
	}
130
131
	public Widget getWidget() {
132
		return widget;
133
	}
134
135
	public IObservable getDecorated() {
136
		return decorated;
137
	}
138
}
(-)src/org/eclipse/jface/databinding/swt/TextProperties.java (+45 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TextEditableProperty;
16
import org.eclipse.jface.internal.databinding.swt.TextTextProperty;
17
import org.eclipse.swt.SWT;
18
19
/**
20
 * A factory for creating properties of SWT Texts.
21
 * 
22
 * @since 1.3
23
 */
24
public class TextProperties {
25
	/**
26
	 * Returns a value property for the text of a SWT Text.
27
	 * 
28
	 * @param event
29
	 *            the SWT event type to register for change events. May be
30
	 *            {@link SWT#None}, {@link SWT#Modify} or {@link SWT#FocusOut}.
31
	 * 
32
	 * @return a value property for the text of a SWT Text.
33
	 */
34
	public static IValueProperty text(int event) {
35
		return new TextTextProperty(event);
36
	}
37
38
	/**
39
	 * Returns a value property for the editable state of a SWT Text.
40
	 * @return a value property for the editable state of a SWT Text.
41
	 */
42
	public static IValueProperty editable() {
43
		return new TextEditableProperty();
44
	}
45
}
(-)src/org/eclipse/jface/databinding/swt/ShellProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ShellTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT Shells.
19
 * 
20
 * @since 1.3
21
 */
22
public class ShellProperties {
23
	/**
24
	 * Returns a value property for the text of a SWT Shell.
25
	 * 
26
	 * @return a value property for the text of a SWT Shell.
27
	 */
28
	public static IValueProperty text() {
29
		return new ShellTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/TabItemProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TabItemTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT TabItems
19
 * 
20
 * @since 1.3
21
 */
22
public class TabItemProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT TabItem.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT TabItem.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new TabItemTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/LinkProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.LinkTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT Links.
19
 * 
20
 * @since 1.3
21
 */
22
public class LinkProperties {
23
	/**
24
	 * Returns a value property for the text of a SWT Link.
25
	 * 
26
	 * @return a value property for the text of a SWT Link.
27
	 */
28
	public static IValueProperty text() {
29
		return new LinkTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/WidgetBooleanValueProperty.java (+46 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public abstract class WidgetBooleanValueProperty extends WidgetValueProperty {
21
	WidgetBooleanValueProperty(int[] events) {
22
		super(events, Boolean.TYPE);
23
	}
24
25
	WidgetBooleanValueProperty(int event) {
26
		super(event, Boolean.TYPE);
27
	}
28
29
	WidgetBooleanValueProperty() {
30
		super(Boolean.TYPE);
31
	}
32
33
	protected Object doGetValue(Object source) {
34
		return doGetBooleanValue(source) ? Boolean.TRUE : Boolean.FALSE;
35
	}
36
37
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
38
		if (value == null)
39
			value = Boolean.FALSE;
40
		doSetBooleanValue(source, ((Boolean) value).booleanValue());
41
	}
42
43
	abstract boolean doGetBooleanValue(Object source);
44
45
	abstract void doSetBooleanValue(Object source, boolean value);
46
}
(-)src/org/eclipse/jface/internal/databinding/viewers/CheckableCheckedElementsProperty.java (+106 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Collections;
15
import java.util.HashSet;
16
import java.util.Iterator;
17
import java.util.Set;
18
19
import org.eclipse.core.databinding.observable.Diffs;
20
import org.eclipse.core.databinding.observable.set.SetDiff;
21
import org.eclipse.core.databinding.property.set.SimpleSetProperty;
22
import org.eclipse.jface.viewers.CheckStateChangedEvent;
23
import org.eclipse.jface.viewers.ICheckStateListener;
24
import org.eclipse.jface.viewers.ICheckable;
25
26
/**
27
 * @since 3.3
28
 * 
29
 */
30
public class CheckableCheckedElementsProperty extends SimpleSetProperty
31
		implements ICheckStateListener {
32
	private Object elementType;
33
34
	/**
35
	 * @param elementType
36
	 */
37
	public CheckableCheckedElementsProperty(Object elementType) {
38
		this.elementType = elementType;
39
40
	}
41
42
	protected void doAddListenerTo(Object source) {
43
		((ICheckable) source).addCheckStateListener(this);
44
	}
45
46
	protected void doRemoveListenerFrom(Object source) {
47
		((ICheckable) source).removeCheckStateListener(this);
48
	}
49
50
	public void checkStateChanged(CheckStateChangedEvent event) {
51
		// ICheckable is documented to not fire events when setChecked() is
52
		// called, so no need to check whether the element is being updated.
53
54
		Object source = event.getCheckable();
55
		Set set = (Set) getCached(source);
56
57
		Object element = event.getElement();
58
		if (event.getChecked()) {
59
			if (set.add(element)) {
60
				fireSetChange(source, Diffs.createSetDiff(Collections
61
						.singleton(element), Collections.EMPTY_SET));
62
			}
63
		} else {
64
			if (set.remove(element)) {
65
				fireSetChange(source, Diffs.createSetDiff(
66
						Collections.EMPTY_SET, Collections.singleton(element)));
67
			}
68
		}
69
	}
70
71
	public Object getElementType() {
72
		return elementType;
73
	}
74
75
	protected final Set doGetSet(Object source) {
76
		ICheckable checkable = (ICheckable) source;
77
78
		Set set = doGetSet(checkable);
79
		if (set == null) {
80
			set = (Set) getCached(source);
81
		}
82
		if (set == null) {
83
			set = createElementSet(checkable);
84
		}
85
86
		return set;
87
	}
88
89
	protected Set doGetSet(ICheckable checkable) {
90
		return null; // overridden by viewer-specific subclasses
91
	}
92
93
	protected Set createElementSet(ICheckable checkable) {
94
		return new HashSet();
95
	}
96
97
	protected void doSetSet(Object source, Set set, SetDiff diff) {
98
		ICheckable checkable = (ICheckable) source;
99
		for (Iterator it = diff.getAdditions().iterator(); it.hasNext();) {
100
			checkable.setChecked(it.next(), true);
101
		}
102
		for (Iterator it = diff.getRemovals().iterator(); it.hasNext();) {
103
			checkable.setChecked(it.next(), false);
104
		}
105
	}
106
}
(-)src/org/eclipse/jface/internal/databinding/swt/WidgetIntValueProperty.java (+44 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public abstract class WidgetIntValueProperty extends WidgetValueProperty {
21
	WidgetIntValueProperty() {
22
		super(Integer.TYPE);
23
	}
24
25
	WidgetIntValueProperty(int event) {
26
		super(event, Integer.TYPE);
27
	}
28
29
	WidgetIntValueProperty(int[] events) {
30
		super(events, Integer.TYPE);
31
	}
32
33
	protected Object doGetValue(Object source) {
34
		return new Integer(doGetIntValue(source));
35
	}
36
37
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
38
		doSetIntValue(source, ((Integer) value).intValue());
39
	}
40
41
	abstract int doGetIntValue(Object source);
42
43
	abstract void doSetIntValue(Object source, int intValue);
44
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlSizeProperty.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 *     Tom Schindl - initial API and implementation
11
 ******************************************************************************/
12
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.value.ValueDiff;
16
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.graphics.Point;
18
import org.eclipse.swt.widgets.Control;
19
20
/**
21
 * @since 3.3
22
 * 
23
 */
24
public class ControlSizeProperty extends WidgetValueProperty {
25
	/**
26
	 * 
27
	 */
28
	public ControlSizeProperty() {
29
		super(SWT.Resize, Point.class);
30
	}
31
32
	public Object doGetValue(Object source) {
33
		return ((Control) source).getSize();
34
	}
35
36
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
37
		((Control) source).setSize((Point) value);
38
	}
39
}
(-)src/org/eclipse/jface/databinding/swt/CComboProperties.java (+62 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.value.IValueProperty;
16
import org.eclipse.jface.internal.databinding.swt.CComboItemsProperty;
17
import org.eclipse.jface.internal.databinding.swt.CComboSelectionProperty;
18
import org.eclipse.jface.internal.databinding.swt.CComboSingleSelectionIndexProperty;
19
import org.eclipse.jface.internal.databinding.swt.CComboTextProperty;
20
21
/**
22
 * A factory for creating properties of SWT CCombos
23
 * 
24
 * @since 1.3
25
 */
26
public class CComboProperties {
27
	/**
28
	 * Returns a value property for the selection text of a SWT CCombo.
29
	 * 
30
	 * @return a value property for the selection text of a SWT CCombo.
31
	 */
32
	public static IValueProperty selection() {
33
		return new CComboSelectionProperty();
34
	}
35
36
	/**
37
	 * Returns a value property for the text of a SWT CCombo.
38
	 * 
39
	 * @return a value property for the text of a SWT CCombo.
40
	 */
41
	public static IValueProperty text() {
42
		return new CComboTextProperty();
43
	}
44
45
	/**
46
	 * Returns a list property for the items of a SWT CCombo.
47
	 * 
48
	 * @return a list property for the items of a SWT CCombo.
49
	 */
50
	public static IListProperty items() {
51
		return new CComboItemsProperty();
52
	}
53
54
	/**
55
	 * Returns a value property for the single selection index of a SWT Combo.
56
	 * 
57
	 * @return a value property for the single selection index of a SWT Combo.
58
	 */
59
	public static IValueProperty singleSelectionIndex() {
60
		return new CComboSingleSelectionIndexProperty();
61
	}
62
}
(-)src/org/eclipse/jface/internal/databinding/viewers/CheckboxTableViewerCheckedElementsProperty.java (+50 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Arrays;
15
import java.util.Set;
16
17
import org.eclipse.core.databinding.observable.set.SetDiff;
18
import org.eclipse.jface.viewers.CheckboxTableViewer;
19
import org.eclipse.jface.viewers.ICheckable;
20
21
/**
22
 * @since 3.3
23
 * 
24
 */
25
public class CheckboxTableViewerCheckedElementsProperty extends
26
		CheckableCheckedElementsProperty {
27
	/**
28
	 * @param elementType
29
	 */
30
	public CheckboxTableViewerCheckedElementsProperty(Object elementType) {
31
		super(elementType);
32
	}
33
34
	protected Set createElementSet(ICheckable checkable) {
35
		return ViewerElementSet.withComparer(((CheckboxTableViewer) checkable)
36
				.getComparer());
37
	}
38
39
	protected Set doGetSet(ICheckable checkable) {
40
		CheckboxTableViewer viewer = (CheckboxTableViewer) checkable;
41
		Set set = createElementSet(viewer);
42
		set.addAll(Arrays.asList(viewer.getCheckedElements()));
43
		return set;
44
	}
45
46
	protected void doSetSet(Object source, Set set, SetDiff diff) {
47
		CheckboxTableViewer viewer = (CheckboxTableViewer) source;
48
		viewer.setCheckedElements(set.toArray());
49
	}
50
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlVisibleProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Control;
15
16
/**
17
 * @since 3.3
18
 *
19
 */
20
public class ControlVisibleProperty extends WidgetBooleanValueProperty {
21
	boolean doGetBooleanValue(Object source) {
22
		return ((Control) source).getVisible();
23
	}
24
25
	void doSetBooleanValue(Object source, boolean value) {
26
		((Control) source).setVisible(value);
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Control;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ControlTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((Control) source).getToolTipText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((Control) source).setToolTipText(value);
27
	}
28
}
(-)src/org/eclipse/jface/databinding/viewers/ViewerProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.viewers.ViewerInputProperty;
16
17
/**
18
 * A factory for creating properties of JFace Viewers
19
 * 
20
 * @since 1.3
21
 */
22
public class ViewerProperties {
23
	/**
24
	 * Returns a value property for the input of a JFace Viewer.
25
	 * 
26
	 * @return a value property for the input of a JFace Viewer.
27
	 */
28
	public static IValueProperty input() {
29
		return new ViewerInputProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/TreeColumnProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TreeItemTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT TabItems
19
 * 
20
 * @since 1.3
21
 */
22
public class TreeColumnProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT TreeColumn.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT TreeColumn.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new TreeItemTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/databinding/swt/CTabItemProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.CTabItemTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT CTabItems
19
 * 
20
 * @since 1.3
21
 */
22
public class CTabItemProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT CTabItem.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT CTabItem.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new CTabItemTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListSingleSelectionIndexProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.List;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ListSingleSelectionIndexProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ListSingleSelectionIndexProperty() {
26
		super(new int[] { SWT.Selection, SWT.DefaultSelection });
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((List) source).getSelectionIndex();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((List) source).setSelection(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboSelectionProperty.java (+53 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.custom.CCombo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class CComboSelectionProperty extends WidgetStringValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public CComboSelectionProperty() {
26
		super(SWT.Modify);
27
	}
28
29
	String doGetStringValue(Object source) {
30
		return ((CCombo) source).getText();
31
	}
32
33
	void doSetStringValue(Object source, String value) {
34
		CCombo ccombo = (CCombo) source;
35
		String items[] = ccombo.getItems();
36
		int index = -1;
37
		if (value == null) {
38
			ccombo.select(-1);
39
		} else if (items != null) {
40
			for (int i = 0; i < items.length; i++) {
41
				if (value.equals(items[i])) {
42
					index = i;
43
					break;
44
				}
45
			}
46
			if (index == -1) {
47
				ccombo.setText(value);
48
			} else {
49
				ccombo.select(index); // -1 will not "unselect"
50
			}
51
		}
52
	}
53
}
(-)src/org/eclipse/jface/databinding/swt/TableProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TableSingleSelectionIndexProperty;
16
17
/**
18
 * A factory for creating properties of SWT Tables.
19
 * 
20
 * @since 1.3
21
 */
22
public class TableProperties {
23
	/**
24
	 * Returns a value property for the single selection index of a SWT Table.
25
	 * 
26
	 * @return a value property for the single selection index of a SWT Table.
27
	 */
28
	public static IValueProperty singleSelectionIndex() {
29
		return new TableSingleSelectionIndexProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/SpinnerSelectionProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Spinner;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class SpinnerSelectionProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public SpinnerSelectionProperty() {
26
		super(SWT.Modify);
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((Spinner) source).getSelection();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((Spinner) source).setSelection(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlBoundsProperty.java (+39 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 *     Tom Schindl - initial API and implementation
11
 ******************************************************************************/
12
13
package org.eclipse.jface.internal.databinding.swt;
14
15
import org.eclipse.core.databinding.observable.value.ValueDiff;
16
import org.eclipse.swt.SWT;
17
import org.eclipse.swt.graphics.Rectangle;
18
import org.eclipse.swt.widgets.Control;
19
20
/**
21
 * @since 3.3
22
 * 
23
 */
24
public class ControlBoundsProperty extends WidgetValueProperty {
25
	/**
26
	 * 
27
	 */
28
	public ControlBoundsProperty() {
29
		super(new int[] { SWT.Resize, SWT.Move }, Rectangle.class);
30
	}
31
32
	public Object doGetValue(Object source) {
33
		return ((Control) source).getBounds();
34
	}
35
36
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
37
		((Control) source).setBounds((Rectangle) value);
38
	}
39
}
(-)src/org/eclipse/jface/databinding/swt/ComboProperties.java (+62 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.value.IValueProperty;
16
import org.eclipse.jface.internal.databinding.swt.ComboItemsProperty;
17
import org.eclipse.jface.internal.databinding.swt.ComboSelectionProperty;
18
import org.eclipse.jface.internal.databinding.swt.ComboSingleSelectionIndexProperty;
19
import org.eclipse.jface.internal.databinding.swt.ComboTextProperty;
20
21
/**
22
 * A factory for creating properties of SWT Combos.
23
 * 
24
 * @since 1.3
25
 */
26
public class ComboProperties {
27
	/**
28
	 * Returns a value property for the selection text of a SWT Combo.
29
	 * 
30
	 * @return a value property for the selection text of a SWT Combo.
31
	 */
32
	public static IValueProperty selection() {
33
		return new ComboSelectionProperty();
34
	}
35
36
	/**
37
	 * Returns a value property for the text of a SWT Combo.
38
	 * 
39
	 * @return a value property for the text of a SWT Combo.
40
	 */
41
	public static IValueProperty text() {
42
		return new ComboTextProperty();
43
	}
44
45
	/**
46
	 * Returns a list property for the items of a SWT Combo.
47
	 * 
48
	 * @return a list property for the items of a SWT Combo.
49
	 */
50
	public static IListProperty items() {
51
		return new ComboItemsProperty();
52
	}
53
54
	/**
55
	 * Returns a value property for the single selection index of a SWT Combo.
56
	 * 
57
	 * @return a value property for the single selection index of a SWT Combo.
58
	 */
59
	public static IValueProperty singleSelectionIndex() {
60
		return new ComboSingleSelectionIndexProperty();
61
	}
62
}
(-)src/org/eclipse/jface/databinding/viewers/CheckableProperties.java (+34 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.set.ISetProperty;
15
import org.eclipse.jface.internal.databinding.viewers.CheckableCheckedElementsProperty;
16
17
/**
18
 * A factory for creating properties of JFace ICheckables
19
 * 
20
 * @since 1.3
21
 */
22
public class CheckableProperties {
23
	/**
24
	 * Returns a set property for the checked elements of a JFace ICheckable.
25
	 * 
26
	 * @param elementType
27
	 *            the element type of the returned property
28
	 * 
29
	 * @return a set property for the checked elements of a JFace ICheckable.
30
	 */
31
	public static ISetProperty checkedElements(Object elementType) {
32
		return new CheckableCheckedElementsProperty(elementType);
33
	}
34
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboTextProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Combo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ComboTextProperty extends WidgetStringValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ComboTextProperty() {
26
		super(SWT.Modify);
27
	}
28
29
	String doGetStringValue(Object source) {
30
		return ((Combo) source).getText();
31
	}
32
33
	void doSetStringValue(Object source, String value) {
34
		((Combo) source).setText(value != null ? value : ""); //$NON-NLS-1$
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/StyledTextTextProperty.java (+48 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.custom.StyledText;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class StyledTextTextProperty extends WidgetStringValueProperty {
22
	/**
23
	 * @param event
24
	 */
25
	public StyledTextTextProperty(int event) {
26
		super(checkEvent(event));
27
	}
28
29
	private static int checkEvent(int event) {
30
		switch (event) {
31
		case SWT.None:
32
		case SWT.Modify:
33
		case SWT.FocusOut:
34
			return event;
35
		default:
36
			throw new IllegalArgumentException("UpdateEventType [" //$NON-NLS-1$
37
					+ event + "] is not supported."); //$NON-NLS-1$
38
		}
39
	}
40
41
	String doGetStringValue(Object source) {
42
		return ((StyledText) source).getText();
43
	}
44
45
	void doSetStringValue(Object source, String value) {
46
		((StyledText) source).setText(value == null ? "" : value); //$NON-NLS-1$
47
	}
48
}
(-)src/org/eclipse/jface/internal/databinding/swt/LabelTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Label;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class LabelTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((Label) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((Label) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/databinding/swt/LabelProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.LabelTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT Labels.
19
 * 
20
 * @since 1.3
21
 */
22
public class LabelProperties {
23
	/**
24
	 * Returns a value property for the text of a SWT Label.
25
	 * 
26
	 * @return a value property for the text of a SWT Label.
27
	 */
28
	public static IValueProperty text() {
29
		return new LabelTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/TextTextProperty.java (+48 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Text;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class TextTextProperty extends WidgetStringValueProperty {
22
	/**
23
	 * @param event
24
	 */
25
	public TextTextProperty(int event) {
26
		super(checkEvent(event));
27
	}
28
29
	private static int checkEvent(int event) {
30
		switch (event) {
31
		case SWT.None:
32
		case SWT.Modify:
33
		case SWT.FocusOut:
34
			return event;
35
		default:
36
			throw new IllegalArgumentException("UpdateEventType [" //$NON-NLS-1$
37
					+ event + "] is not supported."); //$NON-NLS-1$
38
		}
39
	}
40
41
	String doGetStringValue(Object source) {
42
		return ((Text) source).getText();
43
	}
44
45
	void doSetStringValue(Object source, String value) {
46
		((Text) source).setText(value == null ? "" : value); //$NON-NLS-1$
47
	}
48
}
(-)src/org/eclipse/jface/internal/databinding/swt/SpinnerMaximumProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Spinner;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class SpinnerMaximumProperty extends WidgetIntValueProperty {
21
	int doGetIntValue(Object source) {
22
		return ((Spinner) source).getMaximum();
23
	}
24
25
	void doSetIntValue(Object source, int value) {
26
		((Spinner) source).setMaximum(value);
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerObservableListDecorator.java (+41 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import org.eclipse.core.databinding.observable.list.DecoratingObservableList;
15
import org.eclipse.core.databinding.observable.list.IObservableList;
16
import org.eclipse.jface.databinding.viewers.IViewerObservableList;
17
import org.eclipse.jface.viewers.Viewer;
18
19
/**
20
 * @since 3.3
21
 * 
22
 */
23
public class ViewerObservableListDecorator extends DecoratingObservableList
24
		implements IViewerObservableList {
25
	private final Viewer viewer;
26
27
	/**
28
	 * @param decorated
29
	 * @param viewer
30
	 */
31
	public ViewerObservableListDecorator(IObservableList decorated,
32
			Viewer viewer) {
33
		super(decorated, true);
34
		this.viewer = viewer;
35
	}
36
37
	public Viewer getViewer() {
38
		return viewer;
39
	}
40
41
}
(-)src/org/eclipse/jface/databinding/swt/ListProperties.java (+52 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.value.IValueProperty;
16
import org.eclipse.jface.internal.databinding.swt.ListItemsProperty;
17
import org.eclipse.jface.internal.databinding.swt.ListSelectionProperty;
18
import org.eclipse.jface.internal.databinding.swt.ListSingleSelectionIndexProperty;
19
20
/**
21
 * A factory for creating properties of SWT List controls.
22
 * 
23
 * @since 1.3
24
 */
25
public class ListProperties {
26
	/**
27
	 * Returns a value property for observing the selection text of a SWT List.
28
	 * 
29
	 * @return a value property for observing the selection text of a SWT List.
30
	 */
31
	public static IValueProperty selection() {
32
		return new ListSelectionProperty();
33
	}
34
35
	/**
36
	 * Returns a list property for observing the items in a SWT List.
37
	 * 
38
	 * @return a list property for observing the items in a SWT List.
39
	 */
40
	public static IListProperty items() {
41
		return new ListItemsProperty();
42
	}
43
44
	/**
45
	 * Returns a value property for the single selection index of a SWT List.
46
	 * 
47
	 * @return a value property for the single selection index of a SWT List.
48
	 */
49
	public static IValueProperty singleSelectionIndex() {
50
		return new ListSingleSelectionIndexProperty();
51
	}
52
}
(-)src/org/eclipse/jface/internal/databinding/viewers/ViewerInputProperty.java (+34 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.core.databinding.property.value.SimpleValueProperty;
16
import org.eclipse.jface.viewers.Viewer;
17
18
/**
19
 * @since 3.3
20
 * 
21
 */
22
public class ViewerInputProperty extends SimpleValueProperty {
23
	public Object getValueType() {
24
		return null;
25
	}
26
27
	protected Object doGetValue(Object source) {
28
		return ((Viewer) source).getInput();
29
	}
30
31
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
32
		((Viewer) source).setInput(value);
33
	}
34
}
(-)src/org/eclipse/jface/internal/databinding/viewers/SelectionProviderSingleSelectionProperty.java (+58 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.core.databinding.property.value.SimpleValueProperty;
16
import org.eclipse.jface.viewers.ISelection;
17
import org.eclipse.jface.viewers.ISelectionChangedListener;
18
import org.eclipse.jface.viewers.ISelectionProvider;
19
import org.eclipse.jface.viewers.IStructuredSelection;
20
import org.eclipse.jface.viewers.SelectionChangedEvent;
21
import org.eclipse.jface.viewers.StructuredSelection;
22
23
/**
24
 * @since 3.3
25
 * 
26
 */
27
public class SelectionProviderSingleSelectionProperty extends
28
		SimpleValueProperty implements ISelectionChangedListener {
29
	protected void doAddListenerTo(Object source) {
30
		((ISelectionProvider) source).addSelectionChangedListener(this);
31
	}
32
33
	protected void doRemoveListenerFrom(Object source) {
34
		((ISelectionProvider) source).removeSelectionChangedListener(this);
35
	}
36
37
	public void selectionChanged(SelectionChangedEvent event) {
38
		fireValueChange(event.getSelectionProvider(), null);
39
	}
40
41
	public Object getValueType() {
42
		return null;
43
	}
44
45
	protected Object doGetValue(Object source) {
46
		ISelection selection = ((ISelectionProvider) source).getSelection();
47
		if (selection instanceof IStructuredSelection) {
48
			return ((IStructuredSelection) selection).getFirstElement();
49
		}
50
		return null;
51
	}
52
53
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
54
		((ISelectionProvider) source)
55
				.setSelection(value == null ? StructuredSelection.EMPTY
56
						: new StructuredSelection(value));
57
	}
58
}
(-)src/org/eclipse/jface/databinding/swt/TableColumnProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TableColumnTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT TableColumns
19
 * 
20
 * @since 1.3
21
 */
22
public class TableColumnProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT TableColumns.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT TableColumns.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new TableColumnTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/ComboItemsProperty.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Combo;
15
import org.eclipse.swt.widgets.Control;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ComboItemsProperty extends ControlStringListProperty {
22
	protected void doSetStringList(Control control, String[] list) {
23
		((Combo) control).setItems(list);
24
	}
25
26
	public String[] doGetStringList(Control control) {
27
		return ((Combo) control).getItems();
28
	}
29
}
(-)src/org/eclipse/jface/internal/databinding/viewers/StructuredViewerFiltersProperty.java (+47 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.viewers;
13
14
import java.util.Arrays;
15
import java.util.HashSet;
16
import java.util.Set;
17
18
import org.eclipse.core.databinding.observable.set.SetDiff;
19
import org.eclipse.core.databinding.property.set.SimpleSetProperty;
20
import org.eclipse.jface.viewers.StructuredViewer;
21
import org.eclipse.jface.viewers.ViewerFilter;
22
23
/**
24
 * @since 3.3
25
 * 
26
 */
27
public class StructuredViewerFiltersProperty extends SimpleSetProperty {
28
	public Object getElementType() {
29
		return ViewerFilter.class;
30
	}
31
32
	public Set doGetSet(Object source) {
33
		return new HashSet(Arrays.asList(((StructuredViewer) source)
34
				.getFilters()));
35
	}
36
37
	protected void doSetSet(Object source, Set set, SetDiff diff) {
38
		StructuredViewer viewer = (StructuredViewer) source;
39
		viewer.getControl().setRedraw(false);
40
		try {
41
			viewer.setFilters((ViewerFilter[]) set.toArray(new ViewerFilter[set
42
					.size()]));
43
		} finally {
44
			viewer.getControl().setRedraw(true);
45
		}
46
	}
47
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboSingleSelectionIndexProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.custom.CCombo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class CComboSingleSelectionIndexProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public CComboSingleSelectionIndexProperty() {
26
		super(new int[] { SWT.Selection, SWT.DefaultSelection });
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((CCombo) source).getSelectionIndex();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((CCombo) source).select(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/ListItemsProperty.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Control;
15
import org.eclipse.swt.widgets.List;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ListItemsProperty extends ControlStringListProperty {
22
	protected void doSetStringList(Control control, String[] list) {
23
		((List) control).setItems(list);
24
	}
25
26
	public String[] doGetStringList(Control control) {
27
		return ((List) control).getItems();
28
	}
29
}
(-)src/org/eclipse/jface/internal/databinding/swt/ControlForegroundProperty.java (+37 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.swt.graphics.Color;
16
import org.eclipse.swt.widgets.Control;
17
18
/**
19
 * @since 3.3
20
 * 
21
 */
22
public class ControlForegroundProperty extends WidgetValueProperty {
23
	/**
24
	 * 
25
	 */
26
	public ControlForegroundProperty() {
27
		super(Color.class);
28
	}
29
30
	public Object doGetValue(Object source) {
31
		return ((Control) source).getForeground();
32
	}
33
34
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
35
		((Control) source).setForeground((Color) value);
36
	}
37
}
(-)src/org/eclipse/jface/internal/databinding/swt/ScaleMinimumProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Scale;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ScaleMinimumProperty extends WidgetIntValueProperty {
21
	int doGetIntValue(Object source) {
22
		return ((Scale) source).getMinimum();
23
	}
24
25
	void doSetIntValue(Object source, int value) {
26
		((Scale) source).setMinimum(value);
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/WidgetStringValueProperty.java (+40 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public abstract class WidgetStringValueProperty extends WidgetValueProperty {
21
	WidgetStringValueProperty(int event) {
22
		super(event, String.class);
23
	}
24
25
	WidgetStringValueProperty() {
26
		super(String.class);
27
	}
28
29
	protected Object doGetValue(Object source) {
30
		return doGetStringValue(source);
31
	}
32
33
	protected void doSetValue(Object source, Object value, ValueDiff diff) {
34
		doSetStringValue(source, (String) value);
35
	}
36
37
	abstract String doGetStringValue(Object source);
38
39
	abstract void doSetStringValue(Object source, String value);
40
}
(-)src/org/eclipse/jface/internal/databinding/swt/SpinnerMinimumProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Spinner;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class SpinnerMinimumProperty extends WidgetIntValueProperty {
21
	int doGetIntValue(Object source) {
22
		return ((Spinner) source).getMinimum();
23
	}
24
25
	void doSetIntValue(Object source, int value) {
26
		((Spinner) source).setMinimum(value);
27
	}
28
}
(-)src/org/eclipse/jface/databinding/swt/ItemProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.ItemTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT controls.
19
 * 
20
 * @since 1.3
21
 */
22
public class ItemProperties {
23
	/**
24
	 * Returns a value property for the text of a SWT Item.
25
	 * 
26
	 * @return a value property for the text of a SWT Item
27
	 */
28
	public static IValueProperty text() {
29
		return new ItemTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/ScaleSelectionProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Scale;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class ScaleSelectionProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public ScaleSelectionProperty() {
26
		super(SWT.Selection);
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((Scale) source).getSelection();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((Scale) source).setSelection(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/WidgetValueProperty.java (+69 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.SimpleValueProperty;
15
import org.eclipse.swt.SWT;
16
import org.eclipse.swt.widgets.Event;
17
import org.eclipse.swt.widgets.Listener;
18
import org.eclipse.swt.widgets.Widget;
19
20
abstract class WidgetValueProperty extends SimpleValueProperty implements
21
		Listener {
22
	private int[] events;
23
	private Object valueType;
24
25
	WidgetValueProperty(Object valueType) {
26
		this(null, valueType);
27
	}
28
29
	WidgetValueProperty(int event, Object valueType) {
30
		this(new int[] { event }, valueType);
31
	}
32
33
	WidgetValueProperty(int[] events, Object valueType) {
34
		this.events = events;
35
		this.valueType = valueType;
36
	}
37
38
	protected final void doAddListenerTo(Object source) {
39
		if (events != null) {
40
			for (int i = 0; i < events.length; i++) {
41
				int event = events[i];
42
				if (event != SWT.None) {
43
					((Widget) source).addListener(event, this);
44
				}
45
			}
46
		}
47
	}
48
49
	protected final void doRemoveListenerFrom(Object source) {
50
		if (events != null) {
51
			Widget widget = (Widget) source;
52
			if (!widget.isDisposed()) {
53
				for (int i = 0; i < events.length; i++) {
54
					int event = events[i];
55
					if (event != SWT.None)
56
						widget.removeListener(event, this);
57
				}
58
			}
59
		}
60
	}
61
62
	public void handleEvent(Event event) {
63
		fireValueChange(event.widget, null);
64
	}
65
66
	public final Object getValueType() {
67
		return valueType;
68
	}
69
}
(-)src/org/eclipse/jface/databinding/swt/TrayItemProperties.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.swt;
13
14
import org.eclipse.core.databinding.property.value.IValueProperty;
15
import org.eclipse.jface.internal.databinding.swt.TrayItemTooltipTextProperty;
16
17
/**
18
 * A factory for creating properties of SWT TrayItems
19
 * 
20
 * @since 1.3
21
 */
22
public class TrayItemProperties {
23
	/**
24
	 * Returns a value property for the tooltip text of a SWT TrayItems.
25
	 * 
26
	 * @return a value property for the tooltip text of a SWT TrayItems.
27
	 */
28
	public static IValueProperty tooltipText() {
29
		return new TrayItemTooltipTextProperty();
30
	}
31
}
(-)src/org/eclipse/jface/internal/databinding/swt/TextEditableProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Text;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class TextEditableProperty extends WidgetBooleanValueProperty {
21
	boolean doGetBooleanValue(Object source) {
22
		return ((Text) source).getEditable();
23
	}
24
25
	void doSetBooleanValue(Object source, boolean value) {
26
		((Text) source).setEditable(value);
27
	}
28
}
(-)src/org/eclipse/jface/databinding/viewers/SelectionProviderProperties.java (+46 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.databinding.viewers;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.value.IValueProperty;
16
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderMultipleSelectionProperty;
17
import org.eclipse.jface.internal.databinding.viewers.SelectionProviderSingleSelectionProperty;
18
19
/**
20
 * A factory for creating properties of JFace ISelectionProviders
21
 * 
22
 * @since 1.3
23
 */
24
public class SelectionProviderProperties {
25
	/**
26
	 * Returns a value property for the single selection of a JFace
27
	 * ISelectionProvider.
28
	 * 
29
	 * @return a value property for the single selection of a JFace
30
	 *         ISelectionProvider.
31
	 */
32
	public static IValueProperty singleSelection() {
33
		return new SelectionProviderSingleSelectionProperty();
34
	}
35
36
	/**
37
	 * Returns a list property for the multiple selection of a JFace
38
	 * ISelectionProvider.
39
	 * 
40
	 * @return a list property for the multiple selection of a JFace
41
	 *         ISelectionProvider.
42
	 */
43
	public static IListProperty multipleSelection() {
44
		return new SelectionProviderMultipleSelectionProperty();
45
	}
46
}
(-)src/org/eclipse/jface/internal/databinding/swt/TrayItemTooltipTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.TrayItem;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class TrayItemTooltipTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((TrayItem) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((TrayItem) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/ShellTextProperty.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.widgets.Shell;
15
16
/**
17
 * @since 3.3
18
 * 
19
 */
20
public class ShellTextProperty extends WidgetStringValueProperty {
21
	String doGetStringValue(Object source) {
22
		return ((Shell) source).getText();
23
	}
24
25
	void doSetStringValue(Object source, String value) {
26
		((Shell) source).setText(value == null ? "" : value); //$NON-NLS-1$
27
	}
28
}
(-)src/org/eclipse/jface/internal/databinding/swt/TableSingleSelectionIndexProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.widgets.Table;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class TableSingleSelectionIndexProperty extends WidgetIntValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public TableSingleSelectionIndexProperty() {
26
		super(new int[] { SWT.Selection, SWT.DefaultSelection });
27
	}
28
29
	int doGetIntValue(Object source) {
30
		return ((Table) source).getSelectionIndex();
31
	}
32
33
	void doSetIntValue(Object source, int value) {
34
		((Table) source).setSelection(value);
35
	}
36
}
(-)src/org/eclipse/jface/internal/databinding/swt/CComboTextProperty.java (+36 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.internal.databinding.swt;
13
14
import org.eclipse.swt.SWT;
15
import org.eclipse.swt.custom.CCombo;
16
17
/**
18
 * @since 3.3
19
 * 
20
 */
21
public class CComboTextProperty extends WidgetStringValueProperty {
22
	/**
23
	 * 
24
	 */
25
	public CComboTextProperty() {
26
		super(SWT.Modify);
27
	}
28
29
	String doGetStringValue(Object source) {
30
		return ((CCombo) source).getText();
31
	}
32
33
	void doSetStringValue(Object source, String value) {
34
		((CCombo) source).setText(value != null ? value : ""); //$NON-NLS-1$
35
	}
36
}
(-)src/org/eclipse/core/databinding/observable/map/MapDiff.java (+34 lines)
Lines 7-16 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 194734
10
 *******************************************************************************/
11
 *******************************************************************************/
11
12
12
package org.eclipse.core.databinding.observable.map;
13
package org.eclipse.core.databinding.observable.map;
13
14
15
import java.util.Iterator;
16
import java.util.Map;
14
import java.util.Set;
17
import java.util.Set;
15
18
16
/**
19
/**
Lines 18-23 Link Here
18
 * 
21
 * 
19
 */
22
 */
20
public abstract class MapDiff {
23
public abstract class MapDiff {
24
	/**
25
	 * Returns true if the diff has no added, removed or changed entries.
26
	 * 
27
	 * @return true if the diff has no added, removed or changed entries.
28
	 * @since 1.2
29
	 */
30
	public boolean isEmpty() {
31
		return getAddedKeys().isEmpty() && getRemovedKeys().isEmpty()
32
				&& getChangedKeys().isEmpty();
33
	}
34
35
	/**
36
	 * Applies the changes in this diff to the given map
37
	 * 
38
	 * @param map
39
	 *            the map to which the diff will be applied
40
	 * @since 1.2
41
	 */
42
	public void applyTo(Map map) {
43
		for (Iterator it = getAddedKeys().iterator(); it.hasNext();) {
44
			Object key = it.next();
45
			map.put(key, getNewValue(key));
46
		}
47
		for (Iterator it = getChangedKeys().iterator(); it.hasNext();) {
48
			Object key = it.next();
49
			map.put(key, getNewValue(key));
50
		}
51
		for (Iterator it = getRemovedKeys().iterator(); it.hasNext();) {
52
			map.remove(it.next());
53
		}
54
	}
21
55
22
	/**
56
	/**
23
	 * @return the set of keys which were added
57
	 * @return the set of keys which were added
(-)META-INF/MANIFEST.MF (+6 lines)
Lines 14-19 Link Here
14
 org.eclipse.core.databinding.observable.masterdetail,
14
 org.eclipse.core.databinding.observable.masterdetail,
15
 org.eclipse.core.databinding.observable.set;x-internal:=false,
15
 org.eclipse.core.databinding.observable.set;x-internal:=false,
16
 org.eclipse.core.databinding.observable.value;x-internal:=false,
16
 org.eclipse.core.databinding.observable.value;x-internal:=false,
17
 org.eclipse.core.databinding.property,
18
 org.eclipse.core.databinding.property.list,
19
 org.eclipse.core.databinding.property.map,
20
 org.eclipse.core.databinding.property.set,
21
 org.eclipse.core.databinding.property.value,
17
 org.eclipse.core.databinding.util,
22
 org.eclipse.core.databinding.util,
18
 org.eclipse.core.databinding.validation;x-internal:=false,
23
 org.eclipse.core.databinding.validation;x-internal:=false,
19
 org.eclipse.core.internal.databinding;x-friends:="org.eclipse.core.databinding.beans",
24
 org.eclipse.core.internal.databinding;x-friends:="org.eclipse.core.databinding.beans",
Lines 21-26 Link Here
21
 org.eclipse.core.internal.databinding.observable;x-internal:=true,
26
 org.eclipse.core.internal.databinding.observable;x-internal:=true,
22
 org.eclipse.core.internal.databinding.observable.masterdetail;x-friends:="org.eclipse.jface.tests.databinding",
27
 org.eclipse.core.internal.databinding.observable.masterdetail;x-friends:="org.eclipse.jface.tests.databinding",
23
 org.eclipse.core.internal.databinding.observable.tree;x-friends:="org.eclipse.jface.databinding,org.eclipse.jface.tests.databinding",
28
 org.eclipse.core.internal.databinding.observable.tree;x-friends:="org.eclipse.jface.databinding,org.eclipse.jface.tests.databinding",
29
 org.eclipse.core.internal.databinding.property;x-friends:="org.eclipse.jface.databinding,org.eclipse.jface.tests.databinding",
24
 org.eclipse.core.internal.databinding.validation;x-friends:="org.eclipse.jface.tests.databinding"
30
 org.eclipse.core.internal.databinding.validation;x-friends:="org.eclipse.jface.tests.databinding"
25
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
31
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)"
26
Import-Package-Comment: see http://wiki.eclipse.org/
32
Import-Package-Comment: see http://wiki.eclipse.org/
(-)src/org/eclipse/core/databinding/observable/list/ListDiff.java (-1 / +39 lines)
Lines 7-17 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 208858
10
 *     Matthew Hall - bug 208858, 194734
11
 *******************************************************************************/
11
 *******************************************************************************/
12
12
13
package org.eclipse.core.databinding.observable.list;
13
package org.eclipse.core.databinding.observable.list;
14
14
15
import java.util.List;
16
15
import org.eclipse.core.internal.databinding.Util;
17
import org.eclipse.core.internal.databinding.Util;
16
18
17
/**
19
/**
Lines 84-89 Link Here
84
	}
86
	}
85
87
86
	/**
88
	/**
89
	 * Returns true if the diff contains no added, removed, moved or replaced
90
	 * elements.
91
	 * 
92
	 * @return true if the diff contains no added, removed, moved or replaced
93
	 *         elements.
94
	 * @since 1.2
95
	 */
96
	public boolean isEmpty() {
97
		return getDifferences().length == 0;
98
	}
99
100
	/**
101
	 * Applies the changes in this diff to the given list
102
	 * 
103
	 * @param list
104
	 *            the list to which the diff will be applied
105
	 * @since 1.2
106
	 */
107
	public void applyTo(final List list) {
108
		accept(new ListDiffVisitor() {
109
			public void handleAdd(int index, Object element) {
110
				list.add(index, element);
111
			}
112
113
			public void handleRemove(int index, Object element) {
114
				list.remove(index);
115
			}
116
117
			public void handleReplace(int index, Object oldElement,
118
					Object newElement) {
119
				list.set(index, newElement);
120
			}
121
		});
122
	}
123
124
	/**
87
	 * @see java.lang.Object#toString()
125
	 * @see java.lang.Object#toString()
88
	 */
126
	 */
89
	public String toString() {
127
	public String toString() {
(-)src/org/eclipse/core/databinding/observable/set/SetDiff.java (+23 lines)
Lines 7-12 Link Here
7
 *
7
 *
8
 * Contributors:
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
9
 *     IBM Corporation - initial API and implementation
10
 *     Matthew Hall - bug 194734
10
 *******************************************************************************/
11
 *******************************************************************************/
11
12
12
package org.eclipse.core.databinding.observable.set;
13
package org.eclipse.core.databinding.observable.set;
Lines 30-35 Link Here
30
	public abstract Set getRemovals();
31
	public abstract Set getRemovals();
31
	
32
	
32
	/**
33
	/**
34
	 * Returns true if the diff has no added or removed elements.
35
	 * 
36
	 * @return true if the diff has no added or removed elements.
37
	 * @since 1.2
38
	 */
39
	public boolean isEmpty() {
40
		return getAdditions().isEmpty() && getRemovals().isEmpty();
41
	}
42
43
	/**
44
	 * Applies the changes in this diff to the given set
45
	 * 
46
	 * @param set
47
	 *            the set to which the diff will be applied
48
	 * @since 1.2
49
	 */
50
	public void applyTo(Set set) {
51
		set.addAll(getAdditions());
52
		set.removeAll(getRemovals());
53
	}
54
55
	/**
33
	 * @see java.lang.Object#toString()
56
	 * @see java.lang.Object#toString()
34
	 */
57
	 */
35
	public String toString() {
58
	public String toString() {
(-)src/org/eclipse/core/databinding/property/value/IValueProperty.java (+73 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.value;
13
14
import org.eclipse.core.databinding.property.IProperty;
15
16
17
/**
18
 * Interface for value-typed properties
19
 * 
20
 * @since 1.2
21
 * @noimplement This interface is not intended to be implemented by clients.
22
 */
23
public interface IValueProperty extends IProperty {
24
	/**
25
	 * Returns the source's value property
26
	 * 
27
	 * @param source
28
	 *            the property source
29
	 * @return the current value of the source's value property
30
	 */
31
	public Object getValue(Object source);
32
33
	/**
34
	 * Sets the source's value property to the specified value
35
	 * 
36
	 * @param source
37
	 *            the property source
38
	 * @param value
39
	 *            the new value
40
	 */
41
	public void setValue(Object source, Object value);
42
43
	/**
44
	 * Returns the value type of the property, or <code>null</code> if untyped.
45
	 * 
46
	 * @return the value type of the property, or <code>null</code> if untyped.
47
	 */
48
	public Object getValueType();
49
50
	/**
51
	 * Adds the given value property change listener to the list of listeners
52
	 * for the given source.
53
	 * 
54
	 * @param source
55
	 *            the property source
56
	 * @param listener
57
	 *            the listener
58
	 */
59
	public void addValueChangeListener(Object source,
60
			IValuePropertyChangeListener listener);
61
62
	/**
63
	 * Removes the given list property change listener from the list of
64
	 * listeners for the given source.
65
	 * 
66
	 * @param source
67
	 *            the property source
68
	 * @param listener
69
	 *            the listener
70
	 */
71
	public void removeValueChangeListener(Object source,
72
			IValuePropertyChangeListener listener);
73
}
(-)src/org/eclipse/core/databinding/property/set/ISetPropertyChangeListener.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.set;
13
14
import org.eclipse.core.databinding.property.IPropertyChangeListener;
15
16
/**
17
 * Listener for changes to set properties on a property source
18
 * 
19
 * @since 1.2
20
 */
21
public interface ISetPropertyChangeListener extends IPropertyChangeListener {
22
	/**
23
	 * Handle a change to a set property on a specific property source.
24
	 * 
25
	 * @param event
26
	 *            an event describing the set change that occured.
27
	 */
28
	public void handleSetPropertyChange(SetPropertyChangeEvent event);
29
}
(-)src/org/eclipse/core/databinding/property/list/IListProperty.java (+165 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.list;
13
14
import java.util.Collection;
15
import java.util.List;
16
17
import org.eclipse.core.databinding.property.ICollectionProperty;
18
19
/**
20
 * Interface for list-typed properties.
21
 * 
22
 * @since 1.2
23
 * @noimplement This interface is not intended to be implemented by clients.
24
 */
25
public interface IListProperty extends ICollectionProperty {
26
	/**
27
	 * Returns a List with the current contents of the source's list property
28
	 * 
29
	 * @param source
30
	 *            the property source
31
	 * @return a List with the current contents of the source's list property
32
	 */
33
	List getList(Object source);
34
35
	/**
36
	 * Inserts all elements in the specified collection into the source's list
37
	 * property at the specified index.
38
	 * 
39
	 * @param source
40
	 *            the property source
41
	 * @param index
42
	 *            the insertion index
43
	 * @param c
44
	 *            the collection of elements to add
45
	 * @return whether the source's list property was changed
46
	 */
47
	boolean addAll(Object source, int index, Collection c);
48
49
	/**
50
	 * Returns the element at the specified position in the source's list
51
	 * property
52
	 * 
53
	 * @param source
54
	 *            the property source
55
	 * @param index
56
	 *            the element position
57
	 * @return the element at the given position in the source's list property
58
	 */
59
	Object get(Object source, int index);
60
61
	/**
62
	 * Replaces the element at the specified position in the source's list
63
	 * property with the given element.
64
	 * 
65
	 * @param source
66
	 *            the property source
67
	 * @param index
68
	 *            the element position
69
	 * @param element
70
	 *            the replacement element
71
	 * @return the element previously at the specified position in the source's
72
	 *         list property
73
	 */
74
	Object set(Object source, int index, Object element);
75
76
	/**
77
	 * Moves the element at the specified old position in the source's list
78
	 * property to the specified new position
79
	 * 
80
	 * @param source
81
	 *            the property source
82
	 * @param oldIndex
83
	 *            the old element position
84
	 * @param newIndex
85
	 *            the new element position
86
	 * @return the element that was moved
87
	 */
88
	Object move(Object source, int oldIndex, int newIndex);
89
90
	/**
91
	 * Inserts the element into the source's list property at the specified
92
	 * position
93
	 * 
94
	 * @param source
95
	 *            the property source
96
	 * @param index
97
	 *            the insertion index
98
	 * @param element
99
	 *            the element to insert
100
	 */
101
	void add(Object source, int index, Object element);
102
103
	/**
104
	 * Removes the element from the source's list property which is located at
105
	 * the specified position
106
	 * 
107
	 * @param source
108
	 *            the property source
109
	 * @param index
110
	 *            the index of the element to remove
111
	 * @return the element that was removed from the source's list property
112
	 */
113
	Object remove(Object source, int index);
114
115
	/**
116
	 * Returns the index of the first location of the given element in the
117
	 * source's list property, or -1 if the list does not contain the element.
118
	 * 
119
	 * @param source
120
	 *            the property source
121
	 * @param o
122
	 *            the element
123
	 * @return the index of the first location of the given element in the
124
	 *         source's list property, or -1 if the list does not contain the
125
	 *         element
126
	 */
127
	int indexOf(Object source, Object o);
128
129
	/**
130
	 * Returns the index of the last location of the given element in the
131
	 * source's list property, or -1 if the list does not contain the given
132
	 * element.
133
	 * 
134
	 * @param source
135
	 * @param o
136
	 * @return the index of the last location of the given element in the
137
	 *         source's list property, or -1 if the list does not contain the
138
	 *         element
139
	 */
140
	int lastIndexOf(Object source, Object o);
141
142
	/**
143
	 * Adds the given list property change listener to the list of listeners for
144
	 * the given source.
145
	 * 
146
	 * @param source
147
	 *            the property source
148
	 * @param listener
149
	 *            the listener
150
	 */
151
	public void addListChangeListener(Object source,
152
			IListPropertyChangeListener listener);
153
154
	/**
155
	 * Removes the given list property change listener from the list of
156
	 * listeners for the given source.
157
	 * 
158
	 * @param source
159
	 *            the property source
160
	 * @param listener
161
	 *            the listener
162
	 */
163
	public void removeListChangeListener(Object source,
164
			IListPropertyChangeListener listener);
165
}
(-)src/org/eclipse/core/databinding/property/set/SimpleSetProperty.java (+268 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.set;
13
14
import java.util.Collection;
15
import java.util.Collections;
16
import java.util.HashSet;
17
import java.util.Iterator;
18
import java.util.Set;
19
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.set.SetDiff;
22
import org.eclipse.core.databinding.property.SimpleProperty;
23
import org.eclipse.core.internal.databinding.Util;
24
25
/**
26
 * Simplified abstract implementation of ISetProperty. This class takes care of
27
 * most of the functional requirements for an ISetProperty implementation,
28
 * leaving only the property-specific details to subclasses.
29
 * <p>
30
 * Subclasses must implement these methods:
31
 * <ul>
32
 * <li>{@link #getElementType()}
33
 * <li>{@link #doGetSet(Object)}
34
 * <li>{@link #doSetSet(Object, Set, SetDiff)}
35
 * </ul>
36
 * Additionally, the following methods should be overridden when the property
37
 * source has listener APIs.
38
 * <ul>
39
 * <li>{@link #doAddListenerTo(Object)}
40
 * <li>{@link #doRemoveListenerFrom(Object)}
41
 * </ul>
42
 * 
43
 * @since 1.2
44
 */
45
public abstract class SimpleSetProperty extends SimpleProperty implements
46
		ISetProperty {
47
	public void addSetChangeListener(Object source,
48
			ISetPropertyChangeListener listener) {
49
		addPropertyChangeListener(source, listener);
50
	}
51
52
	public void removeSetChangeListener(Object source,
53
			ISetPropertyChangeListener listener) {
54
		removePropertyChangeListener(source, listener);
55
	}
56
57
	protected final Object getProperty(Object source) {
58
		return doGetSet(source);
59
	}
60
61
	public boolean contains(Object source, Object o) {
62
		return getSet(source).contains(o);
63
	}
64
65
	public boolean containsAll(Object source, Collection c) {
66
		return getSet(source).containsAll(c);
67
	}
68
69
	public boolean equals(Object source, Object o) {
70
		return getSet(source).equals(o);
71
	}
72
73
	public int hashCode(Object source) {
74
		return getSet(source).hashCode();
75
	}
76
77
	public boolean isEmpty(Object source) {
78
		return getSet(source).isEmpty();
79
	}
80
81
	public int size(Object source) {
82
		return getSet(source).size();
83
	}
84
85
	public Object[] toArray(Object source, Object[] array) {
86
		return getSet(source).toArray(array);
87
	}
88
89
	public Object[] toArray(Object source) {
90
		return getSet(source).toArray();
91
	}
92
93
	public final Set getSet(Object source) {
94
		Set set = doGetSet(source);
95
		if (hasListeners(source) && !isUpdating(source)) {
96
			Set cached = (Set) getCached(source);
97
			if (!Util.equals(set, cached)) {
98
				fireSetChange(source, Diffs.computeSetDiff(cached, set));
99
			}
100
		}
101
		return set;
102
	}
103
104
	/**
105
	 * Returns a Set with the current contents of the source's set property
106
	 * 
107
	 * @param source
108
	 *            the property source
109
	 * @return a Set with the current contents of the source's set property
110
	 * @see ISetProperty#getSet(Object)
111
	 */
112
	protected abstract Set doGetSet(Object source);
113
114
	private void setSet(Object source, Set set, SetDiff diff) {
115
		setUpdating(source, true);
116
		try {
117
			doSetSet(source, set, diff);
118
		} finally {
119
			setUpdating(source, false);
120
		}
121
122
		if (hasListeners(source)) {
123
			fireSetChange(source, diff);
124
		}
125
	}
126
127
	/**
128
	 * Updates the property on the source with the specified change. A set
129
	 * change event is fired in the calling method, so implementers do not need
130
	 * to call {@link #fireSetChange(Object, SetDiff)}.
131
	 * 
132
	 * @param source
133
	 *            the property source
134
	 * @param set
135
	 *            the new set
136
	 * @param diff
137
	 *            a diff describing the change
138
	 */
139
	protected abstract void doSetSet(Object source, Set set, SetDiff diff);
140
141
	/**
142
	 * Notifies that the source's property changed. Listeners registered in the
143
	 * {@link #addListenerTo(Object)} method should call this method when a
144
	 * property change is observed on the source object.
145
	 * 
146
	 * @param source
147
	 *            the property source
148
	 * @param diff
149
	 *            a diff describing the set change. If null, a diff will be
150
	 *            computed from the cached state and the current state.
151
	 */
152
	protected final void fireSetChange(Object source, SetDiff diff) {
153
		if (!isUpdating(source) && hasListeners(source)) {
154
			if (diff == null) {
155
				diff = Diffs.computeSetDiff((Set) getCached(source),
156
						doGetSet(source));
157
			}
158
			if (!diff.isEmpty()) {
159
				firePropertyChange(new SetPropertyChangeEvent(source, this,
160
						diff));
161
			}
162
		}
163
	}
164
165
	public boolean add(Object source, Object o) {
166
		Set set = getSet(source);
167
		if (!set.contains(o)) {
168
			set = new HashSet(set);
169
			boolean added = set.add(o);
170
			if (added) {
171
				setSet(source, set, Diffs.createSetDiff(Collections
172
						.singleton(o), Collections.EMPTY_SET));
173
			}
174
			return added;
175
		}
176
		return false;
177
	}
178
179
	public boolean addAll(Object source, Collection c) {
180
		if (c.isEmpty())
181
			return false;
182
183
		Set set = getSet(source);
184
		Set additions = new HashSet();
185
		for (Iterator it = c.iterator(); it.hasNext();) {
186
			Object o = it.next();
187
			if (!set.contains(o)) {
188
				additions.add(o);
189
			}
190
		}
191
		boolean changed = !additions.isEmpty();
192
		if (changed) {
193
			set = new HashSet(set);
194
			set.addAll(additions);
195
196
			setSet(source, set, Diffs.createSetDiff(additions,
197
					Collections.EMPTY_SET));
198
		}
199
		return changed;
200
	}
201
202
	public void clear(Object source) {
203
		if (!isEmpty(source)) {
204
			setSet(source, new HashSet(), Diffs.createSetDiff(
205
					Collections.EMPTY_SET, getSet(source)));
206
		}
207
	}
208
209
	public boolean remove(Object source, Object o) {
210
		Set set = getSet(source);
211
		if (set.contains(o)) {
212
			set = new HashSet(set);
213
			boolean removed = set.remove(o);
214
			if (removed) {
215
				setSet(source, set, Diffs.createSetDiff(Collections.EMPTY_SET,
216
						Collections.singleton(o)));
217
			}
218
			return removed;
219
		}
220
		return false;
221
	}
222
223
	public boolean removeAll(Object source, Collection c) {
224
		if (c.isEmpty())
225
			return false;
226
227
		Set set = new HashSet(getSet(source));
228
		Set removals = new HashSet();
229
		for (Iterator it = set.iterator(); it.hasNext();) {
230
			Object o = it.next();
231
			if (c.contains(o)) {
232
				removals.add(o);
233
				it.remove();
234
			}
235
		}
236
		boolean changed = !removals.isEmpty();
237
		if (changed) {
238
			setSet(source, set, Diffs.createSetDiff(Collections.EMPTY_SET,
239
					removals));
240
		}
241
		return changed;
242
	}
243
244
	public boolean retainAll(Object source, Collection c) {
245
		if (isEmpty(source))
246
			return false;
247
		if (c.isEmpty()) {
248
			clear(source);
249
			return true;
250
		}
251
252
		Set set = new HashSet(getSet(source));
253
		Set removals = new HashSet();
254
		for (Iterator it = set.iterator(); it.hasNext();) {
255
			Object o = it.next();
256
			if (!c.contains(o)) {
257
				removals.add(o);
258
				it.remove();
259
			}
260
		}
261
		boolean changed = !removals.isEmpty();
262
		if (changed) {
263
			setSet(source, set, Diffs.createSetDiff(Collections.EMPTY_SET,
264
					removals));
265
		}
266
		return changed;
267
	}
268
}
(-)src/org/eclipse/core/internal/databinding/observable/PropertyObservableMap.java (+177 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable;
13
14
import java.util.Collection;
15
import java.util.Collections;
16
import java.util.Map;
17
import java.util.Set;
18
19
import org.eclipse.core.databinding.observable.ObservableTracker;
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.map.AbstractObservableMap;
22
import org.eclipse.core.databinding.property.IProperty;
23
import org.eclipse.core.databinding.property.IPropertyObservable;
24
import org.eclipse.core.databinding.property.map.IMapProperty;
25
import org.eclipse.core.databinding.property.map.IMapPropertyChangeListener;
26
import org.eclipse.core.databinding.property.map.MapPropertyChangeEvent;
27
28
/**
29
 * @since 3.3
30
 * 
31
 */
32
public class PropertyObservableMap extends AbstractObservableMap implements
33
		IPropertyObservable {
34
	private Object source;
35
	private IMapProperty property;
36
37
	private volatile boolean updating = false;
38
39
	private boolean disposed = false;
40
41
	private transient volatile int modCount = 0;
42
43
	private IMapPropertyChangeListener listener = new IMapPropertyChangeListener() {
44
		public void handleMapPropertyChange(final MapPropertyChangeEvent event) {
45
			if (!disposed && !updating) {
46
				getRealm().exec(new Runnable() {
47
					public void run() {
48
						getRealm().exec(new Runnable() {
49
							public void run() {
50
								modCount++;
51
								fireMapChange(event.diff);
52
							}
53
						});
54
					}
55
				});
56
			}
57
		}
58
	};
59
60
	/**
61
	 * @param realm
62
	 * @param source
63
	 * @param property
64
	 */
65
	public PropertyObservableMap(Realm realm, Object source,
66
			IMapProperty property) {
67
		super(realm);
68
		this.source = source;
69
		this.property = property;
70
	}
71
72
	private void getterCalled() {
73
		ObservableTracker.getterCalled(this);
74
	}
75
76
	protected void firstListenerAdded() {
77
		if (!disposed) {
78
			property.addMapChangeListener(source, listener);
79
		}
80
	}
81
82
	protected void lastListenerRemoved() {
83
		if (!disposed) {
84
			property.removeMapChangeListener(source, listener);
85
		}
86
	}
87
88
	public boolean containsKey(Object key) {
89
		getterCalled();
90
		return property.containsKey(source, key);
91
	}
92
93
	public boolean containsValue(Object value) {
94
		getterCalled();
95
		return property.containsValue(source, value);
96
	}
97
98
	public Set entrySet() {
99
		getterCalled();
100
		// unmodifiable for now
101
		return Collections.unmodifiableSet(property.getMap(source).entrySet());
102
	}
103
104
	public Object get(Object key) {
105
		getterCalled();
106
		return property.get(source, key);
107
	}
108
109
	public boolean isEmpty() {
110
		getterCalled();
111
		return property.isEmpty(source);
112
	}
113
114
	public Set keySet() {
115
		getterCalled();
116
		return Collections.unmodifiableSet(property.getMap(source).keySet());
117
	}
118
119
	public Object put(Object key, Object value) {
120
		checkRealm();
121
		return property.put(source, key, value);
122
	}
123
124
	public void putAll(Map m) {
125
		checkRealm();
126
		property.putAll(source, m);
127
	}
128
129
	public Object remove(Object key) {
130
		checkRealm();
131
		return property.remove(source, key);
132
	}
133
134
	public int size() {
135
		getterCalled();
136
		return property.size(source);
137
	}
138
139
	public Collection values() {
140
		getterCalled();
141
		return Collections.unmodifiableCollection(property.getMap(source)
142
				.values());
143
	}
144
145
	public void clear() {
146
		getterCalled();
147
		property.clear(source);
148
	}
149
150
	public boolean equals(Object o) {
151
		getterCalled();
152
		return property.equals(source, o);
153
	}
154
155
	public int hashCode() {
156
		getterCalled();
157
		return property.hashCode(source);
158
	}
159
160
	public Object getObserved() {
161
		return source;
162
	}
163
164
	public IProperty getProperty() {
165
		return property;
166
	}
167
168
	public synchronized void dispose() {
169
		if (!disposed) {
170
			disposed = true;
171
			property.removeMapChangeListener(source, listener);
172
			property = null;
173
			source = null;
174
		}
175
		super.dispose();
176
	}
177
}
(-)src/org/eclipse/core/internal/databinding/property/ValuePropertyDetailValue.java (+123 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.Map;
16
17
import org.eclipse.core.databinding.observable.Diffs;
18
import org.eclipse.core.databinding.observable.value.ValueDiff;
19
import org.eclipse.core.databinding.property.value.IValueProperty;
20
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
21
import org.eclipse.core.databinding.property.value.ValueProperty;
22
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
23
24
/**
25
 * @since 1.2
26
 * 
27
 */
28
public class ValuePropertyDetailValue extends ValueProperty implements
29
		IValueProperty {
30
	private IValueProperty masterProperty;
31
	private IValueProperty detailProperty;
32
33
	private Map sourceToDetailListener = new HashMap();
34
35
	private IValuePropertyChangeListener masterListener = new MasterPropertyListener();
36
37
	private class MasterPropertyListener implements
38
			IValuePropertyChangeListener {
39
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
40
			Object oldSource = event.diff.getOldValue();
41
			Object newSource = event.diff.getNewValue();
42
43
			Object oldValue = detailProperty.getValue(oldSource);
44
			Object newValue = detailProperty.getValue(newSource);
45
46
			ValueDiff diff = Diffs.createValueDiff(oldValue, newValue);
47
48
			Object source = event.getSource();
49
50
			removeDetailPropertyListener(source);
51
			addDetailPropertyListener(source);
52
53
			fireValueChange(source, diff);
54
		}
55
	}
56
57
	private class DetailPropertyListener implements
58
			IValuePropertyChangeListener {
59
		private Object source;
60
		private Object masterValue;
61
62
		DetailPropertyListener(Object source, Object masterValue) {
63
			this.source = source;
64
			this.masterValue = masterValue;
65
		}
66
67
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
68
			fireValueChange(source, event.diff);
69
		}
70
	}
71
72
	/**
73
	 * @param masterProperty
74
	 * @param detailProperty
75
	 */
76
	public ValuePropertyDetailValue(IValueProperty masterProperty,
77
			IValueProperty detailProperty) {
78
		this.masterProperty = masterProperty;
79
		this.detailProperty = detailProperty;
80
	}
81
82
	protected void addListenerTo(Object source) {
83
		masterProperty.addValueChangeListener(source, masterListener);
84
		addDetailPropertyListener(source);
85
	}
86
87
	protected void removeListenerFrom(Object source) {
88
		masterProperty.removeValueChangeListener(source, masterListener);
89
		removeDetailPropertyListener(source);
90
	}
91
92
	private void addDetailPropertyListener(Object source) {
93
		Object masterValue = masterProperty.getValue(source);
94
		DetailPropertyListener detailListener = new DetailPropertyListener(
95
				source, masterValue);
96
		detailProperty.addValueChangeListener(masterValue, detailListener);
97
		sourceToDetailListener.put(source, detailListener);
98
	}
99
100
	private void removeDetailPropertyListener(Object source) {
101
		DetailPropertyListener detailListener = (DetailPropertyListener) sourceToDetailListener
102
				.remove(source);
103
		if (detailListener != null) {
104
			detailProperty.removeValueChangeListener(
105
					detailListener.masterValue, detailListener);
106
		}
107
		sourceToDetailListener.remove(source);
108
	}
109
110
	public Object getValue(Object source) {
111
		Object masterValue = masterProperty.getValue(source);
112
		return detailProperty.getValue(masterValue);
113
	}
114
115
	public Object getValueType() {
116
		return detailProperty.getValueType();
117
	}
118
119
	public void setValue(Object source, Object value) {
120
		Object masterValue = masterProperty.getValue(source);
121
		detailProperty.setValue(masterValue, value);
122
	}
123
}
(-)src/org/eclipse/core/internal/databinding/observable/PropertyObservableList.java (+374 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.Collections;
17
import java.util.ConcurrentModificationException;
18
import java.util.Iterator;
19
import java.util.List;
20
import java.util.ListIterator;
21
22
import org.eclipse.core.databinding.observable.ObservableTracker;
23
import org.eclipse.core.databinding.observable.Realm;
24
import org.eclipse.core.databinding.observable.list.AbstractObservableList;
25
import org.eclipse.core.databinding.property.IProperty;
26
import org.eclipse.core.databinding.property.IPropertyObservable;
27
import org.eclipse.core.databinding.property.list.IListProperty;
28
import org.eclipse.core.databinding.property.list.IListPropertyChangeListener;
29
import org.eclipse.core.databinding.property.list.ListPropertyChangeEvent;
30
31
/**
32
 * @since 3.3
33
 * 
34
 */
35
public class PropertyObservableList extends AbstractObservableList implements
36
		IPropertyObservable {
37
	private Object source;
38
	private IListProperty property;
39
40
	private volatile boolean updating = false;
41
42
	private boolean disposed = false;
43
44
	private transient volatile int modCount = 0;
45
46
	private IListPropertyChangeListener listener = new IListPropertyChangeListener() {
47
		public void handleListPropertyChange(final ListPropertyChangeEvent event) {
48
			if (!disposed && !updating) {
49
				getRealm().exec(new Runnable() {
50
					public void run() {
51
						getRealm().exec(new Runnable() {
52
							public void run() {
53
								modCount++;
54
								fireListChange(event.diff);
55
							}
56
						});
57
					}
58
				});
59
			}
60
		}
61
	};
62
63
	/**
64
	 * @param realm
65
	 * @param source
66
	 * @param property
67
	 */
68
	public PropertyObservableList(Realm realm, Object source,
69
			IListProperty property) {
70
		super(realm);
71
		this.source = source;
72
		this.property = property;
73
	}
74
75
	protected void firstListenerAdded() {
76
		if (!disposed) {
77
			property.addListChangeListener(source, listener);
78
		}
79
	}
80
81
	protected void lastListenerRemoved() {
82
		if (!disposed) {
83
			property.removeListChangeListener(source, listener);
84
		}
85
	}
86
87
	private void getterCalled() {
88
		ObservableTracker.getterCalled(this);
89
	}
90
91
	public Object getElementType() {
92
		return property.getElementType();
93
	}
94
95
	// Queries
96
97
	protected int doGetSize() {
98
		return property.size(source);
99
	}
100
101
	public boolean contains(Object o) {
102
		getterCalled();
103
		return property.contains(source, o);
104
	}
105
106
	public boolean containsAll(Collection c) {
107
		getterCalled();
108
		return property.containsAll(source, c);
109
	}
110
111
	public Object get(int index) {
112
		getterCalled();
113
		return property.get(source, index);
114
	}
115
116
	public int indexOf(Object o) {
117
		getterCalled();
118
		return property.indexOf(source, o);
119
	}
120
121
	public boolean isEmpty() {
122
		getterCalled();
123
		return property.isEmpty(source);
124
	}
125
126
	public int lastIndexOf(Object o) {
127
		getterCalled();
128
		return property.lastIndexOf(source, o);
129
	}
130
131
	public Object[] toArray() {
132
		getterCalled();
133
		return property.toArray(source);
134
	}
135
136
	public Object[] toArray(Object[] a) {
137
		getterCalled();
138
		return property.toArray(source, a);
139
	}
140
141
	// Single change operations
142
143
	public boolean add(Object o) {
144
		checkRealm();
145
		return property.add(source, o);
146
	}
147
148
	public Iterator iterator() {
149
		getterCalled();
150
		return new Iterator() {
151
			int lastReturned = -1;
152
			int expectedModCount = modCount;
153
			ListIterator delegate = new ArrayList(property.getList(source))
154
					.listIterator();
155
156
			public boolean hasNext() {
157
				getterCalled();
158
				checkForComodification();
159
				return delegate.hasNext();
160
			}
161
162
			public Object next() {
163
				getterCalled();
164
				checkForComodification();
165
				Object next = delegate.next();
166
				lastReturned = delegate.previousIndex();
167
				return next;
168
			}
169
170
			public void remove() {
171
				checkRealm();
172
				checkForComodification();
173
				if (lastReturned == -1)
174
					throw new IllegalStateException();
175
176
				delegate.remove(); // stay in sync
177
178
				property.remove(source, lastReturned);
179
180
				lastReturned = -1;
181
				expectedModCount = modCount;
182
			}
183
184
			private void checkForComodification() {
185
				if (expectedModCount != modCount)
186
					throw new ConcurrentModificationException();
187
			}
188
		};
189
	}
190
191
	public Object move(int oldIndex, int newIndex) {
192
		getterCalled();
193
		return property.move(source, oldIndex, newIndex);
194
	}
195
196
	public boolean remove(Object o) {
197
		getterCalled();
198
		return property.remove(source, o);
199
	}
200
201
	public void add(int index, Object o) {
202
		getterCalled();
203
		property.add(source, index, o);
204
	}
205
206
	public ListIterator listIterator() {
207
		return listIterator(0);
208
	}
209
210
	public ListIterator listIterator(final int index) {
211
		getterCalled();
212
		return new ListIterator() {
213
			int lastReturned = -1;
214
			int expectedModCount = modCount;
215
			ListIterator delegate = new ArrayList(property.getList(source))
216
					.listIterator(index);
217
218
			public boolean hasNext() {
219
				getterCalled();
220
				checkForComodification();
221
				return delegate.hasNext();
222
			}
223
224
			public int nextIndex() {
225
				getterCalled();
226
				checkForComodification();
227
				return delegate.nextIndex();
228
			}
229
230
			public Object next() {
231
				getterCalled();
232
				checkForComodification();
233
				Object next = delegate.next();
234
				lastReturned = delegate.previousIndex();
235
				return next;
236
			}
237
238
			public boolean hasPrevious() {
239
				getterCalled();
240
				checkForComodification();
241
				return delegate.hasPrevious();
242
			}
243
244
			public int previousIndex() {
245
				getterCalled();
246
				checkForComodification();
247
				return delegate.previousIndex();
248
			}
249
250
			public Object previous() {
251
				getterCalled();
252
				checkForComodification();
253
				Object previous = delegate.previous();
254
				lastReturned = delegate.nextIndex();
255
				return previous;
256
			}
257
258
			public void add(Object o) {
259
				checkRealm();
260
				checkForComodification();
261
				int index = delegate.nextIndex();
262
263
				delegate.add(o); // keep in sync
264
265
				property.add(source, index, o);
266
267
				lastReturned = -1;
268
				expectedModCount = modCount;
269
			}
270
271
			public void set(Object o) {
272
				checkRealm();
273
				checkForComodification();
274
275
				delegate.set(o);
276
277
				property.set(source, lastReturned, o);
278
279
				expectedModCount = modCount;
280
			}
281
282
			public void remove() {
283
				checkRealm();
284
				checkForComodification();
285
				if (lastReturned == -1)
286
					throw new IllegalStateException();
287
288
				delegate.remove(); // keep in sync
289
290
				property.remove(source, lastReturned);
291
292
				lastReturned = -1;
293
				expectedModCount = modCount;
294
			}
295
296
			private void checkForComodification() {
297
				if (expectedModCount != modCount)
298
					throw new ConcurrentModificationException();
299
			}
300
301
		};
302
	}
303
304
	public Object remove(int index) {
305
		getterCalled();
306
		return property.remove(source, index);
307
	}
308
309
	public Object set(int index, Object o) {
310
		getterCalled();
311
		return property.set(source, index, o);
312
	}
313
314
	public List subList(int fromIndex, int toIndex) {
315
		getterCalled();
316
		return Collections.unmodifiableList(property.getList(source).subList(
317
				fromIndex, toIndex));
318
	}
319
320
	// Bulk change operations
321
322
	public boolean addAll(Collection c) {
323
		getterCalled();
324
		return property.addAll(source, c);
325
	}
326
327
	public boolean addAll(int index, Collection c) {
328
		getterCalled();
329
		return property.addAll(source, index, c);
330
	}
331
332
	public boolean removeAll(Collection c) {
333
		getterCalled();
334
		return property.removeAll(source, c);
335
	}
336
337
	public boolean retainAll(Collection c) {
338
		getterCalled();
339
		return property.retainAll(source, c);
340
	}
341
342
	public void clear() {
343
		getterCalled();
344
		property.clear(source);
345
	}
346
347
	public boolean equals(Object o) {
348
		getterCalled();
349
		return property.equals(source, o);
350
	}
351
352
	public int hashCode() {
353
		getterCalled();
354
		return property.hashCode(source);
355
	}
356
357
	public Object getObserved() {
358
		return source;
359
	}
360
361
	public IProperty getProperty() {
362
		return property;
363
	}
364
365
	public synchronized void dispose() {
366
		if (!disposed) {
367
			disposed = true;
368
			property.removeListChangeListener(source, listener);
369
			property = null;
370
			source = null;
371
		}
372
		super.dispose();
373
	}
374
}
(-)src/org/eclipse/core/internal/databinding/observable/masterdetail/MapValuePropertyObservableMap.java (+323 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable.masterdetail;
13
14
import java.util.AbstractSet;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.IdentityHashMap;
18
import java.util.Iterator;
19
import java.util.Map;
20
import java.util.Set;
21
22
import org.eclipse.core.databinding.observable.Diffs;
23
import org.eclipse.core.databinding.observable.IObserving;
24
import org.eclipse.core.databinding.observable.IStaleListener;
25
import org.eclipse.core.databinding.observable.ObservableTracker;
26
import org.eclipse.core.databinding.observable.StaleEvent;
27
import org.eclipse.core.databinding.observable.map.AbstractObservableMap;
28
import org.eclipse.core.databinding.observable.map.IMapChangeListener;
29
import org.eclipse.core.databinding.observable.map.IObservableMap;
30
import org.eclipse.core.databinding.observable.map.MapChangeEvent;
31
import org.eclipse.core.databinding.property.value.IValueProperty;
32
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
33
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
34
import org.eclipse.core.internal.databinding.Util;
35
36
/**
37
 * @since 3.3
38
 * 
39
 */
40
public class MapValuePropertyObservableMap extends AbstractObservableMap
41
		implements IObserving {
42
	private IObservableMap map;
43
	private IValueProperty property;
44
45
	private Map keyToMasterValueListener;
46
47
	private boolean updating = false;
48
	private boolean disposed = false;
49
50
	private IMapChangeListener mapListener = new IMapChangeListener() {
51
		public void handleMapChange(final MapChangeEvent event) {
52
			if (!updating && !disposed) {
53
				getRealm().exec(new Runnable() {
54
					public void run() {
55
						Map oldValues = new HashMap();
56
						Map newValues = new HashMap();
57
58
						Set addedKeys = event.diff.getAddedKeys();
59
						for (Iterator it = addedKeys.iterator(); it.hasNext();) {
60
							Object key = it.next();
61
							Object newSource = event.diff.getNewValue(key);
62
							Object newValue = property.getValue(newSource);
63
							newValues.put(key, newValue);
64
							addPropertySourceListener(key, newSource);
65
						}
66
67
						Set removedKeys = event.diff.getRemovedKeys();
68
						for (Iterator it = removedKeys.iterator(); it.hasNext();) {
69
							Object key = it.next();
70
							Object oldSource = event.diff.getOldValue(key);
71
							Object oldValue = property.getValue(oldSource);
72
							oldValues.put(key, oldValue);
73
							removePropertySourceListener(key, oldSource);
74
						}
75
76
						Set changedKeys = new HashSet(event.diff
77
								.getChangedKeys());
78
						for (Iterator it = changedKeys.iterator(); it.hasNext();) {
79
							Object key = it.next();
80
81
							Object oldSource = event.diff.getOldValue(key);
82
							Object newSource = event.diff.getNewValue(key);
83
84
							Object oldValue = property.getValue(oldSource);
85
							Object newValue = property.getValue(newSource);
86
87
							if (Util.equals(oldValue, newValue)) {
88
								it.remove();
89
							} else {
90
								oldValues.put(key, oldValue);
91
								newValues.put(key, newValue);
92
							}
93
94
							removePropertySourceListener(key, oldSource);
95
							addPropertySourceListener(key, newSource);
96
						}
97
98
						fireMapChange(Diffs.createMapDiff(addedKeys,
99
								removedKeys, changedKeys, oldValues, newValues));
100
					}
101
				});
102
			}
103
		}
104
	};
105
106
	private IStaleListener staleListener = new IStaleListener() {
107
		public void handleStale(StaleEvent staleEvent) {
108
			fireStale();
109
		}
110
	};
111
112
	/**
113
	 * @param map
114
	 * @param valueProperty
115
	 */
116
	public MapValuePropertyObservableMap(IObservableMap map,
117
			IValueProperty valueProperty) {
118
		super(map.getRealm());
119
		this.map = map;
120
		this.property = valueProperty;
121
122
		this.keyToMasterValueListener = new IdentityHashMap();
123
	}
124
125
	private class ValuePropertySourceChangeListener implements
126
			IValuePropertyChangeListener {
127
		private final Object key;
128
129
		public ValuePropertySourceChangeListener(Object key) {
130
			this.key = key;
131
		}
132
133
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
134
			Object oldSource = event.diff.getOldValue();
135
			Object oldValue = property.getValue(oldSource);
136
			property.removeValueChangeListener(oldSource, this);
137
138
			Object newSource = event.diff.getNewValue();
139
			Object newValue = property.getValue(newSource);
140
			property.addValueChangeListener(newSource, this);
141
142
			if (!Util.equals(oldValue, newValue))
143
				fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue,
144
						newValue));
145
		}
146
	}
147
148
	protected void firstListenerAdded() {
149
		if (!disposed) {
150
			map.addMapChangeListener(mapListener);
151
			map.addStaleListener(staleListener);
152
			for (Iterator iterator = map.entrySet().iterator(); iterator
153
					.hasNext();) {
154
				Map.Entry entry = (Map.Entry) iterator.next();
155
				Object key = entry.getKey();
156
				Object masterValue = entry.getValue();
157
158
				addPropertySourceListener(key, masterValue);
159
			}
160
		}
161
	}
162
163
	protected void lastListenerRemoved() {
164
		if (!disposed) {
165
			map.removeMapChangeListener(mapListener);
166
			map.removeStaleListener(staleListener);
167
			for (Iterator iterator = map.entrySet().iterator(); iterator
168
					.hasNext();) {
169
				Map.Entry entry = (Map.Entry) iterator.next();
170
				Object key = entry.getKey();
171
				Object propertySource = entry.getValue();
172
173
				removePropertySourceListener(key, propertySource);
174
			}
175
		}
176
	}
177
178
	private void addPropertySourceListener(Object key, Object propertySource) {
179
		IValuePropertyChangeListener propertyListener = new ValuePropertySourceChangeListener(
180
				key);
181
		property.addValueChangeListener(propertySource, propertyListener);
182
		keyToMasterValueListener.put(key, propertyListener);
183
	}
184
185
	private void removePropertySourceListener(Object key, Object propertySource) {
186
		IValuePropertyChangeListener propertyListener = (IValuePropertyChangeListener) keyToMasterValueListener
187
				.remove(key);
188
		if (propertyListener != null) {
189
			property
190
					.removeValueChangeListener(propertySource, propertyListener);
191
		}
192
	}
193
194
	protected Object doGet(Object key) {
195
		if (!map.containsKey(key))
196
			return null;
197
		return property.getValue(map.get(key));
198
	}
199
200
	protected Object doPut(Object key, Object value) {
201
		if (!map.containsKey(key))
202
			return null;
203
		Object source = map.get(key);
204
205
		Object oldValue = property.getValue(source);
206
207
		updating = true;
208
		try {
209
			property.setValue(source, value);
210
		} finally {
211
			updating = false;
212
		}
213
214
		Object newValue = property.getValue(source);
215
216
		if (!Util.equals(oldValue, newValue)) {
217
			fireMapChange(Diffs.createMapDiffSingleChange(key, oldValue,
218
					newValue));
219
		}
220
221
		return oldValue;
222
	}
223
224
	private Set entrySet;
225
226
	public Set entrySet() {
227
		getterCalled();
228
		if (entrySet == null)
229
			entrySet = new EntrySet();
230
		return entrySet;
231
	}
232
233
	class EntrySet extends AbstractSet {
234
		public Iterator iterator() {
235
			return new Iterator() {
236
				Iterator it = map.entrySet().iterator();
237
238
				public boolean hasNext() {
239
					getterCalled();
240
					return it.hasNext();
241
				}
242
243
				public Object next() {
244
					getterCalled();
245
					Map.Entry next = (Map.Entry) it.next();
246
					return new MapEntry(next.getKey());
247
				}
248
249
				public void remove() {
250
					it.remove();
251
				}
252
			};
253
		}
254
255
		public int size() {
256
			return map.size();
257
		}
258
	}
259
260
	class MapEntry implements Map.Entry {
261
		private Object key;
262
263
		MapEntry(Object key) {
264
			this.key = key;
265
		}
266
267
		public Object getKey() {
268
			getterCalled();
269
			return key;
270
		}
271
272
		public Object getValue() {
273
			getterCalled();
274
			return get(key);
275
		}
276
277
		public Object setValue(Object value) {
278
			return put(key, value);
279
		}
280
281
		public boolean equals(Object o) {
282
			getterCalled();
283
			if (o == this)
284
				return true;
285
			if (o == null)
286
				return false;
287
			if (!(o instanceof Map.Entry))
288
				return false;
289
			Map.Entry that = (Map.Entry) o;
290
			return Util.equals(this.getKey(), that.getKey())
291
					&& Util.equals(this.getValue(), that.getValue());
292
		}
293
294
		public int hashCode() {
295
			getterCalled();
296
			Object value = getValue();
297
			return (key == null ? 0 : key.hashCode())
298
					^ (value == null ? 0 : value.hashCode());
299
		}
300
	}
301
302
	public boolean isStale() {
303
		getterCalled();
304
		return map.isStale();
305
	}
306
307
	private void getterCalled() {
308
		ObservableTracker.getterCalled(this);
309
	}
310
311
	public Object getObserved() {
312
		return map;
313
	}
314
315
	public synchronized void dispose() {
316
		if (!disposed) {
317
			disposed = true;
318
			property = null;
319
		}
320
321
		super.dispose();
322
	}
323
}
(-)src/org/eclipse/core/internal/databinding/property/ValuePropertyDetailSet.java (+150 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.Collection;
15
import java.util.HashMap;
16
import java.util.Map;
17
import java.util.Set;
18
19
import org.eclipse.core.databinding.observable.Diffs;
20
import org.eclipse.core.databinding.observable.set.SetDiff;
21
import org.eclipse.core.databinding.property.set.ISetProperty;
22
import org.eclipse.core.databinding.property.set.ISetPropertyChangeListener;
23
import org.eclipse.core.databinding.property.set.SetProperty;
24
import org.eclipse.core.databinding.property.set.SetPropertyChangeEvent;
25
import org.eclipse.core.databinding.property.value.IValueProperty;
26
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
27
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
28
29
/**
30
 * @since 3.3
31
 * 
32
 */
33
public class ValuePropertyDetailSet extends SetProperty {
34
	private final IValueProperty masterProperty;
35
	private final ISetProperty detailProperty;
36
37
	private Map sourceToDetailListener = new HashMap();
38
39
	private IValuePropertyChangeListener masterListener = new MasterPropertyListener();
40
41
	private class MasterPropertyListener implements
42
			IValuePropertyChangeListener {
43
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
44
			Object oldSource = event.diff.getOldValue();
45
			Object newSource = event.diff.getNewValue();
46
47
			Set oldSet = detailProperty.getSet(oldSource);
48
			Set newSet = detailProperty.getSet(newSource);
49
			SetDiff diff = Diffs.computeSetDiff(oldSet, newSet);
50
51
			Object source = event.getSource();
52
53
			removeDetailPropertyListener(source);
54
			addDetailPropertyListener(source);
55
56
			fireSetChange(source, diff);
57
		}
58
	}
59
60
	private class DetailPropertyListener implements ISetPropertyChangeListener {
61
		private Object source;
62
		private Object masterValue;
63
64
		DetailPropertyListener(Object source, Object masterValue) {
65
			this.source = source;
66
			this.masterValue = masterValue;
67
		}
68
69
		public void handleSetPropertyChange(SetPropertyChangeEvent event) {
70
			fireSetChange(source, event.diff);
71
		}
72
	}
73
74
	/**
75
	 * @param masterProperty
76
	 * @param detailProperty
77
	 */
78
	public ValuePropertyDetailSet(IValueProperty masterProperty,
79
			ISetProperty detailProperty) {
80
		this.masterProperty = masterProperty;
81
		this.detailProperty = detailProperty;
82
	}
83
84
	protected void addListenerTo(Object source) {
85
		masterProperty.addValueChangeListener(source, masterListener);
86
		addDetailPropertyListener(source);
87
	}
88
89
	protected void removeListenerFrom(Object source) {
90
		masterProperty.removeValueChangeListener(source, masterListener);
91
		removeDetailPropertyListener(source);
92
	}
93
94
	private void addDetailPropertyListener(Object source) {
95
		Object masterValue = masterProperty.getValue(source);
96
		DetailPropertyListener detailListener = new DetailPropertyListener(
97
				source, masterValue);
98
		detailProperty.addSetChangeListener(masterValue, detailListener);
99
		sourceToDetailListener.put(source, detailListener);
100
	}
101
102
	private void removeDetailPropertyListener(Object source) {
103
		DetailPropertyListener detailListener = (DetailPropertyListener) sourceToDetailListener
104
				.remove(source);
105
		if (detailListener != null) {
106
			detailProperty.removeSetChangeListener(detailListener.masterValue,
107
					detailListener);
108
		}
109
		sourceToDetailListener.remove(source);
110
	}
111
112
	public Set getSet(Object source) {
113
		Object masterValue = masterProperty.getValue(source);
114
		return detailProperty.getSet(masterValue);
115
	}
116
117
	public boolean add(Object source, Object o) {
118
		Object masterValue = masterProperty.getValue(source);
119
		return detailProperty.add(masterValue, o);
120
	}
121
122
	public boolean addAll(Object source, Collection c) {
123
		Object masterValue = masterProperty.getValue(source);
124
		return detailProperty.addAll(masterValue, c);
125
	}
126
127
	public void clear(Object source) {
128
		Object masterValue = masterProperty.getValue(source);
129
		detailProperty.clear(masterValue);
130
	}
131
132
	public Object getElementType() {
133
		return detailProperty.getElementType();
134
	}
135
136
	public boolean remove(Object source, Object o) {
137
		Object masterValue = masterProperty.getValue(source);
138
		return detailProperty.remove(masterValue, o);
139
	}
140
141
	public boolean removeAll(Object source, Collection c) {
142
		Object masterValue = masterProperty.getValue(source);
143
		return detailProperty.removeAll(masterValue, c);
144
	}
145
146
	public boolean retainAll(Object source, Collection c) {
147
		Object masterValue = masterProperty.getValue(source);
148
		return detailProperty.retainAll(masterValue, c);
149
	}
150
}
(-)src/org/eclipse/core/databinding/property/value/ValueProperty.java (+44 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.value;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.core.databinding.property.Property;
16
17
/**
18
 * Abstract implementation of IValueProperty.
19
 * 
20
 * @since 1.2
21
 */
22
public abstract class ValueProperty extends Property implements IValueProperty {
23
	public final void addValueChangeListener(Object source,
24
			IValuePropertyChangeListener listener) {
25
		addPropertyChangeListener(source, listener);
26
	}
27
28
	public final void removeValueChangeListener(Object source,
29
			IValuePropertyChangeListener listener) {
30
		removePropertyChangeListener(source, listener);
31
	}
32
33
	/**
34
	 * Fires a ValuePropertyChangeEvent with the given source and diff
35
	 * 
36
	 * @param source
37
	 *            the property source
38
	 * @param diff
39
	 *            the value diff
40
	 */
41
	protected final void fireValueChange(Object source, ValueDiff diff) {
42
		firePropertyChange(new ValuePropertyChangeEvent(source, this, diff));
43
	}
44
}
(-)src/org/eclipse/core/databinding/property/Properties.java (+200 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import org.eclipse.core.databinding.property.list.IListProperty;
15
import org.eclipse.core.databinding.property.map.IMapProperty;
16
import org.eclipse.core.databinding.property.set.ISetProperty;
17
import org.eclipse.core.databinding.property.value.IValueProperty;
18
import org.eclipse.core.internal.databinding.property.ListPropertyDetailValueList;
19
import org.eclipse.core.internal.databinding.property.MapPropertyDetailValueMap;
20
import org.eclipse.core.internal.databinding.property.SetPropertyDetailValueMap;
21
import org.eclipse.core.internal.databinding.property.ValuePropertyDetailList;
22
import org.eclipse.core.internal.databinding.property.ValuePropertyDetailMap;
23
import org.eclipse.core.internal.databinding.property.ValuePropertyDetailSet;
24
import org.eclipse.core.internal.databinding.property.ValuePropertyDetailValue;
25
26
/**
27
 * A factory for chaining properties together to create nested properties.
28
 * <p>
29
 * Example: Suppose class <code>A</code> has a property <code>b</code> of type
30
 * <code>B</code>, and that class <code>B</code> has a property <code>c</code>
31
 * of type <code>C</code>:
32
 * 
33
 * <pre>
34
 * A a = new A();
35
 * B b = a.getB();
36
 * IValueProperty ab = BeanProperties.valueProperty(A.class, &quot;b&quot;);
37
 * assertTrue(ab.getValue(a) == b);
38
 * 
39
 * IValueProperty bc = BeanProperties.valueProperty(B.class, &quot;c&quot;);
40
 * C c = b.getC();
41
 * assertTrue(bc.getValue(b) == c);
42
 * </pre>
43
 * 
44
 * Using Properties, the <code>ab</code> and <code>bc</code>
45
 * properties may be combined to form a nested <code>abc</code> property:
46
 * 
47
 * <pre>
48
 * IValueProperty abc = Properties.detailValue(ab, bc)
49
 * assertTrue(abc.getValue(a) == c);
50
 * </pre>
51
 * 
52
 * @since 1.2
53
 */
54
public class Properties {
55
	// Properties of IValueProperty properties
56
57
	/**
58
	 * Returns the nested combination of the master value and detail value
59
	 * properties. Value modifications made through the returned property are
60
	 * delegated to the detail property, using the value of the master property
61
	 * as the source.
62
	 * 
63
	 * @param masterValue
64
	 *            the master property
65
	 * @param detailValue
66
	 *            the detail property
67
	 * @return the nested combination of the master and detail properties
68
	 */
69
	public static IValueProperty detailValue(IValueProperty masterValue,
70
			IValueProperty detailValue) {
71
		return new ValuePropertyDetailValue(masterValue, detailValue);
72
	}
73
74
	/**
75
	 * Returns the nested combination of the master value and detail list
76
	 * properties. List modifications made through the returned property are
77
	 * delegated to the detail property, using the value of the master property
78
	 * as the source.
79
	 * 
80
	 * @param masterValue
81
	 *            the master property
82
	 * @param detailList
83
	 *            the detail property
84
	 * @return the nested combination of the master value and detail list
85
	 *         properties
86
	 */
87
	public static IListProperty detailList(IValueProperty masterValue,
88
			IListProperty detailList) {
89
		return new ValuePropertyDetailList(masterValue, detailList);
90
	}
91
92
	/**
93
	 * Returns the nested combination of the master value and detail set
94
	 * properties. Set modifications made through the returned property are
95
	 * delegated to the detail property, using the value of the master property
96
	 * as the source.
97
	 * 
98
	 * @param masterValue
99
	 *            the master property
100
	 * @param detailSet
101
	 *            the detail property
102
	 * @return the nested combination of the master value and detail set
103
	 *         properties
104
	 */
105
	public static ISetProperty detailSet(IValueProperty masterValue,
106
			ISetProperty detailSet) {
107
		return new ValuePropertyDetailSet(masterValue, detailSet);
108
	}
109
110
	/**
111
	 * Returns the nested combination of the master value and detail map
112
	 * properties. Map modifications made through the returned property are
113
	 * delegated to the detail property, using the value of the master property
114
	 * as the source.
115
	 * 
116
	 * @param masterValue
117
	 *            the master property
118
	 * @param detailMap
119
	 *            the detail property
120
	 * @return the nested combination of the master value and detial map
121
	 *         properties
122
	 */
123
	public static IMapProperty detailMap(IValueProperty masterValue,
124
			IMapProperty detailMap) {
125
		return new ValuePropertyDetailMap(masterValue, detailMap);
126
	}
127
128
	// Properties of IListProperty master properties
129
130
	/**
131
	 * Returns the nested combination of the master list and detail value
132
	 * properties. Note that because this property is a projection of value
133
	 * properties over a list, the only modification supported is through the
134
	 * {@link IValueProperty#setValue(Object, Object)} method. Modifications
135
	 * made through the returned property are delegated to the detail property,
136
	 * using the corresponding list element from the master property as the
137
	 * source.
138
	 * 
139
	 * @param masterList
140
	 *            the master property
141
	 * @param detailValue
142
	 *            the detail property
143
	 * @return the nested combination of the master list and detail value
144
	 *         properties
145
	 */
146
	public static IListProperty detailValues(IListProperty masterList,
147
			IValueProperty detailValue) {
148
		return new ListPropertyDetailValueList(masterList, detailValue);
149
	}
150
151
	// Properties of ISetProperty master properties
152
153
	/**
154
	 * Returns the nested combination of the master set and detail value
155
	 * properties. Note that because this property is a projection of value
156
	 * properties over a set, the only modifications supported are through the
157
	 * {@link IMapProperty#put(Object, Object, Object)} and
158
	 * {@link IMapProperty#putAll(Object, java.util.Map)} methods. In the latter
159
	 * case, this property does not put entries for keys not already in the
160
	 * master key set. Modifications made through the returned property are
161
	 * delegated to the detail property, using the corresponding set element
162
	 * from the master property as the source.
163
	 * 
164
	 * @param masterKeySet
165
	 *            the master property
166
	 * @param detailValues
167
	 *            the detail property
168
	 * @return the nested combination of the master set and detail value
169
	 *         properties
170
	 */
171
	public static IMapProperty detailValues(ISetProperty masterKeySet,
172
			IValueProperty detailValues) {
173
		return new SetPropertyDetailValueMap(masterKeySet, detailValues);
174
	}
175
176
	// Properties of IMapProperty master properties
177
178
	/**
179
	 * Returns the nested combination of the master map and detail value
180
	 * properties. Note that because this property is a projection of value
181
	 * properties over a values collection, the only modifications supported are
182
	 * through the {@link IMapProperty#put(Object, Object, Object)} and
183
	 * {@link IMapProperty#putAll(Object, java.util.Map)} methods. In the latter
184
	 * case, this property does not entries for keys not already contained in
185
	 * the master map's key set. Modifications made through the returned
186
	 * property are delegated to the detail property, using the corresponding
187
	 * entry value from the master property as the source.
188
	 * 
189
	 * @param masterMap
190
	 *            the master property
191
	 * @param detailValues
192
	 *            the detail property
193
	 * @return the nested combination of the master map and detail value
194
	 *         properties.
195
	 */
196
	public static IMapProperty detailValues(IMapProperty masterMap,
197
			IValueProperty detailValues) {
198
		return new MapPropertyDetailValueMap(masterMap, detailValues);
199
	}
200
}
(-)src/org/eclipse/core/databinding/property/map/IMapProperty.java (+197 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.map;
13
14
import java.util.Map;
15
16
import org.eclipse.core.databinding.property.IProperty;
17
18
/**
19
 * Interface for map-typed properties
20
 * 
21
 * @since 1.2
22
 * @noimplement This interface is not intended to be implemented by clients.
23
 */
24
public interface IMapProperty extends IProperty {
25
	/**
26
	 * Returns the element type of the map's key set or <code>null</code> if the
27
	 * key set is untyped.
28
	 * 
29
	 * @return the element type of the map's key set or <code>null</code> if the
30
	 *         key set is untyped.
31
	 */
32
	public Object getKeyType();
33
34
	/**
35
	 * Returns the element type of the map's values collection or
36
	 * <code>null</code> if the collection is untyped.
37
	 * 
38
	 * @return the element type of the map's values collection or
39
	 *         <code>null</code> if the collection is untyped.
40
	 */
41
	public Object getValueType();
42
43
	/**
44
	 * Returns a Map with the current contents of the source's map property
45
	 * 
46
	 * @param source
47
	 *            the property source
48
	 * @return a Map with the current contents of the source's map property
49
	 */
50
	Map getMap(Object source);
51
52
	/**
53
	 * Returns the size of the source's map property
54
	 * 
55
	 * @param source
56
	 *            the property source
57
	 * @return the size of the source's map property
58
	 */
59
	int size(Object source);
60
61
	/**
62
	 * Returns whether the source's map property is empty
63
	 * 
64
	 * @param source
65
	 *            the property source
66
	 * @return whether the source's map property is empty
67
	 */
68
	boolean isEmpty(Object source);
69
70
	/**
71
	 * Returns whether the specified key is contained in the key set of the
72
	 * source's map property
73
	 * 
74
	 * @param source
75
	 *            the property source
76
	 * @param key
77
	 *            the key
78
	 * @return whether the specified key is contained in the key set of the
79
	 *         source's map property
80
	 */
81
	boolean containsKey(Object source, Object key);
82
83
	/**
84
	 * Returns whether the specified value is contains in the values collection
85
	 * of the source's map property
86
	 * 
87
	 * @param source
88
	 *            the property source
89
	 * @param value
90
	 *            the value
91
	 * @return whether the specified value is contains in the values collection
92
	 *         of the source's map property
93
	 */
94
	boolean containsValue(Object source, Object value);
95
96
	/**
97
	 * Returns the value associated with the specified key in the source's map
98
	 * property
99
	 * 
100
	 * @param source
101
	 *            the property source
102
	 * @param key
103
	 *            the key
104
	 * @return the value associated with the specified key in the source's map
105
	 *         property
106
	 */
107
	Object get(Object source, Object key);
108
109
	/**
110
	 * Associates the specified value with the specified key in the source's map
111
	 * property
112
	 * 
113
	 * @param source
114
	 *            the property source
115
	 * @param key
116
	 *            the key
117
	 * @param value
118
	 *            the value
119
	 * @return the value that was previously associated with the given key in
120
	 *         the source's map property
121
	 */
122
	Object put(Object source, Object key, Object value);
123
124
	/**
125
	 * Removes the mapping for the specified key from the source's map property
126
	 * 
127
	 * @param source
128
	 *            the property source
129
	 * @param key
130
	 *            the key
131
	 * @return the value that was previously associated with the specified key
132
	 *         in the source's map property, or null if no such mapping exists
133
	 */
134
	Object remove(Object source, Object key);
135
136
	/**
137
	 * Adds all mappings in the specified map to the source's map property.
138
	 * 
139
	 * @param source
140
	 *            the property source
141
	 * @param t
142
	 *            the map
143
	 */
144
	void putAll(Object source, Map t);
145
146
	/**
147
	 * Removes all mapping from the source's map property
148
	 * 
149
	 * @param source
150
	 *            the property source
151
	 */
152
	void clear(Object source);
153
154
	/**
155
	 * Returns whether the source's map property is equal to the argument
156
	 * 
157
	 * @param source
158
	 *            the property source
159
	 * @param o
160
	 *            the object to test for equality
161
	 * @return whether the source's map property is equal to the argument
162
	 */
163
	boolean equals(Object source, Object o);
164
165
	/**
166
	 * Returns the hash code of the source's map property
167
	 * 
168
	 * @param source
169
	 *            the property source
170
	 * @return the hash code of the source's map property
171
	 */
172
	int hashCode(Object source);
173
174
	/**
175
	 * Adds the given map property change listener to the list of listeners for
176
	 * the given source.
177
	 * 
178
	 * @param source
179
	 *            the property source
180
	 * @param listener
181
	 *            the listener
182
	 */
183
	public void addMapChangeListener(Object source,
184
			IMapPropertyChangeListener listener);
185
186
	/**
187
	 * Removes the given map property change listener from the list of listeners
188
	 * for the given source.
189
	 * 
190
	 * @param source
191
	 *            the property source
192
	 * @param listener
193
	 *            the listener
194
	 */
195
	public void removeMapChangeListener(Object source,
196
			IMapPropertyChangeListener listener);
197
}
(-)src/org/eclipse/core/internal/databinding/property/MapPropertyDetailValueMap.java (+231 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Iterator;
17
import java.util.Map;
18
import java.util.Set;
19
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.map.MapDiff;
22
import org.eclipse.core.databinding.property.map.IMapProperty;
23
import org.eclipse.core.databinding.property.map.IMapPropertyChangeListener;
24
import org.eclipse.core.databinding.property.map.MapProperty;
25
import org.eclipse.core.databinding.property.map.MapPropertyChangeEvent;
26
import org.eclipse.core.databinding.property.value.IValueProperty;
27
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
28
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
29
import org.eclipse.core.internal.databinding.Util;
30
31
/**
32
 * @since 3.3
33
 * 
34
 */
35
public class MapPropertyDetailValueMap extends MapProperty {
36
	private final IMapProperty masterProperty;
37
	private final IValueProperty detailProperty;
38
39
	private Map sourceToKeyToDetailListener = new HashMap();
40
41
	private IMapPropertyChangeListener masterListener = new MasterPropertyListener();
42
43
	private class MasterPropertyListener implements IMapPropertyChangeListener {
44
		public void handleMapPropertyChange(final MapPropertyChangeEvent event) {
45
			Object source = event.getSource();
46
47
			Map oldValues = new HashMap();
48
			Map newValues = new HashMap();
49
50
			Set addedKeys = event.diff.getAddedKeys();
51
			for (Iterator it = addedKeys.iterator(); it.hasNext();) {
52
				Object key = it.next();
53
				Object newMasterValue = event.diff.getNewValue(key);
54
				Object newDetailValue = detailProperty.getValue(newMasterValue);
55
				newValues.put(key, newDetailValue);
56
				addPropertySourceListener(source, key, newMasterValue);
57
			}
58
59
			Set removedKeys = event.diff.getRemovedKeys();
60
			for (Iterator it = removedKeys.iterator(); it.hasNext();) {
61
				Object key = it.next();
62
				Object oldMasterValue = event.diff.getOldValue(key);
63
				Object oldDetailValue = detailProperty.getValue(oldMasterValue);
64
				oldValues.put(key, oldDetailValue);
65
				removePropertySourceListener(source, key, oldMasterValue);
66
			}
67
68
			Set changedKeys = new HashSet(event.diff.getChangedKeys());
69
			for (Iterator it = changedKeys.iterator(); it.hasNext();) {
70
				Object key = it.next();
71
72
				Object oldMasterValue = event.diff.getOldValue(key);
73
				Object newMasterValue = event.diff.getNewValue(key);
74
75
				Object oldDetailValue = detailProperty.getValue(oldMasterValue);
76
				Object newDetailValue = detailProperty.getValue(newMasterValue);
77
78
				if (Util.equals(oldDetailValue, newDetailValue)) {
79
					it.remove();
80
				} else {
81
					oldValues.put(key, oldDetailValue);
82
					newValues.put(key, newDetailValue);
83
				}
84
85
				removePropertySourceListener(source, key, oldMasterValue);
86
				addPropertySourceListener(source, key, newMasterValue);
87
			}
88
89
			MapDiff diff = Diffs.createMapDiff(addedKeys, removedKeys,
90
					changedKeys, oldValues, newValues);
91
92
			fireMapChange(source, diff);
93
		}
94
95
		private void addPropertySourceListener(Object source, Object key,
96
				Object masterValue) {
97
			Map keyToDetailListener = (Map) sourceToKeyToDetailListener
98
					.get(source);
99
			if (keyToDetailListener == null) {
100
				sourceToKeyToDetailListener.put(source,
101
						keyToDetailListener = new HashMap());
102
			}
103
			if (!keyToDetailListener.containsKey(key)) {
104
				DetailPropertyListener detailListener = new DetailPropertyListener(
105
						source, key);
106
				detailProperty.addValueChangeListener(masterValue,
107
						detailListener);
108
				keyToDetailListener.put(key, detailListener);
109
			}
110
		}
111
112
		private void removePropertySourceListener(Object source, Object key,
113
				Object masterValue) {
114
			Map keyToDetailListener = (Map) sourceToKeyToDetailListener
115
					.get(source);
116
			if (keyToDetailListener != null
117
					&& keyToDetailListener.containsKey(key)) {
118
				DetailPropertyListener detailListener = (DetailPropertyListener) keyToDetailListener
119
						.remove(key);
120
				detailProperty.removeValueChangeListener(masterValue,
121
						detailListener);
122
			}
123
		}
124
	}
125
126
	private class DetailPropertyListener implements
127
			IValuePropertyChangeListener {
128
		private Object source;
129
		private Object key;
130
131
		DetailPropertyListener(Object source, Object key) {
132
			this.source = source;
133
			this.key = key;
134
		}
135
136
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
137
			fireMapChange(source, Diffs.createMapDiffSingleChange(key,
138
					event.diff.getOldValue(), event.diff.getNewValue()));
139
		}
140
	}
141
142
	/**
143
	 * @param masterProperty
144
	 * @param detailProperty
145
	 */
146
	public MapPropertyDetailValueMap(IMapProperty masterProperty,
147
			IValueProperty detailProperty) {
148
		this.masterProperty = masterProperty;
149
		this.detailProperty = detailProperty;
150
	}
151
152
	protected void addListenerTo(Object source) {
153
		masterProperty.addMapChangeListener(source, masterListener);
154
155
		Map keyToDetailListener = new HashMap();
156
		for (Iterator it = masterProperty.getMap(source).entrySet().iterator(); it
157
				.hasNext();) {
158
			Map.Entry entry = (Map.Entry) it.next();
159
			Object key = entry.getKey();
160
			Object masterValue = entry.getValue();
161
			DetailPropertyListener detailListener = new DetailPropertyListener(
162
					source, key);
163
			detailProperty.addValueChangeListener(masterValue, detailListener);
164
			keyToDetailListener.put(masterValue, detailListener);
165
		}
166
167
		sourceToKeyToDetailListener.put(source, keyToDetailListener);
168
	}
169
170
	protected void removeListenerFrom(Object source) {
171
		masterProperty.removeMapChangeListener(source, masterListener);
172
		Map masterElementToDetailListener = (Map) sourceToKeyToDetailListener
173
				.remove(source);
174
		if (masterElementToDetailListener != null) {
175
			for (Iterator it = masterElementToDetailListener.entrySet()
176
					.iterator(); it.hasNext();) {
177
				Map.Entry entry = (Map.Entry) it.next();
178
				detailProperty.removeValueChangeListener(entry.getKey(),
179
						(DetailPropertyListener) entry.getValue());
180
			}
181
		}
182
	}
183
184
	public Map getMap(Object source) {
185
		Map result = new HashMap();
186
		for (Iterator it = masterProperty.getMap(source).entrySet().iterator(); it
187
				.hasNext();) {
188
			Map.Entry entry = (Map.Entry) it.next();
189
			result.put(entry.getKey(), detailProperty
190
					.getValue(entry.getValue()));
191
		}
192
		return result;
193
	}
194
195
	public void clear(Object source) {
196
		throw new UnsupportedOperationException();
197
	}
198
199
	public Object put(Object source, Object key, Object value) {
200
		if (!masterProperty.containsKey(source, key))
201
			return null;
202
		Object masterValue = masterProperty.get(source, key);
203
204
		Object result = detailProperty.getValue(masterValue);
205
		detailProperty.setValue(masterValue, value);
206
		return result;
207
	}
208
209
	public void putAll(Object source, Map t) {
210
		for (Iterator it = t.entrySet().iterator(); it.hasNext();) {
211
			Map.Entry entry = (Map.Entry) it.next();
212
			Object masterKey = entry.getKey();
213
			Object detailValue = entry.getValue();
214
			if (masterProperty.getMap(source).containsKey(masterKey)) {
215
				detailProperty.setValue(masterKey, detailValue);
216
			}
217
		}
218
	}
219
220
	public Object remove(Object source, Object key) {
221
		throw new UnsupportedOperationException();
222
	}
223
224
	public Object getKeyType() {
225
		return masterProperty.getKeyType();
226
	}
227
228
	public Object getValueType() {
229
		return detailProperty.getValueType();
230
	}
231
}
(-)src/org/eclipse/core/internal/databinding/property/ValuePropertyDetailMap.java (+141 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.Map;
16
17
import org.eclipse.core.databinding.observable.Diffs;
18
import org.eclipse.core.databinding.observable.map.MapDiff;
19
import org.eclipse.core.databinding.property.map.IMapProperty;
20
import org.eclipse.core.databinding.property.map.IMapPropertyChangeListener;
21
import org.eclipse.core.databinding.property.map.MapProperty;
22
import org.eclipse.core.databinding.property.map.MapPropertyChangeEvent;
23
import org.eclipse.core.databinding.property.value.IValueProperty;
24
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
25
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
26
27
/**
28
 * @since 3.3
29
 * 
30
 */
31
public class ValuePropertyDetailMap extends MapProperty {
32
	private final IValueProperty masterProperty;
33
	private final IMapProperty detailProperty;
34
35
	private Map sourceToDetailListener = new HashMap();
36
37
	private IValuePropertyChangeListener masterListener = new MasterValueListener();
38
39
	private class MasterValueListener implements IValuePropertyChangeListener {
40
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
41
			Object oldSource = event.diff.getOldValue();
42
			Object newSource = event.diff.getNewValue();
43
44
			Map oldMap = detailProperty.getMap(oldSource);
45
			Map newMap = detailProperty.getMap(newSource);
46
			MapDiff diff = Diffs.computeMapDiff(oldMap, newMap);
47
48
			Object source = event.getSource();
49
50
			removeDetailPropertyListener(source);
51
			addDetailPropertyListener(source);
52
53
			fireMapChange(source, diff);
54
		}
55
	}
56
57
	private class DetailPropertyListener implements IMapPropertyChangeListener {
58
		private Object source;
59
		private Object masterValue;
60
61
		DetailPropertyListener(Object source, Object masterValue) {
62
			this.source = source;
63
			this.masterValue = masterValue;
64
		}
65
66
		public void handleMapPropertyChange(MapPropertyChangeEvent event) {
67
			fireMapChange(source, event.diff);
68
		}
69
	}
70
71
	/**
72
	 * @param masterProperty
73
	 * @param detailProperty
74
	 */
75
	public ValuePropertyDetailMap(IValueProperty masterProperty,
76
			IMapProperty detailProperty) {
77
		this.masterProperty = masterProperty;
78
		this.detailProperty = detailProperty;
79
	}
80
81
	protected void addListenerTo(Object source) {
82
		masterProperty.addValueChangeListener(source, masterListener);
83
		addDetailPropertyListener(source);
84
	}
85
86
	protected void removeListenerFrom(Object source) {
87
		masterProperty.removeValueChangeListener(source, masterListener);
88
		removeDetailPropertyListener(source);
89
	}
90
91
	private void addDetailPropertyListener(Object source) {
92
		Object masterValue = masterProperty.getValue(source);
93
		DetailPropertyListener detailListener = new DetailPropertyListener(
94
				source, masterValue);
95
		detailProperty.addMapChangeListener(masterValue, detailListener);
96
		sourceToDetailListener.put(source, detailListener);
97
	}
98
99
	private void removeDetailPropertyListener(Object source) {
100
		DetailPropertyListener detailListener = (DetailPropertyListener) sourceToDetailListener
101
				.remove(source);
102
		if (detailListener != null) {
103
			detailProperty.removeMapChangeListener(detailListener.masterValue,
104
					detailListener);
105
		}
106
		sourceToDetailListener.remove(source);
107
	}
108
109
	public Map getMap(Object source) {
110
		Object masterValue = masterProperty.getValue(source);
111
		return detailProperty.getMap(masterValue);
112
	}
113
114
	public void clear(Object source) {
115
		Object masterValue = masterProperty.getValue(source);
116
		detailProperty.clear(masterValue);
117
	}
118
119
	public Object put(Object source, Object key, Object value) {
120
		Object masterValue = masterProperty.getValue(source);
121
		return detailProperty.put(masterValue, key, value);
122
	}
123
124
	public void putAll(Object source, Map t) {
125
		Object masterValue = masterProperty.getValue(source);
126
		detailProperty.putAll(masterValue, t);
127
	}
128
129
	public Object remove(Object source, Object key) {
130
		Object masterValue = masterProperty.getValue(source);
131
		return detailProperty.remove(masterValue, key);
132
	}
133
134
	public Object getKeyType() {
135
		return detailProperty.getKeyType();
136
	}
137
138
	public Object getValueType() {
139
		return detailProperty.getValueType();
140
	}
141
}
(-)src/org/eclipse/core/databinding/property/value/ValuePropertyChangeEvent.java (+60 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.value;
13
14
import org.eclipse.core.databinding.observable.value.ValueDiff;
15
import org.eclipse.core.databinding.property.IPropertyChangeListener;
16
import org.eclipse.core.databinding.property.PropertyChangeEvent;
17
import org.eclipse.core.runtime.Assert;
18
19
/**
20
 * Value change event describing a change of a value property on a particular
21
 * property source.
22
 * 
23
 * @since 1.2
24
 */
25
public class ValuePropertyChangeEvent extends PropertyChangeEvent {
26
	private static final long serialVersionUID = 1L;
27
28
	/**
29
	 * The value property that changed
30
	 */
31
	public final IValueProperty property;
32
33
	/**
34
	 * ValueDiff with the old and new values of the property.
35
	 */
36
	public final ValueDiff diff;
37
38
	/**
39
	 * Constructs a ValuePropertyChangeEvent with the given attributes
40
	 * 
41
	 * @param source
42
	 *            the property source
43
	 * @param property
44
	 *            the property that changed on the source
45
	 * @param diff
46
	 *            a ValueDiff describing the changes to the value property
47
	 */
48
	public ValuePropertyChangeEvent(Object source, IValueProperty property,
49
			ValueDiff diff) {
50
		super(source);
51
		this.property = property;
52
		Assert.isNotNull(diff, "diff cannot be null"); //$NON-NLS-1$
53
		this.diff = diff;
54
	}
55
56
	protected void dispatch(IPropertyChangeListener listener) {
57
		((IValuePropertyChangeListener) listener)
58
				.handleValuePropertyChange(this);
59
	}
60
}
(-)src/org/eclipse/core/databinding/property/IProperty.java (+31 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
/**
15
 * Interface for observing a property of a source object.
16
 * 
17
 * @since 1.2
18
 * @noimplement This interface is not intended to be implemented by clients.
19
 */
20
public interface IProperty {
21
	/**
22
	 * Returns whether the property is disposed
23
	 * @return whether the property is disposed
24
	 */
25
	public boolean isDisposed();
26
27
	/**
28
	 * Disposes the property, removing all property listeners on source objects.
29
	 */
30
	public void dispose();
31
}
(-)src/org/eclipse/core/internal/databinding/observable/PropertyObservableValue.java (+115 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
17
import org.eclipse.core.databinding.property.IProperty;
18
import org.eclipse.core.databinding.property.IPropertyObservable;
19
import org.eclipse.core.databinding.property.value.IValueProperty;
20
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
21
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
22
import org.eclipse.core.internal.databinding.Util;
23
24
/**
25
 * @since 1.2
26
 * 
27
 */
28
public class PropertyObservableValue extends AbstractObservableValue implements
29
		IPropertyObservable {
30
	private Object source;
31
	private IValueProperty property;
32
33
	private boolean updating = false;
34
35
	private boolean disposed = false;
36
37
	private IValuePropertyChangeListener listener = new IValuePropertyChangeListener() {
38
		public void handleValuePropertyChange(
39
				final ValuePropertyChangeEvent event) {
40
			if (!disposed && !updating) {
41
				getRealm().exec(new Runnable() {
42
					public void run() {
43
						fireValueChange(event.diff);
44
					}
45
				});
46
			}
47
		}
48
	};
49
50
	/**
51
	 * @param realm
52
	 * @param source
53
	 * @param property
54
	 */
55
	public PropertyObservableValue(Realm realm, Object source,
56
			IValueProperty property) {
57
		super(realm);
58
		this.source = source;
59
		this.property = property;
60
	}
61
62
	protected void firstListenerAdded() {
63
		if (!disposed) {
64
			property.addValueChangeListener(source, listener);
65
		}
66
	}
67
68
	protected void lastListenerRemoved() {
69
		if (!disposed) {
70
			property.removeValueChangeListener(source, listener);
71
		}
72
	}
73
74
	protected Object doGetValue() {
75
		return property.getValue(source);
76
	}
77
78
	protected void doSetValue(Object value) {
79
		Object oldValue = doGetValue();
80
81
		updating = true;
82
		try {
83
			property.setValue(source, value);
84
		} finally {
85
			updating = false;
86
		}
87
88
		Object newValue = doGetValue();
89
		if (!Util.equals(oldValue, newValue)) {
90
			fireValueChange(Diffs.createValueDiff(oldValue, newValue));
91
		}
92
	}
93
94
	public Object getValueType() {
95
		return property.getValueType();
96
	}
97
98
	public Object getObserved() {
99
		return source;
100
	}
101
102
	public IProperty getProperty() {
103
		return property;
104
	}
105
106
	public synchronized void dispose() {
107
		if (!disposed) {
108
			disposed = true;
109
			property.removeValueChangeListener(source, listener);
110
			property = null;
111
			source = null;
112
		}
113
		super.dispose();
114
	}
115
}
(-)src/org/eclipse/core/databinding/property/list/SimpleListProperty.java (+320 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.list;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.Iterator;
17
import java.util.List;
18
import java.util.ListIterator;
19
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.list.ListDiff;
22
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
23
import org.eclipse.core.databinding.property.SimpleProperty;
24
import org.eclipse.core.internal.databinding.Util;
25
26
/**
27
 * Simplified abstract implementation of IListProperty. This class takes care of
28
 * most of the functional requirements for an IListProperty implementation,
29
 * leaving only the property-specific details to subclasses.
30
 * <p>
31
 * Subclasses must implement these methods:
32
 * <ul>
33
 * <li>{@link #getElementType()}
34
 * <li>{@link #doGetList(Object)}
35
 * <li>{@link #doSetList(Object, List, ListDiff)}
36
 * </ul>
37
 * Additionally, the following methods should be overridden when the property
38
 * source has listener APIs.
39
 * <ul>
40
 * <li>{@link #doAddListenerTo(Object)}
41
 * <li>{@link #doRemoveListenerFrom(Object)}
42
 * </ul>
43
 * 
44
 * @since 1.2
45
 */
46
public abstract class SimpleListProperty extends SimpleProperty implements
47
		IListProperty {
48
	public void addListChangeListener(Object source,
49
			IListPropertyChangeListener listener) {
50
		addPropertyChangeListener(source, listener);
51
	}
52
53
	public void removeListChangeListener(Object source,
54
			IListPropertyChangeListener listener) {
55
		removePropertyChangeListener(source, listener);
56
	}
57
58
	protected final Object getProperty(Object source) {
59
		return doGetList(source);
60
	}
61
62
	public boolean contains(Object source, Object o) {
63
		return getList(source).contains(o);
64
	}
65
66
	public boolean containsAll(Object source, Collection c) {
67
		return getList(source).containsAll(c);
68
	}
69
70
	public boolean equals(Object source, Object o) {
71
		return getList(source).equals(o);
72
	}
73
74
	public Object get(Object source, int index) {
75
		return getList(source).get(index);
76
	}
77
78
	public int hashCode(Object source) {
79
		return getList(source).hashCode();
80
	}
81
82
	public int indexOf(Object source, Object o) {
83
		return getList(source).indexOf(o);
84
	}
85
86
	public boolean isEmpty(Object source) {
87
		return getList(source).isEmpty();
88
	}
89
90
	public int lastIndexOf(Object source, Object o) {
91
		return getList(source).lastIndexOf(o);
92
	}
93
94
	public int size(Object source) {
95
		return getList(source).size();
96
	}
97
98
	public Object[] toArray(Object source, Object[] array) {
99
		return getList(source).toArray(array);
100
	}
101
102
	public Object[] toArray(Object source) {
103
		return getList(source).toArray();
104
	}
105
106
	public final List getList(Object source) {
107
		List list = doGetList(source);
108
		if (hasListeners(source) && !isUpdating(source)) {
109
			List cached = (List) getCached(source);
110
			if (!Util.equals(list, cached)) {
111
				fireListChange(source, Diffs.computeListDiff(cached, list));
112
			}
113
		}
114
		return list;
115
	}
116
117
	/**
118
	 * Returns a List with the current contents of the source's list property
119
	 * 
120
	 * @param source
121
	 *            the property source
122
	 * @return a List with the current contents of the source's list property
123
	 * @see IListProperty#getList(Object)
124
	 */
125
	protected abstract List doGetList(Object source);
126
127
	private void setList(Object source, List list, ListDiff diff) {
128
		setUpdating(source, true);
129
		try {
130
			doSetList(source, list, diff);
131
		} finally {
132
			setUpdating(source, false);
133
		}
134
135
		if (hasListeners(source)) {
136
			fireListChange(source, diff);
137
		}
138
	}
139
140
	/**
141
	 * Updates the property on the source with the specified change. A list
142
	 * change is fired in the calling method, so implementers do not need to
143
	 * call {@link #fireListChange(Object, ListDiff)}.
144
	 * 
145
	 * @param source
146
	 *            the property source
147
	 * @param list
148
	 *            the new list
149
	 * @param diff
150
	 *            a diff describing the change
151
	 */
152
	protected abstract void doSetList(Object source, List list, ListDiff diff);
153
154
	/**
155
	 * Notifies that the source's property changed. Listeners registered in the
156
	 * {@link #addListenerTo(Object)} method should call this method when a
157
	 * property change is observed on the source object.
158
	 * 
159
	 * @param source
160
	 *            the property source
161
	 * @param diff
162
	 *            a diff describing the list change. If null, a diff will be
163
	 *            computed from the cached state and the current state.
164
	 */
165
	protected final void fireListChange(Object source, ListDiff diff) {
166
		if (!isUpdating(source) && hasListeners(source)) {
167
			if (diff == null) {
168
				diff = Diffs.computeListDiff((List) getCached(source),
169
						doGetList(source));
170
			}
171
			if (!diff.isEmpty()) {
172
				firePropertyChange(new ListPropertyChangeEvent(source, this,
173
						diff));
174
			}
175
		}
176
	}
177
178
	public boolean add(Object source, Object o) {
179
		add(source, size(source), o);
180
		return true;
181
	}
182
183
	public void add(Object source, int index, Object element) {
184
		List list = new ArrayList(getList(source));
185
		list.add(index, element);
186
		setList(source, list, Diffs.createListDiff(Diffs.createListDiffEntry(
187
				index, true, element)));
188
	}
189
190
	public boolean addAll(Object source, Collection c) {
191
		if (c.isEmpty())
192
			return false;
193
		addAll(source, size(source), c);
194
		return true;
195
	}
196
197
	public boolean addAll(Object source, int index, Collection c) {
198
		if (c.isEmpty()) {
199
			return false;
200
		}
201
202
		List list = new ArrayList(getList(source));
203
		List entries = new ArrayList();
204
		int i = index;
205
		for (Iterator it = c.iterator(); it.hasNext(); i++) {
206
			Object o = it.next();
207
			list.add(i, o);
208
			entries.add(Diffs.createListDiffEntry(i, true, o));
209
		}
210
		boolean changed = !entries.isEmpty();
211
		if (changed) {
212
			ListDiffEntry[] ea = (ListDiffEntry[]) entries
213
					.toArray(new ListDiffEntry[entries.size()]);
214
			setList(source, list, Diffs.createListDiff(ea));
215
		}
216
		return changed;
217
	}
218
219
	public void clear(Object source) {
220
		if (!isEmpty(source)) {
221
			List list = getList(source);
222
			ListDiffEntry[] entries = new ListDiffEntry[list.size()];
223
			int i = 0;
224
			for (Iterator it = getList(source).iterator(); it.hasNext(); i++) {
225
				entries[i] = Diffs.createListDiffEntry(0, false, it.next());
226
			}
227
			setList(source, new ArrayList(), Diffs.createListDiff(entries));
228
		}
229
	}
230
231
	public Object move(Object source, int oldIndex, int newIndex) {
232
		if (oldIndex == newIndex)
233
			return get(source, oldIndex);
234
		List list = new ArrayList(getList(source));
235
		Object result = list.remove(oldIndex);
236
		list.add(newIndex, result);
237
		setList(source, list, Diffs.createListDiff(Diffs.createListDiffEntry(
238
				oldIndex, false, result), Diffs.createListDiffEntry(newIndex,
239
				true, result)));
240
		return result;
241
	}
242
243
	public boolean remove(Object source, Object o) {
244
		int i = indexOf(source, o);
245
		if (i == -1)
246
			return false;
247
		remove(source, i);
248
		return true;
249
	}
250
251
	public Object remove(Object source, int index) {
252
		List list = new ArrayList(getList(source));
253
		Object result = list.remove(index);
254
		setList(source, list, Diffs.createListDiff(Diffs.createListDiffEntry(
255
				index, false, result)));
256
		return result;
257
	}
258
259
	public boolean removeAll(Object source, Collection c) {
260
		if (isEmpty(source)) {
261
			return false;
262
		}
263
		if (c.isEmpty()) {
264
			return false;
265
		}
266
		List list = new ArrayList(getList(source));
267
		List entries = new ArrayList();
268
		for (ListIterator it = list.listIterator(); it.hasNext();) {
269
			Object o = it.next();
270
			if (c.contains(o)) {
271
				entries.add(Diffs.createListDiffEntry(it.previousIndex(),
272
						false, o));
273
				it.remove();
274
			}
275
		}
276
		boolean changed = !entries.isEmpty();
277
		if (changed) {
278
			ListDiffEntry[] ea = (ListDiffEntry[]) entries
279
					.toArray(new ListDiffEntry[entries.size()]);
280
			setList(source, list, Diffs.createListDiff(ea));
281
		}
282
		return changed;
283
	}
284
285
	public boolean retainAll(Object source, Collection c) {
286
		if (isEmpty(source)) {
287
			return false;
288
		}
289
		if (c.isEmpty()) {
290
			clear(source);
291
			return true;
292
		}
293
		List list = new ArrayList(getList(source));
294
		List entries = new ArrayList();
295
		for (ListIterator it = list.listIterator(); it.hasNext();) {
296
			Object o = it.next();
297
			if (!c.contains(o)) {
298
				entries.add(Diffs.createListDiffEntry(it.previousIndex(),
299
						false, o));
300
				it.remove();
301
			}
302
		}
303
		boolean changed = !entries.isEmpty();
304
		if (changed) {
305
			ListDiffEntry[] ea = (ListDiffEntry[]) entries
306
					.toArray(new ListDiffEntry[entries.size()]);
307
			setList(source, list, Diffs.createListDiff(ea));
308
		}
309
		return changed;
310
	}
311
312
	public Object set(Object source, int index, Object element) {
313
		List list = new ArrayList(getList(source));
314
		Object result = list.set(index, element);
315
		setList(source, list, Diffs.createListDiff(Diffs.createListDiffEntry(
316
				index, false, result), Diffs.createListDiffEntry(index, true,
317
				element)));
318
		return result;
319
	}
320
}
(-)src/org/eclipse/core/databinding/property/IPropertyObservable.java (+28 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import org.eclipse.core.databinding.observable.IObserving;
15
16
/**
17
 * Provides access to the details of property observables
18
 * 
19
 * @since 1.2
20
 */
21
public interface IPropertyObservable extends IObserving {
22
	/**
23
	 * Returns the property being observed
24
	 * 
25
	 * @return the property being observed
26
	 */
27
	IProperty getProperty();
28
}
(-)src/org/eclipse/core/databinding/property/set/SetPropertyChangeEvent.java (+59 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.set;
13
14
import org.eclipse.core.databinding.observable.set.SetDiff;
15
import org.eclipse.core.databinding.property.IPropertyChangeListener;
16
import org.eclipse.core.databinding.property.PropertyChangeEvent;
17
import org.eclipse.core.runtime.Assert;
18
19
/**
20
 * Set change event describing an incremental change of a set property on a
21
 * particular property source.
22
 * 
23
 * @since 1.2
24
 */
25
public class SetPropertyChangeEvent extends PropertyChangeEvent {
26
	private static final long serialVersionUID = 1L;
27
28
	/**
29
	 * The set property that changed
30
	 */
31
	public final ISetProperty property;
32
33
	/**
34
	 * SetDiff enumerating the added and removed elements in the set.
35
	 */
36
	public final SetDiff diff;
37
38
	/**
39
	 * Constructs a SetPropertyChangeEvent with the given attributes
40
	 * 
41
	 * @param source
42
	 *            the property source
43
	 * @param property
44
	 *            the property that changed on the source
45
	 * @param diff
46
	 *            a SetDiff describing the changes to the set property
47
	 */
48
	public SetPropertyChangeEvent(Object source, ISetProperty property,
49
			SetDiff diff) {
50
		super(source);
51
		this.property = property;
52
		Assert.isNotNull(diff, "diff cannot be null"); //$NON-NLS-1$
53
		this.diff = diff;
54
	}
55
56
	protected void dispatch(IPropertyChangeListener listener) {
57
		((ISetPropertyChangeListener) listener).handleSetPropertyChange(this);
58
	}
59
}
(-)src/org/eclipse/core/databinding/property/value/IValuePropertyChangeListener.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.value;
13
14
import org.eclipse.core.databinding.property.IPropertyChangeListener;
15
16
/**
17
 * Listener for changes to value properties on a property source
18
 * 
19
 * @since 1.2
20
 */
21
public interface IValuePropertyChangeListener extends IPropertyChangeListener {
22
	/**
23
	 * Handle a change to a value property on a specific property source.
24
	 * 
25
	 * @param event
26
	 *            an event describing the value change that occured.
27
	 */
28
	public void handleValuePropertyChange(ValuePropertyChangeEvent event);
29
}
(-)src/org/eclipse/core/databinding/property/SimpleProperty.java (+152 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import org.eclipse.core.internal.databinding.property.PropertyCache;
15
import org.eclipse.core.internal.databinding.property.PropertyUpdateHelper;
16
17
/**
18
 * Abstract IProperty implementation which uses property caching and updating
19
 * flags to prevent firing duplicate change events.
20
 * 
21
 * @since 1.2
22
 */
23
public abstract class SimpleProperty extends Property {
24
	private PropertyCache cache = new PropertyCache();
25
	private PropertyUpdateHelper updateHelper = new PropertyUpdateHelper();
26
27
	/**
28
	 * Returns the most recently known value for the given source, or null if no
29
	 * listeners have been registered for the source
30
	 * 
31
	 * @param source
32
	 *            the property source
33
	 * @return the most recently known value for the given source
34
	 */
35
	protected final Object getCached(Object source) {
36
		PropertyCache cache = this.cache;
37
		return cache == null ? null : cache.get(source);
38
	}
39
40
	protected final void putCache(Object source, Object property) {
41
42
	}
43
44
	/**
45
	 * Returns whether this property is currently being updated on the source.
46
	 * Subclasses should query this value to avoid unnecessary calculations,
47
	 * such as computing a diff.
48
	 * 
49
	 * @param source
50
	 *            the property source
51
	 * @return whether this property is currently being updated on the source.
52
	 */
53
	protected final boolean isUpdating(Object source) {
54
		if (!hasListeners(source))
55
			return false;
56
		PropertyUpdateHelper updateHelper = this.updateHelper;
57
		return updateHelper != null && updateHelper.isUpdating(source);
58
	}
59
60
	/**
61
	 * Sets whether the property is being updated on the specified source
62
	 * object. Nested calls are accumulated.
63
	 * 
64
	 * @param source
65
	 *            the property source
66
	 * @param state
67
	 *            whether the property is being updated
68
	 */
69
	protected final void setUpdating(Object source, boolean state) {
70
		PropertyUpdateHelper updateHelper = this.updateHelper;
71
		if (updateHelper != null)
72
			updateHelper.setUpdating(source, state);
73
	}
74
75
	protected final void addListenerTo(Object source) {
76
		PropertyCache cache = this.cache;
77
		if (cache != null) {
78
			setUpdating(source, true);
79
			try {
80
				cache.put(source, getProperty(source));
81
			} finally {
82
				setUpdating(source, false);
83
			}
84
		}
85
		doAddListenerTo(source);
86
	}
87
88
	/**
89
	 * Adds a property-specific listener to the specified property source.
90
	 * 
91
	 * @param source
92
	 *            the property source
93
	 */
94
	protected void doAddListenerTo(Object source) {
95
		// Do nothing
96
	}
97
98
	protected final void removeListenerFrom(Object source) {
99
		doRemoveListenerFrom(source);
100
		PropertyCache cache = this.cache;
101
		if (cache != null)
102
			cache.remove(source);
103
	}
104
105
	/**
106
	 * Removes a listener from the specified property source.
107
	 * 
108
	 * @param source
109
	 *            the property source
110
	 */
111
	protected void doRemoveListenerFrom(Object source) {
112
		// Do nothing
113
	}
114
115
	/**
116
	 * Returns the current property state (for caching purposes)
117
	 * 
118
	 * @param source
119
	 *            the property source
120
	 * @return the current property state (for caching purposes)
121
	 * @noreference This method is not intended to be referenced by clients.
122
	 */
123
	protected abstract Object getProperty(Object source);
124
125
	/**
126
	 * Fires the specified property change event only if the property source is
127
	 * not currently being updated.
128
	 * 
129
	 * @see #isUpdating(Object)
130
	 */
131
	protected void firePropertyChange(PropertyChangeEvent event) {
132
		Object source = event.getSource();
133
		if (!isUpdating(source)) {
134
			PropertyCache cache = this.cache;
135
			if (cache != null)
136
				cache.put(source, getProperty(source));
137
			super.firePropertyChange(event);
138
		}
139
	}
140
141
	public synchronized void dispose() {
142
		if (cache != null) {
143
			cache.dispose();
144
			cache = null;
145
		}
146
		if (updateHelper != null) {
147
			updateHelper.dispose();
148
			updateHelper = null;
149
		}
150
		super.dispose();
151
	}
152
}
(-)src/org/eclipse/core/databinding/property/list/ListProperty.java (+91 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.list;
13
14
import java.util.Collection;
15
16
import org.eclipse.core.databinding.observable.list.ListDiff;
17
import org.eclipse.core.databinding.property.Property;
18
19
/**
20
 * Abstract implementation of IListProperty.
21
 * 
22
 * @since 1.2
23
 */
24
public abstract class ListProperty extends Property implements
25
		IListProperty {
26
	public boolean contains(Object source, Object o) {
27
		return getList(source).contains(o);
28
	}
29
30
	public boolean containsAll(Object source, Collection c) {
31
		return getList(source).containsAll(c);
32
	}
33
34
	public boolean equals(Object source, Object o) {
35
		return getList(source).equals(o);
36
	}
37
38
	public Object get(Object source, int index) {
39
		return getList(source).get(index);
40
	}
41
42
	public int hashCode(Object source) {
43
		return getList(source).hashCode();
44
	}
45
46
	public int indexOf(Object source, Object o) {
47
		return getList(source).indexOf(o);
48
	}
49
50
	public boolean isEmpty(Object source) {
51
		return getList(source).isEmpty();
52
	}
53
54
	public int lastIndexOf(Object source, Object o) {
55
		return getList(source).lastIndexOf(o);
56
	}
57
58
	public int size(Object source) {
59
		return getList(source).size();
60
	}
61
62
	public Object[] toArray(Object source, Object[] array) {
63
		return getList(source).toArray(array);
64
	}
65
66
	public Object[] toArray(Object source) {
67
		return getList(source).toArray();
68
	}
69
70
	public final void addListChangeListener(Object source,
71
			IListPropertyChangeListener listener) {
72
		addPropertyChangeListener(source, listener);
73
	}
74
75
	public final void removeListChangeListener(Object source,
76
			IListPropertyChangeListener listener) {
77
		removePropertyChangeListener(source, listener);
78
	}
79
80
	/**
81
	 * Fires a ListPropertyChangeEvent with the given source and diff
82
	 * 
83
	 * @param source
84
	 *            the property source
85
	 * @param diff
86
	 *            the list diff
87
	 */
88
	protected final void fireListChange(Object source, ListDiff diff) {
89
		firePropertyChange(new ListPropertyChangeEvent(source, this, diff));
90
	}
91
}
(-)src/org/eclipse/core/databinding/property/PropertyChangeEvent.java (+44 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import java.util.EventObject;
15
16
/**
17
 * Base class for change events in the properties API
18
 * 
19
 * @since 1.2
20
 */
21
public abstract class PropertyChangeEvent extends EventObject {
22
	private static final long serialVersionUID = 1L;
23
24
	protected PropertyChangeEvent(Object source) {
25
		super(source);
26
	}
27
28
	protected abstract void dispatch(IPropertyChangeListener listener);
29
30
	public boolean equals(Object obj) {
31
		if (obj == this)
32
			return true;
33
		if (obj == null)
34
			return false;
35
		if (getClass() != obj.getClass())
36
			return false;
37
38
		return getSource().equals(((PropertyChangeEvent) obj).getSource());
39
	}
40
41
	public int hashCode() {
42
		return getSource().hashCode();
43
	}
44
}
(-)src/org/eclipse/core/databinding/property/ICollectionProperty.java (+186 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import java.util.Collection;
15
16
/**
17
 * Interface for collection-typed properties.
18
 * 
19
 * @since 1.2
20
 * @noimplement This interface is not intended to be implemented by clients.
21
 */
22
public interface ICollectionProperty extends IProperty {
23
	/**
24
	 * Returns the size of the source's collection property
25
	 * 
26
	 * @param source
27
	 *            the property source
28
	 * @return the size of the source's collection property
29
	 */
30
	int size(Object source);
31
32
	/**
33
	 * Returns whether the source's collection property is empty
34
	 * 
35
	 * @param source
36
	 *            the property source
37
	 * @return whether the source's collection property is empty
38
	 */
39
	boolean isEmpty(Object source);
40
41
	/**
42
	 * Returns whether the source's collection property contains the given
43
	 * element.
44
	 * 
45
	 * @param source
46
	 *            the property source
47
	 * @param o
48
	 *            the element
49
	 * @return whether the source's collection property contains the given
50
	 *         element.
51
	 */
52
	boolean contains(Object source, Object o);
53
54
	/**
55
	 * Returns an array of all elements in the source's collection property
56
	 * 
57
	 * @param source
58
	 *            the property source
59
	 * @return an array of all elements in the source's collection property
60
	 */
61
	Object[] toArray(Object source);
62
63
	/**
64
	 * Returns an array of all elements in the source's collection property
65
	 * 
66
	 * @param source
67
	 *            the property source
68
	 * @param array
69
	 *            the array into which the elements will be copied. If the array
70
	 *            is not large enough to hold all elements, the elements will be
71
	 *            returned in a new array of the same runtime type.
72
	 * @return an array of all elements in the source's collection property
73
	 */
74
	Object[] toArray(Object source, Object[] array);
75
76
	/**
77
	 * Adds the element to the source's collection property
78
	 * 
79
	 * @param source
80
	 *            the property source
81
	 * @param o
82
	 *            the element to add
83
	 * @return whether the element was added to the source's collection property
84
	 */
85
	boolean add(Object source, Object o);
86
87
	/**
88
	 * Removes the element from the source's collection property
89
	 * 
90
	 * @param source
91
	 *            the property source
92
	 * @param o
93
	 *            the element to remove
94
	 * @return whether the element was removed from the source's collection
95
	 *         property
96
	 */
97
	boolean remove(Object source, Object o);
98
99
	/**
100
	 * Returns whether the source's collection property contains all elements in
101
	 * the given collection
102
	 * 
103
	 * @param source
104
	 *            the property source
105
	 * @param c
106
	 *            the collection of elements to test for
107
	 * @return whether the source's collection property contains all elements in
108
	 *         the given collection
109
	 */
110
	boolean containsAll(Object source, Collection c);
111
112
	/**
113
	 * Adds all elements in the specified collection to the source's collection
114
	 * property.
115
	 * 
116
	 * @param source
117
	 *            the property source
118
	 * @param c
119
	 *            the collection of elements to add.
120
	 * @return whether the source's collection property was changed
121
	 */
122
	boolean addAll(Object source, Collection c);
123
124
	/**
125
	 * Removes all elements from the source's collection property which are
126
	 * contained in the specified collection.
127
	 * 
128
	 * @param source
129
	 *            the property source
130
	 * @param c
131
	 *            the collection of elements to be removed
132
	 * @return whether the source's collection property was changed
133
	 */
134
	boolean removeAll(Object source, Collection c);
135
136
	/**
137
	 * Removes all elements from the source's collection property which are not
138
	 * contained in the specified collection.
139
	 * 
140
	 * @param source
141
	 *            the property source
142
	 * @param c
143
	 *            the collection of elements to retain
144
	 * @return whether the source's collection property was changed
145
	 */
146
	boolean retainAll(Object source, Collection c);
147
148
	/**
149
	 * Removes all elements from the source's collection property.
150
	 * 
151
	 * @param source
152
	 *            the property source
153
	 */
154
	void clear(Object source);
155
156
	/**
157
	 * Returns whether the source's collection property is equal to the
158
	 * argument.
159
	 * 
160
	 * @param source
161
	 *            the property source
162
	 * @param o
163
	 *            the object to test for equality to the source's collection
164
	 *            property
165
	 * @return whether the source's collection property is equal to the argument
166
	 */
167
	boolean equals(Object source, Object o);
168
169
	/**
170
	 * Returns the hash code of the source's collection property.
171
	 * 
172
	 * @param source
173
	 *            the property source
174
	 * @return the hash code of the source's collection property
175
	 */
176
	int hashCode(Object source);
177
178
	/**
179
	 * Returns the type of the elements in the collection or <code>null</code>
180
	 * if untyped
181
	 * 
182
	 * @return the type of the elements in the collection or <code>null</code>
183
	 *         if untyped
184
	 */
185
	Object getElementType();
186
}
(-)src/org/eclipse/core/internal/databinding/observable/masterdetail/SetValuePropertyObservableMap.java (+92 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable.masterdetail;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.IObserving;
16
import org.eclipse.core.databinding.observable.map.ComputedObservableMap;
17
import org.eclipse.core.databinding.observable.set.IObservableSet;
18
import org.eclipse.core.databinding.property.value.IValueProperty;
19
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
20
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
21
22
/**
23
 * @since 3.3
24
 * 
25
 */
26
public class SetValuePropertyObservableMap extends ComputedObservableMap
27
		implements IObserving {
28
	private IValueProperty property;
29
30
	private boolean disposed = false;
31
32
	private IValuePropertyChangeListener listener = new IValuePropertyChangeListener() {
33
		public void handleValuePropertyChange(
34
				final ValuePropertyChangeEvent event) {
35
			if (!disposed) {
36
				getRealm().exec(new Runnable() {
37
					public void run() {
38
						Object key = event.getSource();
39
						Object oldValue = event.diff.getOldValue();
40
						Object newValue = event.diff.getNewValue();
41
						fireMapChange(Diffs.createMapDiffSingleChange(key,
42
								oldValue, newValue));
43
					}
44
				});
45
			}
46
		}
47
	};
48
49
	/**
50
	 * @param keySet
51
	 * @param valueProperty
52
	 */
53
	public SetValuePropertyObservableMap(IObservableSet keySet,
54
			IValueProperty valueProperty) {
55
		super(keySet);
56
		this.property = valueProperty;
57
	}
58
59
	protected Object doGet(Object key) {
60
		return property.getValue(key);
61
	}
62
63
	protected Object doPut(Object key, Object value) {
64
		Object result = property.getValue(key);
65
		property.setValue(key, value);
66
		return result;
67
	}
68
69
	protected void hookListener(Object addedKey) {
70
		if (!disposed)
71
			property.addValueChangeListener(addedKey, listener);
72
	}
73
74
	protected void unhookListener(Object removedKey) {
75
		if (!disposed)
76
			property.removeValueChangeListener(removedKey, listener);
77
	}
78
79
	public Object getObserved() {
80
		return keySet();
81
	}
82
83
	public synchronized void dispose() {
84
		super.dispose();
85
86
		if (!disposed) {
87
			disposed = true;
88
			property = null;
89
			listener = null;
90
		}
91
	}
92
}
(-)src/org/eclipse/core/databinding/property/map/IMapPropertyChangeListener.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.map;
13
14
import org.eclipse.core.databinding.property.IPropertyChangeListener;
15
16
/**
17
 * Listener for changes to map properties on a property source
18
 * 
19
 * @since 1.2
20
 */
21
public interface IMapPropertyChangeListener extends IPropertyChangeListener {
22
	/**
23
	 * Handle a change to a map property on a specific property source.
24
	 * 
25
	 * @param event
26
	 *            an event describing the map change that occured.
27
	 */
28
	public void handleMapPropertyChange(MapPropertyChangeEvent event);
29
}
(-)src/org/eclipse/core/databinding/property/map/MapProperty.java (+72 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.map;
13
14
import org.eclipse.core.databinding.observable.map.MapDiff;
15
import org.eclipse.core.databinding.property.Property;
16
17
/**
18
 * Abstract implementation of IMapProperty
19
 * 
20
 * @since 1.2
21
 */
22
public abstract class MapProperty extends Property implements IMapProperty {
23
	public boolean containsKey(Object source, Object key) {
24
		return getMap(source).containsKey(key);
25
	}
26
27
	public boolean containsValue(Object source, Object value) {
28
		return getMap(source).containsValue(value);
29
	}
30
31
	public boolean equals(Object source, Object o) {
32
		return getMap(source).equals(o);
33
	}
34
35
	public Object get(Object source, Object key) {
36
		return getMap(source).get(key);
37
	}
38
39
	public int hashCode(Object source) {
40
		return getMap(source).hashCode();
41
	}
42
43
	public boolean isEmpty(Object source) {
44
		return getMap(source).isEmpty();
45
	}
46
47
	public int size(Object source) {
48
		return getMap(source).size();
49
	}
50
51
	public final void addMapChangeListener(Object source,
52
			IMapPropertyChangeListener listener) {
53
		addPropertyChangeListener(source, listener);
54
	}
55
56
	public final void removeMapChangeListener(Object source,
57
			IMapPropertyChangeListener listener) {
58
		removePropertyChangeListener(source, listener);
59
	}
60
61
	/**
62
	 * Fires a MapPropertyChangeEvent with the given source and diff
63
	 * 
64
	 * @param source
65
	 *            the property source
66
	 * @param diff
67
	 *            the map diff
68
	 */
69
	protected final void fireMapChange(Object source, MapDiff diff) {
70
		firePropertyChange(new MapPropertyChangeEvent(source, this, diff));
71
	}
72
}
(-)src/org/eclipse/core/databinding/property/PropertyChangeSupport.java (+150 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.Iterator;
16
import java.util.Map;
17
18
import org.eclipse.core.internal.databinding.IdentityWrapper;
19
import org.eclipse.core.runtime.ListenerList;
20
21
/**
22
 * Utility class which maintains a listener list per property source object.
23
 * 
24
 * @since 1.2
25
 */
26
abstract class PropertyChangeSupport {
27
	private Map changeListeners;
28
29
	PropertyChangeSupport() {
30
		this.changeListeners = null;
31
	}
32
33
	/**
34
	 * Adds the listener to the list of listeners for the specified source
35
	 * 
36
	 * @param source
37
	 *            the property source
38
	 * @param listener
39
	 *            the listener to add
40
	 */
41
	synchronized final void addListener(Object source,
42
			IPropertyChangeListener listener) {
43
		boolean hadListeners = hasListeners(source);
44
45
		if (changeListeners == null) {
46
			changeListeners = new HashMap();
47
		}
48
49
		ListenerList listeners;
50
		IdentityWrapper identityWrapper = new IdentityWrapper(source);
51
		if (changeListeners.containsKey(identityWrapper)) {
52
			listeners = (ListenerList) changeListeners.get(identityWrapper);
53
		} else {
54
			changeListeners
55
					.put(identityWrapper, listeners = new ListenerList());
56
		}
57
58
		listeners.add(listener);
59
60
		if (!hadListeners) {
61
			addListenerTo(source);
62
		}
63
	}
64
65
	/**
66
	 * Removes the listener from the list of listeners for the specified source
67
	 * 
68
	 * @param source
69
	 *            the property source
70
	 * @param listener
71
	 *            the listener to remove
72
	 */
73
	synchronized final void removeListener(Object source,
74
			IPropertyChangeListener listener) {
75
		if (changeListeners != null) {
76
			IdentityWrapper identityWrapper = new IdentityWrapper(source);
77
			ListenerList listeners = (ListenerList) changeListeners
78
					.get(identityWrapper);
79
			if (listeners != null) {
80
				listeners.remove(listener);
81
				if (listeners.isEmpty()) {
82
					synchronized (listeners) {
83
						if (listeners.isEmpty()) {
84
							changeListeners.remove(identityWrapper);
85
							removeListenerFrom(source);
86
						}
87
					}
88
				}
89
			}
90
		}
91
	}
92
93
	/**
94
	 * Returns whether the change support has listeners registered for the given
95
	 * property source
96
	 * 
97
	 * @param source
98
	 *            the property source
99
	 * @return whether the change support has listeners registered for the given
100
	 *         property source
101
	 */
102
	synchronized final boolean hasListeners(Object source) {
103
		return changeListeners != null
104
				&& changeListeners.containsKey(new IdentityWrapper(source));
105
	}
106
107
	protected abstract void addListenerTo(Object source);
108
109
	protected abstract void removeListenerFrom(Object source);
110
111
	private synchronized final Object[] getListeners(Object source) {
112
		if (changeListeners == null)
113
			return null;
114
		ListenerList list = (ListenerList) changeListeners
115
				.get(new IdentityWrapper(source));
116
		if (list == null)
117
			return null;
118
		return list.getListeners();
119
	}
120
121
	/**
122
	 * Notifies all registered listeners of the specified property change
123
	 * 
124
	 * @param event
125
	 *            the property change event
126
	 */
127
	public final void firePropertyChange(PropertyChangeEvent event) {
128
		Object[] listeners = getListeners(event.getSource());
129
		if (listeners != null) {
130
			for (int i = 0; i < listeners.length; i++) {
131
				event.dispatch((IPropertyChangeListener) listeners[i]);
132
			}
133
		}
134
	}
135
136
	/**
137
	 * Diposes the change support, removing all registered listeners
138
	 */
139
	public synchronized void dispose() {
140
		if (changeListeners != null) {
141
			for (Iterator iterator = changeListeners.keySet().iterator(); iterator
142
					.hasNext();) {
143
				Object source = ((IdentityWrapper) iterator.next()).unwrap();
144
				removeListenerFrom(source);
145
				iterator.remove();
146
			}
147
			changeListeners = null;
148
		}
149
	}
150
}
(-)src/org/eclipse/core/internal/databinding/property/SetPropertyDetailValueMap.java (+225 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.Collections;
15
import java.util.HashMap;
16
import java.util.Iterator;
17
import java.util.Map;
18
import java.util.Set;
19
20
import org.eclipse.core.databinding.observable.Diffs;
21
import org.eclipse.core.databinding.observable.map.MapDiff;
22
import org.eclipse.core.databinding.property.map.MapProperty;
23
import org.eclipse.core.databinding.property.set.ISetProperty;
24
import org.eclipse.core.databinding.property.set.ISetPropertyChangeListener;
25
import org.eclipse.core.databinding.property.set.SetPropertyChangeEvent;
26
import org.eclipse.core.databinding.property.value.IValueProperty;
27
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
28
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
29
30
/**
31
 * @since 3.3
32
 * 
33
 */
34
public class SetPropertyDetailValueMap extends MapProperty {
35
	private final ISetProperty masterProperty;
36
	private final IValueProperty detailProperty;
37
38
	private Map sourceToMasterElementToDetailListener = new HashMap();
39
40
	private ISetPropertyChangeListener masterListener = new MasterPropertyListener();
41
42
	private class MasterPropertyListener implements ISetPropertyChangeListener {
43
		public void handleSetPropertyChange(final SetPropertyChangeEvent event) {
44
			Object source = event.getSource();
45
46
			MapDiff diff;
47
			if (event.diff == null) {
48
				diff = null;
49
			} else {
50
				final Set removals = event.diff.getRemovals();
51
				final Set additions = event.diff.getAdditions();
52
53
				diff = new MapDiff() {
54
					public Set getAddedKeys() {
55
						return additions;
56
					}
57
58
					public Set getChangedKeys() {
59
						return Collections.EMPTY_SET;
60
					}
61
62
					public Object getNewValue(Object key) {
63
						return getValue(key);
64
					}
65
66
					public Object getOldValue(Object key) {
67
						return getValue(key);
68
					}
69
70
					private Object getValue(Object key) {
71
						return detailProperty.getValue(key);
72
					}
73
74
					public Set getRemovedKeys() {
75
						return removals;
76
					}
77
				};
78
79
				for (Iterator it = removals.iterator(); it.hasNext();) {
80
					removeElementPropertyListener(source, it.next());
81
				}
82
				for (Iterator it = additions.iterator(); it.hasNext();) {
83
					addElementPropertyListener(source, it.next());
84
				}
85
			}
86
87
			fireMapChange(source, diff);
88
		}
89
90
		private void addElementPropertyListener(Object source, Object element) {
91
			Map elementToDetailListener = (Map) sourceToMasterElementToDetailListener
92
					.get(source);
93
			if (elementToDetailListener == null) {
94
				sourceToMasterElementToDetailListener.put(source,
95
						elementToDetailListener = new HashMap());
96
			}
97
			if (!elementToDetailListener.containsKey(element)) {
98
				DetailPropertyListener detailListener = new DetailPropertyListener(
99
						source, element);
100
				detailProperty.addValueChangeListener(element, detailListener);
101
				elementToDetailListener.put(element, detailListener);
102
			}
103
		}
104
105
		private void removeElementPropertyListener(Object source, Object element) {
106
			Map elementToDetailListener = (Map) sourceToMasterElementToDetailListener
107
					.get(source);
108
			if (elementToDetailListener != null
109
					&& elementToDetailListener.containsKey(element)) {
110
				DetailPropertyListener detailListener = (DetailPropertyListener) elementToDetailListener
111
						.remove(element);
112
				detailProperty.removeValueChangeListener(element,
113
						detailListener);
114
			}
115
		}
116
	}
117
118
	private class DetailPropertyListener implements
119
			IValuePropertyChangeListener {
120
		private Object source;
121
		private Object masterValue;
122
123
		DetailPropertyListener(Object source, Object masterValue) {
124
			this.source = source;
125
			this.masterValue = masterValue;
126
		}
127
128
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
129
			MapDiff diff;
130
			if (event.diff == null) {
131
				diff = null;
132
			} else {
133
				diff = Diffs.createMapDiffSingleChange(masterValue, event.diff
134
						.getOldValue(), event.diff.getNewValue());
135
			}
136
			fireMapChange(source, diff);
137
		}
138
	}
139
140
	/**
141
	 * @param masterProperty
142
	 * @param detailProperty
143
	 */
144
	public SetPropertyDetailValueMap(ISetProperty masterProperty,
145
			IValueProperty detailProperty) {
146
		this.masterProperty = masterProperty;
147
		this.detailProperty = detailProperty;
148
	}
149
150
	protected void addListenerTo(Object source) {
151
		masterProperty.addSetChangeListener(source, masterListener);
152
153
		Map masterElementToDetailListener = new HashMap();
154
		for (Iterator it = masterProperty.getSet(source).iterator(); it
155
				.hasNext();) {
156
			Object masterElement = it.next();
157
			DetailPropertyListener detailListener = new DetailPropertyListener(
158
					source, masterElement);
159
			detailProperty
160
					.addValueChangeListener(masterElement, detailListener);
161
			masterElementToDetailListener.put(masterElement, detailListener);
162
		}
163
164
		sourceToMasterElementToDetailListener.put(source,
165
				masterElementToDetailListener);
166
	}
167
168
	protected void removeListenerFrom(Object source) {
169
		masterProperty.removeSetChangeListener(source, masterListener);
170
		Map masterElementToDetailListener = (Map) sourceToMasterElementToDetailListener
171
				.remove(source);
172
		if (masterElementToDetailListener != null) {
173
			for (Iterator it = masterElementToDetailListener.entrySet()
174
					.iterator(); it.hasNext();) {
175
				Map.Entry entry = (Map.Entry) it.next();
176
				detailProperty.removeValueChangeListener(entry.getKey(),
177
						(DetailPropertyListener) entry.getValue());
178
			}
179
		}
180
	}
181
182
	public Map getMap(Object source) {
183
		Map result = new HashMap();
184
		for (Iterator it = masterProperty.getSet(source).iterator(); it
185
				.hasNext();) {
186
			Object element = it.next();
187
			result.put(element, detailProperty.getValue(element));
188
		}
189
		return result;
190
	}
191
192
	public void clear(Object source) {
193
		throw new UnsupportedOperationException();
194
	}
195
196
	public Object put(Object source, Object key, Object value) {
197
		if (!masterProperty.contains(source, key))
198
			return null;
199
		Object result = detailProperty.getValue(key);
200
		detailProperty.setValue(key, value);
201
		return result;
202
	}
203
204
	public void putAll(Object source, Map t) {
205
		Set masterSet = masterProperty.getSet(source);
206
		for (Iterator it = t.entrySet().iterator(); it.hasNext();) {
207
			Map.Entry entry = (Map.Entry) it.next();
208
			if (masterSet.contains(entry.getKey())) {
209
				detailProperty.setValue(entry.getKey(), entry.getValue());
210
			}
211
		}
212
	}
213
214
	public Object remove(Object source, Object key) {
215
		throw new UnsupportedOperationException();
216
	}
217
218
	public Object getKeyType() {
219
		return masterProperty.getElementType();
220
	}
221
222
	public Object getValueType() {
223
		return detailProperty.getValueType();
224
	}
225
}
(-)src/org/eclipse/core/databinding/property/set/SetProperty.java (+79 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.set;
13
14
import java.util.Collection;
15
16
import org.eclipse.core.databinding.observable.set.SetDiff;
17
import org.eclipse.core.databinding.property.Property;
18
19
/**
20
 * Abstract implementation of ISetProperty
21
 * 
22
 * @since 1.2
23
 */
24
public abstract class SetProperty extends Property implements
25
		ISetProperty {
26
	public boolean contains(Object source, Object o) {
27
		return getSet(source).contains(o);
28
	}
29
30
	public boolean containsAll(Object source, Collection c) {
31
		return getSet(source).containsAll(c);
32
	}
33
34
	public boolean equals(Object source, Object o) {
35
		return getSet(source).equals(o);
36
	}
37
38
	public int hashCode(Object source) {
39
		return getSet(source).hashCode();
40
	}
41
42
	public boolean isEmpty(Object source) {
43
		return getSet(source).isEmpty();
44
	}
45
46
	public int size(Object source) {
47
		return getSet(source).size();
48
	}
49
50
	public Object[] toArray(Object source, Object[] array) {
51
		return getSet(source).toArray(array);
52
	}
53
54
	public Object[] toArray(Object source) {
55
		return getSet(source).toArray();
56
	}
57
58
	public final void addSetChangeListener(Object source,
59
			ISetPropertyChangeListener listener) {
60
		addPropertyChangeListener(source, listener);
61
	}
62
63
	public final void removeSetChangeListener(Object source,
64
			ISetPropertyChangeListener listener) {
65
		removePropertyChangeListener(source, listener);
66
	}
67
68
	/**
69
	 * Fires a SetPropertyChangeEvent with the given source and diff
70
	 * 
71
	 * @param source
72
	 *            the property source
73
	 * @param diff
74
	 *            the set diff
75
	 */
76
	protected final void fireSetChange(Object source, SetDiff diff) {
77
		firePropertyChange(new SetPropertyChangeEvent(source, this, diff));
78
	}
79
}
(-)src/org/eclipse/core/databinding/property/value/SimpleValueProperty.java (+133 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.value;
13
14
import org.eclipse.core.databinding.observable.Diffs;
15
import org.eclipse.core.databinding.observable.value.ValueDiff;
16
import org.eclipse.core.databinding.property.SimpleProperty;
17
import org.eclipse.core.internal.databinding.Util;
18
19
/**
20
 * Simplified abstract implementation of IValueProperty. This class takes care
21
 * of most of the functional requirements for an IValueProperty implementation,
22
 * leaving only the property-specific details to subclasses.
23
 * <p>
24
 * Subclasses must implement these methods:
25
 * <ul>
26
 * <li>{@link #getValueType()}
27
 * <li>{@link #doGetValue(Object)}
28
 * <li>{@link #doSetValue(Object, Object, ValueDiff)}
29
 * </ul>
30
 * Additionally, the following methods should be overridden when the property
31
 * source has listener APIs.
32
 * <ul>
33
 * <li>{@link #doAddListenerTo(Object)}
34
 * <li>{@link #doRemoveListenerFrom(Object)}
35
 * </ul>
36
 * 
37
 * @since 1.2
38
 */
39
public abstract class SimpleValueProperty extends SimpleProperty implements
40
		IValueProperty {
41
	public void addValueChangeListener(Object source,
42
			IValuePropertyChangeListener listener) {
43
		addPropertyChangeListener(source, listener);
44
	}
45
46
	public void removeValueChangeListener(Object source,
47
			IValuePropertyChangeListener listener) {
48
		removePropertyChangeListener(source, listener);
49
	}
50
51
	protected final Object getProperty(Object source) {
52
		return doGetValue(source);
53
	}
54
55
	public final void setValue(Object source, Object value) {
56
		Object oldValue = getCached(source);
57
58
		setUpdating(source, true);
59
		try {
60
			doSetValue(source, value, Diffs.createValueDiff(oldValue, value));
61
		} finally {
62
			setUpdating(source, false);
63
		}
64
65
		if (hasListeners(source)) {
66
			Object newValue = doGetValue(source);
67
			if (!Util.equals(oldValue, newValue)) {
68
				fireValueChange(source, Diffs.createValueDiff(oldValue,
69
						newValue));
70
			}
71
		}
72
	}
73
74
	/**
75
	 * Updates the property on the source with the specified change. A value
76
	 * change event is fired in the calling method, so implementers do not need
77
	 * to call {@link #fireValueChange(Object, ValueDiff)}.
78
	 * 
79
	 * @param source
80
	 *            the property source
81
	 * @param value
82
	 *            the new value
83
	 * @param diff
84
	 *            a diff describing the change
85
	 */
86
	protected abstract void doSetValue(Object source, Object value,
87
			ValueDiff diff);
88
89
	public final Object getValue(Object source) {
90
		Object value = doGetValue(source);
91
		if (hasListeners(source) && !isUpdating(source)) {
92
			Object cached = getCached(source);
93
			if (!Util.equals(value, cached)) {
94
				fireValueChange(source, Diffs.createValueDiff(cached, value));
95
			}
96
		}
97
		return value;
98
	}
99
100
	/**
101
	 * Returns the current property value
102
	 * 
103
	 * @param source
104
	 *            the property source
105
	 * @return the current property value
106
	 * @see IValueProperty#getValue(Object)
107
	 */
108
	protected abstract Object doGetValue(Object source);
109
110
	/**
111
	 * Notifies that the source's property changed. Listeners registered in the
112
	 * {@link #addListenerTo(Object)} method should call this method when a
113
	 * property change is observed on the source object.
114
	 * 
115
	 * @param source
116
	 *            the property source
117
	 * @param diff
118
	 *            a diff describing the value change. If null, a diff will be
119
	 *            created from the cached value and the current value.
120
	 */
121
	protected final void fireValueChange(Object source, ValueDiff diff) {
122
		if (!isUpdating(source) && hasListeners(source)) {
123
			if (diff == null) {
124
				diff = Diffs.createValueDiff(getCached(source),
125
						doGetValue(source));
126
			}
127
			if (!Util.equals(diff.getOldValue(), diff.getNewValue())) {
128
				firePropertyChange(new ValuePropertyChangeEvent(source, this,
129
						diff));
130
			}
131
		}
132
	}
133
}
(-)src/org/eclipse/core/databinding/property/PropertyObservables.java (+375 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
import org.eclipse.core.databinding.observable.IObservable;
15
import org.eclipse.core.databinding.observable.Realm;
16
import org.eclipse.core.databinding.observable.list.IObservableList;
17
import org.eclipse.core.databinding.observable.map.IObservableMap;
18
import org.eclipse.core.databinding.observable.masterdetail.IObservableFactory;
19
import org.eclipse.core.databinding.observable.masterdetail.MasterDetailObservables;
20
import org.eclipse.core.databinding.observable.set.IObservableSet;
21
import org.eclipse.core.databinding.observable.value.IObservableValue;
22
import org.eclipse.core.databinding.property.list.IListProperty;
23
import org.eclipse.core.databinding.property.map.IMapProperty;
24
import org.eclipse.core.databinding.property.set.ISetProperty;
25
import org.eclipse.core.databinding.property.value.IValueProperty;
26
import org.eclipse.core.internal.databinding.observable.PropertyObservableList;
27
import org.eclipse.core.internal.databinding.observable.PropertyObservableMap;
28
import org.eclipse.core.internal.databinding.observable.PropertyObservableSet;
29
import org.eclipse.core.internal.databinding.observable.PropertyObservableValue;
30
import org.eclipse.core.internal.databinding.observable.masterdetail.ListValuePropertyObservableList;
31
import org.eclipse.core.internal.databinding.observable.masterdetail.MapValuePropertyObservableMap;
32
import org.eclipse.core.internal.databinding.observable.masterdetail.SetValuePropertyObservableMap;
33
34
/**
35
 * A factory for creating observables observing properties of source objects
36
 * 
37
 * @since 1.2
38
 */
39
public class PropertyObservables {
40
	/**
41
	 * Returns an observable value on the default realm that tracks the given
42
	 * property of the source object.
43
	 * 
44
	 * @param source
45
	 *            the property value
46
	 * @param property
47
	 *            the value property to observe
48
	 * @return an observable value on the default realm that tracks the given
49
	 *         property of the source object.
50
	 * @since 1.2
51
	 */
52
	public static IObservableValue observeValue(Object source,
53
			IValueProperty property) {
54
		return observeValue(Realm.getDefault(), source, property);
55
	}
56
57
	/**
58
	 * Returns an observable value on the given realm that tracks the given
59
	 * property of the source object
60
	 * 
61
	 * @param realm
62
	 *            the realm
63
	 * @param source
64
	 *            the property source
65
	 * @param property
66
	 *            the value property observe
67
	 * @return an observable value that tracks the given property of the source
68
	 *         object
69
	 * @since 1.2
70
	 */
71
	public static IObservableValue observeValue(Realm realm, Object source,
72
			IValueProperty property) {
73
		return new PropertyObservableValue(realm, source, property);
74
	}
75
76
	/**
77
	 * Returns a factory for creating observable values on the default realm
78
	 * tracking the given property of a particular source object
79
	 * 
80
	 * @param property
81
	 *            the property to observe
82
	 * @return a factory for creating observable values on the default realm
83
	 *         tracking the given property of a particular source object
84
	 */
85
	public static IObservableFactory valueFactory(IValueProperty property) {
86
		return valueFactory(Realm.getDefault(), property);
87
	}
88
89
	/**
90
	 * Returns a factory for creating observable values on the given realm
91
	 * tracking the given property of a particular source object
92
	 * 
93
	 * @param realm
94
	 *            the realm
95
	 * @param property
96
	 *            the property to observe
97
	 * @return a factory for creating observable values on the given realm
98
	 *         tracking the given property of a particular source object
99
	 */
100
	public static IObservableFactory valueFactory(final Realm realm,
101
			final IValueProperty property) {
102
		return new IObservableFactory() {
103
			public IObservable createObservable(Object target) {
104
				return observeValue(realm, target, property);
105
			}
106
		};
107
	}
108
109
	/**
110
	 * Returns an observable value on the master observable's realm which tracks
111
	 * the given property of the current value of <code>master</code>.
112
	 * 
113
	 * @param master
114
	 *            the master observable
115
	 * @param property
116
	 *            the property to observe
117
	 * @return an observable value which tracks the given property of the
118
	 *         current value of <code>master</code>.
119
	 */
120
	public static IObservableValue observeDetailValue(IObservableValue master,
121
			IValueProperty property) {
122
		return MasterDetailObservables.detailValue(master, valueFactory(master
123
				.getRealm(), property), property.getValueType());
124
	}
125
126
	/**
127
	 * Returns an observable set on the default realm that tracks the given
128
	 * property of the source object
129
	 * 
130
	 * @param source
131
	 *            the property source
132
	 * @param property
133
	 *            the property to observe
134
	 * @return an observable set on the default realm that tracks the given
135
	 *         property of the source object
136
	 */
137
	public static IObservableSet observeSet(Object source, ISetProperty property) {
138
		return observeSet(Realm.getDefault(), source, property);
139
	}
140
141
	/**
142
	 * Returns an observable set on the given realm that tracks the given
143
	 * property of the source object
144
	 * 
145
	 * @param realm
146
	 *            the realm
147
	 * @param source
148
	 *            the property source
149
	 * @param property
150
	 *            the property to observe
151
	 * @return an observable set on the given realm that tracks the given
152
	 *         property of the source object
153
	 */
154
	public static IObservableSet observeSet(Realm realm, Object source,
155
			ISetProperty property) {
156
		return new PropertyObservableSet(realm, source, property);
157
	}
158
159
	/**
160
	 * Returns a factory for creating observable sets on the default realm
161
	 * tracking the given property of a particular source object
162
	 * 
163
	 * @param property
164
	 *            the property to be observed
165
	 * @return a factory for creating observable sets on the default realm
166
	 *         tracking the given property of a particular source object
167
	 */
168
	public static IObservableFactory setFactory(ISetProperty property) {
169
		return setFactory(Realm.getDefault(), property);
170
	}
171
172
	/**
173
	 * Returns a factory for creating obervable sets on the given realm tracking
174
	 * the given property of a particular source object
175
	 * 
176
	 * @param realm
177
	 *            the realm
178
	 * @param property
179
	 *            the property to be observed
180
	 * @return a factory for creating obervable sets on the given realm tracking
181
	 *         the given property of a particular source object
182
	 */
183
	public static IObservableFactory setFactory(final Realm realm,
184
			final ISetProperty property) {
185
		return new IObservableFactory() {
186
			public IObservable createObservable(Object target) {
187
				return observeSet(realm, target, property);
188
			}
189
		};
190
	}
191
192
	/**
193
	 * Returns an observable set on the master observable's realm which tracks
194
	 * the given property of the current value of <code>master</code>.
195
	 * 
196
	 * @param master
197
	 *            the master observable
198
	 * @param property
199
	 *            the property to observe
200
	 * @return an observable set on the given realm which tracks the given
201
	 *         property of the current value of <code>master</code>.
202
	 */
203
	public static IObservableSet observeDetailSet(IObservableValue master,
204
			ISetProperty property) {
205
		return MasterDetailObservables.detailSet(master, setFactory(master
206
				.getRealm(), property), property.getElementType());
207
	}
208
209
	/**
210
	 * Returns an observable list on the default realm that tracks the given
211
	 * property of the source object
212
	 * 
213
	 * @param source
214
	 *            the property source
215
	 * @param property
216
	 *            the property to observe
217
	 * @return an observable list on the default realm that tracks the given
218
	 *         property of the source object
219
	 */
220
	public static IObservableList observeList(Object source,
221
			IListProperty property) {
222
		return observeList(Realm.getDefault(), source, property);
223
	}
224
225
	/**
226
	 * Returns an observable list on the given realm that tracks the given
227
	 * property of the source object
228
	 * 
229
	 * @param realm
230
	 *            the realm
231
	 * @param source
232
	 *            the property source
233
	 * @param property
234
	 *            the property to observe
235
	 * @return an observable list on the given realm that tracks the given
236
	 *         property of the source object
237
	 */
238
	public static IObservableList observeList(Realm realm, Object source,
239
			IListProperty property) {
240
		return new PropertyObservableList(realm, source, property);
241
	}
242
243
	/**
244
	 * Returns a factory for creating observable lists on the default realm
245
	 * tracking the given property of a particular source object
246
	 * 
247
	 * @param property
248
	 *            the property to be observed
249
	 * @return an observable value factory on
250
	 */
251
	public static IObservableFactory listFactory(IListProperty property) {
252
		return listFactory(Realm.getDefault(), property);
253
	}
254
255
	/**
256
	 * Returns a factory for creating obervable lists on the given realm
257
	 * tracking the given property of a particular source object
258
	 * 
259
	 * @param realm
260
	 *            the realm
261
	 * @param property
262
	 *            the property to be observed
263
	 * @return an observable value factory on
264
	 */
265
	public static IObservableFactory listFactory(final Realm realm,
266
			final IListProperty property) {
267
		return new IObservableFactory() {
268
			public IObservable createObservable(Object target) {
269
				return observeList(realm, target, property);
270
			}
271
		};
272
	}
273
274
	/**
275
	 * Returns an observable list on the master observable's realm which tracks
276
	 * the given property of the current value of <code>master</code>.
277
	 * 
278
	 * @param master
279
	 *            the master observable
280
	 * @param property
281
	 *            the property to observe
282
	 * @return an observable list on the given realm which tracks the given
283
	 *         property of the current value of <code>master</code>.
284
	 */
285
	public static IObservableList observeDetailList(IObservableValue master,
286
			IListProperty property) {
287
		return MasterDetailObservables.detailList(master, listFactory(master
288
				.getRealm(), property), property.getElementType());
289
	}
290
291
	/**
292
	 * Returns an observable list on the master observable's realm which tracks
293
	 * the given property of each element of <code>master</code>.
294
	 * 
295
	 * @param master
296
	 *            the master observable
297
	 * @param property
298
	 *            the property to observe on each element in the master
299
	 *            observable
300
	 * @return an observable
301
	 */
302
	public static IObservableList observeDetailValues(IObservableList master,
303
			IValueProperty property) {
304
		return new ListValuePropertyObservableList(master, property);
305
	}
306
307
	/**
308
	 * Returns an observable map on the default realm which tracks the given
309
	 * property of the source object
310
	 * 
311
	 * @param source
312
	 *            the property source
313
	 * @param property
314
	 *            the property to observe
315
	 * @return an observable map on the default realm which tracks the given
316
	 *         property of the source object
317
	 */
318
	public static IObservableMap observeMap(Object source, IMapProperty property) {
319
		return observeMap(Realm.getDefault(), source, property);
320
	}
321
322
	/**
323
	 * Returns an observable map on the given realm which tracks the given
324
	 * property of the source object
325
	 * 
326
	 * @param realm
327
	 *            the realm
328
	 * @param source
329
	 *            the property source
330
	 * @param property
331
	 *            the property to observe
332
	 * @return an observable map on the given realm which tracks the given
333
	 *         property of the source object
334
	 */
335
	public static IObservableMap observeMap(Realm realm, Object source,
336
			IMapProperty property) {
337
		return new PropertyObservableMap(realm, source, property);
338
	}
339
340
	/**
341
	 * Returns an observable map on the master observable's realm tracking the
342
	 * current values of the given property for the elements in the given set.
343
	 * 
344
	 * @param keySet
345
	 *            the master observable
346
	 * @param valueProperty
347
	 *            the property to observe on each element of the master
348
	 *            observable
349
	 * @return an observable map that tracks the current value of the given
350
	 *         property for the elements in the given set.
351
	 */
352
	public static IObservableMap observeDetailValues(IObservableSet keySet,
353
			IValueProperty valueProperty) {
354
		return new SetValuePropertyObservableMap(keySet, valueProperty);
355
	}
356
357
	/**
358
	 * Returns an observable map on the master observable's realm which tracks
359
	 * the current values of the given property for the entry values in the
360
	 * given map.
361
	 * 
362
	 * @param map
363
	 *            the master observable
364
	 * @param valueProperty
365
	 *            the property to observe on each entry value in the master
366
	 *            observable
367
	 * @return an observable map on the master observable's realm which tracks
368
	 *         the current value of the given property for the elements in the
369
	 *         given map's values collection
370
	 */
371
	public static IObservableMap observeDetailValues(IObservableMap map,
372
			IValueProperty valueProperty) {
373
		return new MapValuePropertyObservableMap(map, valueProperty);
374
	}
375
}
(-)src/org/eclipse/core/internal/databinding/property/ValuePropertyDetailList.java (+173 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.Collection;
15
import java.util.HashMap;
16
import java.util.List;
17
import java.util.Map;
18
19
import org.eclipse.core.databinding.observable.Diffs;
20
import org.eclipse.core.databinding.property.list.IListProperty;
21
import org.eclipse.core.databinding.property.list.IListPropertyChangeListener;
22
import org.eclipse.core.databinding.property.list.ListProperty;
23
import org.eclipse.core.databinding.property.list.ListPropertyChangeEvent;
24
import org.eclipse.core.databinding.property.value.IValueProperty;
25
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
26
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
27
28
/**
29
 * @since 3.3
30
 * 
31
 */
32
public class ValuePropertyDetailList extends ListProperty {
33
	private final IValueProperty masterProperty;
34
	private final IListProperty detailProperty;
35
36
	private Map sourceToDetailListener = new HashMap();
37
38
	private IValuePropertyChangeListener masterListener = new MasterPropertyListener();
39
40
	private class MasterPropertyListener implements
41
			IValuePropertyChangeListener {
42
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
43
			Object oldSource = event.diff.getOldValue();
44
			Object newSource = event.diff.getNewValue();
45
46
			List oldList = detailProperty.getList(oldSource);
47
			List newList = detailProperty.getList(newSource);
48
49
			Object source = event.getSource();
50
51
			removeDetailPropertyListener(source);
52
			addDetailPropertyListener(source);
53
54
			fireListChange(source, Diffs.computeListDiff(oldList, newList));
55
		}
56
	}
57
58
	private class DetailPropertyListener implements IListPropertyChangeListener {
59
		private Object source;
60
		private Object masterValue;
61
62
		DetailPropertyListener(Object source, Object masterValue) {
63
			this.source = source;
64
			this.masterValue = masterValue;
65
		}
66
67
		public void handleListPropertyChange(ListPropertyChangeEvent event) {
68
			fireListChange(source, event.diff);
69
		}
70
	}
71
72
	/**
73
	 * @param masterProperty
74
	 * @param detailProperty
75
	 */
76
	public ValuePropertyDetailList(IValueProperty masterProperty,
77
			IListProperty detailProperty) {
78
		this.masterProperty = masterProperty;
79
		this.detailProperty = detailProperty;
80
	}
81
82
	protected void addListenerTo(Object source) {
83
		masterProperty.addValueChangeListener(source, masterListener);
84
		addDetailPropertyListener(source);
85
	}
86
87
	protected void removeListenerFrom(Object source) {
88
		masterProperty.removeValueChangeListener(source, masterListener);
89
		removeDetailPropertyListener(source);
90
	}
91
92
	private void addDetailPropertyListener(Object source) {
93
		Object masterValue = masterProperty.getValue(source);
94
		DetailPropertyListener detailListener = new DetailPropertyListener(
95
				source, masterValue);
96
		detailProperty.addListChangeListener(masterValue, detailListener);
97
		sourceToDetailListener.put(source, detailListener);
98
	}
99
100
	private void removeDetailPropertyListener(Object source) {
101
		DetailPropertyListener detailListener = (DetailPropertyListener) sourceToDetailListener
102
				.remove(source);
103
		if (detailListener != null) {
104
			detailProperty.removeListChangeListener(detailListener.masterValue,
105
					detailListener);
106
		}
107
		sourceToDetailListener.remove(source);
108
	}
109
110
	public List getList(Object source) {
111
		Object masterValue = masterProperty.getValue(source);
112
		return detailProperty.getList(masterValue);
113
	}
114
115
	public boolean add(Object source, Object o) {
116
		Object masterValue = masterProperty.getValue(source);
117
		return detailProperty.add(masterValue, o);
118
	}
119
120
	public boolean addAll(Object source, Collection c) {
121
		Object masterValue = masterProperty.getValue(source);
122
		return detailProperty.addAll(masterValue, c);
123
	}
124
125
	public void clear(Object source) {
126
		Object masterValue = masterProperty.getValue(source);
127
		detailProperty.clear(masterValue);
128
	}
129
130
	public Object getElementType() {
131
		return detailProperty.getElementType();
132
	}
133
134
	public boolean remove(Object source, Object o) {
135
		Object masterValue = masterProperty.getValue(source);
136
		return detailProperty.remove(masterValue, o);
137
	}
138
139
	public boolean removeAll(Object source, Collection c) {
140
		Object masterValue = masterProperty.getValue(source);
141
		return detailProperty.removeAll(masterValue, c);
142
	}
143
144
	public boolean retainAll(Object source, Collection c) {
145
		Object masterValue = masterProperty.getValue(source);
146
		return detailProperty.retainAll(masterValue, c);
147
	}
148
149
	public void add(Object source, int index, Object element) {
150
		Object masterValue = masterProperty.getValue(source);
151
		detailProperty.add(masterValue, index, element);
152
	}
153
154
	public boolean addAll(Object source, int index, Collection c) {
155
		Object masterValue = masterProperty.getValue(source);
156
		return detailProperty.addAll(masterValue, index, c);
157
	}
158
159
	public Object move(Object source, int oldIndex, int newIndex) {
160
		Object masterValue = masterProperty.getValue(source);
161
		return detailProperty.move(masterValue, oldIndex, newIndex);
162
	}
163
164
	public Object remove(Object source, int index) {
165
		Object masterValue = masterProperty.getValue(source);
166
		return detailProperty.remove(masterValue, index);
167
	}
168
169
	public Object set(Object source, int index, Object element) {
170
		Object masterValue = masterProperty.getValue(source);
171
		return detailProperty.set(masterValue, index, element);
172
	}
173
}
(-)src/org/eclipse/core/internal/databinding/property/ListPropertyDetailValueList.java (+259 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.HashMap;
17
import java.util.HashSet;
18
import java.util.Iterator;
19
import java.util.List;
20
import java.util.ListIterator;
21
import java.util.Map;
22
import java.util.Set;
23
24
import org.eclipse.core.databinding.observable.Diffs;
25
import org.eclipse.core.databinding.observable.list.ListDiff;
26
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
27
import org.eclipse.core.databinding.property.list.IListProperty;
28
import org.eclipse.core.databinding.property.list.IListPropertyChangeListener;
29
import org.eclipse.core.databinding.property.list.ListProperty;
30
import org.eclipse.core.databinding.property.list.ListPropertyChangeEvent;
31
import org.eclipse.core.databinding.property.value.IValueProperty;
32
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
33
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
34
import org.eclipse.core.internal.databinding.Util;
35
36
/**
37
 * @since 3.3
38
 * 
39
 */
40
public class ListPropertyDetailValueList extends ListProperty {
41
	private final IListProperty masterProperty;
42
	private final IValueProperty detailProperty;
43
44
	private Map sourceToMasterElementToDetailListener = new HashMap();
45
46
	private IListPropertyChangeListener masterListener = new MasterPropertyListener();
47
48
	private class MasterPropertyListener implements IListPropertyChangeListener {
49
		public void handleListPropertyChange(ListPropertyChangeEvent event) {
50
			Object source = event.getSource();
51
			ListDiffEntry[] masterEntries = event.diff.getDifferences();
52
			ListDiffEntry[] detailEntries = new ListDiffEntry[masterEntries.length];
53
			Set masterElementsAdded = new HashSet();
54
			Set masterElementsRemoved = new HashSet();
55
			for (int i = 0; i < masterEntries.length; i++) {
56
				ListDiffEntry masterDifference = masterEntries[i];
57
				int index = masterDifference.getPosition();
58
				boolean addition = masterDifference.isAddition();
59
				Object masterElement = masterDifference.getElement();
60
				Object elementDetailValue = detailProperty
61
						.getValue(masterElement);
62
				detailEntries[i] = Diffs.createListDiffEntry(index, addition,
63
						elementDetailValue);
64
				if (addition)
65
					masterElementsAdded.add(masterElement);
66
				else
67
					masterElementsRemoved.add(masterElement);
68
			}
69
70
			ListDiff diff = Diffs.createListDiff(detailEntries);
71
72
			for (Iterator it = masterElementsRemoved.iterator(); it.hasNext();) {
73
				Object element = it.next();
74
				if (!masterProperty.contains(source, element))
75
					removeElementPropertyListener(source, element);
76
			}
77
			for (Iterator it = masterElementsAdded.iterator(); it.hasNext();) {
78
				Object element = it.next();
79
				if (masterProperty.contains(source, element))
80
					addElementPropertyListener(source, element);
81
			}
82
83
			fireListChange(source, diff);
84
		}
85
86
		private void addElementPropertyListener(Object source, Object element) {
87
			Map elementToDetailListener = (Map) sourceToMasterElementToDetailListener
88
					.get(source);
89
			if (elementToDetailListener == null) {
90
				sourceToMasterElementToDetailListener.put(source,
91
						elementToDetailListener = new HashMap());
92
			}
93
			if (!elementToDetailListener.containsKey(element)) {
94
				DetailPropertyListener detailListener = new DetailPropertyListener(
95
						source, element);
96
				detailProperty.addValueChangeListener(element, detailListener);
97
				elementToDetailListener.put(element, detailListener);
98
			}
99
		}
100
101
		private void removeElementPropertyListener(Object source, Object element) {
102
			Map elementToDetailListener = (Map) sourceToMasterElementToDetailListener
103
					.get(source);
104
			if (elementToDetailListener != null
105
					&& elementToDetailListener.containsKey(element)) {
106
				DetailPropertyListener detailListener = (DetailPropertyListener) elementToDetailListener
107
						.remove(element);
108
				detailProperty.removeValueChangeListener(element,
109
						detailListener);
110
			}
111
		}
112
	}
113
114
	private class DetailPropertyListener implements
115
			IValuePropertyChangeListener {
116
		private Object source;
117
		private Object masterElement;
118
119
		DetailPropertyListener(Object source, Object masterElement) {
120
			this.source = source;
121
			this.masterElement = masterElement;
122
		}
123
124
		private int[] findIndices() {
125
			List indices = new ArrayList();
126
127
			List list = masterProperty.getList(source);
128
			for (ListIterator it = list.listIterator(); it.hasNext();) {
129
				if (Util.equals(masterElement, it.next()))
130
					indices.add(new Integer(it.previousIndex()));
131
			}
132
133
			int[] result = new int[indices.size()];
134
			for (int i = 0; i < result.length; i++) {
135
				result[i] = ((Integer) indices.get(i)).intValue();
136
			}
137
			return result;
138
		}
139
140
		public void handleValuePropertyChange(ValuePropertyChangeEvent event) {
141
			int[] indices = findIndices();
142
			Object oldValue = event.diff.getOldValue();
143
			Object newValue = event.diff.getNewValue();
144
			ListDiffEntry[] entries = new ListDiffEntry[indices.length * 2];
145
			for (int i = 0; i < indices.length; i++) {
146
				int index = indices[i];
147
				entries[i * 2] = Diffs.createListDiffEntry(index, false,
148
						oldValue);
149
				entries[i * 2 + 1] = Diffs.createListDiffEntry(index, true,
150
						newValue);
151
			}
152
153
			ListDiff diff = Diffs.createListDiff(entries);
154
			fireListChange(source, diff);
155
		}
156
	}
157
158
	/**
159
	 * @param masterProperty
160
	 * @param detailProperty
161
	 */
162
	public ListPropertyDetailValueList(IListProperty masterProperty,
163
			IValueProperty detailProperty) {
164
		this.masterProperty = masterProperty;
165
		this.detailProperty = detailProperty;
166
	}
167
168
	protected void addListenerTo(Object source) {
169
		masterProperty.addListChangeListener(source, masterListener);
170
171
		Map masterElementToDetailListener = new HashMap();
172
		for (Iterator it = masterProperty.getList(source).iterator(); it
173
				.hasNext();) {
174
			Object masterElement = it.next();
175
			DetailPropertyListener detailListener = new DetailPropertyListener(
176
					source, masterElement);
177
			detailProperty
178
					.addValueChangeListener(masterElement, detailListener);
179
			masterElementToDetailListener.put(masterElement, detailListener);
180
		}
181
182
		sourceToMasterElementToDetailListener.put(source,
183
				masterElementToDetailListener);
184
	}
185
186
	protected void removeListenerFrom(Object source) {
187
		masterProperty.removeListChangeListener(source, masterListener);
188
		Map masterElementToDetailListener = (Map) sourceToMasterElementToDetailListener
189
				.remove(source);
190
		if (masterElementToDetailListener != null) {
191
			for (Iterator it = masterElementToDetailListener.entrySet()
192
					.iterator(); it.hasNext();) {
193
				Map.Entry entry = (Map.Entry) it.next();
194
				detailProperty.removeValueChangeListener(entry.getKey(),
195
						(DetailPropertyListener) entry.getValue());
196
			}
197
		}
198
	}
199
200
	public List getList(Object source) {
201
		List result = new ArrayList();
202
		for (Iterator it = masterProperty.getList(source).iterator(); it
203
				.hasNext();) {
204
			result.add(detailProperty.getValue(it.next()));
205
		}
206
		return result;
207
	}
208
209
	public boolean add(Object source, Object o) {
210
		throw new UnsupportedOperationException();
211
	}
212
213
	public boolean addAll(Object source, Collection c) {
214
		throw new UnsupportedOperationException();
215
	}
216
217
	public void clear(Object source) {
218
		throw new UnsupportedOperationException();
219
	}
220
221
	public Object getElementType() {
222
		return detailProperty.getValueType();
223
	}
224
225
	public boolean remove(Object source, Object o) {
226
		throw new UnsupportedOperationException();
227
	}
228
229
	public boolean removeAll(Object source, Collection c) {
230
		throw new UnsupportedOperationException();
231
	}
232
233
	public boolean retainAll(Object source, Collection c) {
234
		throw new UnsupportedOperationException();
235
	}
236
237
	public void add(Object source, int index, Object element) {
238
		throw new UnsupportedOperationException();
239
	}
240
241
	public boolean addAll(Object source, int index, Collection c) {
242
		throw new UnsupportedOperationException();
243
	}
244
245
	public Object move(Object source, int oldIndex, int newIndex) {
246
		throw new UnsupportedOperationException();
247
	}
248
249
	public Object remove(Object source, int index) {
250
		throw new UnsupportedOperationException();
251
	}
252
253
	public Object set(Object source, int index, Object element) {
254
		Object masterElement = masterProperty.get(source, index);
255
		Object result = detailProperty.getValue(masterElement);
256
		detailProperty.setValue(masterElement, element);
257
		return result;
258
	}
259
}
(-)src/org/eclipse/core/internal/databinding/property/PropertyCache.java (+65 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.Map;
16
17
import org.eclipse.core.internal.databinding.IdentityWrapper;
18
19
/**
20
 * @since 3.3
21
 * 
22
 */
23
public class PropertyCache {
24
	private Map map;
25
26
	private Map getMap() {
27
		if (map == null)
28
			map = new HashMap();
29
		return map;
30
	}
31
32
	/**
33
	 * @param source
34
	 * @param property
35
	 */
36
	public synchronized void put(Object source, Object property) {
37
		getMap().put(new IdentityWrapper(source), property);
38
	}
39
40
	/**
41
	 * @param source
42
	 * @return the cached property
43
	 */
44
	public synchronized Object get(Object source) {
45
		return map == null ? null : map.get(new IdentityWrapper(source));
46
	}
47
48
	/**
49
	 * @param source
50
	 */
51
	public synchronized void remove(Object source) {
52
		if (map != null)
53
			map.remove(new IdentityWrapper(source));
54
	}
55
56
	/**
57
	 * 
58
	 */
59
	public void dispose() {
60
		if (map != null) {
61
			map.clear();
62
			map = null;
63
		}
64
	}
65
}
(-)src/org/eclipse/core/internal/databinding/observable/masterdetail/ListValuePropertyObservableList.java (+379 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable.masterdetail;
13
14
import java.lang.reflect.Array;
15
import java.util.ArrayList;
16
import java.util.Collection;
17
import java.util.Iterator;
18
import java.util.List;
19
import java.util.ListIterator;
20
21
import org.eclipse.core.databinding.observable.Diffs;
22
import org.eclipse.core.databinding.observable.IObserving;
23
import org.eclipse.core.databinding.observable.ObservableTracker;
24
import org.eclipse.core.databinding.observable.list.AbstractObservableList;
25
import org.eclipse.core.databinding.observable.list.IListChangeListener;
26
import org.eclipse.core.databinding.observable.list.IObservableList;
27
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
28
import org.eclipse.core.databinding.observable.list.ListDiff;
29
import org.eclipse.core.databinding.observable.list.ListDiffEntry;
30
import org.eclipse.core.databinding.observable.set.IObservableSet;
31
import org.eclipse.core.databinding.observable.set.ISetChangeListener;
32
import org.eclipse.core.databinding.observable.set.SetChangeEvent;
33
import org.eclipse.core.databinding.observable.set.WritableSet;
34
import org.eclipse.core.databinding.property.value.IValueProperty;
35
import org.eclipse.core.databinding.property.value.IValuePropertyChangeListener;
36
import org.eclipse.core.databinding.property.value.ValuePropertyChangeEvent;
37
import org.eclipse.core.internal.databinding.Util;
38
39
/**
40
 * @since 3.3
41
 * 
42
 */
43
public class ListValuePropertyObservableList extends AbstractObservableList
44
		implements IObserving {
45
	private IObservableList masterList;
46
	private IValueProperty detailProperty;
47
48
	private IObservableSet knownMasterElements;
49
50
	private boolean disposed = false;
51
52
	private IListChangeListener masterListener = new IListChangeListener() {
53
		public void handleListChange(ListChangeEvent event) {
54
			ListDiffEntry[] masterEntries = event.diff.getDifferences();
55
			ListDiffEntry[] detailEntries = new ListDiffEntry[masterEntries.length];
56
			for (int i = 0; i < masterEntries.length; i++) {
57
				ListDiffEntry masterDifference = masterEntries[i];
58
				int index = masterDifference.getPosition();
59
				boolean addition = masterDifference.isAddition();
60
				Object masterElement = masterDifference.getElement();
61
				Object elementDetailValue = detailProperty
62
						.getValue(masterElement);
63
				detailEntries[i] = Diffs.createListDiffEntry(index, addition,
64
						elementDetailValue);
65
			}
66
67
			// Removes listeners from elements removed from list
68
			knownMasterElements.retainAll(masterList);
69
70
			// Adds listeners to elements added to list
71
			knownMasterElements.addAll(masterList);
72
73
			fireListChange(Diffs.createListDiff(detailEntries));
74
		}
75
	};
76
77
	private IValuePropertyChangeListener detailListener = new IValuePropertyChangeListener() {
78
		public void handleValuePropertyChange(
79
				final ValuePropertyChangeEvent event) {
80
			if (!disposed) {
81
				Object source = event.getSource();
82
				int[] indices = findIndices(source);
83
				Object oldValue = event.diff.getOldValue();
84
				Object newValue = event.diff.getNewValue();
85
				ListDiffEntry[] entries = new ListDiffEntry[indices.length * 2];
86
				for (int i = 0; i < indices.length; i++) {
87
					int index = indices[i];
88
					entries[i * 2] = Diffs.createListDiffEntry(index, false,
89
							oldValue);
90
					entries[i * 2 + 1] = Diffs.createListDiffEntry(index, true,
91
							newValue);
92
				}
93
94
				ListDiff diff = Diffs.createListDiff(entries);
95
				fireListChange(diff);
96
			}
97
		}
98
99
		private int[] findIndices(Object masterElement) {
100
			List indices = new ArrayList();
101
102
			for (ListIterator it = masterList.listIterator(); it.hasNext();) {
103
				if (Util.equals(masterElement, it.next()))
104
					indices.add(new Integer(it.previousIndex()));
105
			}
106
107
			int[] result = new int[indices.size()];
108
			for (int i = 0; i < result.length; i++) {
109
				result[i] = ((Integer) indices.get(i)).intValue();
110
			}
111
			return result;
112
		}
113
	};
114
115
	/**
116
	 * @param masterList
117
	 * @param valueProperty
118
	 */
119
	public ListValuePropertyObservableList(IObservableList masterList,
120
			IValueProperty valueProperty) {
121
		super(masterList.getRealm());
122
		this.masterList = masterList;
123
		this.detailProperty = valueProperty;
124
	}
125
126
	protected void firstListenerAdded() {
127
		knownMasterElements = new WritableSet(getRealm());
128
		knownMasterElements.addSetChangeListener(new ISetChangeListener() {
129
			public void handleSetChange(SetChangeEvent event) {
130
				for (Iterator it = event.diff.getRemovals().iterator(); it
131
						.hasNext();) {
132
					detailProperty.addValueChangeListener(it.next(),
133
							detailListener);
134
				}
135
				for (Iterator it = event.diff.getAdditions().iterator(); it
136
						.hasNext();) {
137
					detailProperty.removeValueChangeListener(it.next(),
138
							detailListener);
139
				}
140
			}
141
		});
142
		knownMasterElements.addAll(masterList);
143
		masterList.addListChangeListener(masterListener);
144
	}
145
146
	protected void lastListenerRemoved() {
147
		masterList.removeListChangeListener(masterListener);
148
		if (knownMasterElements != null) {
149
			knownMasterElements.clear();
150
			knownMasterElements.dispose();
151
			knownMasterElements = null;
152
		}
153
	}
154
155
	protected int doGetSize() {
156
		getterCalled();
157
		return masterList.size();
158
	}
159
160
	private void getterCalled() {
161
		ObservableTracker.getterCalled(this);
162
	}
163
164
	public Object getElementType() {
165
		return detailProperty.getValueType();
166
	}
167
168
	public Object get(int index) {
169
		getterCalled();
170
		Object masterElement = masterList.get(index);
171
		return detailProperty.getValue(masterElement);
172
	}
173
174
	public boolean add(Object o) {
175
		throw new UnsupportedOperationException();
176
	}
177
178
	public boolean addAll(Collection c) {
179
		throw new UnsupportedOperationException();
180
	}
181
182
	public boolean addAll(int index, Collection c) {
183
		throw new UnsupportedOperationException();
184
	}
185
186
	public boolean contains(Object o) {
187
		getterCalled();
188
189
		Iterator it;
190
		if (knownMasterElements != null)
191
			it = knownMasterElements.iterator();
192
		else
193
			it = masterList.iterator();
194
		for (; it.hasNext();) {
195
			if (Util.equals(detailProperty.getValue(it.next()), o))
196
				return true;
197
		}
198
		return false;
199
	}
200
201
	public boolean isEmpty() {
202
		getterCalled();
203
		return masterList.isEmpty();
204
	}
205
206
	public boolean isStale() {
207
		getterCalled();
208
		return masterList.isStale();
209
	}
210
211
	public Iterator iterator() {
212
		getterCalled();
213
		return new Iterator() {
214
			Iterator it = masterList.iterator();
215
216
			public boolean hasNext() {
217
				getterCalled();
218
				return it.hasNext();
219
			}
220
221
			public Object next() {
222
				getterCalled();
223
				Object masterElement = it.next();
224
				return detailProperty.getValue(masterElement);
225
			}
226
227
			public void remove() {
228
				throw new UnsupportedOperationException();
229
			}
230
		};
231
	}
232
233
	public Object move(int oldIndex, int newIndex) {
234
		throw new UnsupportedOperationException();
235
	}
236
237
	public boolean remove(Object o) {
238
		throw new UnsupportedOperationException();
239
	}
240
241
	public boolean removeAll(Collection c) {
242
		throw new UnsupportedOperationException();
243
	}
244
245
	public boolean retainAll(Collection c) {
246
		throw new UnsupportedOperationException();
247
	}
248
249
	public Object[] toArray() {
250
		getterCalled();
251
		Object[] masterElements = masterList.toArray();
252
		Object[] result = new Object[masterElements.length];
253
		for (int i = 0; i < result.length; i++) {
254
			result[i] = detailProperty.getValue(masterElements[i]);
255
		}
256
		return result;
257
	}
258
259
	public Object[] toArray(Object[] a) {
260
		getterCalled();
261
		Object[] masterElements = masterList.toArray();
262
		if (a.length < masterElements.length)
263
			a = (Object[]) Array.newInstance(a.getClass().getComponentType(),
264
					masterElements.length);
265
		for (int i = 0; i < masterElements.length; i++) {
266
			a[i] = detailProperty.getValue(masterElements[i]);
267
		}
268
		return a;
269
	}
270
271
	public void add(int index, Object o) {
272
		throw new UnsupportedOperationException();
273
	}
274
275
	public void clear() {
276
		throw new UnsupportedOperationException();
277
	}
278
279
	public ListIterator listIterator() {
280
		return listIterator(0);
281
	}
282
283
	public ListIterator listIterator(final int index) {
284
		getterCalled();
285
		return new ListIterator() {
286
			ListIterator it = masterList.listIterator(index);
287
			Object lastReturned;
288
			boolean haveIterated = false;
289
290
			public void add(Object arg0) {
291
				throw new UnsupportedOperationException();
292
			}
293
294
			public boolean hasNext() {
295
				getterCalled();
296
				return it.hasNext();
297
			}
298
299
			public boolean hasPrevious() {
300
				getterCalled();
301
				return it.hasPrevious();
302
			}
303
304
			public Object next() {
305
				getterCalled();
306
				Object result = lastReturned = detailProperty.getValue(it
307
						.next());
308
				haveIterated = true;
309
				return result;
310
			}
311
312
			public int nextIndex() {
313
				getterCalled();
314
				return it.nextIndex();
315
			}
316
317
			public Object previous() {
318
				getterCalled();
319
				Object result = lastReturned = detailProperty.getValue(it
320
						.previous());
321
				haveIterated = true;
322
				return result;
323
			}
324
325
			public int previousIndex() {
326
				getterCalled();
327
				return it.previousIndex();
328
			}
329
330
			public void remove() {
331
				throw new UnsupportedOperationException();
332
			}
333
334
			public void set(Object o) {
335
				checkRealm();
336
				if (!haveIterated)
337
					throw new IllegalStateException();
338
				// if listeners are registered, the value property listener will
339
				// cause the list change event to fire. otherwise it doesn't
340
				// matter because noone is listening
341
				detailProperty.setValue(lastReturned, o);
342
			}
343
		};
344
	}
345
346
	public Object remove(int index) {
347
		throw new UnsupportedOperationException();
348
	}
349
350
	public Object set(int index, Object o) {
351
		checkRealm();
352
		Object masterElement = masterList.get(index);
353
		Object oldValue = detailProperty.getValue(masterElement);
354
		detailProperty.setValue(masterElement, o);
355
		return oldValue;
356
	}
357
358
	public Object getObserved() {
359
		return masterList;
360
	}
361
362
	public synchronized void dispose() {
363
		if (masterList != null) {
364
			masterList.removeListChangeListener(masterListener);
365
			masterList = null;
366
			masterListener = null;
367
		}
368
		if (knownMasterElements != null) {
369
			knownMasterElements.clear();
370
			knownMasterElements.dispose();
371
			knownMasterElements = null;
372
			detailListener = null;
373
		}
374
		detailProperty = null;
375
		disposed = true;
376
377
		super.dispose();
378
	}
379
}
(-)src/org/eclipse/core/databinding/property/list/IListPropertyChangeListener.java (+29 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.list;
13
14
import org.eclipse.core.databinding.property.IPropertyChangeListener;
15
16
/**
17
 * Listener for changes to list properties on a property source
18
 * 
19
 * @since 1.2
20
 */
21
public interface IListPropertyChangeListener extends IPropertyChangeListener {
22
	/**
23
	 * Handle a change to a list property on a specific property source.
24
	 * 
25
	 * @param event
26
	 *            an event describing the list change that occured.
27
	 */
28
	public void handleListPropertyChange(ListPropertyChangeEvent event);
29
}
(-)src/org/eclipse/core/internal/databinding/property/PropertyUpdateHelper.java (+68 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.property;
13
14
import java.util.HashMap;
15
import java.util.Map;
16
17
import org.eclipse.core.internal.databinding.IdentityWrapper;
18
19
/**
20
 * @since 3.3
21
 * 
22
 */
23
public class PropertyUpdateHelper {
24
	private ThreadLocal localMap = new ThreadLocal() {
25
		protected Object initialValue() {
26
			return new HashMap();
27
		}
28
	};
29
30
	/**
31
	 * @param source
32
	 * @return blah
33
	 */
34
	public boolean isUpdating(Object source) {
35
		Map map = (Map) localMap.get();
36
		return map.containsKey(new IdentityWrapper(source));
37
	}
38
39
	/**
40
	 * @param source
41
	 * @param state
42
	 */
43
	public void setUpdating(Object source, boolean state) {
44
		Map map = (Map) localMap.get();
45
		IdentityWrapper identityWrapper = new IdentityWrapper(source);
46
		Integer count = (Integer) map.get(identityWrapper);
47
		int newCount = (count == null ? 0 : count.intValue())
48
				+ (state ? 1 : -1);
49
		if (newCount > 0)
50
			map.put(identityWrapper, new Integer(newCount));
51
		else
52
			map.remove(identityWrapper);
53
	}
54
55
	/**
56
	 * 
57
	 */
58
	public void dispose() {
59
		if (localMap != null) {
60
			Map map = (Map) localMap.get();
61
			if (map != null) {
62
				map.clear();
63
				localMap.set(null);
64
			}
65
			localMap = null;
66
		}
67
	}
68
}
(-)src/org/eclipse/core/databinding/property/map/SimpleMapProperty.java (+221 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.map;
13
14
import java.util.Collections;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.Iterator;
18
import java.util.Map;
19
import java.util.Set;
20
21
import org.eclipse.core.databinding.observable.Diffs;
22
import org.eclipse.core.databinding.observable.map.MapDiff;
23
import org.eclipse.core.databinding.property.SimpleProperty;
24
import org.eclipse.core.internal.databinding.Util;
25
26
/**
27
 * Simplified abstract implementation of IMapProperty. This class takes care of
28
 * most of the functional requirements for an IMapProperty implementation,
29
 * leaving only the property-specific details to subclasses.
30
 * <p>
31
 * Subclasses must implement these methods:
32
 * <ul>
33
 * <li>{@link #getKeyType()}
34
 * <li>{@link #getValueType()}
35
 * <li>{@link #doGetMap(Object)}
36
 * <li>{@link #doSetMap(Object, Map, MapDiff)}
37
 * </ul>
38
 * Additionally, the following methods should be overridden when the property
39
 * source has listener APIs.
40
 * <ul>
41
 * <li>{@link #doAddListenerTo(Object)}
42
 * <li>{@link #doRemoveListenerFrom(Object)}
43
 * </ul>
44
 * 
45
 * @since 1.2
46
 */
47
public abstract class SimpleMapProperty extends SimpleProperty implements
48
		IMapProperty {
49
	public final void addMapChangeListener(Object source,
50
			IMapPropertyChangeListener listener) {
51
		addPropertyChangeListener(source, listener);
52
	}
53
54
	public final void removeMapChangeListener(Object source,
55
			IMapPropertyChangeListener listener) {
56
		removePropertyChangeListener(source, listener);
57
	}
58
59
	protected final Object getProperty(Object source) {
60
		return doGetMap(source);
61
	}
62
63
	public boolean containsKey(Object source, Object key) {
64
		return getMap(source).containsKey(key);
65
	}
66
67
	public boolean containsValue(Object source, Object value) {
68
		return getMap(source).containsValue(value);
69
	}
70
71
	public boolean equals(Object source, Object o) {
72
		return getMap(source).equals(o);
73
	}
74
75
	public Object get(Object source, Object key) {
76
		return getMap(source).get(key);
77
	}
78
79
	public int hashCode(Object source) {
80
		return getMap(source).hashCode();
81
	}
82
83
	public boolean isEmpty(Object source) {
84
		return getMap(source).isEmpty();
85
	}
86
87
	public int size(Object source) {
88
		return getMap(source).size();
89
	}
90
91
	public final Map getMap(Object source) {
92
		Map map = doGetMap(source);
93
		if (hasListeners(source) && !isUpdating(source)) {
94
			Map cached = (Map) getCached(source);
95
			if (!Util.equals(map, cached)) {
96
				fireMapChange(source, Diffs.computeMapDiff(cached, map));
97
			}
98
		}
99
		return map;
100
	}
101
102
	/**
103
	 * Returns a Map with the current contents of the source's map property
104
	 * 
105
	 * @param source
106
	 *            the property source
107
	 * @return a Map with the current contents of the source's map property
108
	 * @see IMapProperty#getMap(Object)
109
	 */
110
	protected abstract Map doGetMap(Object source);
111
112
	private void setMap(Object source, Map map, MapDiff diff) {
113
		setUpdating(source, true);
114
		try {
115
			doSetMap(source, map, diff);
116
		} finally {
117
			setUpdating(source, false);
118
		}
119
120
		if (hasListeners(source)) {
121
			fireMapChange(source, diff);
122
		}
123
	}
124
125
	/**
126
	 * Updates the property on the source with the specified change. A map
127
	 * change event is fired in the calling method, so implementers do not need
128
	 * to call {@link #fireMapChange(Object, MapDiff)}.
129
	 * 
130
	 * @param source
131
	 *            the property source
132
	 * @param map
133
	 *            the new map
134
	 * @param diff
135
	 *            a diff describing the change
136
	 */
137
	protected abstract void doSetMap(Object source, Map map, MapDiff diff);
138
139
	/**
140
	 * Notifies that the source's property changed. Listeners registered in the
141
	 * {@link #addListenerTo(Object)} method should call this method when a
142
	 * property change is observed on the source object.
143
	 * 
144
	 * @param source
145
	 *            the property source
146
	 * @param diff
147
	 *            a diff describing the map change. If null, a diff will be
148
	 *            computed from the cached state and the current state.
149
	 */
150
	protected final void fireMapChange(Object source, MapDiff diff) {
151
		if (!isUpdating(source) && hasListeners(source)) {
152
			if (diff == null) {
153
				diff = Diffs.computeMapDiff((Map) getCached(source),
154
						doGetMap(source));
155
			}
156
			if (!diff.isEmpty()) {
157
				firePropertyChange(new MapPropertyChangeEvent(source, this,
158
						diff));
159
			}
160
		}
161
	}
162
163
	public void clear(Object source) {
164
		if (!isEmpty(source)) {
165
			setMap(source, new HashMap(), Diffs
166
					.createMapDiffRemoveAll(new HashMap(getMap(source))));
167
		}
168
	}
169
170
	public Object put(Object source, Object key, Object value) {
171
		Map map = new HashMap(getMap(source));
172
		boolean addition = !map.containsKey(key);
173
		Object result = map.put(key, value);
174
		MapDiff diff;
175
		if (addition) {
176
			diff = Diffs.createMapDiffSingleAdd(key, value);
177
		} else {
178
			diff = Diffs.createMapDiffSingleChange(key, result, value);
179
		}
180
		setMap(source, map, diff);
181
		return result;
182
	}
183
184
	public void putAll(Object source, Map t) {
185
		if (t.isEmpty())
186
			return;
187
188
		Map map = new HashMap(getMap(source));
189
		Set addedKeys = new HashSet();
190
		Set changedKeys = new HashSet();
191
		Map oldValues = new HashMap();
192
		Map newValues = new HashMap();
193
		for (Iterator it = t.entrySet().iterator(); it.hasNext();) {
194
			Map.Entry entry = (Map.Entry) it.next();
195
			Object key = entry.getKey();
196
			Object newValue = entry.getValue();
197
			boolean addition = !map.containsKey(key);
198
			Object oldValue = map.put(key, newValue);
199
			if (addition) {
200
				addedKeys.add(key);
201
			} else if (!Util.equals(oldValue, newValue)) {
202
				changedKeys.add(key);
203
				oldValues.put(key, oldValue);
204
			}
205
			newValues.put(key, newValue);
206
		}
207
		setMap(source, map, Diffs.createMapDiff(addedKeys,
208
				Collections.EMPTY_SET, changedKeys, oldValues, newValues));
209
	}
210
211
	public Object remove(Object source, Object key) {
212
		Map map = getMap(source);
213
		if (map.containsKey(key)) {
214
			map = new HashMap(map);
215
			Object result = map.remove(key);
216
			setMap(source, map, Diffs.createMapDiffSingleRemove(key, result));
217
			return result;
218
		}
219
		return null;
220
	}
221
}
(-)src/org/eclipse/core/databinding/property/IPropertyChangeListener.java (+23 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
/**
15
 * Marker interface for all listener types in the properties framework.
16
 * 
17
 * @noimplement This interface is not intended to be implemented by clients.
18
 * 
19
 * @since 1.2
20
 */
21
public interface IPropertyChangeListener {
22
23
}
(-)src/org/eclipse/core/databinding/property/set/ISetProperty.java (+57 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.set;
13
14
import java.util.Set;
15
16
import org.eclipse.core.databinding.property.ICollectionProperty;
17
18
/**
19
 * Interface for set-typed properties
20
 * 
21
 * @since 1.2
22
 * @noimplement This interface is not intended to be implemented by clients.
23
 */
24
public interface ISetProperty extends ICollectionProperty {
25
	/**
26
	 * Returns a Set with the current contents of the source's set property
27
	 * 
28
	 * @param source
29
	 *            the property source
30
	 * @return a Set with the current contents of the source's set property
31
	 */
32
	public Set getSet(Object source);
33
34
	/**
35
	 * Adds the given set property change listener to the list of listeners for
36
	 * the given source.
37
	 * 
38
	 * @param source
39
	 *            the property source
40
	 * @param listener
41
	 *            the listener
42
	 */
43
	public void addSetChangeListener(Object source,
44
			ISetPropertyChangeListener listener);
45
46
	/**
47
	 * Removes the given set property change listener from the list of listeners
48
	 * for the given source.
49
	 * 
50
	 * @param source
51
	 *            the property source
52
	 * @param listener
53
	 *            the listener
54
	 */
55
	public void removeSetChangeListener(Object source,
56
			ISetPropertyChangeListener listener);
57
}
(-)src/org/eclipse/core/databinding/property/list/ListPropertyChangeEvent.java (+59 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.list;
13
14
import org.eclipse.core.databinding.observable.list.ListDiff;
15
import org.eclipse.core.databinding.property.IPropertyChangeListener;
16
import org.eclipse.core.databinding.property.PropertyChangeEvent;
17
import org.eclipse.core.runtime.Assert;
18
19
/**
20
 * List change event describing an incremental change of a list property on a
21
 * particular property source.
22
 * 
23
 * @since 1.2
24
 */
25
public class ListPropertyChangeEvent extends PropertyChangeEvent {
26
	private static final long serialVersionUID = 1L;
27
28
	/**
29
	 * The list property that changed
30
	 */
31
	public final IListProperty property;
32
33
	/**
34
	 * ListDiff enumerating the added and removed elements in the list.
35
	 */
36
	public final ListDiff diff;
37
38
	/**
39
	 * Constructs a ListPropertyChangeEvent with the given attributes
40
	 * 
41
	 * @param source
42
	 *            the property source
43
	 * @param property
44
	 *            the property that changed on the source
45
	 * @param diff
46
	 *            a ListDiff describing the changes to the list property
47
	 */
48
	public ListPropertyChangeEvent(Object source, IListProperty property,
49
			ListDiff diff) {
50
		super(source);
51
		this.property = property;
52
		Assert.isNotNull(diff, "diff cannot be null"); //$NON-NLS-1$
53
		this.diff = diff;
54
	}
55
56
	protected void dispatch(IPropertyChangeListener listener) {
57
		((IListPropertyChangeListener) listener).handleListPropertyChange(this);
58
	}
59
}
(-)src/org/eclipse/core/internal/databinding/observable/PropertyObservableSet.java (+197 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.internal.databinding.observable;
13
14
import java.util.Collection;
15
import java.util.ConcurrentModificationException;
16
import java.util.HashSet;
17
import java.util.Iterator;
18
import java.util.Set;
19
20
import org.eclipse.core.databinding.observable.Realm;
21
import org.eclipse.core.databinding.observable.set.AbstractObservableSet;
22
import org.eclipse.core.databinding.property.IProperty;
23
import org.eclipse.core.databinding.property.IPropertyObservable;
24
import org.eclipse.core.databinding.property.set.ISetProperty;
25
import org.eclipse.core.databinding.property.set.ISetPropertyChangeListener;
26
import org.eclipse.core.databinding.property.set.SetPropertyChangeEvent;
27
28
/**
29
 * @since 3.3
30
 * 
31
 */
32
public class PropertyObservableSet extends AbstractObservableSet implements
33
		IPropertyObservable {
34
	private Object source;
35
	private ISetProperty property;
36
37
	private boolean updating = false;
38
39
	private boolean disposed = false;
40
41
	private transient volatile int modCount = 0;
42
43
	private ISetPropertyChangeListener listener = new ISetPropertyChangeListener() {
44
		public void handleSetPropertyChange(final SetPropertyChangeEvent event) {
45
			if (!disposed && !updating) {
46
				getRealm().exec(new Runnable() {
47
					public void run() {
48
						getRealm().exec(new Runnable() {
49
							public void run() {
50
								modCount++;
51
								fireSetChange(event.diff);
52
							}
53
						});
54
					}
55
				});
56
			}
57
		}
58
	};
59
60
	/**
61
	 * @param realm
62
	 * @param source
63
	 * @param property
64
	 */
65
	public PropertyObservableSet(Realm realm, Object source,
66
			ISetProperty property) {
67
		super(realm);
68
		this.source = source;
69
		this.property = property;
70
	}
71
72
	protected void firstListenerAdded() {
73
		if (!disposed) {
74
			property.addSetChangeListener(source, listener);
75
		}
76
	}
77
78
	protected void lastListenerRemoved() {
79
		if (!disposed) {
80
			property.removeSetChangeListener(source, listener);
81
		}
82
	}
83
84
	protected Set getWrappedSet() {
85
		return property.getSet(source);
86
	}
87
88
	public Object getElementType() {
89
		return property.getElementType();
90
	}
91
92
	// Queries
93
94
	protected int doGetSize() {
95
		return property.size(source);
96
	}
97
98
	// Single change operations
99
100
	public boolean add(Object o) {
101
		checkRealm();
102
		return property.add(source, o);
103
	}
104
105
	public Iterator iterator() {
106
		getterCalled();
107
		return new Iterator() {
108
			int expectedModCount = modCount;
109
			Iterator delegate = new HashSet(property.getSet(source)).iterator();
110
			Object last = null;
111
112
			public boolean hasNext() {
113
				getterCalled();
114
				checkForComodification();
115
				return delegate.hasNext();
116
			}
117
118
			public Object next() {
119
				getterCalled();
120
				checkForComodification();
121
				Object next = delegate.next();
122
				last = next;
123
				return next;
124
			}
125
126
			public void remove() {
127
				checkRealm();
128
				checkForComodification();
129
130
				delegate.remove(); // stay in sync
131
132
				property.remove(source, last);
133
134
				last = null;
135
				expectedModCount = modCount;
136
			}
137
138
			private void checkForComodification() {
139
				if (expectedModCount != modCount)
140
					throw new ConcurrentModificationException();
141
			}
142
		};
143
	}
144
145
	public boolean remove(Object o) {
146
		getterCalled();
147
		return property.remove(source, o);
148
	}
149
150
	// Bulk change operations
151
152
	public boolean addAll(Collection c) {
153
		getterCalled();
154
		return property.addAll(source, c);
155
	}
156
157
	public boolean removeAll(Collection c) {
158
		getterCalled();
159
		return property.removeAll(source, c);
160
	}
161
162
	public boolean retainAll(Collection c) {
163
		getterCalled();
164
		return property.retainAll(source, c);
165
	}
166
167
	public void clear() {
168
		getterCalled();
169
		property.clear(source);
170
	}
171
172
	public boolean equals(Object o) {
173
		return property.equals(source, o);
174
	}
175
176
	public int hashCode() {
177
		return property.hashCode(source);
178
	}
179
180
	public Object getObserved() {
181
		return source;
182
	}
183
184
	public IProperty getProperty() {
185
		return property;
186
	}
187
188
	public synchronized void dispose() {
189
		if (!disposed) {
190
			disposed = true;
191
			property.removeSetChangeListener(source, listener);
192
			property = null;
193
			source = null;
194
		}
195
		super.dispose();
196
	}
197
}
(-)src/org/eclipse/core/databinding/property/map/MapPropertyChangeEvent.java (+59 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property.map;
13
14
import org.eclipse.core.databinding.observable.map.MapDiff;
15
import org.eclipse.core.databinding.property.IPropertyChangeListener;
16
import org.eclipse.core.databinding.property.PropertyChangeEvent;
17
import org.eclipse.core.runtime.Assert;
18
19
/**
20
 * Map change event describing an incremental change of a map property on a
21
 * particular property source.
22
 * 
23
 * @since 1.2
24
 */
25
public class MapPropertyChangeEvent extends PropertyChangeEvent {
26
	private static final long serialVersionUID = 1L;
27
28
	/**
29
	 * The map property that changed
30
	 */
31
	public final IMapProperty property;
32
33
	/**
34
	 * MapDiff enumerating the added, changed, and removed entries in the map.
35
	 */
36
	public final MapDiff diff;
37
38
	/**
39
	 * Constructs a MapPropertyChangeEvent with the given attributes
40
	 * 
41
	 * @param source
42
	 *            the property source
43
	 * @param property
44
	 *            the property that changed on the source
45
	 * @param diff
46
	 *            a MapDiff describing the changes to the map property
47
	 */
48
	public MapPropertyChangeEvent(Object source, IMapProperty property,
49
			MapDiff diff) {
50
		super(source);
51
		this.property = property;
52
		Assert.isNotNull(diff, "diff cannot be null"); //$NON-NLS-1$
53
		this.diff = diff;
54
	}
55
56
	protected void dispatch(IPropertyChangeListener listener) {
57
		((IMapPropertyChangeListener) listener).handleMapPropertyChange(this);
58
	}
59
}
(-)src/org/eclipse/core/databinding/property/Property.java (+144 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Matthew Hall 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
 *     Matthew Hall - initial API and implementation (bug 194734)
10
 ******************************************************************************/
11
12
package org.eclipse.core.databinding.property;
13
14
/**
15
 * Abstract implementation of IProperty
16
 * 
17
 * @since 1.2
18
 */
19
public abstract class Property implements IProperty {
20
	private PropertyChangeSupport changeSupport;
21
22
	private boolean disposed;
23
24
	private synchronized PropertyChangeSupport getChangeSupport() {
25
		if (changeSupport == null) {
26
			changeSupport = new PropertyChangeSupport() {
27
				protected void addListenerTo(Object source) {
28
					Property.this.addListenerTo(source);
29
				}
30
31
				protected void removeListenerFrom(Object source) {
32
					Property.this.removeListenerFrom(source);
33
				}
34
			};
35
		}
36
		return changeSupport;
37
	}
38
39
	/**
40
	 * Adds the listener to the list of listeners for the specified property
41
	 * source.
42
	 * 
43
	 * @param source
44
	 *            the property source
45
	 * @param listener
46
	 *            the listener to add
47
	 */
48
	protected final synchronized void addPropertyChangeListener(Object source,
49
			IPropertyChangeListener listener) {
50
		if (!isDisposed()) {
51
			getChangeSupport().addListener(source, listener);
52
		}
53
	}
54
55
	/**
56
	 * Removes the listener from the list of listeners for the specified
57
	 * property source.
58
	 * 
59
	 * @param source
60
	 *            the property source
61
	 * @param listener
62
	 *            the listener to remove
63
	 */
64
	protected final synchronized void removePropertyChangeListener(
65
			Object source, IPropertyChangeListener listener) {
66
		if (changeSupport != null) {
67
			changeSupport.removeListener(source, listener);
68
		}
69
	}
70
71
	/**
72
	 * Returns whether this property has listeners registered for the given
73
	 * property source
74
	 * 
75
	 * @param source
76
	 *            the property source
77
	 * @return whether this property has listeners registered for the given
78
	 *         property source
79
	 */
80
	protected final boolean hasListeners(Object source) {
81
		PropertyChangeSupport changeSupport = this.changeSupport;
82
		return changeSupport != null && changeSupport.hasListeners(source);
83
	}
84
85
	/**
86
	 * Fires a property change notification for all listeners registered on the
87
	 * property source indicated by the event object
88
	 * 
89
	 * @param event
90
	 *            the property change event
91
	 */
92
	protected void firePropertyChange(PropertyChangeEvent event) {
93
		PropertyChangeSupport changeSupport = this.changeSupport;
94
		if (changeSupport != null
95
				&& changeSupport.hasListeners(event.getSource())) {
96
			changeSupport.firePropertyChange(event);
97
		}
98
	}
99
100
	/**
101
	 * Adds a listener on the given property source for changes to the property.
102
	 * The listener should fire a property change event whenever the a property
103
	 * change is observed. This method is called when the first property change
104
	 * listener is added for the given source object.
105
	 * <p>
106
	 * This method does nothing if the source object has no listener support for
107
	 * the property.
108
	 * 
109
	 * @param source
110
	 *            the source object to observe for property changes.
111
	 * @see #removeListenerFrom(Object)
112
	 * @noreference This method is not intended to be referenced by clients.
113
	 */
114
	protected abstract void addListenerTo(Object source);
115
116
	/**
117
	 * Remove the listeners previous added on the property source for changes to
118
	 * the property. This method is called when the last property change
119
	 * listener is removed for the given source object.
120
	 * <p>
121
	 * This method does nothing if the source object has no listener support for
122
	 * the property.
123
	 * 
124
	 * @param source
125
	 *            the source object to stop observing for property changes.
126
	 * @see #addListenerTo(Object)
127
	 * @noreference This method is not intended to be referenced by clients.
128
	 */
129
	protected abstract void removeListenerFrom(Object source);
130
131
	public boolean isDisposed() {
132
		return disposed;
133
	}
134
135
	public synchronized void dispose() {
136
		if (!disposed) {
137
			if (changeSupport != null) {
138
				changeSupport.dispose();
139
				changeSupport = null;
140
			}
141
			disposed = true;
142
		}
143
	}
144
}

Return to bug 194734