Java tutorial
/******************************************************************************* * Copyright (c) 2011 Softberries Krzysztof Grajek. * 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: * Softberries Krzysztof Grajek - initial API and implementation ******************************************************************************/ package com.softberries.klerk.gui.dialogs; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.sf.swtaddons.autocomplete.combo.AutocompleteComboInput; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import com.softberries.klerk.dao.to.Address; import com.softberries.klerk.dao.to.Product; import com.softberries.klerk.gui.helpers.table.ProductsModelProvider; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.validation.IValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.core.databinding.beans.PojoObservables; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.runtime.IStatus; import com.softberries.klerk.gui.validators.FieldNotEmptyValidator; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.events.TraverseListener; import org.eclipse.swt.events.TraverseEvent; public class AddressDialog extends Dialog { private DataBindingContext m_bindingContext; private Text countryTxt; private Text cityTxt; private Text streetTxt; private Text houseNrTxt; private Text flatNrTxt; private Text postCodeTxt; private Text notesTxt; private Address currentAddress; private Button okButton; /** * Create the dialog. * @param parentShell */ public AddressDialog(Shell parentShell, Address address) { super(parentShell); this.currentAddress = address; } /** * Create contents of the dialog. * @param parent */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); container.setLayout(new GridLayout(2, false)); Label lblProduct = new Label(container, SWT.NONE); lblProduct.setText("Country:"); countryTxt = new Text(container, SWT.BORDER); countryTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { okButton.setEnabled(getFormValid()); } }); countryTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblCity = new Label(container, SWT.NONE); lblCity.setText("City:"); cityTxt = new Text(container, SWT.BORDER); cityTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { okButton.setEnabled(getFormValid()); } }); cityTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblStreet = new Label(container, SWT.NONE); lblStreet.setText("Street:"); streetTxt = new Text(container, SWT.BORDER); streetTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { okButton.setEnabled(getFormValid()); } }); streetTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblHouseNr = new Label(container, SWT.NONE); lblHouseNr.setText("House Nr:"); houseNrTxt = new Text(container, SWT.BORDER); houseNrTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { okButton.setEnabled(getFormValid()); } }); houseNrTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblFlatNr = new Label(container, SWT.NONE); lblFlatNr.setText("Flat Nr:"); flatNrTxt = new Text(container, SWT.BORDER); flatNrTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblPostCode = new Label(container, SWT.NONE); lblPostCode.setText("Post Code:"); postCodeTxt = new Text(container, SWT.BORDER); postCodeTxt.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { okButton.setEnabled(getFormValid()); } }); postCodeTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblNotes = new Label(container, SWT.NONE); lblNotes.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); lblNotes.setText("Notes:"); ScrolledComposite scrolledComposite = new ScrolledComposite(container, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); GridData gd_scrolledComposite = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1); gd_scrolledComposite.heightHint = 110; scrolledComposite.setLayoutData(gd_scrolledComposite); scrolledComposite.setExpandHorizontal(true); scrolledComposite.setExpandVertical(true); notesTxt = new Text(scrolledComposite, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL | SWT.MULTI); scrolledComposite.setContent(notesTxt); scrolledComposite.setMinSize(notesTxt.computeSize(SWT.DEFAULT, SWT.DEFAULT)); return container; } /** * Create contents of the button bar. * @param parent */ @Override protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); m_bindingContext = initDataBindings(); okButton.setEnabled(getFormValid()); } private boolean getFormValid() { if (!countryTxt.getText().isEmpty() && !cityTxt.getText().isEmpty() && !streetTxt.getText().isEmpty() && !houseNrTxt.getText().isEmpty() && !postCodeTxt.getText().isEmpty()) { return true; } else { return false; } } /** * Return the initial size of the dialog. */ @Override protected Point getInitialSize() { return new Point(438, 414); } public Address getAddressFromDialog() { int result = super.open(); if (result == Dialog.OK) { return currentAddress; } else { return null; } } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText("Address Editor"); } protected DataBindingContext initDataBindings() { IValidator notEmptyValidator = new FieldNotEmptyValidator("This field cannot be empty!"); DataBindingContext bindingContext = new DataBindingContext(); UpdateValueStrategy ttm = new UpdateValueStrategy(); ttm.setBeforeSetValidator(notEmptyValidator); // IObservableValue countryTxtObserveTextObserveWidget = SWTObservables.observeText(countryTxt, SWT.Modify); IObservableValue currentAddressCountryObserveValue = PojoObservables.observeValue(currentAddress, "country"); Binding binding = bindingContext.bindValue(countryTxtObserveTextObserveWidget, currentAddressCountryObserveValue, ttm, null); ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT); // IObservableValue cityTxtObserveTextObserveWidget = SWTObservables.observeText(cityTxt, SWT.Modify); IObservableValue currentAddressCityObserveValue = PojoObservables.observeValue(currentAddress, "city"); binding = bindingContext.bindValue(cityTxtObserveTextObserveWidget, currentAddressCityObserveValue, ttm, null); ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT); // IObservableValue streetTxtObserveTextObserveWidget = SWTObservables.observeText(streetTxt, SWT.Modify); IObservableValue currentAddressStreetObserveValue = PojoObservables.observeValue(currentAddress, "street"); binding = bindingContext.bindValue(streetTxtObserveTextObserveWidget, currentAddressStreetObserveValue, ttm, null); ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT); // IObservableValue houseNrTxtObserveTextObserveWidget = SWTObservables.observeText(houseNrTxt, SWT.Modify); IObservableValue currentAddressHouseNumberObserveValue = PojoObservables.observeValue(currentAddress, "houseNumber"); binding = bindingContext.bindValue(houseNrTxtObserveTextObserveWidget, currentAddressHouseNumberObserveValue, ttm, null); ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT); // IObservableValue flatNrTxtObserveTextObserveWidget = SWTObservables.observeText(flatNrTxt, SWT.Modify); IObservableValue currentAddressFlatNumberObserveValue = PojoObservables.observeValue(currentAddress, "flatNumber"); bindingContext.bindValue(flatNrTxtObserveTextObserveWidget, currentAddressFlatNumberObserveValue, null, null); // IObservableValue postCodeTxtObserveTextObserveWidget = SWTObservables.observeText(postCodeTxt, SWT.Modify); IObservableValue currentAddressPostCodeObserveValue = PojoObservables.observeValue(currentAddress, "postCode"); binding = bindingContext.bindValue(postCodeTxtObserveTextObserveWidget, currentAddressPostCodeObserveValue, ttm, null); ControlDecorationSupport.create(binding, SWT.TOP | SWT.LEFT); // IObservableValue notesTxtObserveTextObserveWidget = SWTObservables.observeText(notesTxt, SWT.Modify); IObservableValue currentAddressNotesObserveValue = PojoObservables.observeValue(currentAddress, "notes"); bindingContext.bindValue(notesTxtObserveTextObserveWidget, currentAddressNotesObserveValue, null, null); // return bindingContext; } }