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 237856 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/jface/databinding/wizard/WizardPageSupport.java (-2 / +22 lines)
Lines 10-15 Link Here
10
 *     Boris Bokowski - bug 218269
10
 *     Boris Bokowski - bug 218269
11
 *     Matthew Hall - bug 218269
11
 *     Matthew Hall - bug 218269
12
 *     Ashley Cambrell - bug 199179 
12
 *     Ashley Cambrell - bug 199179 
13
 *     Ovidio Mallo - bug 237856
13
 *******************************************************************************/
14
 *******************************************************************************/
14
package org.eclipse.jface.databinding.wizard;
15
package org.eclipse.jface.databinding.wizard;
15
16
Lines 21-26 Link Here
21
import org.eclipse.core.databinding.observable.ChangeEvent;
22
import org.eclipse.core.databinding.observable.ChangeEvent;
22
import org.eclipse.core.databinding.observable.IChangeListener;
23
import org.eclipse.core.databinding.observable.IChangeListener;
23
import org.eclipse.core.databinding.observable.IObservable;
24
import org.eclipse.core.databinding.observable.IObservable;
25
import org.eclipse.core.databinding.observable.IStaleListener;
26
import org.eclipse.core.databinding.observable.StaleEvent;
24
import org.eclipse.core.databinding.observable.list.IListChangeListener;
27
import org.eclipse.core.databinding.observable.list.IListChangeListener;
25
import org.eclipse.core.databinding.observable.list.IObservableList;
28
import org.eclipse.core.databinding.observable.list.IObservableList;
26
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
29
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
Lines 41-46 Link Here
41
 * given wizard page, updating the wizard page's completion state and its error
44
 * given wizard page, updating the wizard page's completion state and its error
42
 * message accordingly.
45
 * message accordingly.
43
 * 
46
 * 
47
 * <p>
48
 * The completion state of the wizard page will only be set to <code>true</code>
49
 * if <i>all</i> of the following conditions are met:
50
 * <ul>
51
 * <li>The validation result from the data binding context has none of the
52
 * severities {@link IStatus#ERROR} or {@link IStatus#CANCEL}.</li>
53
 * <li>None of the validation status observables of the data binding context is
54
 * stale.</li>
55
 * </ul>
56
 * </p>
57
 * 
44
 * @noextend This class is not intended to be subclassed by clients.
58
 * @noextend This class is not intended to be subclassed by clients.
45
 *
59
 *
46
 * @since 1.1
60
 * @since 1.1
Lines 137-142 Link Here
137
				handleStatusChanged();
151
				handleStatusChanged();
138
			}
152
			}
139
		});
153
		});
154
		aggregateStatus.addStaleListener(new IStaleListener() {
155
			public void handleStale(StaleEvent staleEvent) {
156
				handleStatusChanged();
157
			}
158
		});
140
		currentStatus = (IStatus) aggregateStatus.getValue();
159
		currentStatus = (IStatus) aggregateStatus.getValue();
141
		handleStatusChanged();
160
		handleStatusChanged();
