/**
* <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.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import net.miginfocom.swing.MigLayout;
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.WritableValue;
import org.eclipse.e4.core.di.annotations.Optional;
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.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.SwingRealm;
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 JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField w_firstName;
private JTextField w_lastName;
private WritableValue master;
private AddressForm privateAddressForm;
private AddressForm businessAddressForm;
private JCheckBox w_hasBusinessAddress;
public static final int DELAY = 200;
/**
* Create the panel.
*/
public PersonForm() {
setLayout(new MigLayout("", "[][grow]", "[][][grow][grow][grow]"));
JLabel lblGivenname = new JLabel("Firstname");
add(lblGivenname, "cell 0 0,alignx trailing");
w_firstName = new JTextField();
add(w_firstName, "cell 1 0,growx");
w_firstName.setColumns(10);
JLabel lblSurname = new JLabel("Surname");
add(lblSurname, "cell 0 1,alignx trailing");
w_lastName = new JTextField();
add(w_lastName, "cell 1 1,growx");
w_lastName.setColumns(10);
privateAddressForm = new AddressForm();
privateAddressForm.setBorder(new TitledBorder(null, "Private",
TitledBorder.LEADING, TitledBorder.TOP, null, null));
add(privateAddressForm, "cell 0 2 2 1,grow");
JPanel panel = new JPanel();
panel.setBorder(new TitledBorder(null, "Business",
TitledBorder.LEADING, TitledBorder.TOP, null, null));
add(panel, "cell 0 3 2 1,grow");
panel.setLayout(new BorderLayout(0, 0));
w_hasBusinessAddress = new JCheckBox("");
panel.add(w_hasBusinessAddress, BorderLayout.NORTH);
businessAddressForm = new AddressForm();
panel.add(businessAddressForm, BorderLayout.CENTER);
}
@Inject
public PersonForm(JPanel parent) {
this();
parent.setLayout(new BorderLayout());
parent.add(this,BorderLayout.CENTER);
}
@PostConstruct
private void init(@Optional EditingDomain editingDomain, AddressBook book, @Optional Person person) {
master = new WritableValue();
privateAddressForm.init(book);
businessAddressForm.init(book);
if (editingDomain == null) {
bindControls();
} else {
bindControls(editingDomain);
}
w_hasBusinessAddress.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (w_hasBusinessAddress.isSelected()) {
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);
}
}
}
});
master.setValue(person);
}
private void bindControls() {
EMFDataBindingContext dbc = new EMFDataBindingContext();
IWidgetValueProperty tProp = SwingProperties.text(TextType.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 = SwingProperties.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 = SwingProperties.text(TextType.Modify);
{
IEMFValueProperty mProp = EMFEditProperties
.value(editingDomain,AddressbookPackage.Literals.PERSON__FIRSTNAME);
dbc.bindValue(tProp.observeDelayed(DELAY, w_firstName),
mProp.observeDetail(master));
}
{
IEMFValueProperty mProp = EMFEditProperties
.value(editingDomain,AddressbookPackage.Literals.PERSON__LASTNAME);
dbc.bindValue(tProp.observeDelayed(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(editingDomain, dbc, value);
}
{
IEMFValueProperty mProp = EMFEditProperties.list(editingDomain,
AddressbookPackage.Literals.PERSON__ADDRESSES).value(
new ElementAccessImpl(AddressType.BUSINESS));
IObservableValue value = mProp.observeDetail(master);
IWidgetValueProperty cProp = SwingProperties.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(editingDomain, dbc, value);
}
}
@Inject
void setPerson(@Optional Person person) {
if( master != null ) {
master.setValue(person);
}
}
public static void main(String[] args) {
SwingRealm.createDefault();
try {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
AddressBook book = loadAddressBook();
PersonForm form = new PersonForm();
form.init(null, book, book.getPersons().get(0));
frame.getContentPane().add(form);
frame.pack();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
private static AddressBook loadAddressBook() {
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet
.getResourceFactoryRegistry()
.getExtensionToFactoryMap()
.put(Resource.Factory.Registry.DEFAULT_EXTENSION,
new XMIResourceFactoryImpl());
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;
}
}
}