/*******************************************************************************
* 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;
}
}