blob: a2214790930892b14fc9bc6c9e3be216b3af1bad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2017 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:
* Mat Hansen - initial API and implementation
******************************************************************************/
package org.eclipse.emfforms.spi.swt.table;
import java.util.Map.Entry;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.databinding.EMFDataBindingContext;
import org.eclipse.jface.databinding.swt.IWidgetValueProperty;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.viewers.AbstractTableViewer;
import org.eclipse.jface.viewers.ViewerColumn;
import org.eclipse.swt.widgets.Item;
import org.eclipse.swt.widgets.Widget;
/**
* A table viewer configuration helper class.
*
* @author Mat Hansen <mhansen@eclipsesource.com>
*
* @param <V> the TableViewer implementation to use
* @param <C> the {@link ViewerColumn} implementation to use
*/
public abstract class AbstractTableViewerColumnBuilder<V extends AbstractTableViewer, C extends ViewerColumn> {
/**
* Column ID counter.
*/
private int columnId;
/**
* The {@link ColumnConfiguration}.
*/
private final ColumnConfiguration config;
/**
* The {@link EMFDataBindingContext}.
*/
private EMFDataBindingContext dataBindingContext;
/**
* The constructor.
*
* @param config the {@link ColumnConfiguration}
*/
public AbstractTableViewerColumnBuilder(ColumnConfiguration config) {
this.config = config;
}
/**
* Creates a new viewer column.
*
* @param tableViewer the parent table viewer
* @return the table viewer column
*/
public C build(V tableViewer) {
final C tableViewerColumn = createViewerColumn(tableViewer);
configure(tableViewer, tableViewerColumn);
executeCallbacks(tableViewer, tableViewerColumn);
return tableViewerColumn;
}
/**
* Creates a new ViewerColumn instance.
*
* @param tableViewer the TableViewer
* @return a ViewerColumn instance
*/
public abstract C createViewerColumn(V tableViewer);
/**
* Returns the table column control for the given viewer column.
*
* @param viewerColumn the viewer column
* @return a table column control
*/
protected abstract Item getTableColumn(C viewerColumn);
/**
* Configures a viewer column instance.
*
* @param viewerColumn the viewer column to configure
*/
protected abstract void configureViewerColumn(C viewerColumn);
/**
* Configures a viewer column instance.
*
* @param tableViewer the table viewer the column belongs to
* @param viewerColumn the viewer column to configure
*/
protected void configure(V tableViewer, C viewerColumn) {
final Item tableColumn = getTableColumn(viewerColumn);
configureDatabinding(tableColumn);
configureLabelProvider(viewerColumn, tableViewer);
configureEditingSupport(viewerColumn, tableViewer);
configureContextMap(tableColumn);
configureViewerColumn(viewerColumn);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void executeCallbacks(V tableViewer, C tableViewerColumn) {
for (final ConfigurationCallback callback : config.getConfigurationCallbacks()) {
callback.configure(config, tableViewer, tableViewerColumn);
}
}
/**
* Configures the EditingSupport for the given table viewer/column.
*
* @param viewerColumn the viewer column to configure
* @param tableViewer the table viewer the column belongs to
*/
protected abstract void configureEditingSupport(C viewerColumn, V tableViewer);
/**
* Adds databinding support.
*
* @param dataBindingContext the {@link EMFDataBindingContext} to use
* @return a new TableViewerColumnBuilder instance
*/
public AbstractTableViewerColumnBuilder<V, C> withDatabinding(EMFDataBindingContext dataBindingContext) {
this.dataBindingContext = dataBindingContext;
return this;
}
/**
* Binds a value to a widget value property.
*
* @param column the widget
* @param valueProperty the value property to bind to
* @param observable the value to bind to
*/
protected void bindValue(Widget column, IWidgetValueProperty valueProperty, IObservableValue observable) {
if (dataBindingContext == null) {
return;
}
dataBindingContext.bindValue(valueProperty.observe(column), observable);
}
/**
* Configures data binding for the given column widget.
*
* @param column the column widget to configure
*/
protected void configureDatabinding(Widget column) {
bindValue(column, WidgetProperties.text(), config.getColumnText());
}
/**
* Configures the label provider of the given column.
*
* @param column the column to configure
* @param tableViewer the table viewer the column belongs to
*/
protected void configureLabelProvider(C column, V tableViewer) {
column.setLabelProvider(config.createLabelProvider(tableViewer));
}
/**
* Configures a image for the given column item.
*
* @param column the column item to configure an image for
*/
protected void configureImage(Item column) {
if (config.getColumnImage().isPresent()) {
column.setImage(config.getColumnImage().get());
}
}
/**
* Configures the context map of the given widget.
*
* @param column the column widget to configure
*/
protected void configureContextMap(Widget column) {
for (final Entry<String, Object> entry : config.getData().entrySet()) {
column.setData(entry.getKey(), entry.getValue());
}
column.setData(ColumnConfiguration.ID, config);
column.setData(ColumnConfiguration.COLUMN_ID, columnId++);
column.setData(ColumnConfiguration.RESIZABLE, config.isResizeable());
column.setData(ColumnConfiguration.WEIGHT, config.getWeight());
column.setData(ColumnConfiguration.MIN_WIDTH, config.getMinWidth());
}
/**
* @return the {@link ColumnConfiguration}
*/
public ColumnConfiguration getConfig() {
return config;
}
}