/* * 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.deidentifier.arx.gui.view.impl.common.table.StyleConfigurationFillLayout; import org.eclipse.nebula.widgets.nattable.NatTable; import org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform; import org.eclipse.nebula.widgets.nattable.layer.DataLayer; import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer; import org.eclipse.nebula.widgets.nattable.layer.LabelStack; import org.eclipse.nebula.widgets.nattable.layer.LayerUtil; import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell; import org.eclipse.nebula.widgets.nattable.layer.cell.LayerCell; import org.eclipse.nebula.widgets.nattable.layer.event.ILayerEvent; import org.eclipse.swt.widgets.Control; /** * Adds an additional column to fill up the space. * * @author Fabian Prasser */ public class DataTableFillLayout extends AbstractLayerTransform implements IUniqueIndexLayer { /** TODO */ private final DataTableContext context; /** TODO */ private final DataTableBodyLayerStack bodyLayerStack; /** * * * @param parent * @param underlyingDataLayer * @param context * @param bodyLayerStack */ public DataTableFillLayout(Control parent, IUniqueIndexLayer underlyingDataLayer, DataTableContext context, DataTableBodyLayerStack bodyLayerStack) { super(underlyingDataLayer); this.context = context; this.addConfiguration(new DataTableFillLayoutStyle(parent)); this.bodyLayerStack = bodyLayerStack; } @Override public ILayerCell getCellByPosition(int columnPosition, int rowPosition) { if (isAdditionalColumnActive() && isAdditionalColumn(columnPosition)) { return new LayerCell(this, columnPosition, rowPosition); } return super.getCellByPosition(columnPosition, rowPosition); } @Override public int getColumnCount() { return isAdditionalColumnActive() ? super.getColumnCount() + 1 : super.getColumnCount(); } @Override public int getColumnIndexByPosition(int columnPosition) { if (isAdditionalColumnActive() && isAdditionalColumn(columnPosition)) { return columnPosition; } return super.getColumnIndexByPosition(columnPosition); } @Override public int getColumnPositionByIndex(int columnIndex) { if (columnIndex >= 0 && columnIndex < getColumnCount()) { return columnIndex; } else { return -1; } } @Override public int getColumnPositionByX(int x) { return LayerUtil.getColumnPositionByX(this, x); } @Override public int getColumnWidthByPosition(int columnPosition) { if (isAdditionalColumnActive() && isAdditionalColumn(columnPosition)) { return getGapWidth(); } else { return super.getColumnWidthByPosition(columnPosition); } } @Override public LabelStack getConfigLabelsByPosition(int columnPosition, int rowPosition) { if (isAdditionalColumnActive() && isAdditionalColumn(columnPosition)) { return new LabelStack(StyleConfigurationFillLayout.DEFAULT_FILL_LAYOUT_CELL_CONFIG_LABEL); } else { return super.getConfigLabelsByPosition(columnPosition, rowPosition); } } /** * NOTE: Since this is a {@link IUniqueIndexLayer} sitting close to the {@link DataLayer}, columnPosition == columnIndex. * * @param columnPosition * @param rowPosition * @return */ @Override public Object getDataValueByPosition(final int columnPosition, final int rowPosition) { if (isAdditionalColumnActive() && isAdditionalColumn(columnPosition)) { return ""; //$NON-NLS-1$ } else { return super.getDataValueByPosition(columnPosition, rowPosition); } } @Override public int getPreferredColumnCount() { return getColumnCount(); } @Override public int getPreferredWidth() { return isAdditionalColumnActive() ? super.getPreferredWidth()+ getColumnWidthByPosition(getAdditionalColumnPosition()) : super.getPreferredWidth(); } @Override public int getRowPositionByIndex(int rowIndex) { if (rowIndex >= 0 && rowIndex < getRowCount()) { return rowIndex; } else { return -1; } } @Override public int getStartXOfColumnPosition(int columnPosition) { return super.getStartXOfColumnPosition(columnPosition); } @Override public int getWidth() { return isAdditionalColumnActive() ? super.getWidth() + getColumnWidthByPosition(getAdditionalColumnPosition()) : super.getWidth(); } @Override public void handleLayerEvent(ILayerEvent event) { if (context.getTable() != null && !context.getTable().isDisposed()) { super.handleLayerEvent(event); } } /** * * * @return */ private int getAdditionalColumnPosition() { return getColumnCount() - 1; } /** * * * @return */ private int getGapWidth() { NatTable table = context.getTable(); if (table == null || table.isDisposed()) return 0; int offset = this.bodyLayerStack != null ? this.bodyLayerStack.getRowHeaderLayer() != null ? this.bodyLayerStack.getRowHeaderLayer().getWidth() : 0 : 0; return table != null ? table.getSize().x - super.getWidth() - offset: 0; } /** * * * @param columnPosition * @return */ private boolean isAdditionalColumn(int columnPosition) { return columnPosition == getAdditionalColumnPosition(); } /** * * * @return */ private boolean isAdditionalColumnActive() { return getGapWidth()>0; } }