/** * <copyright> * * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM - Initial API and implementation * * </copyright> * * $Id: EMF_codetemplates.xml,v 1.1 2008/05/06 20:12:20 nickb Exp $ */ package at.bestsolution.e4.addressbook.ui.swt; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.conversion.Converter; 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.property.value.IValueProperty; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.EMFUpdateValueStrategy; import org.eclipse.emf.databinding.FeaturePath; import org.eclipse.emf.databinding.IEMFListProperty; import org.eclipse.emf.databinding.IEMFValueProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.databinding.swt.IWidgetValueProperty; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.IViewerValueProperty; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.databinding.viewers.ObservableMapLabelProvider; import org.eclipse.jface.databinding.viewers.ViewerProperties; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.swt.SWT; 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.Text; import at.bestsolution.e4.addressbook.model.addressbook.Address; import at.bestsolution.e4.addressbook.model.addressbook.AddressBook; import at.bestsolution.e4.addressbook.model.addressbook.AddressbookPackage; public class AddressForm extends Composite { private Text w_street; private Text w_zip; private Text w_city; private Combo w_country; private Combo w_state; private ComboViewer v_country; private ComboViewer v_state; private Binding stateBinding; private DataBindingContext dbc; private IObservableValue master; private EditingDomain editingDomain; /** * Create the composite. * * @param parent * @param style */ public AddressForm(Composite parent, int style) { super(parent, style); setLayout(new GridLayout(3, false)); Label lblStreet = new Label(this, SWT.NONE); lblStreet.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblStreet.setText("Street"); w_street = new Text(this, SWT.BORDER); w_street.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); Label lblCity = new Label(this, SWT.NONE); lblCity.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblCity.setText("ZIP/City"); w_zip = new Text(this, SWT.BORDER); w_zip.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); w_city = new Text(this, SWT.BORDER); w_city.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblCountry = new Label(this, SWT.NONE); lblCountry.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblCountry.setText("Country"); w_country = new Combo(this, SWT.READ_ONLY); w_country.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); Label lblState = new Label(this, SWT.NONE); lblState.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblState.setText("State"); w_state = new Combo(this, SWT.READ_ONLY); w_state.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1)); } @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } public void init(AddressBook book) { { IEMFListProperty mProp = EMFProperties .list(AddressbookPackage.Literals.ADDRESS_BOOK__COUNTRIES); IValueProperty props = EMFProperties .value(AddressbookPackage.Literals.COUNTRY__NAME); v_country = new ComboViewer(w_country); ObservableListContentProvider cp = new ObservableListContentProvider(); v_country.setContentProvider(cp); v_country.setLabelProvider(new ObservableMapLabelProvider(props .observeDetail(cp.getKnownElements()))); v_country.setInput(mProp.observe(book)); } { IObservableValue value = ViewerProperties.singleSelection() .observe(v_country); IEMFListProperty mProp = EMFProperties .list(AddressbookPackage.Literals.COUNTRY__FEDERAL_STATES); IValueProperty props = EMFProperties .value(AddressbookPackage.Literals.FEDERAL_STATE__NAME); value.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (stateBinding != null) { stateBinding.dispose(); stateBinding = null; } } }); v_state = new ComboViewer(w_state); ObservableListContentProvider cp = new ObservableListContentProvider(); v_state.setContentProvider(cp); v_state.setLabelProvider(new ObservableMapLabelProvider(props .observeDetail(cp.getKnownElements()))); v_state.setInput(mProp.observeDetail(value)); value.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (stateBinding == null && dbc != null && master != null) { bindState(); } } }); } } public void bindControls(DataBindingContext dbc, IObservableValue master) { this.dbc = dbc; this.master = master; IWidgetValueProperty tProp = WidgetProperties.text(SWT.Modify); IViewerValueProperty sProp = ViewerProperties.singleSelection(); { IEMFValueProperty mProp = EMFProperties .value(AddressbookPackage.Literals.ADDRESS__STREET); dbc.bindValue(tProp.observe(w_street), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFProperties .value(AddressbookPackage.Literals.ADDRESS__ZIP); dbc.bindValue(tProp.observe(w_zip), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFProperties .value(AddressbookPackage.Literals.ADDRESS__CITY); dbc.bindValue(tProp.observe(w_city), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFProperties.value(FeaturePath .fromList(AddressbookPackage.Literals.ADDRESS__COUNTRY)); dbc.bindValue(sProp.observe(v_country), mProp.observeDetail(master)); } bindState(); IWidgetValueProperty eProp = WidgetProperties.enabled(); for (Control c : getChildren()) { EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); final Binding b = dbc .bindValue(eProp.observe(c), master, new EMFUpdateValueStrategy( UpdateValueStrategy.POLICY_NEVER), modelToTarget); master.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (event.diff.getNewValue() == null) b.updateModelToTarget(); } }); } } public void bindControls(EditingDomain editingDomain, DataBindingContext dbc, IObservableValue master) { this.dbc = dbc; this.master = master; this.editingDomain = editingDomain; IWidgetValueProperty tProp = WidgetProperties.text(SWT.Modify); IViewerValueProperty sProp = ViewerProperties.singleSelection(); { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__STREET); dbc.bindValue(tProp.observeDelayed(PersonForm.DELAY, w_street), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__ZIP); dbc.bindValue(tProp.observeDelayed(PersonForm.DELAY, w_zip), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__CITY); dbc.bindValue(tProp.observeDelayed(PersonForm.DELAY, w_city), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties .value(editingDomain, FeaturePath .fromList(AddressbookPackage.Literals.ADDRESS__COUNTRY)); dbc.bindValue(sProp.observe(v_country), mProp.observeDetail(master)); } bindState(); IWidgetValueProperty eProp = WidgetProperties.enabled(); for (Control c : getChildren()) { EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); final Binding b = dbc .bindValue(eProp.observe(c), master, new EMFUpdateValueStrategy( UpdateValueStrategy.POLICY_NEVER), modelToTarget); master.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (event.diff.getNewValue() == null) b.updateModelToTarget(); } }); } } private void bindState() { IViewerValueProperty sProp = ViewerProperties.singleSelection(); IEMFValueProperty prop; if (editingDomain == null) { prop = EMFProperties .value(AddressbookPackage.Literals.ADDRESS__FEDERAL_STATE); } else { prop = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__FEDERAL_STATE); } stateBinding = dbc.bindValue(sProp.observe(v_state), prop.observeDetail(master)); } }