142
		dbc.getValidationStatusProviders().addListChangeListener(
161
		dbc.getValidationStatusProviders().addListChangeListener(
Lines 188-194 Link Here
188
		} else if (currentStatus != null
207
		} else if (currentStatus != null
189
				&& currentStatus.getSeverity() != IStatus.OK) {
208
				&& currentStatus.getSeverity() != IStatus.OK) {
190
			int severity = currentStatus.getSeverity();
209
			int severity = currentStatus.getSeverity();
191
			wizardPage.setPageComplete((severity & IStatus.CANCEL) != 0);
210
			wizardPage.setPageComplete(((severity & IStatus.CANCEL) != 0)
211
					&& !aggregateStatus.isStale());
192
			int type;
212
			int type;
193
			switch (severity) {
213
			switch (severity) {
194
			case IStatus.OK:
214
			case IStatus.OK:
Lines 213-219 Link Here
213
			wizardPage.setErrorMessage(null);
233
			wizardPage.setErrorMessage(null);
214
			wizardPage.setMessage(currentStatus.getMessage(), type);
234
			wizardPage.setMessage(currentStatus.getMessage(), type);
215
		} else {
235
		} else {
216
			wizardPage.setPageComplete(true);
236
			wizardPage.setPageComplete(!aggregateStatus.isStale());
217
			wizardPage.setMessage(null);
237
			wizardPage.setMessage(null);
218
			wizardPage.setErrorMessage(null);
238
			wizardPage.setErrorMessage(null);
219
		}
239
		}
(-)src/org/eclipse/jface/tests/databinding/BindingTestSuite.java (-1 / +5 lines)
Lines 132-137 Link Here
132
import org.eclipse.jface.tests.databinding.viewers.ObservableSetContentProviderTest;
132
import org.eclipse.jface.tests.databinding.viewers.ObservableSetContentProviderTest;
133
import org.eclipse.jface.tests.databinding.viewers.ObservableSetTreeContentProviderTest;
133
import org.eclipse.jface.tests.databinding.viewers.ObservableSetTreeContentProviderTest;
134
import org.eclipse.jface.tests.databinding.viewers.ViewersObservablesTest;
134
import org.eclipse.jface.tests.databinding.viewers.ViewersObservablesTest;
135
import org.eclipse.jface.tests.databinding.wizard.WizardPageSupportTest;
135
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskLexerAndTokenTest;
136
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskLexerAndTokenTest;
136
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskParserTest;
137
import org.eclipse.jface.tests.examples.databinding.mask.internal.EditMaskParserTest;
137
import org.eclipse.jface.tests.internal.databinding.swt.ButtonObservableValueTest;
138
import org.eclipse.jface.tests.internal.databinding.swt.ButtonObservableValueTest;
Lines 332-338 Link Here
332
		addTestSuite(ObservableSetContentProviderTest.class);
333
		addTestSuite(ObservableSetContentProviderTest.class);
333
		addTestSuite(ObservableSetTreeContentProviderTest.class);
334
		addTestSuite(ObservableSetTreeContentProviderTest.class);
334
		addTestSuite(ViewersObservablesTest.class);
335
		addTestSuite(ViewersObservablesTest.class);
335
		
336
337
		// org.eclipse.jface.tests.databinding.wizard
338
		addTestSuite(WizardPageSupportTest.class);
339
336
		//org.eclipse.jface.tests.example.databinding.mask.internal
340
		//org.eclipse.jface.tests.example.databinding.mask.internal
337
		addTestSuite(EditMaskLexerAndTokenTest.class);
341
		addTestSuite(EditMaskLexerAndTokenTest.class);
338
		addTestSuite(EditMaskParserTest.class);
342
		addTestSuite(EditMaskParserTest.class);
(-)src/org/eclipse/jface/tests/databinding/wizard/WizardPageSupportTest.java (+140 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2008 Ovidio Mallo 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
 *     Ovidio Mallo - initial API and implementation (bug 237856)
10
 ******************************************************************************/
11
12
package org.eclipse.jface.tests.databinding.wizard;
13
14
import org.eclipse.core.databinding.DataBindingContext;
15
import org.eclipse.core.databinding.ValidationStatusProvider;
16
import org.eclipse.core.databinding.observable.Diffs;
17
import org.eclipse.core.databinding.observable.ObservableTracker;
18
import org.eclipse.core.databinding.observable.Observables;
19
import org.eclipse.core.databinding.observable.Realm;
20
import org.eclipse.core.databinding.observable.list.IObservableList;
21
import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
22
import org.eclipse.core.databinding.observable.value.IObservableValue;
23
import org.eclipse.core.databinding.validation.ValidationStatus;
24
import org.eclipse.core.internal.commands.util.Util;
25
import org.eclipse.core.runtime.IStatus;
26
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
27
import org.eclipse.jface.tests.databinding.AbstractSWTTestCase;
28
import org.eclipse.jface.wizard.IWizardPage;
29
import org.eclipse.jface.wizard.Wizard;
30
import org.eclipse.jface.wizard.WizardDialog;
31
import org.eclipse.jface.wizard.WizardPage;
32
import org.eclipse.swt.widgets.Composite;
33
34
/**
35
 * @since 1.2
36
 */
37
public class WizardPageSupportTest extends AbstractSWTTestCase {
38
39
	public void testPageCompleteOnValidationStaleness() {
40
		IWizardPage page = new WizardPage("Page") {
41
			public void createControl(Composite parent) {
42
				setControl(parent);
43
44
				ValidationObservable validation = new ValidationObservable();
45
46
				DataBindingContext dbc = new DataBindingContext();
47
				dbc.addValidationStatusProvider(new ValidationProvider(
48
						validation));
49
50
				WizardPageSupport.create(this, dbc);
51
52
				assertTrue(isPageComplete());
53
54
				validation.setStale(true);
55
				assertFalse(isPageComplete());
56
57
				validation.setStale(false);
58
				assertTrue(isPageComplete());
59
			}
60
		};
61
62
		loadWizardPage(page);
63
	}
64
65
	private void loadWizardPage(IWizardPage page) {
66
		Wizard wizard = new Wizard() {
67
			public boolean performFinish() {
68
				return true;
69
			}
70
		};
71
		wizard.addPage(page);
72
73
		WizardDialog dialog = new WizardDialog(getShell(), wizard);
74
		dialog.create();
75
	}
76
77
	private static class ValidationObservable extends AbstractObservableValue {
78
79
		private Object value = ValidationStatus.ok();
80
81
		private boolean stale = false;
82
83
		public ValidationObservable() {
84
			super(Realm.getDefault());
85
		}
86
87
		protected Object doGetValue() {
88
			return value;
89
		}
90
91
		protected void doSetValue(Object value) {
92
			Object oldValue = this.value;
93
			this.value = value;
94
			if (!Util.equals(oldValue, value)) {
95
				fireValueChange(Diffs.createValueDiff(oldValue, value));
96
			}
97
		}
98
99
		public boolean isStale() {
100
			ObservableTracker.getterCalled(this);
101
			return stale;
102
		}
103
104
		public void setStale(boolean stale) {
105
			if (this.stale != stale) {
106
				this.stale = stale;
107
				if (stale) {
108
					fireStale();
109
				} else {
110
					fireValueChange(Diffs.createValueDiff(value, value));
111
				}
112
			}
113
		}
114
115
		public Object getValueType() {
116
			return IStatus.class;
117
		}
118
	}
119
120
	private static class ValidationProvider extends ValidationStatusProvider {
121
122
		private final IObservableValue validation;
123
124
		public ValidationProvider(IObservableValue validation) {
125
			this.validation = validation;
126
		}
127
128
		public IObservableValue getValidationStatus() {
129
			return validation;
130
		}
131
132
		public IObservableList getTargets() {
133
			return Observables.emptyObservableList();
134
		}
135
136
		public IObservableList getModels() {
137
			return Observables.emptyObservableList();
138
		}
139
	}
140
}

Return to bug 237856