/** * <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.swing; import java.awt.Component; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import net.miginfocom.swing.MigLayout; 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.map.IObservableMap; 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.ufacekit.ui.swing.databinding.swing.IWidgetValueProperty; import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingProperties; import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingProperties.TextType; import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ILabelDelegate; import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ObservableComboBoxModel; import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ObservableListCellRender; import at.bestsolution.e4.addressbook.model.addressbook.Address; import at.bestsolution.e4.addressbook.model.addressbook.AddressBook; import at.bestsolution.e4.addressbook.model.addressbook.AddressbookPackage; import at.bestsolution.e4.addressbook.model.addressbook.Country; import at.bestsolution.e4.addressbook.model.addressbook.FederalState; public class AddressForm extends JPanel { /** * */ private static final long serialVersionUID = 1L; private JTextField w_street; private JTextField w_zip; private JTextField w_city; private JComboBox w_state; private JComboBox w_country; private Binding stateBinding; private DataBindingContext dbc; private IObservableValue master; private EditingDomain editingDomain; /** * Create the panel. */ public AddressForm() { setLayout(new MigLayout("", "[][grow]", "[][][][]")); JLabel lblStreet = new JLabel("Street"); add(lblStreet, "cell 0 0,alignx trailing"); w_street = new JTextField(); add(w_street, "cell 1 0,growx"); w_street.setColumns(10); JLabel lblZipcity = new JLabel("Zip/City"); add(lblZipcity, "cell 0 1,alignx trailing"); w_zip = new JTextField(); add(w_zip, "flowx,cell 1 1"); w_zip.setColumns(10); w_city = new JTextField(); add(w_city, "cell 1 1,growx"); w_city.setColumns(10); JLabel lblCountry = new JLabel("Country"); add(lblCountry, "cell 0 2,alignx trailing"); w_country = new JComboBox(); add(w_country, "cell 1 2,growx"); JLabel lblState = new JLabel("State"); add(lblState, "cell 0 3,alignx trailing"); w_state = new JComboBox(); add(w_state, "cell 1 3,growx"); } public void init(AddressBook book) { { IEMFListProperty mProp = EMFProperties .list(AddressbookPackage.Literals.ADDRESS_BOOK__COUNTRIES); IValueProperty[] props = { EMFProperties .value(AddressbookPackage.Literals.COUNTRY__NAME) }; ObservableComboBoxModel<Country> model = new ObservableComboBoxModel<Country>( mProp.observe(book), props); w_country.setRenderer(new ObservableListCellRender<Country>(model, new ILabelDelegate<Country>() { @Override public String getText(Country object, IObservableMap[] maps) { return object == null ? "" : object.getName(); } })); w_country.setModel(model); } { IWidgetValueProperty p = SwingProperties.singleSelectionValue(); IObservableValue value = p.observe(w_country); value.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (stateBinding != null) { stateBinding.dispose(); stateBinding = null; } } }); IEMFListProperty mProp = EMFProperties .list(AddressbookPackage.Literals.COUNTRY__FEDERAL_STATES); IValueProperty[] props = { EMFProperties .value(AddressbookPackage.Literals.FEDERAL_STATE__NAME) }; ObservableComboBoxModel<FederalState> model = new ObservableComboBoxModel<FederalState>( mProp.observeDetail(value), props); w_state.setRenderer(new ObservableListCellRender<FederalState>( model, new ILabelDelegate<FederalState>() { @Override public String getText(FederalState object, IObservableMap[] maps) { return object == null ? "" : object.getName(); } })); w_state.setModel(model); value.addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { if (stateBinding == null && dbc != null && master != null) { bindState(dbc, master); } } }); } } public void bindControls(DataBindingContext dbc, IObservableValue master) { this.dbc = dbc; this.master = master; IWidgetValueProperty tProp = SwingProperties.text(TextType.Modify); IWidgetValueProperty sProp = SwingProperties.singleSelectionValue(); { 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(w_country), mProp.observeDetail(master)); } bindState(dbc, master); IWidgetValueProperty eProp = SwingProperties.enabled(); for (Component c : getComponents()) { EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); // Work around - No Idea 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 = SwingProperties.text(TextType.Modify); IWidgetValueProperty sProp = SwingProperties.singleSelectionValue(); { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__STREET); dbc.bindValue(tProp.observe(w_street), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.ADDRESS__ZIP); dbc.bindValue(tProp.observe(w_zip), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, 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(w_country), mProp.observeDetail(master)); } bindState(dbc, master); IWidgetValueProperty eProp = SwingProperties.enabled(); for (Component c : getComponents()) { EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); // Work around - No Idea 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(DataBindingContext dbc, IObservableValue master) { IWidgetValueProperty sProp = SwingProperties.singleSelectionValue(); 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(w_state), prop.observeDetail(master)); } }