/** * <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 java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.databinding.EMFDataBindingContext; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.EMFUpdateValueStrategy; import org.eclipse.emf.databinding.IEMFListProperty.ListElementAccess; import org.eclipse.emf.databinding.IEMFValueProperty; import org.eclipse.emf.databinding.edit.EMFEditProperties; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.databinding.swt.IWidgetValueProperty; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; 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.Shell; 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.AddressType; import at.bestsolution.e4.addressbook.model.addressbook.AddressbookFactory; import at.bestsolution.e4.addressbook.model.addressbook.AddressbookPackage; import at.bestsolution.e4.addressbook.model.addressbook.Person; @SuppressWarnings("restriction") public class PersonForm extends Composite { private Text w_firstName; private Text w_lastName; private WritableValue master; private AddressForm privateAddressForm; private AddressForm businessAddressForm; private Button w_hasBusinessAddress; public static final int DELAY = 200; /** * Create the composite. * * @param parent * @param style */ public PersonForm(Composite parent, int style) { super(parent, style); setLayout(new GridLayout(2, false)); Label lblFirstname = new Label(this, SWT.NONE); lblFirstname.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblFirstname.setText("Firstname"); w_firstName = new Text(this, SWT.BORDER); w_firstName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Label lblLastname = new Label(this, SWT.NONE); lblLastname.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblLastname.setText("Lastname"); w_lastName = new Text(this, SWT.BORDER); w_lastName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Group grpPrivate = new Group(this, SWT.NONE); grpPrivate.setLayout(new FillLayout(SWT.HORIZONTAL)); grpPrivate.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 2, 1)); grpPrivate.setText("Private"); privateAddressForm = new AddressForm(grpPrivate, SWT.NONE); Group grpBusiness = new Group(this, SWT.NONE); grpBusiness.setLayout(new GridLayout(1, false)); grpBusiness.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 2, 1)); grpBusiness.setText("Business"); w_hasBusinessAddress = new Button(grpBusiness, SWT.CHECK); w_hasBusinessAddress.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { } }); businessAddressForm = new AddressForm(grpBusiness, SWT.NONE); businessAddressForm.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); } @Inject public PersonForm(Composite parent) { this(parent, SWT.NONE); parent.setLayout(new FillLayout()); } @PostConstruct private void init(@Optional final EditingDomain editingDomain, AddressBook book, @Optional Person person) { master = new WritableValue(); privateAddressForm.init(book); businessAddressForm.init(book); if (editingDomain == null) { bindControls(); } else { bindControls(editingDomain); } if (editingDomain == null) { w_hasBusinessAddress.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent ev) { if (w_hasBusinessAddress.getSelection()) { Address address = AddressbookFactory.eINSTANCE .createAddress(); address.setType(AddressType.BUSINESS); ((Person) master.getValue()).getAddresses() .add(address); } else { ElementAccessImpl e = new ElementAccessImpl( AddressType.BUSINESS); int idx = e.getReadValueIndex(((Person) master .getValue()).getAddresses()); if (idx != -1) { ((Person) master.getValue()).getAddresses().remove( idx); } } } }); } else { w_hasBusinessAddress.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent ev) { if (w_hasBusinessAddress.getSelection()) { Address address = AddressbookFactory.eINSTANCE .createAddress(); address.setType(AddressType.BUSINESS); Command cmd = AddCommand.create(editingDomain, master.getValue(), AddressbookPackage.Literals.PERSON__ADDRESSES, address); if (cmd.canExecute()) { editingDomain.getCommandStack().execute(cmd); } } else { ElementAccessImpl e = new ElementAccessImpl( AddressType.BUSINESS); int idx = e.getReadValueIndex(((Person) master .getValue()).getAddresses()); if (idx != -1) { Address address = ((Person) master.getValue()) .getAddresses().get(idx); Command cmd = RemoveCommand.create( editingDomain, master.getValue(), AddressbookPackage.Literals.PERSON__ADDRESSES, address); if (cmd.canExecute()) { editingDomain.getCommandStack().execute(cmd); } } } } }); } master.setValue(person); } private void bindControls() { EMFDataBindingContext dbc = new EMFDataBindingContext(); IWidgetValueProperty tProp = WidgetProperties.text(SWT.Modify); { IEMFValueProperty mProp = EMFProperties .value(AddressbookPackage.Literals.PERSON__FIRSTNAME); dbc.bindValue(tProp.observe(w_firstName), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFProperties .value(AddressbookPackage.Literals.PERSON__LASTNAME); dbc.bindValue(tProp.observe(w_lastName), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFProperties.list( AddressbookPackage.Literals.PERSON__ADDRESSES).value( new ElementAccessImpl(AddressType.PRIVATE)); IObservableValue value = mProp.observeDetail(master); privateAddressForm.bindControls(dbc, value); } { IEMFValueProperty mProp = EMFProperties.list( AddressbookPackage.Literals.PERSON__ADDRESSES).value( new ElementAccessImpl(AddressType.BUSINESS)); IObservableValue value = mProp.observeDetail(master); IWidgetValueProperty cProp = WidgetProperties.selection(); EMFUpdateValueStrategy targetToModel = new EMFUpdateValueStrategy( UpdateValueStrategy.POLICY_NEVER); EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); dbc.bindValue(cProp.observe(w_hasBusinessAddress), value, targetToModel, modelToTarget); businessAddressForm.bindControls(dbc, value); } } private void bindControls(EditingDomain editingDomain) { EMFDataBindingContext dbc = new EMFDataBindingContext(); IWidgetValueProperty tProp = WidgetProperties.text(SWT.Modify); { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.PERSON__FIRSTNAME); dbc.bindValue(tProp.observeDelayed(PersonForm.DELAY, w_firstName), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.value(editingDomain, AddressbookPackage.Literals.PERSON__LASTNAME); dbc.bindValue(tProp.observeDelayed(PersonForm.DELAY, w_lastName), mProp.observeDetail(master)); } { IEMFValueProperty mProp = EMFEditProperties.list(editingDomain, AddressbookPackage.Literals.PERSON__ADDRESSES).value( new ElementAccessImpl(AddressType.PRIVATE)); IObservableValue value = mProp.observeDetail(master); privateAddressForm.bindControls(dbc, value); } { IEMFValueProperty mProp = EMFEditProperties.list(editingDomain, AddressbookPackage.Literals.PERSON__ADDRESSES).value( new ElementAccessImpl(AddressType.BUSINESS)); IObservableValue value = mProp.observeDetail(master); IWidgetValueProperty cProp = WidgetProperties.selection(); EMFUpdateValueStrategy targetToModel = new EMFUpdateValueStrategy( UpdateValueStrategy.POLICY_NEVER); EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy(); modelToTarget.setConverter(new Converter(Address.class, boolean.class) { @Override public Object convert(Object fromObject) { return fromObject != null; } }); dbc.bindValue(cProp.observe(w_hasBusinessAddress), value, targetToModel, modelToTarget); businessAddressForm.bindControls(dbc, value); } } @Inject public void setPerson(@Optional Person person) { if (master != null) { master.setValue(person); } } @Override protected void checkSubclass() { // Disable the check that prevents subclassing of SWT components } public static void main(String[] args) { final Display display = new Display(); Realm.runWithDefault(SWTObservables.getRealm(display), new Runnable() { @Override public void run() { try { final Shell frame = new Shell(); frame.setLayout(new FillLayout()); AddressBook book = loadAddressBook(); PersonForm form = new PersonForm(frame, SWT.NONE); form.init(null, book, book.getPersons().get(0)); frame.pack(); frame.setVisible(true); frame.open(); while (!frame.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } catch (Exception e) { e.printStackTrace(); } } }); display.dispose(); } private static AddressBook loadAddressBook() { ResourceSet resourceSet = new ResourceSetImpl(); // Register the appropriate resource factory to handle all file // extensions. // resourceSet .getResourceFactoryRegistry() .getExtensionToFactoryMap() .put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl()); // Register the package to ensure it is available during loading. // resourceSet.getPackageRegistry().put(AddressbookPackage.eNS_URI, AddressbookPackage.eINSTANCE); Resource resource = resourceSet .getResource( URI.createFileURI("/Users/tomschindl/Documents/3x_workspaces/emf_dev/at.bestsolution.e4.addressbook.model/model/AddressBook.xmi"), true); return (AddressBook) resource.getContents().get(0); } private class ElementAccessImpl extends ListElementAccess<Address> { private AddressType type; public ElementAccessImpl(AddressType type) { this.type = type; } @Override public int getReadValueIndex(List<Address> list) { int i = 0; for (Address o : list) { if (o.getType() == type) { return i; } i++; } return -1; } @Override public int getWriteValueIndex(List<Address> list) { int i = 0; for (Address o : list) { if (o.getType() == type) { return i; } i++; } return -1; } } }