blob: 6f531c9c8867ab457b60486b572d00bcbfb3e9d0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2019 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Alexandra Buzila - initial API and implementation
* Johannes Faltermeier - initial API and implementation
* Mat Hansen - builder refactoring
* Christian W. Damus - bugs 534829, 530314
******************************************************************************/
package org.eclipse.emfforms.spi.swt.table;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emfforms.common.Feature;
import org.eclipse.emfforms.internal.swt.table.DefaultTableControlSWTCustomization;
import org.eclipse.emfforms.spi.swt.table.action.ActionBar;
import org.eclipse.emfforms.spi.swt.table.action.ActionConfiguration;
import org.eclipse.jface.viewers.AbstractTableViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.widgets.Composite;
/**
* Builder class for creating a {@link TableViewerComposite}.
*
* @author Alexandra Buzila
* @author Johannes Faltermeier
* @author Mat Hansen
*
*/
@SuppressWarnings("deprecation")
public class TableViewerSWTBuilder extends AbstractFeatureAwareBuilder<TableViewerSWTBuilder> {
private boolean tableConfigured;
/** The parent composite. */
private final Composite composite;
/** The style bits. */
private final int swtStyleBits;
/** The input object. */
private final Object input;
/** The table control customization. */
private final DefaultTableControlSWTCustomization customization;
/** The title. */
private final IObservableValue<String> title;
/** The tooltip. */
private final IObservableValue<String> tooltip;
private final Set<Feature> features = new LinkedHashSet<Feature>();
/**
* @param composite the parent {@link Composite}
* @param swtStyleBits the swt style bits
* @param input the input object
* @param title the title
* @param tooltip the tooltip
*/
@SuppressWarnings("rawtypes")
protected TableViewerSWTBuilder(Composite composite, int swtStyleBits, Object input, IObservableValue<String> title,
IObservableValue<String> tooltip) {
this.composite = composite;
this.swtStyleBits = swtStyleBits;
this.input = input;
this.title = title;
this.tooltip = tooltip;
customization = new DefaultTableControlSWTCustomization() {
@Override
public TableConfiguration getTableConfiguration() {
// if the table hasn't been configured, do it now (using defaults)
if (!tableConfigured) {
configureTable(TableConfigurationBuilder.withFeatures(features).build());
}
return super.getTableConfiguration();
}
};
}
/**
* @return the composite
*/
protected Composite getComposite() {
return composite;
}
/**
* @return the swtStyleBits
*/
protected int getSwtStyleBits() {
return swtStyleBits;
}
/**
* @return the input
*/
protected Object getInput() {
return input;
}
/**
* @return the customization
*/
public TableViewerSWTCustomization<?> getCustomization() {
return customization;
}
/**
* @return the title
*/
protected IObservableValue<String> getTitle() {
return title;
}
/**
* @return the tooltip
*/
protected IObservableValue<String> getTooltip() {
return tooltip;
}
/**
* <p>
* Use this method to customize the way title, validation, buttons and the tableviewer are arranged.
* </p>
* <p>
* The default implementation will create a title bar with title to left, a validation label in the middle and a
* button bar on the right. Below the title bar the viewer will be created
* </p>
*
* @param builder the {@link TableViewerCompositeBuilder}
* @return self
*/
public TableViewerSWTBuilder customizeCompositeStructure(TableViewerCompositeBuilder builder) {
customization.setTableViewerCompositeBuilder(builder);
return this;
}
/**
* <p>
* Use this method to create the actual TableViewer.
* </p>
* <p>
* The default implementation will create a viewer with the SWT#MULTI, SWT#V_SCROLL,
* FULL_SELECTION and SWT#BORDER style bits. The table will show the
* {@link org.eclipse.swt.widgets.Table#setHeaderVisible(boolean) header} and will show
* {@link org.eclipse.swt.widgets.Table#setLinesVisible(boolean) lines}.
* </p>
*
* @param creator the {@link TableViewerCreator}
* @return self
*/
@SuppressWarnings("unchecked")
public TableViewerSWTBuilder customizeTableViewerCreation(
TableViewerCreator<? extends AbstractTableViewer> creator) {
customization.setTableViewerCreator(creator);
return this;
}
/**
* <p>
* Use this method to set a {@link ViewerComparator} on the table.
* </p>
* <p>
* The default implementation does not add a comparator.
* </p>
*
* @param comparator the {@link ViewerComparator}
* @return self
*/
public TableViewerSWTBuilder customizeComparator(ViewerComparator comparator) {
customization.setViewerComparator(comparator);
return this;
}
/**
* <p>
* Use this method to set a different content provider on the viewer.
* </p>
* <p>
* The default implementation uses a {@link org.eclipse.jface.databinding.viewers.ObservableListContentProvider
* ObservableListContentProvider}.
* </p>
*
* @param provider the {@link IContentProvider} to use
* @return self
*/
public TableViewerSWTBuilder customizeContentProvider(IContentProvider provider) {
customization.setContentProvider(provider);
return this;
}
/**
* <p>
* Use this method to customize the way the button bar is filled.
* </p>
* <p>
* The default behavior will not add any buttons.
* </p>
*
* @param actionBar the {@link ActionBar}
* @return self
*/
@SuppressWarnings("unchecked")
public TableViewerSWTBuilder customizeActionBar(ActionBar<? extends Viewer> actionBar) {
customization.setActionBar(actionBar);
return this;
}
/**
* <p>
* Use this method to customize the key bindings for the table viewer.
* </p>
* <p>
* The default behavior will not register any bindings.
* </p>
*
* @param actionConfiguration the {@link ActionConfiguration}
* @return self
*/
public TableViewerSWTBuilder customizeActionConfiguration(ActionConfiguration actionConfiguration) {
customization.setActionConfiguration(actionConfiguration);
return this;
}
/**
* <p>
* Use this method to customize drag&drop.
* </p>
* <p>
* The default behaviour disables drag&drop.
* </p>
*
* @param provider the provider
* @return self
*/
public TableViewerSWTBuilder customizeDragAndDrop(DNDProvider provider) {
customization.setDND(provider);
return this;
}
/**
* Configures the current table instance using the given configuration.
*
* @param tableConfiguration the {@link TableConfiguration} to add
* @return self
*/
public TableViewerSWTBuilder configureTable(TableConfiguration tableConfiguration) {
customization.configureTable(tableConfiguration);
tableConfigured = true;
return this;
}
/**
* Adds a new column.
*
* @param columnConfiguration the {@link ColumnConfiguration} to add
* @return self
*/
public TableViewerSWTBuilder addColumn(ColumnConfiguration columnConfiguration) {
customization.addColumn(columnConfiguration);
return this;
}
/**
* @deprecated Since 1.21, use the {@link #showHideColumns(boolean)} and similar
* builder methods, instead
* @see #showHideColumns(boolean)
* @see #columnSubstringFilter(boolean)
* @see #columnRegexFilter(boolean)
*/
@Override
@Deprecated
public Set<Feature> getSupportedFeatures() {
return new LinkedHashSet<Feature>(TableConfiguration.ALL_FEATURES);
}
/**
* @deprecated Since 1.21, use the {@link #showHideColumns(boolean)} and similar
* builder methods, instead
* @see #showHideColumns(boolean)
* @see #columnSubstringFilter(boolean)
* @see #columnRegexFilter(boolean)
*/
@Override
@Deprecated
public Set<Feature> getEnabledFeatures() {
return features;
}
/**
* Set whether support for users to show and hide columns is installed.
*
* @param showHideColumns {@code true} to enable showing and hiding of columns; {@code false} to disable it
* @return this builder, for fluent chaining
*
* @since 1.21
*/
public TableViewerSWTBuilder showHideColumns(boolean showHideColumns) {
return showHideColumns ? enableFeature(TableConfiguration.FEATURE_COLUMN_HIDE_SHOW)
: disableFeature(TableConfiguration.FEATURE_COLUMN_HIDE_SHOW);
}
/**
* Set whether support for users to show a simple substring-matching filter on columns
* is installed.
*
* @param columnSubstringFilter {@code true} to enable the substring filter; {@code false} to disable it
* @return this builder, for fluent chaining
*
* @since 1.21
*/
public TableViewerSWTBuilder columnSubstringFilter(boolean columnSubstringFilter) {
return columnSubstringFilter ? enableFeature(TableConfiguration.FEATURE_COLUMN_FILTER)
: disableFeature(TableConfiguration.FEATURE_COLUMN_FILTER);
}
/**
* Set whether support for users to show a regular expression filter on columns
* is installed.
*
* @param columnRegexFilter {@code true} to enable the regex filter; {@code false} to disable it
* @return this builder, for fluent chaining
*
* @since 1.21
*/
public TableViewerSWTBuilder columnRegexFilter(boolean columnRegexFilter) {
return columnRegexFilter ? enableFeature(TableConfiguration.FEATURE_COLUMN_REGEX_FILTER)
: disableFeature(TableConfiguration.FEATURE_COLUMN_REGEX_FILTER);
}
/**
* Call this method after all desired customizations have been passed to the builder. The will create a new
* {@link TableViewerComposite} with the desired customizations.
*
* @return the {@link TableViewerComposite}
*/
public AbstractTableViewerComposite<? extends AbstractTableViewer> build() {
final AbstractTableViewerComposite<? extends AbstractTableViewer> viewerComposite = //
new TableViewerComposite(composite, swtStyleBits, input, customization, title, tooltip);
viewerComposite.setData(TableConfiguration.ID, customization.getTableConfiguration());
return viewerComposite;
}
}