/*
* 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.table;
import org.eclipse.nebula.widgets.nattable.NatTable;
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;
/**
* Adds additional rows at the end that fill up the available height.
*
* @author Fabian Prasser
*/
public class LayerRowFillLayout extends CTLayer implements IUniqueIndexLayer {
/**
*
*
* @param underlyingDataLayer
* @param config
* @param context
*/
public LayerRowFillLayout(IUniqueIndexLayer underlyingDataLayer, CTConfiguration config, CTContext context) {
super(underlyingDataLayer, config, context);
addConfiguration(new StyleConfigurationFillLayout(config));
}
@Override
public ILayerCell getCellByPosition(int columnPosition, int rowPosition) {
if (isActive() && isAdditionalRowPosition(rowPosition)) { return new LayerCell(this, columnPosition, rowPosition); }
return super.getCellByPosition(columnPosition, rowPosition);
}
@Override
public int getColumnPositionByIndex(int columnIndex) {
if (columnIndex >= 0 && columnIndex < getColumnCount()) {
return columnIndex;
} else {
return -1;
}
}
@Override
public LabelStack getConfigLabelsByPosition(int columnPosition, int rowPosition) {
if (isActive() && isAdditionalRowPosition(rowPosition)) {
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 (isActive() && isAdditionalRowPosition(rowPosition)) {
return ""; //$NON-NLS-1$
} else {
return super.getDataValueByPosition(columnPosition, rowPosition);
}
}
@Override
public int getHeight() {
return isActive() ? super.getHeight() + getGapHeight() : super.getHeight();
}
@Override
public int getPreferredHeight() {
return isActive() ? super.getPreferredHeight() + getGapHeight() : super.getPreferredHeight();
}
@Override
public int getPreferredRowCount() {
return getRowCount();
}
@Override
public int getRowCount() {
return isActive() ? super.getRowCount() + getAdditionalRowCount() : super.getRowCount();
}
@Override
public int getRowHeightByPosition(int rowPosition) {
if (isActive() && isAdditionalRowPosition(rowPosition)) { return DataLayer.DEFAULT_ROW_HEIGHT; }
return super.getRowHeightByPosition(rowPosition);
}
@Override
public int getRowIndexByPosition(int rowPosition) {
if (isActive() && isAdditionalRowPosition(rowPosition)) { return rowPosition; }
return super.getRowIndexByPosition(rowPosition);
}
@Override
public int getRowPositionByIndex(int rowIndex) {
if (rowIndex >= 0 && rowIndex < getRowCount()) {
return rowIndex;
} else {
return -1;
}
}
@Override
public int getRowPositionByY(int y) {
return LayerUtil.getRowPositionByY(this, y);
}
/**
*
*
* @return
*/
private int getAdditionalRowCount() {
return getGapHeight()/DataLayer.DEFAULT_ROW_HEIGHT;
}
/**
*
*
* @return
*/
private int getGapHeight() {
NatTable table = getContext().getTable();
if (table.isDisposed()) return 0;
return table != null ? table.getSize().y - DataLayer.DEFAULT_ROW_HEIGHT - super.getHeight() : 0;
}
/**
*
*
* @return
*/
private boolean isActive() {
boolean result = getGapHeight()>0;
getContext().setRowExpanded(result);
return result;
}
/**
*
*
* @param rowPosition
* @return
*/
private boolean isAdditionalRowPosition(int rowPosition) {
return super.getRowIndexByPosition(rowPosition)==-1;
}
}