/**
* <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 javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.eclipse.core.databinding.observable.list.IListChangeListener;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.ListChangeEvent;
import org.eclipse.core.databinding.observable.list.ListDiffVisitor;
import org.eclipse.core.databinding.observable.map.IObservableMap;
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.common.util.URI;
import org.eclipse.emf.databinding.EMFProperties;
import org.eclipse.emf.databinding.IEMFListProperty;
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.ufacekit.ui.swing.databinding.swing.SwingProperties;
import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingRealm;
import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ILabelDelegate;
import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ObservableListCellRender;
import org.eclipse.ufacekit.ui.swing.databinding.swing.model.ObservableListModel;
import at.bestsolution.e4.addressbook.model.addressbook.AddressBook;
import at.bestsolution.e4.addressbook.model.addressbook.AddressbookPackage;
import at.bestsolution.e4.addressbook.model.addressbook.Person;
import at.bestsolution.e4.addressbook.ui.services.PersonSelectionPublisher;
public class PersonList extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private JList w_list;
/**
* Create the panel.
*/
public PersonList() {
setLayout(new BorderLayout(0, 0));
JScrollPane scrollPane = new JScrollPane();
add(scrollPane, BorderLayout.CENTER);
w_list = new JList();
scrollPane.setViewportView(w_list);
}
@Inject
public PersonList(JPanel parent) {
this();
parent.setLayout(new BorderLayout());
parent.add(this,BorderLayout.CENTER);
}
@PostConstruct
void init(AddressBook book, final PersonSelectionPublisher personService) {
{
IEMFListProperty mProp = EMFProperties
.list(AddressbookPackage.Literals.ADDRESS_BOOK__PERSONS);
IValueProperty[] props = {
EMFProperties
.value(AddressbookPackage.Literals.PERSON__FIRSTNAME),
EMFProperties
.value(AddressbookPackage.Literals.PERSON__LASTNAME) };
final IObservableList list = mProp.observe(book);
ObservableListModel<Person> model = new ObservableListModel<Person>(list, props);
w_list.setModel(model);
w_list.setCellRenderer(new ObservableListCellRender<Person>(model,
new ILabelDelegate<Person>() {
@Override
public String getText(Person object,
IObservableMap[] maps) {
return object == null ? "" : object.getFirstname()
+ " " + object.getLastname();
}
}));
list.addListChangeListener(new IListChangeListener() {
@Override
public void handleListChange(ListChangeEvent event) {
event.diff.accept(new ListDiffVisitor() {
@Override
public void handleRemove(int index, Object element) {
if( list.size() > index - 1 && w_list.getSelectedValue() == null ) {
if( index - 1 >= 0 ) {
index--;
} else {
index = 0;
}
w_list.setSelectedValue(list.get(index), true);
}
}
@Override
public void handleAdd(int index, Object element) {
w_list.setSelectedValue(element, true);
}
});
}
});
SwingProperties.singleSelectionValue().observe(w_list)
.addValueChangeListener(new IValueChangeListener() {
@Override
public void handleValueChange(ValueChangeEvent event) {
personService.setPerson((Person) event.diff
.getNewValue());
}
});
if( list.size() > 0 ) {
w_list.setSelectedIndex(0);
}
}
}
public static void main(String[] args) {
SwingRealm.createDefault();
try {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
AddressBook book = loadAddressBook();
PersonList form = new PersonList();
form.init(book, new SelectedPersonServiceMock());
frame.getContentPane().add(form);
frame.pack();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
static class SelectedPersonServiceMock implements PersonSelectionPublisher {
@Override
public void setPerson(Person person) {
}
}
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);
}
}