/*******************************************************************************
* Copyright (c) 2012, 2016 Original authors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.grid.layer;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
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.config.DefaultRowHeaderLayerConfiguration;
import org.eclipse.nebula.widgets.nattable.painter.layer.ILayerPainter;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
import org.eclipse.nebula.widgets.nattable.style.SelectionStyleLabels;
/**
* Layer for the row header of the grid layer.
*/
public class RowHeaderLayer extends DimensionallyDependentLayer {
private final SelectionLayer[] selectionLayer;
/**
* Creates a row header layer using the default configuration and painter.
*
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* The SelectionLayer needed to respond to selection events.
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer selectionLayer) {
this(baseLayer, verticalLayerDependency, selectionLayer, true);
}
/**
* Creates a row header layer using the default configuration and painter.
*
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* 0 to multiple SelectionLayer needed to respond to selection
* events.
* @since 1.4
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer... selectionLayer) {
this(baseLayer, verticalLayerDependency, selectionLayer, true);
}
/**
* Creates a row header layer using the default painter.
*
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* The SelectionLayer needed to respond to selection events.
* @param useDefaultConfiguration
* Flag to configure whether to use the default configuration or
* not.
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer selectionLayer,
boolean useDefaultConfiguration) {
this(baseLayer, verticalLayerDependency, selectionLayer, useDefaultConfiguration, null);
}
/**
* Creates a row header layer using the default painter.
*
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* 0 to multiple SelectionLayer needed to respond to selection
* events.
* @param useDefaultConfiguration
* Flag to configure whether to use the default configuration or
* not.
* @since 1.4
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer[] selectionLayer,
boolean useDefaultConfiguration) {
this(baseLayer, verticalLayerDependency, selectionLayer, useDefaultConfiguration, null);
}
/**
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* The SelectionLayer needed to respond to selection events.
* @param useDefaultConfiguration
* Flag to configure whether to use the default configuration or
* not.
* @param layerPainter
* The painter for this layer or <code>null</code> to use the
* painter of the base layer
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer selectionLayer,
boolean useDefaultConfiguration,
ILayerPainter layerPainter) {
this(baseLayer, verticalLayerDependency,
selectionLayer != null ? new SelectionLayer[] { selectionLayer } : new SelectionLayer[] {},
useDefaultConfiguration, layerPainter);
}
/**
* @param baseLayer
* The base layer for this layer, typically a DataLayer.
* @param verticalLayerDependency
* The layer to link the vertical dimension to, typically the
* body layer.
* @param selectionLayer
* 0 to multiple SelectionLayer needed to respond to selection
* events.
* @param useDefaultConfiguration
* Flag to configure whether to use the default configuration or
* not.
* @param layerPainter
* The painter for this layer or <code>null</code> to use the
* painter of the base layer
* @since 1.4
*/
public RowHeaderLayer(
IUniqueIndexLayer baseLayer,
ILayer verticalLayerDependency,
SelectionLayer[] selectionLayer,
boolean useDefaultConfiguration,
ILayerPainter layerPainter) {
super(baseLayer, baseLayer, verticalLayerDependency);
if (selectionLayer == null) {
this.selectionLayer = new SelectionLayer[] {};
} else {
this.selectionLayer = selectionLayer;
}
this.layerPainter = layerPainter;
if (useDefaultConfiguration) {
addConfiguration(new DefaultRowHeaderLayerConfiguration());
}
}
@Override
public String getDisplayModeByPosition(int columnPosition, int rowPosition) {
String displayMode = super.getDisplayModeByPosition(columnPosition, rowPosition);
if (this.selectionLayer.length > 0) {
int selectionLayerRowPosition = LayerUtil.convertRowPosition(this, rowPosition, this.selectionLayer[0]);
for (SelectionLayer sl : this.selectionLayer) {
if (sl.isRowPositionSelected(selectionLayerRowPosition)) {
if (DisplayMode.HOVER.equals(displayMode)) {
return DisplayMode.SELECT_HOVER;
}
return DisplayMode.SELECT;
}
}
}
return displayMode;
}
@Override
public LabelStack getConfigLabelsByPosition(int columnPosition, int rowPosition) {
LabelStack labelStack = super.getConfigLabelsByPosition(columnPosition, rowPosition);
if (this.selectionLayer.length > 0) {
final int selectionLayerRowPosition = LayerUtil.convertRowPosition(this, rowPosition, this.selectionLayer[0]);
boolean fullySelected = true;
for (SelectionLayer sl : this.selectionLayer) {
if (!sl.isRowPositionFullySelected(selectionLayerRowPosition)) {
fullySelected = false;
break;
}
}
if (fullySelected) {
labelStack.addLabel(SelectionStyleLabels.ROW_FULLY_SELECTED_STYLE);
}
}
return labelStack;
}
}