org.eclipse.emfforms.spi.swt.table.TableViewerComposite.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emfforms.spi.swt.table.TableViewerComposite.java

Source

/*******************************************************************************
 * Copyright (c) 2011-2015 EclipseSource Muenchen GmbH 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:
 * Alexandra Buzila - initial API and implementation
 * Johannes Faltermeier - initial API and implementation
 ******************************************************************************/
package org.eclipse.emfforms.spi.swt.table;

import java.util.List;

import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.emfforms.common.Optional;
import org.eclipse.emfforms.spi.swt.table.TableViewerSWTCustomization.ColumnDescription;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.EditingSupport;
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.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableColumn;

/**
 * A {@link Composite} containing a {@link TableViewer}.
 *
 * @author Alexandra Buzila
 * @author Johannes Faltermeier
 *
 */
public class TableViewerComposite extends Composite {

    private static final String RESIZABLE = "resizable"; //$NON-NLS-1$
    private static final String WEIGHT = "weight"; //$NON-NLS-1$
    private static final String MIN_WIDTH = "min_width"; //$NON-NLS-1$
    private final EMFDataBindingContext emfDatabindingContext;
    private TableViewer tableViewer;
    private Optional<List<Control>> validationControls;

    /**
     * Default constructor.
     *
     * @param parent the parent {@link Composite}
     * @param style the style bits
     * @param inputObject the input object
     * @param customization the {@link TableViewerSWTCustomization}
     * @param title the title
     * @param tooltip the tooltip
     */
    TableViewerComposite(Composite parent, int style, Object inputObject, TableViewerSWTCustomization customization,
            IObservableValue title, IObservableValue tooltip) {
        super(parent, style);
        emfDatabindingContext = new EMFDataBindingContext();
        renderControl(this, customization, inputObject, emfDatabindingContext, title, tooltip);
    }

    /**
     * @return the {@link TableViewer}
     */
    public TableViewer getTableViewer() {
        return tableViewer;
    }

    /**
     *
     * @return the validation controls, if present
     */
    public Optional<List<Control>> getValidationControls() {
        return validationControls;
    }

    private void renderControl(Composite parent, TableViewerSWTCustomization customization, Object inputObject,
            EMFDataBindingContext emfDataBindingContext, IObservableValue title, IObservableValue tooltip) {
        customization.createCompositeLayout(parent);

        final Optional<Label> titleLabel = customization.getTitleLabel();
        if (titleLabel.isPresent()) {
            initTitleLabel(titleLabel.get(), title, tooltip, emfDatabindingContext);
        }

        validationControls = customization.getValidationControls();

        final Composite viewerComposite = customization.getViewerComposite();

        tableViewer = customization.createTableViewer(viewerComposite);

        final Optional<Composite> buttonComposite = customization.getButtonComposite();
        if (buttonComposite.isPresent()) {
            initButtonComposite(buttonComposite.get(), customization, tableViewer);
        }

        enableTooltipSupport(tableViewer);

        enableEditingSupport(tableViewer);

        final Optional<ViewerComparator> comparator = customization.getComparator();
        if (comparator.isPresent()) {
            tableViewer.setComparator(comparator.get());
        }

        tableViewer.setContentProvider(customization.createContentProvider());

        addColumns(customization, tableViewer, emfDataBindingContext);

        tableViewer.setInput(inputObject);

        final TableColumnLayout layout = new TableColumnLayout();
        viewerComposite.setLayout(layout);
        for (int i = 0; i < tableViewer.getTable().getColumns().length; i++) {
            final TableColumn tableColumn = tableViewer.getTable().getColumns()[i];
            final boolean storedIsResizable = (Boolean) tableColumn.getData(RESIZABLE);
            final Integer storedWeight = (Integer) tableColumn.getData(WEIGHT);
            final Integer storedMinWidth = (Integer) tableColumn.getData(MIN_WIDTH);
            layout.setColumnData(tableColumn,
                    new ColumnWeightData(storedWeight, storedMinWidth, storedIsResizable));
        }
    }

