org.eclipse.emf.examples.library.databinding.stock.StockForm.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.examples.library.databinding.stock.StockForm.java

Source

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

}