Java tutorial
/******************************************************************************* * 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(); } }