View | Details | Raw Unified | Return to bug 144260 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jface/databinding/viewers/ObservableValueEditingSupport.java (+220 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 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.databinding.viewers;
13
14
import org.eclipse.core.databinding.Binding;
15
import org.eclipse.core.databinding.DataBindingContext;
16
import org.eclipse.core.databinding.UpdateValueStrategy;
17
import org.eclipse.core.databinding.observable.value.IObservableValue;
18
import org.eclipse.core.runtime.Assert;
19
import org.eclipse.jface.viewers.CellEditor;
20
import org.eclipse.jface.viewers.ColumnViewer;
21
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
22
import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
23
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
24
import org.eclipse.jface.viewers.EditingSupport;
25
import org.eclipse.jface.viewers.ViewerCell;
26
27
/**
28
 * {@link EditingSupport} using the JFace Data Binding concepts to handle the
29
 * updating of an element from a {@link CellEditor}.
30
 * 
31
 * @since 1.2
32
 */
33
public abstract class ObservableValueEditingSupport extends EditingSupport {
34
	/**
35
	 * Maintains references to the instances currently imployed while editing.
36
	 * Will be <code>null</code> when not editing.
37
	 */
38
	private EditingState editingState;
39
40
	private final ColumnViewerEditorActivationListenerHelper activationListener = new ColumnViewerEditorActivationListenerHelper();
41
42
	private ColumnViewer viewer;
43
44
	private DataBindingContext dbc;
45
46
	/**
47
	 * Constructs a new instance with the provided <code>viewer</code> and
48
	 * <code>dbc</code>.
49
	 * 
50
	 * @param viewer
51
	 *            viewer to edit
52
	 * @param dbc
53
	 *            dbc to create <code>Bindings</code>
54
	 */
55
	public ObservableValueEditingSupport(ColumnViewer viewer,
56
			DataBindingContext dbc) {
57
		super(viewer);
58
59
		if (dbc == null) {
60
			throw new IllegalArgumentException("Parameter dbc was null."); //$NON-NLS-1$
61
		}
62
63
		this.viewer = viewer;
64
		this.dbc = dbc;
65
	}
66
67
	/**
68
	 * Default implementation always returns <code>true</code>.
69
	 * 
70
	 * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
71
	 */
72
	protected boolean canEdit(Object element) {
73
		return true;
74
	}
75
76
	/**
77
	 * Default implementation always returns <code>null</code> as this will be
78
	 * handled by the Binding.
79
	 * 
80
	 * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object)
81
	 */
82
	protected Object getValue(Object element) {
83
		// no op
84
		return null;
85
	}
86
87
	/**
88
	 * Default implementation does nothing as this will be handled by the
89
	 * Binding.
90
	 * 
91
	 * @see org.eclipse.jface.viewers.EditingSupport#setValue(java.lang.Object,
92
	 *      java.lang.Object)
93
	 */
94
	protected void setValue(Object element, Object value) {
95
		// no op
96
	}
97
98
	/**
99
	 * Creates a {@link Binding} between the editor and the element to be
100
	 * edited. Invokes {@link #doCreateCellEditorObservable(CellEditor)},
101
	 * {@link #doCreateElementObservable(Object, ViewerCell)}, and then
102
	 * {@link #createBinding(IObservableValue, IObservableValue)}.
103
	 */
104
	final protected void initializeCellEditorValue(CellEditor cellEditor,
105
			ViewerCell cell) {
106
		IObservableValue target = doCreateCellEditorObservable(cellEditor);
107
		Assert
108
				.isNotNull(target,
109
						"doCreateCellEditorObservable(...) did not return an observable"); //$NON-NLS-1$
110
111
		IObservableValue model = doCreateElementObservable(cell.getElement(),
112
				cell);
113
		Assert.isNotNull(model,
114
				"doCreateElementObservable(...) did not return an observable"); //$NON-NLS-1$
115
116
		Binding binding = createBinding(target, model);
117
		Assert
118
				.isNotNull(binding,
119
						"createBinding(...) did not return a binding"); //$NON-NLS-1$
120
121
		editingState = new EditingState(binding, target, model);
122
123
		getViewer().getColumnViewerEditor().addEditorActivationListener(
124
				activationListener);
125
	}
126
127
	/**
128
	 * Creates the observable value for the CellEditor.
129
	 * 
130
	 * @param cellEditor
131
	 * @return observable value
132
	 */
133
	protected abstract IObservableValue doCreateCellEditorObservable(
134
			CellEditor cellEditor);
135
136
	/**
137
	 * Creates the observable value for the element.
138
	 * 
139
	 * @param element
140
	 * @param cell
141
	 * @return observable value
142
	 */
143
	protected abstract IObservableValue doCreateElementObservable(
144
			Object element, ViewerCell cell);
145
146
	/**
147
	 * Creates a new binding for the provided <code>target</code> and
148
	 * <code>model</code>. Default
149
	 * {@link UpdateValueStrategy value update strategies} are used with the
150
	 * target to model updating on {@link UpdateValueStrategy#POLICY_CONVERT}.
151
	 * 
152
	 * @param target
153
	 * @param model
154
	 * @return binding
155
	 */
156
	protected Binding createBinding(IObservableValue target,
157
			IObservableValue model) {
158
		return dbc.bindValue(target, model, new UpdateValueStrategy(
159
				UpdateValueStrategy.POLICY_CONVERT), null);
160
	}
161
162
	/**
163
	 * Updates the model from the target.
164
	 */
165
	final protected void saveCellEditorValue(CellEditor cellEditor,
166
			ViewerCell cell) {
167
		editingState.binding.updateTargetToModel();
168
	}
169
170
	private class ColumnViewerEditorActivationListenerHelper extends
171
			ColumnViewerEditorActivationListener {
172
173
		public void afterEditorActivated(ColumnViewerEditorActivationEvent event) {
174
			// do nothing
175
		}
176
177
		public void afterEditorDeactivated(
178
				ColumnViewerEditorDeactivationEvent event) {
179
			editingState.dispose();
180
			editingState = null;
181
182
			viewer.getColumnViewerEditor().removeEditorActivationListener(this);
183
		}
184
185
		public void beforeEditorActivated(
186
				ColumnViewerEditorActivationEvent event) {
187
			// do nothing
188
		}
189
190
		public void beforeEditorDeactivated(
191
				ColumnViewerEditorDeactivationEvent event) {
192
			// do nothing
193
		}
194
	}
195
196
	/**
197
	 * Maintains references to objects that only live for the length of the edit
198
	 * cycle.
199
	 */
200
	private class EditingState {
201
		IObservableValue target;
202
203
		IObservableValue model;
204
205
		Binding binding;
206
207
		EditingState(Binding binding, IObservableValue target,
208
				IObservableValue model) {
209
			this.binding = binding;
210
			this.target = target;
211
			this.model = model;
212
		}
213
214
		void dispose() {
215
			target.dispose();
216
			model.dispose();
217
			binding.dispose();
218
		}
219
	}
220
}
(-)src/org/eclipse/jface/tests/databinding/BindingTestSuite.java (+2 lines)
Lines 109-114 Link Here
109
import org.eclipse.jface.tests.databinding.swt.SWTObservablesTest;
109
import org.eclipse.jface.tests.databinding.swt.SWTObservablesTest;
110
import org.eclipse.jface.tests.databinding.viewers.ObservableMapLabelProviderTest;
110
import org.eclipse.jface.tests.databinding.viewers.ObservableMapLabelProviderTest;
111
import org.eclipse.jface.tests.databinding.viewers.ObservableSetContentProviderTest;
111
import org.eclipse.jface.tests.databinding.viewers.ObservableSetContentProviderTest;
112
import org.eclipse.jface.tests.databinding.viewers.ObservableValueEditingSupportTest;
112
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskLexerAndTokenTest;
113
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskLexerAndTokenTest;
113
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskParserTest;
114
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskParserTest;
114
import org.eclipse.jface.tests.internal.databinding.internal.swt.ButtonObservableValueTest;
115
import org.eclipse.jface.tests.internal.databinding.internal.swt.ButtonObservableValueTest;
Lines 277-282 Link Here
277
		// org.eclipse.jface.tests.databinding.viewers
278
		// org.eclipse.jface.tests.databinding.viewers
278
		addTestSuite(ObservableMapLabelProviderTest.class);
279
		addTestSuite(ObservableMapLabelProviderTest.class);
279
		addTestSuite(ObservableSetContentProviderTest.class);
280
		addTestSuite(ObservableSetContentProviderTest.class);
281
		addTestSuite(ObservableValueEditingSupportTest.class);
280
		
282
		
281
		//org.eclipse.jface.tests.example.databinding.mask.internal
283
		//org.eclipse.jface.tests.example.databinding.mask.internal
282
		addTestSuite(EditMaskLexerAndTokenTest.class);
284
		addTestSuite(EditMaskLexerAndTokenTest.class);
(-)src/org/eclipse/jface/tests/databinding/viewers/ObservableValueEditingSupportTest.java (+302 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 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.tests.databinding.viewers;
13
14
import org.eclipse.core.databinding.Binding;
15
import org.eclipse.core.databinding.DataBindingContext;
16
import org.eclipse.core.databinding.beans.BeansObservables;
17
import org.eclipse.core.databinding.observable.IChangeListener;
18
import org.eclipse.core.databinding.observable.IStaleListener;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.list.WritableList;
21
import org.eclipse.core.databinding.observable.map.IObservableMap;
22
import org.eclipse.core.databinding.observable.value.IObservableValue;
23
import org.eclipse.core.databinding.observable.value.IValueChangeListener;
24
import org.eclipse.core.tests.internal.databinding.internal.beans.Bean;
25
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
27
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
28
import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
29
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
30
import org.eclipse.jface.viewers.CellEditor;
31
import org.eclipse.jface.viewers.ColumnViewer;
32
import org.eclipse.jface.viewers.TableViewer;
33
import org.eclipse.jface.viewers.TableViewerColumn;
34
import org.eclipse.jface.viewers.TextCellEditor;
35
import org.eclipse.jface.viewers.ViewerCell;
36
import org.eclipse.swt.SWT;
37
import org.eclipse.swt.widgets.Composite;
38
import org.eclipse.swt.widgets.Shell;
39
import org.eclipse.swt.widgets.Text;
40
41
public class ObservableValueEditingSupportTest extends AbstractSWTTestCase {
42
	private Shell shell;
43
44
	private ObservableValueEditingSupportStub editingSupport;
45
46
	private DataBindingContext dbc;
47
48
	private TableViewer viewer;
49
50
	private Bean bean;
51
52
	/*
53
	 * (non-Javadoc)
54
	 * 
55
	 * @see org.eclipse.jface.tests.databinding.AbstractSWTTestCase#setUp()
56
	 */
57
	protected void setUp() throws Exception {
58
		super.setUp();
59
60
		shell = getShell();
61
		dbc = new DataBindingContext();
62
63
		viewer = new TableViewer(shell);
64
		TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
65
66
		// Create a standard content provider
67
		ObservableListContentProvider peopleViewerContentProvider = new ObservableListContentProvider();
68
		viewer.setContentProvider(peopleViewerContentProvider);
69
70
		// And a standard label provider that maps columns
71
		IObservableMap[] attributeMaps = BeansObservables.observeMaps(
72
				peopleViewerContentProvider.getKnownElements(), Bean.class,
73
				new String[] { "value" });
74
		viewer.setLabelProvider(new ObservableMapLabelProvider(attributeMaps));
75
76
		editingSupport = new ObservableValueEditingSupportStub(viewer, dbc);
77
		column.setEditingSupport(editingSupport);
78
79
		WritableList input = WritableList.withElementType(String.class);
80
		bean = new Bean();
81
		bean.setValue("value");
82
		input.add(bean);
83
		viewer.setInput(input);
84
	}
85
86
	public void testInitializeCellEditorValue_OrderOfOperations()
87
			throws Exception {
88
		assertEquals("precondition", 0, editingSupport.events.length());
89
90
		viewer.editElement(bean, 0);
91
		assertEquals(
92
				"createCellEditorObservable createElementObservable createBinding",
93
				editingSupport.events.toString());
94
	}
95
96
	public void testSaveCellEditorValue_UpdatesModel() throws Exception {
97
		Text text = new Text(shell, SWT.NONE);
98
		shell.open();
99
100
		String newValue = bean.getValue() + "a";
101
102
		viewer.editElement(bean, 0);
103
		editingSupport.editor.setValue(newValue);
104
105
		// force the focus to leave the editor updating the value
106
		text.setFocus();
107
108
		assertEquals(newValue, bean.getValue());
109
	}
110
111
	public void testDisposesBinding() throws Exception {
112
		Text text = new Text(shell, SWT.NONE);
113
		shell.open();
114
115
		viewer.editElement(bean, 0);
116
		assertFalse("precondition", editingSupport.binding.isDisposed());
117
118
		text.setFocus();
119
		assertTrue(editingSupport.binding.isDisposed());
120
	}
121
122
	public void testDisposesTargetObservable() throws Exception {
123
		Text text = new Text(shell, SWT.NONE);
124
		shell.open();
125
126
		viewer.editElement(bean, 0);
127
		assertEquals("precondition", 0, editingSupport.target.disposed);
128
129
		text.setFocus();
130
		assertEquals(1, editingSupport.target.disposed);
131
	}
132
133
	public void testDisposesModelObservable() throws Exception {
134
		Text text = new Text(shell, SWT.NONE);
135
		shell.open();
136
137
		viewer.editElement(bean, 0);
138
		assertEquals("precondition", 0, editingSupport.model.disposed);
139
140
		text.setFocus();
141
		assertEquals(1, editingSupport.model.disposed);
142
	}
143
144
	public void testCanEdit_DefaultIsTrue() throws Exception {
145
		assertTrue(editingSupport.canEdit(bean));
146
	}
147
148
	private static class ObservableValueEditingSupportStub extends
149
			ObservableValueEditingSupport {
150
		StringBuffer events = new StringBuffer();
151
152
		TextCellEditor editor;
153
154
		Binding binding;
155
156
		ObservableValueDecorator target;
157
158
		ObservableValueDecorator model;
159
160
		/**
161
		 * @param viewer
162
		 * @param dbc
163
		 */
164
		public ObservableValueEditingSupportStub(ColumnViewer viewer,
165
				DataBindingContext dbc) {
166
			super(viewer, dbc);
167
			editor = new TextCellEditor((Composite) viewer.getControl());
168
		}
169
170
		/*
171
		 * (non-Javadoc)
172
		 * 
173
		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#canEdit(java.lang.Object)
174
		 */
175
		protected boolean canEdit(Object element) {
176
			return super.canEdit(element);
177
		}
178
179
		public CellEditor getCellEditor() {
180
			return editor;
181
		}
182
183
		private void event(String event) {
184
			if (events.length() > 0) {
185
				events.append(" ");
186
			}
187
188
			events.append(event);
189
		}
190
191
		/*
192
		 * (non-Javadoc)
193
		 * 
194
		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createCellEditorObservable(org.eclipse.jface.viewers.CellEditor)
195
		 */
196
		protected IObservableValue doCreateCellEditorObservable(
197
				CellEditor cellEditor) {
198
			event("createCellEditorObservable");
199
200
			return target = new ObservableValueDecorator(SWTObservables
201
					.observeText(cellEditor.getControl(), SWT.NONE));
202
		}
203
204
		/*
205
		 * (non-Javadoc)
206
		 * 
207
		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createElementObservable(java.lang.Object,
208
		 *      org.eclipse.jface.viewers.ViewerCell)
209
		 */
210
		protected IObservableValue doCreateElementObservable(Object element,
211
				ViewerCell cell) {
212
			event("createElementObservable");
213
			return model = new ObservableValueDecorator(BeansObservables
214
					.observeValue(element, "value"));
215
		}
216
217
		/*
218
		 * (non-Javadoc)
219
		 * 
220
		 * @see org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport#createBinding(org.eclipse.core.databinding.observable.value.IObservableValue,
221
		 *      org.eclipse.core.databinding.observable.value.IObservableValue)
222
		 */
223
		protected Binding createBinding(IObservableValue target,
224
				IObservableValue model) {
225
			event("createBinding");
226
227
			return binding = super.createBinding(target, model);
228
		}
229
230
		/*
231
		 * (non-Javadoc)
232
		 * 
233
		 * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object)
234
		 */
235
		protected CellEditor getCellEditor(Object element) {
236
			return editor;
237
		}
238
	}
239
240
	/**
241
	 * Decorator that will allow for tracking calls to dispose(). We really need
242
	 * an isDisposed() method on IObservable...
243
	 */
244
	private static class ObservableValueDecorator implements IObservableValue {
245
		int disposed;
246
247
		IObservableValue delegate;
248
249
		ObservableValueDecorator(IObservableValue delegate) {
250
			this.delegate = delegate;
251
		}
252
253
		public synchronized void dispose() {
254
			disposed++;
255
			delegate.dispose();
256
		}
257
258
		public void addChangeListener(IChangeListener listener) {
259
			delegate.addChangeListener(listener);
260
		}
261
262
		public void addStaleListener(IStaleListener listener) {
263
			delegate.addStaleListener(listener);
264
		}
265
266
		public void addValueChangeListener(IValueChangeListener listener) {
267
			delegate.addValueChangeListener(listener);
268
		}
269
270
		public Realm getRealm() {
271
			return delegate.getRealm();
272
		}
273
274
		public Object getValue() {
275
			return delegate.getValue();
276
		}
277
278
		public Object getValueType() {
279
			return delegate.getValueType();
280
		}
281
282
		public boolean isStale() {
283
			return delegate.isStale();
284
		}
285
286
		public void removeChangeListener(IChangeListener listener) {
287
			delegate.removeChangeListener(listener);
288
		}
289
290
		public void removeStaleListener(IStaleListener listener) {
291
			delegate.removeStaleListener(listener);
292
		}
293
294
		public void removeValueChangeListener(IValueChangeListener listener) {
295
			delegate.removeValueChangeListener(listener);
296
		}
297
298
		public void setValue(Object value) {
299
			delegate.setValue(value);
300
		}
301
	}
302
}
(-)src/org/eclipse/jface/examples/databinding/snippets/Snippet013TableViewerEditing.java (-82 / +19 lines)
Lines 17-25 Link Here
17
import java.util.LinkedList;
17
import java.util.LinkedList;
18
import java.util.List;
18
import java.util.List;
19
19
20
import org.eclipse.core.databinding.Binding;
21
import org.eclipse.core.databinding.DataBindingContext;
20
import org.eclipse.core.databinding.DataBindingContext;
22
import org.eclipse.core.databinding.UpdateValueStrategy;
23
import org.eclipse.core.databinding.beans.BeansObservables;
21
import org.eclipse.core.databinding.beans.BeansObservables;
24
import org.eclipse.core.databinding.observable.Realm;
22
import org.eclipse.core.databinding.observable.Realm;
25
import org.eclipse.core.databinding.observable.list.WritableList;
23
import org.eclipse.core.databinding.observable.list.WritableList;
Lines 28-40 Link Here
28
import org.eclipse.jface.databinding.swt.SWTObservables;
26
import org.eclipse.jface.databinding.swt.SWTObservables;
29
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
27
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
30
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
28
import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider;
29
import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
31
import org.eclipse.jface.databinding.viewers.ViewersObservables;
30
import org.eclipse.jface.databinding.viewers.ViewersObservables;
32
import org.eclipse.jface.viewers.CellEditor;
31
import org.eclipse.jface.viewers.CellEditor;
33
import org.eclipse.jface.viewers.ColumnViewer;
32
import org.eclipse.jface.viewers.ColumnViewer;
34
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
35
import org.eclipse.jface.viewers.ColumnViewerEditorActivationListener;
36
import org.eclipse.jface.viewers.ColumnViewerEditorDeactivationEvent;
37
import org.eclipse.jface.viewers.EditingSupport;
38
import org.eclipse.jface.viewers.TableViewer;
33
import org.eclipse.jface.viewers.TableViewer;
39
import org.eclipse.jface.viewers.TableViewerColumn;
34
import org.eclipse.jface.viewers.TableViewerColumn;
40
import org.eclipse.jface.viewers.TextCellEditor;
35
import org.eclipse.jface.viewers.TextCellEditor;
Lines 151-243 Link Here
151
	 * 
146
	 * 
152
	 * @since 3.3
147
	 * @since 3.3
153
	 */
148
	 */
154
	static class InlineEditingSupport extends EditingSupport {
149
	private static class InlineEditingSupport extends ObservableValueEditingSupport {
155
		private TextCellEditor editor;
150
		private CellEditor cellEditor;
156
151
		
157
		private DataBindingContext bindingContext;
158
		/**
159
		 * The current binding.
160
		 */
161
		private Binding binding;
162
163
		private final ColumnViewerEditorActivationListenerHelper activationListener = new ColumnViewerEditorActivationListenerHelper();
164
165
		/**
152
		/**
166
		 * @param viewer
153
		 * @param viewer
154
		 * @param dbc
167
		 */
155
		 */
168
		public InlineEditingSupport(ColumnViewer viewer,
156
		public InlineEditingSupport(ColumnViewer viewer,
169
				DataBindingContext bindingContext) {
157
				DataBindingContext dbc) {
170
			super(viewer);
158
			
171
			this.editor = new TextCellEditor((Composite) viewer.getControl());
159
			super(viewer, dbc);
172
			this.bindingContext = bindingContext;
160
			cellEditor = new TextCellEditor((Composite) viewer.getControl());
173
		}
174
175
		protected boolean canEdit(Object element) {
176
			return true;
177
		}
161
		}
178
162
		
179
		protected CellEditor getCellEditor(Object element) {
163
		protected CellEditor getCellEditor(Object element) {
180
			return editor;
164
			return cellEditor;
181
		}
182
183
		protected Object getValue(Object element) {
184
			// Not needed
185
			return null;
186
		}
165
		}
187
166
188
		protected void setValue(Object element, Object value) {
167
		protected IObservableValue doCreateCellEditorObservable(
189
			// Not Needed
168
				CellEditor cellEditor) {
169
			
170
			return SWTObservables.observeText(cellEditor
171
					.getControl(), SWT.Modify);
190
		}
172
		}
191
173
192
		protected void initializeCellEditorValue(CellEditor cellEditor,
174
		protected IObservableValue doCreateElementObservable(Object element,
193
				ViewerCell cell) {
175
				ViewerCell cell) {
194
			Object modelElement = cell.getElement();
176
			return BeansObservables.observeValue(element, "name");
195
			IObservableValue observableValue = BeansObservables.observeValue(
177
		}		
196
					modelElement, "name");
197
198
			/*
199
			 * Creates a binding between the cell editor and the model that only
200
			 * updates the model when the current edit is saved.
201
			 */
202
			binding = bindingContext
203
					.bindValue(SWTObservables.observeText(cellEditor
204
							.getControl(), SWT.Modify), observableValue,
205
							new UpdateValueStrategy(
206
									UpdateValueStrategy.POLICY_CONVERT), null);
207
208
			getViewer().getColumnViewerEditor().addEditorActivationListener(
209
					activationListener);
210
		}
211
212
		protected void saveCellEditorValue(CellEditor cellEditor,
213
				ViewerCell cell) {
214
			binding.updateTargetToModel();
215
		}
216
217
		private class ColumnViewerEditorActivationListenerHelper extends
218
				ColumnViewerEditorActivationListener {
219
220
			public void afterEditorActivated(
221
					ColumnViewerEditorActivationEvent event) {
222
				// do nothing
223
			}
224
225
			public void afterEditorDeactivated(
226
					ColumnViewerEditorDeactivationEvent event) {
227
				binding.dispose();
228
				binding = null;
229
			}
230
231
			public void beforeEditorActivated(
232
					ColumnViewerEditorActivationEvent event) {
233
				// do nothing
234
			}
235
236
			public void beforeEditorDeactivated(
237
					ColumnViewerEditorDeactivationEvent event) {
238
				// do nothing
239
			}
240
		}
241
	}
178
	}
242
179
243
	// The GUI view
180
	// The GUI view

Return to bug 144260