blob: 0f59e28935a5b1364cb84bc6463a1a543bb104e8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 Matthew Hall and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Hall - initial API and implementation (bug 218269)
* Matthew Hall - bug 260329
******************************************************************************/
package org.eclipse.xwt.tests.snipppets;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.core.databinding.validation.MultiValidator;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.wizard.WizardPageSupport;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Text;
/**
* @since 3.2
*
*/
public class Snippet021MultiFieldValidation extends WizardPage {
private List list_1;
private List list;
private Button addAddendButton;
private Button removeAddendButton;
private Text sumModelValue;
private Text field2ModelValue;
private Text field1ModelValue;
private Text sumTarget;
private Text field2Target;
private Text field1Target;
private ListViewer addendsTarget;
private ListViewer addendsModelValue;
/**
* Create the wizard
*/
public Snippet021MultiFieldValidation() {
super("snippet021");
setTitle("Snippet 021 - Multi-field Validators");
setDescription("Enter values which satisfy the cross-field constraints");
}
/**
* Create nameMap of the wizard
*
* @param parent
*/
public void createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
final GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
container.setLayout(gridLayout);
//
setControl(container);
final Group bothEvenOrGroup = new Group(container, SWT.NONE);
bothEvenOrGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
false));
bothEvenOrGroup.setText("Numbers must be both even or both odd");
final GridLayout gridLayout_1 = new GridLayout();
gridLayout_1.numColumns = 3;
bothEvenOrGroup.setLayout(gridLayout_1);
new Label(bothEvenOrGroup, SWT.NONE);
final Label targetLabel = new Label(bothEvenOrGroup, SWT.NONE);
targetLabel.setText("Target");
final Label modelLabel = new Label(bothEvenOrGroup, SWT.NONE);
modelLabel.setText("Model");
final Label field1Label = new Label(bothEvenOrGroup, SWT.NONE);
field1Label.setText("Field 1");
field1Target = new Text(bothEvenOrGroup, SWT.BORDER);
final GridData gd_field1Target = new GridData(SWT.FILL, SWT.CENTER,
true, false);
field1Target.setLayoutData(gd_field1Target);
field1ModelValue = new Text(bothEvenOrGroup, SWT.READ_ONLY | SWT.BORDER);
final GridData gd_field1ModelValue = new GridData(SWT.FILL, SWT.CENTER,
true, false);
field1ModelValue.setLayoutData(gd_field1ModelValue);
final Label field2Label = new Label(bothEvenOrGroup, SWT.NONE);
field2Label.setText("Field 2");
field2Target = new Text(bothEvenOrGroup, SWT.BORDER);
final GridData gd_field2Target = new GridData(SWT.FILL, SWT.CENTER,
true, false);
field2Target.setLayoutData(gd_field2Target);
field2ModelValue = new Text(bothEvenOrGroup, SWT.READ_ONLY | SWT.BORDER);
final GridData gd_field2ModelValue = new GridData(SWT.FILL, SWT.CENTER,
true, false);
field2ModelValue.setLayoutData(gd_field2ModelValue);
final Group sumOfAllGroup = new Group(container, SWT.NONE);
sumOfAllGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
true));
sumOfAllGroup.setText("Addends must add up to sum");
final GridLayout gridLayout_2 = new GridLayout();
gridLayout_2.numColumns = 3;
sumOfAllGroup.setLayout(gridLayout_2);
new Label(sumOfAllGroup, SWT.NONE);
final Label targetLabel_1 = new Label(sumOfAllGroup, SWT.NONE);
targetLabel_1.setText("Target");
final Label modelLabel_1 = new Label(sumOfAllGroup, SWT.NONE);
modelLabel_1.setText("Model");
final Label expectedSumLabel = new Label(sumOfAllGroup, SWT.NONE);
expectedSumLabel.setText("Sum");
sumTarget = new Text(sumOfAllGroup, SWT.BORDER);
final GridData gd_sumTarget = new GridData(SWT.FILL, SWT.CENTER, true,
false);
sumTarget.setLayoutData(gd_sumTarget);
sumModelValue = new Text(sumOfAllGroup, SWT.READ_ONLY | SWT.BORDER);
final GridData gd_sumModelValue = new GridData(SWT.FILL, SWT.CENTER,
true, false);
sumModelValue.setLayoutData(gd_sumModelValue);
final Label addendsLabel = new Label(sumOfAllGroup, SWT.NONE);
addendsLabel.setText("Addends");
addendsTarget = new ListViewer(sumOfAllGroup, SWT.V_SCROLL | SWT.BORDER);
list_1 = addendsTarget.getList();
list_1
.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1,
2));
addendsModelValue = new ListViewer(sumOfAllGroup, SWT.V_SCROLL
| SWT.BORDER);
list = addendsModelValue.getList();
list.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 2));
final Composite composite = new Composite(sumOfAllGroup, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
final GridLayout gridLayout_3 = new GridLayout();
gridLayout_3.marginWidth = 0;
gridLayout_3.marginHeight = 0;
composite.setLayout(gridLayout_3);
addAddendButton = new Button(composite, SWT.NONE);
addAddendButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
false));
addAddendButton.setText("Add");
removeAddendButton = new Button(composite, SWT.NONE);
removeAddendButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
false, false));
removeAddendButton.setText("Remove");
bindUI();
}
private void bindUI() {
DataBindingContext dbc = new DataBindingContext();
bindEvensAndOddsGroup(dbc);
bindSumAndAddendsGroup(dbc);
WizardPageSupport.create(this, dbc);
}
private void bindEvensAndOddsGroup(DataBindingContext dbc) {
IObservableValue targetField1 = SWTObservables.observeText(
field1Target, SWT.Modify);
final IObservableValue middleField1 = new WritableValue(null,
Integer.TYPE);
dbc.bindValue(targetField1, middleField1);
IObservableValue targetField2 = SWTObservables.observeText(
field2Target, SWT.Modify);
final IObservableValue middleField2 = new WritableValue(null,
Integer.TYPE);
dbc.bindValue(targetField2, middleField2);
MultiValidator validator = new MultiValidator() {
protected IStatus validate() {
Integer field1 = (Integer) middleField1.getValue();
Integer field2 = (Integer) middleField2.getValue();
if (Math.abs(field1.intValue()) % 2 != Math.abs(field2
.intValue()) % 2)
return ValidationStatus
.error("Fields 1 and 2 must be both even or both odd");
return null;
}
};
dbc.addValidationStatusProvider(validator);
IObservableValue modelField1 = new WritableValue(new Integer(1),
Integer.TYPE);
IObservableValue modelField2 = new WritableValue(new Integer(4),
Integer.TYPE);
dbc.bindValue(validator.observeValidatedValue(middleField1),
modelField1);
dbc.bindValue(validator.observeValidatedValue(middleField2),
modelField2);
dbc.bindValue(SWTObservables.observeText(field1ModelValue, SWT.Modify),
modelField1);
dbc.bindValue(SWTObservables.observeText(field2ModelValue, SWT.Modify),
modelField2);
}
private void bindSumAndAddendsGroup(DataBindingContext dbc) {
IObservableValue targetSum = SWTObservables.observeText(sumTarget,
SWT.Modify);
final IObservableValue middleSum = new WritableValue(null, Integer.TYPE);
dbc.bindValue(targetSum, middleSum);
final IObservableList targetAddends = new WritableList(new ArrayList(),
Integer.TYPE);
addendsTarget.setContentProvider(new ObservableListContentProvider());
addendsTarget.setInput(targetAddends);
addAddendButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(final SelectionEvent e) {
InputDialog dialog = new InputDialog(getShell(),
"Input addend", "Enter an integer addend", "0",
new IInputValidator() {
public String isValid(String newText) {
try {
Integer.valueOf(newText);
return null;
} catch (NumberFormatException e) {
return "Enter a number between "
+ Integer.MIN_VALUE + " and "
+ Integer.MAX_VALUE;
}
}
});
if (dialog.open() == Window.OK) {
targetAddends.add(Integer.valueOf(dialog.getValue()));
}
}
});
removeAddendButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection selection = (IStructuredSelection) addendsTarget
.getSelection();
if (!selection.isEmpty())
targetAddends.remove(selection.getFirstElement());
}
});
IObservableValue modelSum = new WritableValue(new Integer(5),
Integer.TYPE);
dbc.bindValue(SWTObservables.observeText(sumModelValue, SWT.Modify),
modelSum);
IObservableList modelAddends = new WritableList(new ArrayList(),
Integer.TYPE);
MultiValidator validator = new MultiValidator() {
protected IStatus validate() {
Integer sum = (Integer) middleSum.getValue();
int actualSum = 0;
for (Iterator iterator = targetAddends.iterator(); iterator
.hasNext();) {
actualSum += ((Integer) iterator.next()).intValue();
}
if (sum.intValue() != actualSum)
return ValidationStatus.error("Sum of addends is "
+ actualSum + ", expecting " + sum);
return ValidationStatus.ok();
}
};
dbc.addValidationStatusProvider(validator);
addendsModelValue
.setContentProvider(new ObservableListContentProvider());
addendsModelValue.setInput(modelAddends);
dbc.bindValue(validator.observeValidatedValue(middleSum), modelSum);
dbc.bindList(validator.observeValidatedList(targetAddends),
modelAddends);
}
static class MultiFieldValidationWizard extends Wizard {
public void addPages() {
addPage(new Snippet021MultiFieldValidation());
}
public String getWindowTitle() {
return "Snippet 021 - Multi-field Validation";
}
public boolean performFinish() {
return true;
}
}
public static void main(String[] args) {
Display display = new Display();
Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() {
public void run() {
IWizard wizard = new MultiFieldValidationWizard();
WizardDialog dialog = new WizardDialog(null, wizard);
dialog.open();
// The SWT event loop
Display display = Display.getCurrent();
while (dialog.getShell() != null
&& !dialog.getShell().isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
});
display.dispose();
}
}