/* * ARX: Powerful Data Anonymization * Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.deidentifier.arx.gui.view.impl.common.datatable; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration; import org.eclipse.nebula.widgets.nattable.data.IDataProvider; import org.eclipse.nebula.widgets.nattable.grid.GridRegion; import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.CornerLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultColumnHeaderDataLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.DefaultRowHeaderDataLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer; import org.eclipse.nebula.widgets.nattable.grid.layer.RowHeaderLayer; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.ILayer; import org.eclipse.nebula.widgets.nattable.layer.ILayerListener; import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer; import org.eclipse.nebula.widgets.nattable.resize.event.ColumnResizeEventMatcher; import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer; import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry; import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Control; /** * A grid layer for the data view. * * @author Fabian Prasser */ public class DataTableGridLayer extends GridLayer { /** TODO */ protected IUniqueIndexLayer bodyDataLayer; /** TODO */ protected IUniqueIndexLayer columnHeaderDataLayer; /** TODO */ protected IUniqueIndexLayer rowHeaderDataLayer; /** TODO */ protected IUniqueIndexLayer cornerDataLayer; /** TODO */ private DataTableContext context; /** TODO */ private NatTable table; /** * Creates a new instance. * * @param useDefaultConfiguration * @param table * @param context */ protected DataTableGridLayer(boolean useDefaultConfiguration, NatTable table, DataTableContext context) { super(useDefaultConfiguration); this.context = context; this.table = table; } /** * Returns the body data layer. * * @return */ public IUniqueIndexLayer getBodyDataLayer() { return bodyDataLayer; } @Override public DataTableBodyLayerStack getBodyLayer() { return (DataTableBodyLayerStack) super.getBodyLayer(); } /** * Returns the column header layer. * * @return */ public IUniqueIndexLayer getColumnHeaderDataLayer() { return columnHeaderDataLayer; } @Override public ColumnHeaderLayer getColumnHeaderLayer() { return (ColumnHeaderLayer) super.getColumnHeaderLayer(); } /** * Returns the corner data layer. * * @return */ public IUniqueIndexLayer getCornerDataLayer() { return cornerDataLayer; } @Override public CornerLayer getCornerLayer() { return (CornerLayer) super.getCornerLayer(); } /** * Returns the row header layer. * * @return */ public IUniqueIndexLayer getRowHeaderDataLayer() { return rowHeaderDataLayer; } @Override public RowHeaderLayer getRowHeaderLayer() { return (RowHeaderLayer) super.getRowHeaderLayer(); } /** * Initialize. * * @param bodyDataProvider * @param columnHeaderDataProvider * @param rowHeaderDataProvider * @param cornerDataProvider * @param parent */ protected void init(IDataProvider bodyDataProvider, IDataProvider columnHeaderDataProvider, IDataProvider rowHeaderDataProvider, IDataProvider cornerDataProvider, Control parent) { init(new DataLayer(bodyDataProvider), new DefaultColumnHeaderDataLayer(columnHeaderDataProvider), new DefaultRowHeaderDataLayer(rowHeaderDataProvider), new DataLayer(cornerDataProvider), parent); } /** * Initialize. * * @param bodyDataLayer * @param columnHeaderDataLayer * @param rowHeaderDataLayer * @param cornerDataLayer * @param parent */ protected void init(final IUniqueIndexLayer bodyDataLayer, IUniqueIndexLayer columnHeaderDataLayer, IUniqueIndexLayer rowHeaderDataLayer, IUniqueIndexLayer cornerDataLayer, Control parent) { // Body this.bodyDataLayer = bodyDataLayer; DataTableBodyLayerStack bodyLayer = new DataTableBodyLayerStack(bodyDataLayer, table, context, parent); SelectionLayer selectionLayer = bodyLayer.getSelectionLayer(); // Column header this.columnHeaderDataLayer = columnHeaderDataLayer; ILayer columnHeaderLayer = new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayer, selectionLayer); // Configure the column resize action ((ColumnHeaderLayer) columnHeaderLayer).addConfiguration(new AbstractUiBindingConfiguration() { @Override public void configureUiBindings(UiBindingRegistry paramUiBindingRegistry) { paramUiBindingRegistry.registerFirstDoubleClickBinding(new ColumnResizeEventMatcher(SWT.NONE, GridRegion.COLUMN_HEADER, MouseEventMatcher.LEFT_BUTTON), new DataTableResizeColumnAction(bodyDataLayer)); } }); // Row header this.rowHeaderDataLayer = rowHeaderDataLayer; ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, selectionLayer); bodyLayer.setRowHeaderLayer(rowHeaderLayer); // Corner this.cornerDataLayer = cornerDataLayer; ILayer cornerLayer = new CornerLayer(cornerDataLayer, rowHeaderLayer, columnHeaderLayer); // Attach the listeners for (ILayerListener listener : context.getListeners()) { selectionLayer.addLayerListener(listener); } setBodyLayer(bodyLayer); setColumnHeaderLayer(columnHeaderLayer); setRowHeaderLayer(rowHeaderLayer); setCornerLayer(cornerLayer); } }