org.eclipse.emf.examples.library.databinding.writer.WriterForm.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.examples.library.databinding.writer.WriterForm.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.writer;

import java.util.Arrays;
import java.util.Collection;

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.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.examples.extlibrary.EXTLibraryPackage;
import org.eclipse.emf.examples.extlibrary.Writer;
import org.eclipse.emf.examples.library.databinding.AbstractForm;
import org.eclipse.emf.examples.library.databinding.common.FocusCellOwnerDrawHighlighter;
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.writer.handler.CreateNewWriterHandler;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ObservableValueEditingSupport;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.TableViewerEditor;
import org.eclipse.jface.viewers.TableViewerFocusCellManager;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.swt.IFocusService;

public class WriterForm extends AbstractForm {
    private class LengthConverter extends Converter {

        public LengthConverter() {
            super(Collection.class, String.class);
        }

        public Object convert(Object fromObject) {
            return "Writers (" + ((Collection<?>) fromObject).size() + ")";
        }

    }

    private static final String PREFIX = "org.eclipse.emf.examples.library.databinding.writer";
    private static final String WRITER_TABLE = PREFIX + ".table";
    private TableViewer writerViewer;

    @Override
    public void doCreateForm(TabFolder folder, TabItem item, final EditingDomain domain, DataBindingContext dbc,
            IObservableValue master) {

        IValueProperty textProp = WidgetProperties.text();
        dbc.bindValue(textProp.observe(item),
                EMFEditObservables.observeDetailValue(Realm.getDefault(), domain, master,
                        EXTLibraryPackage.Literals.LIBRARY__WRITERS),
                new UpdateValueStrategy(), new UpdateValueStrategy().setConverter(new LengthConverter()));

        Composite comp = new Composite(folder, SWT.NONE);
        TableColumnLayout layout = new TableColumnLayout();
        comp.setLayout(layout);

        writerViewer = new TableViewer(comp, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        writerViewer.getTable().setHeaderVisible(true);
        writerViewer.getTable().setLinesVisible(true);

        Color color = comp.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION);
        final Color bg = new Color(comp.getDisplay(),
                new RGB(color.getRed() - 50, color.getGreen() - 50, color.getBlue() - 50));

        writerViewer.getControl().addDisposeListener(new DisposeListener() {

            public void widgetDisposed(DisposeEvent e) {
                bg.dispose();
            }
        });

        TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(writerViewer,
                new FocusCellOwnerDrawHighlighter(writerViewer) {
                    @Override
                    protected Color getSelectedCellBackgroundColor(ViewerCell cell) {
                        return bg;
                    }
                });
        ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(writerViewer) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                boolean rv = false;

                if (event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION) {
                    rv = (((MouseEvent) event.sourceEvent).stateMask & SWT.MOD1) == SWT.MOD1;
                }

                return rv || event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || (event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
                                && event.keyCode == SWT.CR)
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };

        TableViewerEditor.create(writerViewer, focusCellManager, actSupport, ColumnViewerEditor.TABBING_HORIZONTAL
                //| ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);

        IFocusService focusService = (IFocusService) getSite().getService(IFocusService.class);
        focusService.addFocusTracker(writerViewer.getControl(), WRITER_TABLE);

        ObservableListContentProvider cp = new ObservableListContentProvider();
        writerViewer.setContentProvider(cp);

        ConditionalTemplate[] tpl = new ConditionalTemplate[3];
        tpl[0] = new ConditionalTemplate("${0}") {

            @Override
            public boolean isTemplate(EObject element) {
                return element instanceof Writer && ((Writer) element).getFirstName() != null;
            }

        };
        tpl[1] = new ConditionalTemplate("${0}") {

            @Override
            public boolean isTemplate(EObject element) {
                return element instanceof Writer && ((Writer) element).getLastName() != null;
            }

        };
        tpl[2] = new ConditionalTemplate("-") {

            @Override
            public boolean isTemplate(EObject element) {
                return true;
            }

        };

        EStructuralFeature[] features = new EStructuralFeature[2];
        features[0] = EXTLibraryPackage.Literals.PERSON__FIRST_NAME;
        features[1] = EXTLibraryPackage.Literals.PERSON__LAST_NAME;

        IObservableMap[] map = EMFEditObservables.observeMaps(domain, cp.getKnownElements(), features);

        TableViewerColumn c = new TableViewerColumn(writerViewer, SWT.NONE);
        c.getColumn().setText("Firstname");
        layout.setColumnData(c.getColumn(), new ColumnWeightData(1, 120));
        c.setLabelProvider(
                new ObservableColumnLabelProvider(new IObservableMap[] { map[0] }, Arrays.asList(tpl[0], tpl[2])));

        final TextCellEditor editor = new TextCellEditor(writerViewer.getTable());

        ObservableValueEditingSupport o = new ObservableValueEditingSupport(writerViewer, dbc) {

            @Override
            protected CellEditor getCellEditor(Object element) {
                return editor;
            }

            @Override
            protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell) {
                return EMFEditObservables.observeValue(domain, (EObject) element,
                        EXTLibraryPackage.Literals.PERSON__FIRST_NAME);
            }

            @Override
            protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor) {
                return SWTObservables.observeText(cellEditor.getControl());
            }
        };
        c.setEditingSupport(o);

        c = new TableViewerColumn(writerViewer, SWT.NONE);
        c.getColumn().setText("Lastname");
        layout.setColumnData(c.getColumn(), new ColumnWeightData(1, 120));
        c.setLabelProvider(
                new ObservableColumnLabelProvider(new IObservableMap[] { map[1] }, Arrays.asList(tpl[1], tpl[2])));
        o = new ObservableValueEditingSupport(writerViewer, dbc) {

            @Override
            protected CellEditor getCellEditor(Object element) {
                return editor;
            }

            @Override
            protected IObservableValue doCreateElementObservable(Object element, ViewerCell cell) {
                return EMFEditObservables.observeValue(domain, (EObject) element,
                        EXTLibraryPackage.Literals.PERSON__LAST_NAME);
            }

            @Override
            protected IObservableValue doCreateCellEditorObservable(CellEditor cellEditor) {
                return SWTObservables.observeText(cellEditor.getControl());
            }
        };
        c.setEditingSupport(o);

        MenuManager mgr = new MenuManager();
        writerViewer.getControl().setMenu(mgr.createContextMenu(writerViewer.getControl()));
        getSite().registerContextMenu("org.eclipse.emf.examples.library.databinding.writer", mgr, writerViewer);

        writerViewer.setInput(EMFEditObservables.observeDetailList(Realm.getDefault(), domain, master,
                EXTLibraryPackage.Literals.LIBRARY__WRITERS));
        item.setControl(comp);

    }

    @Override
    public void preExecute(String commandId, ExecutionEvent event) {

    }

    @Override
    public void postExecuteFailure(String commandId, ExecutionException exception) {
        if (commandId.equals(CreateNewWriterHandler.commandId)) {
            MessageDialog.openError(getItem().getParent().getShell(), "Creating Stock item failed",
                    exception.getMessage());
        }
    }

    @Override
    public void postExecuteSuccess(String commandId, Object returnValue) {
        if (commandId.equals(CreateNewWriterHandler.commandId)) {
            getItem().getParent().setSelection(getItem());
            writerViewer.editElement(returnValue, 0);
        }
    }

    @Override
    protected void doDispose() {
        // TODO Auto-generated method stub

    }

    @Override
    protected String getContextIdPrefix() {
        return PREFIX;
    }
}