[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Newsgroup Home]
|
[news.eclipse.platform] Re: [DataBinding] Cross field validation and WizardPageSupport
|
Hi Ovidio,
This looks like a valid use case. Could you please open an enhancement
request in Bugzilla, and ideally, attach your snippet? (We might want to put
it into our collection of snippets when/if we can support your use case.)
Thanks
Boris
"Ovidio Mallo" <malloovidio@xxxxxxxxxx> wrote in message
news:fmrdp5$87l$1@xxxxxxxxxxxxxxxxxxxx
> Hi all!
>
> I have a wizard page in which -- among other things -- the user can
> specify a start date and an end date while, for each date, the month
> and the year can be edited separately using combo boxes (see the
> attached code snippet).
> For implementing that using databinding, I have defined a ComputedValue
> for each date which assembles a Date object from the two SWTObservables
> defining the month and year contained in the combo boxes.
> For validating the wizard page, I have defined another ComputedValue
> which depends on the two date values and returns an IStatus which tells
> whether the start date is before the end date.
> My problem is that I would like to attach this validation status to an
> instance of WizardPageSupport which I am already using for validating
> other parts of the wizard page. However, the WizardPageSupport class
> seems to only support validation status' belonging to bindings. In my
> case, I have a stand-alone validation status value which does not belong
> to any binding.
> So, my question is whether this kind of cross field validation (for
> which no real binding exists) can also be integrated into the
> WizardPageSupport class? Or am I maybe just going the wrong way with my
> approach described above?
>
> I hope my explanation is clear enough. If not, the attached code snippet
> may clarify things.
>
> Thanks in advance for any feedback!
>
> Best regards,
> Ovidio
>
--------------------------------------------------------------------------------
> import java.text.ParseException;
> import java.text.SimpleDateFormat;
> import java.util.Date;
>
> import org.eclipse.core.databinding.DataBindingContext;
> import org.eclipse.core.databinding.observable.Realm;
> import org.eclipse.core.databinding.observable.value.ComputedValue;
> import org.eclipse.core.databinding.observable.value.IObservableValue;
> import org.eclipse.core.databinding.observable.value.IValueChangeListener;
> import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
> 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.wizard.WizardPageSupport;
> import org.eclipse.jface.layout.GridLayoutFactory;
> import org.eclipse.jface.resource.ImageDescriptor;
> 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.graphics.Image;
> import org.eclipse.swt.widgets.Combo;
> import org.eclipse.swt.widgets.Composite;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Label;
>
> public class CrossFieldValidation {
>
> static class FirstWizardPage extends WizardPage {
>
> private static final String[] MONTHS = {
> "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
> };
>
> private static final String[] YEARS = { "2006", "2007", "2008",
> "2009" };
>
> protected FirstWizardPage() {
> super("First", "First Page",
> ImageDescriptor.createFromImage(new Image(Display.getDefault(),
> 16, 16)));
> }
>
> public void createControl(Composite parent) {
> DataBindingContext dbc = new DataBindingContext();
> WizardPageSupport.create(this, dbc);
> Composite composite = new Composite(parent, SWT.NONE);
>
> final ComputedValue startDateValue = getDateValue(composite,
> "Start");
> final ComputedValue endDateValue = getDateValue(composite, "End");
>
> ComputedValue validationStatus = new ComputedValue(IStatus.class) {
>
> protected Object calculate() {
> Date startDate = (Date) startDateValue.getValue();
> Date endDate = (Date) endDateValue.getValue();
> if (startDate.before(endDate)) {
> return ValidationStatus.ok();
> } else {
> return ValidationStatus.error("Start date is not before end
> date.");
> }
> }
> };
>
> // How to integrate this validation status into a WizardPageSupport
> class?
> validationStatus.addValueChangeListener(new IValueChangeListener() {
>
> public void handleValueChange(ValueChangeEvent event) {
> IStatus status = (IStatus) event.diff.getNewValue();
> if (status.isOK()) {
> setErrorMessage(null);
> setPageComplete(true);
> } else {
> setErrorMessage(status.getMessage());
> setPageComplete(false);
> }
> }
> });
>
>
> GridLayoutFactory.swtDefaults().numColumns(4).generateLayout(composite);
> setControl(composite);
> }
>
> private static ComputedValue getDateValue(Composite parent, String
> startOrEnd) {
> Label monthLabel = new Label(parent, SWT.NONE);
> monthLabel.setText(startOrEnd + " month:");
> Combo monthCombo = new Combo(parent, SWT.READ_ONLY);
> monthCombo.setItems(MONTHS);
> monthCombo.select(0);
>
> Label yearLabel = new Label(parent, SWT.NONE);
> yearLabel.setText(startOrEnd + " year:");
> Combo yearCombo = new Combo(parent, SWT.READ_ONLY);
> yearCombo.setItems(YEARS);
> yearCombo.select(0);
>
> final IObservableValue monthValue =
> SWTObservables.observeText(monthCombo);
> final IObservableValue yearValue =
> SWTObservables.observeText(yearCombo);
>
> return new ComputedValue(Date.class) {
>
> protected Object calculate() {
> Date date = null;
> try {
> date = new SimpleDateFormat("mm.yyyy")
> .parse(monthValue.getValue() + "." + yearValue.getValue());
> } catch (ParseException e) {
> e.printStackTrace();
> }
> return date;
> }
> };
> }
> }
>
> static class SampleWizard extends Wizard {
>
> public void addPages() {
> addPage(new FirstWizardPage());
> }
>
> public String getWindowTitle() {
> return "Cross 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 SampleWizard();
> WizardDialog dialog = new WizardDialog(null, wizard);
> dialog.open();
> Display display = Display.getCurrent();
> while (dialog.getShell() != null &&
> !dialog.getShell().isDisposed()) {
> if (!display.readAndDispatch()) {
> display.sleep();
> }
> }
> }
> });
> }
> }
>