Java tutorial
/******************************************************************************* * Copyright (c) 2009 BestSolution.at and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tom Schindl<tom.schindl@bestsolution.at> - initial API and implementation *******************************************************************************/ package org.eclipse.emf.examples.library.databinding.stock; import java.util.Arrays; import java.util.Collection; import java.util.UUID; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; 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.Realm; import org.eclipse.core.databinding.observable.map.IObservableMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.property.value.IValueProperty; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.databinding.edit.EMFEditObservables; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.example.library.service.ISavePoint; import org.eclipse.emf.example.library.service.ISavePointEditingDomain; import org.eclipse.emf.examples.extlibrary.AudioVisualItem; import org.eclipse.emf.examples.extlibrary.Book; import org.eclipse.emf.examples.extlibrary.BookOnTape; import org.eclipse.emf.examples.extlibrary.EXTLibraryPackage; import org.eclipse.emf.examples.extlibrary.Item; import org.eclipse.emf.examples.extlibrary.Periodical; import org.eclipse.emf.examples.extlibrary.VideoCassette; import org.eclipse.emf.examples.library.databinding.AbstractForm; import org.eclipse.emf.examples.library.databinding.ISources; import org.eclipse.emf.examples.library.databinding.SourceProvider; import org.eclipse.emf.examples.library.databinding.common.ObservableColumnLabelProvider; import org.eclipse.emf.examples.library.databinding.common.ObservableColumnLabelProvider.ConditionalTemplate; import org.eclipse.emf.examples.library.databinding.stock.handler.CreateNewStockItemHandler; import org.eclipse.emf.examples.library.databinding.stock.handler.EditStockItemHandler; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.ObservableListContentProvider; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.services.ISourceProviderService; import org.eclipse.ui.swt.IFocusService; public class StockForm extends AbstractForm { private class LengthConverter extends Converter { public LengthConverter() { super(Collection.class, String.class); } public Object convert(Object fromObject) { return "Stock (" + ((Collection<?>) fromObject).size() + " Items)"; } } private TableViewer itemViewer; private static final String PREFIX = "org.eclipse.emf.examples.library.databinding.stock"; private static final String STOCK_TABLE = PREFIX + ".table"; private static ISavePoint createSavePoint; @Override public void doCreateForm(TabFolder folder, TabItem item, EditingDomain domain, DataBindingContext dbc, IObservableValue master) { Composite comp = new Composite(folder, SWT.NONE); IValueProperty textProp = WidgetProperties.text(); dbc.bindValue(textProp.observe(item), EMFEditObservables.observeDetailValue(Realm.getDefault(), domain, master, EXTLibraryPackage.Literals.LIBRARY__STOCK), new UpdateValueStrategy(), new UpdateValueStrategy().setConverter(new LengthConverter())); TableColumnLayout layout = new TableColumnLayout(); comp.setLayout(layout); itemViewer = new TableViewer(comp, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI); IFocusService focusService = (IFocusService) getSite().getService(IFocusService.class); focusService.addFocusTracker(itemViewer.getControl(), STOCK_TABLE); itemViewer.getTable().setHeaderVisible(true); itemViewer.getTable().setLinesVisible(true); ObservableListContentProvider cp = new ObservableListContentProvider(); itemViewer.setContentProvider(cp); itemViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { ISourceProviderService service = (ISourceProviderService) getSite() .getService(ISourceProviderService.class); SourceProvider pv = (SourceProvider) service.getSourceProvider(ISources.SELECTED_STOCK_ITEM_NAME); pv.setItemSelection(event.getSelection()); } }); ConditionalTemplate tplBookTitle = new ConditionalTemplate("${0}") { @Override public boolean isTemplate(EObject element) { return element instanceof Book && ((Book) element).getTitle() != null; } }; ConditionalTemplate tplAudiovisualTitle = new ConditionalTemplate("${1}") { @Override public boolean isTemplate(EObject element) { return element instanceof AudioVisualItem && ((AudioVisualItem) element).getTitle() != null; } }; ConditionalTemplate tplPeriodicalTitle = new ConditionalTemplate("${2}") { @Override public boolean isTemplate(EObject element) { return element instanceof Periodical && ((Periodical) element).getTitle() != null; } }; ConditionalTemplate tplPublicationDate = new ConditionalTemplate("${0,date,medium}") { @Override public boolean isTemplate(EObject element) { return ((Item) element).getPublicationDate() != null; } }; ConditionalTemplate tplNullValue = new ConditionalTemplate("-") { @Override public boolean isTemplate(EObject element) { return true; } }; IObservableMap featBookTitle = EMFEditObservables.observeMap(domain, cp.getKnownElements(), EXTLibraryPackage.Literals.BOOK__TITLE); IObservableMap featAudiovisualTitle = EMFEditObservables.observeMap(domain, cp.getKnownElements(), EXTLibraryPackage.Literals.AUDIO_VISUAL_ITEM__TITLE); IObservableMap featPeriodicalTitle = EMFEditObservables.observeMap(domain, cp.getKnownElements(), EXTLibraryPackage.Literals.PERIODICAL__TITLE); IObservableMap featItemPublicationDate = EMFEditObservables.observeMap(domain, cp.getKnownElements(), EXTLibraryPackage.Literals.ITEM__PUBLICATION_DATE); TableViewerColumn c = new TableViewerColumn(itemViewer, SWT.NONE); c.getColumn().setText("AAAAA"); layout.setColumnData(c.getColumn(), new ColumnWeightData(1, 120)); c.setLabelProvider(new ObservableColumnLabelProvider( new IObservableMap[] { featBookTitle, featAudiovisualTitle, featPeriodicalTitle }, Arrays.asList(tplBookTitle, tplAudiovisualTitle, tplPeriodicalTitle, tplNullValue))); c = new TableViewerColumn(itemViewer, SWT.NONE); c.getColumn().setText("Type"); layout.setColumnData(c.getColumn(), new ColumnWeightData(1, 120)); c.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof Book) { return "Book"; } else if (element instanceof BookOnTape) { return "Book On Tape"; } else if (element instanceof VideoCassette) { return "Video"; } else if (element instanceof Periodical) { return "Periodical"; } else { return ""; } } }); c = new TableViewerColumn(itemViewer, SWT.NONE); c.getColumn().setText("Publication Date"); layout.setColumnData(c.getColumn(), new ColumnWeightData(1, 120)); c.setLabelProvider(new ObservableColumnLabelProvider(new IObservableMap[] { featItemPublicationDate }, Arrays.asList(tplPublicationDate, tplNullValue))); MenuManager mgr = new MenuManager(); itemViewer.getControl().setMenu(mgr.createContextMenu(itemViewer.getControl())); getSite().registerContextMenu("org.eclipse.emf.examples.library.databinding.stock", mgr, itemViewer); item.setControl(comp); itemViewer.setInput(EMFEditObservables.observeDetailList(Realm.getDefault(), domain, master, EXTLibraryPackage.Literals.LIBRARY__STOCK)); } @Override public void postExecuteFailure(String commandId, ExecutionException exception) { if (commandId.equals(CreateNewStockItemHandler.commandId)) { MessageDialog.openError(getItem().getParent().getShell(), "Creating Stock item failed", exception.getMessage()); } } @Override public void preExecute(String commandId, ExecutionEvent event) { if (commandId.equals(CreateNewStockItemHandler.commandId)) { createSavePoint = getDomain().addSavePoint(UUID.randomUUID().toString()); } } @Override public void postExecuteSuccess(String commandId, Object returnValue) { if (commandId.equals(CreateNewStockItemHandler.commandId)) { getItem().getParent().setSelection(getItem()); itemViewer.setSelection(new StructuredSelection(returnValue)); IHandlerService hs = (IHandlerService) getSite().getService(IHandlerService.class); try { IStatus s = (IStatus) hs.executeCommand(EditStockItemHandler.commandId, null); if (s.isOK()) { createSavePoint.dispose(); createSavePoint = null; } else { if (createSavePoint.canRollback()) { createSavePoint.rollback(); } createSavePoint = null; } } catch (Exception e) { MessageDialog.openError(getItem().getParent().getShell(), "Creating Stock item failed", e.getMessage()); } } } @Override protected void doDispose() { } @Override protected String getContextIdPrefix() { return PREFIX; } }