    private static void addColumns(TableViewerSWTCustomization customization, TableViewer tableViewer,
            EMFDataBindingContext emfDataBindingContext) {
        for (final ColumnDescription columnDescription : customization.getColumns()) {
            /* create column */
            // TODO move TableViewerColumnBuilder?
            @SuppressWarnings("restriction")
            final TableViewerColumn column = org.eclipse.emf.ecp.edit.internal.swt.controls.TableViewerColumnBuilder
                    .create().setData(RESIZABLE, columnDescription.isResizeable())
                    .setMoveable(columnDescription.isMoveable()).setStyle(columnDescription.getStyleBits())
                    .setData(WEIGHT, columnDescription.getWeight())
                    .setData(MIN_WIDTH, columnDescription.getMinWidth()).build(tableViewer);

            /* bind text and tooltip */
            final IObservableValue text = columnDescription.getColumnText();
            emfDataBindingContext.bindValue(WidgetProperties.text().observe(column.getColumn()), text);
            final IObservableValue tooltipText = columnDescription.getColumnTooltip();
            emfDataBindingContext.bindValue(WidgetProperties.tooltipText().observe(column.getColumn()),
                    tooltipText);

            /* set label provider */
            column.setLabelProvider(columnDescription.createLabelProvider(tableViewer));

            /* set editing support */
            final Optional<EditingSupport> editingSupport = columnDescription.createEditingSupport(tableViewer);
            if (editingSupport.isPresent()) {
                column.setEditingSupport(editingSupport.get());
            }

            if (columnDescription.getColumnImage().isPresent()) {
                column.getColumn().setImage(columnDescription.getColumnImage().get());
            }

            /* setup drag&drop */
            if (customization.hasDND()) {
                tableViewer.addDragSupport(customization.getDragOperations(), customization.getDragTransferTypes(),
                        customization.getDragListener(tableViewer));
                tableViewer.addDropSupport(customization.getDropOperations(), customization.getDropTransferTypes(),
                        customization.getDropListener(tableViewer));
            }

        }
    }

    private static void enableEditingSupport(final TableViewer tableViewer) {
        @SuppressWarnings("restriction")
        final TableViewerFocusCellManager focusCellManager = new TableViewerFocusCellManager(tableViewer,
                new org.eclipse.emf.ecp.edit.internal.swt.controls.ECPFocusCellDrawHighlighter(tableViewer));
        final ColumnViewerEditorActivationStrategy actSupport = new ColumnViewerEditorActivationStrategy(
                tableViewer) {
            @Override
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.TRAVERSAL
                        || event.eventType == ColumnViewerEditorActivationEvent.MOUSE_CLICK_SELECTION
                        || event.eventType == ColumnViewerEditorActivationEvent.KEY_PRESSED
                                && event.keyCode == SWT.CR
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };
        TableViewerEditor.create(tableViewer, focusCellManager, actSupport,
                ColumnViewerEditor.TABBING_HORIZONTAL | ColumnViewerEditor.TABBING_MOVE_TO_ROW_NEIGHBOR
                        | ColumnViewerEditor.TABBING_VERTICAL | ColumnViewerEditor.KEYBOARD_ACTIVATION);
    }

    private static void enableTooltipSupport(final TableViewer tableViewer) {
        ColumnViewerToolTipSupport.enableFor(tableViewer);
    }

    private static void initButtonComposite(Composite composite, ButtonBarBuilder customization,
            TableViewer viewer) {
        customization.fillButtonComposite(composite, viewer);

    }

    private static void initTitleLabel(Label label, IObservableValue title, IObservableValue tooltip,
            EMFDataBindingContext emfDatabindingContext) {
        emfDatabindingContext.bindValue(WidgetProperties.text().observe(label), title);
        emfDatabindingContext.bindValue(WidgetProperties.tooltipText().observe(label), tooltip);
    }

    @Override
    public void dispose() {
        emfDatabindingContext.dispose();
        super.dispose();
    }

}