/** * <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 javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.databinding.observable.Realm; 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.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.jface.databinding.swt.SWTObservables; 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.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; 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 Composite { private Table w_list; /** * Create the composite. * * @param parent * @param style */ public PersonList(Composite parent, int style) { super(parent, style); setLayout(new FillLayout(SWT.HORIZONTAL)); w_list = new Table(this, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); } @Inject public PersonList(Composite parent) { this(parent, SWT.NONE); parent.setLayout(new FillLayout()); } @PostConstruct void init(AddressBook book, final PersonSelectionPublisher personService) { { IEMFListProperty mProp = EMFProperties .list(AddressbookPackage.Literals.ADDRESS_BOOK__PERSONS); final TableViewer viewer = new TableViewer(w_list); ObservableListContentProvider cp = new ObservableListContentProvider(); viewer.setContentProvider(cp); IObservableMap[] map = { EMFProperties.value( AddressbookPackage.Literals.PERSON__FIRSTNAME) .observeDetail(cp.getKnownElements()), EMFProperties.value( AddressbookPackage.Literals.PERSON__LASTNAME) .observeDetail(cp.getKnownElements()) }; viewer.setLabelProvider(new ObservableMapLabelProvider(map) { @Override public String getColumnText(Object element, int columnIndex) { Person object = (Person) element; return object == null ? "" : object.getFirstname() + " " + object.getLastname(); } }); final IObservableList list = mProp.observe(book); viewer.setInput(list); 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() == 0 ) { return; } if( list.size() > index - 1 && viewer.getSelection().isEmpty() ) { if( index - 1 >= 0 ) { index--; } else { index = 0; } viewer.setSelection(new StructuredSelection(list.get(index))); } } @Override public void handleAdd(int index, Object element) { viewer.setSelection(new StructuredSelection(element)); } }); } }); ViewerProperties.singleSelection().observe(viewer) .addValueChangeListener(new IValueChangeListener() { @Override public void handleValueChange(ValueChangeEvent event) { personService.setPerson((Person) event.diff .getNewValue()); } }); if( list.size() > 0 ) { viewer.setSelection(new StructuredSelection(list.get(0))); } } } @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(); PersonList form = new PersonList(frame, SWT.NONE); form.init(book, new SelectedPersonServiceMock()); frame.pack(); frame.open(); while (!frame.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } catch (Exception e) { e.printStackTrace(); } } }); display.dispose(); } 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); } }