blob: bc470d89a795b5bda151432176ae3f2a47f4d604 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2020 Original authors and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Original authors and others - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.grid.command;
import org.eclipse.nebula.widgets.nattable.command.ILayerCommandHandler;
import org.eclipse.nebula.widgets.nattable.grid.layer.GridLayer;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.print.command.TurnViewportOffCommand;
import org.eclipse.nebula.widgets.nattable.print.command.TurnViewportOnCommand;
import org.eclipse.nebula.widgets.nattable.resize.MaxCellBoundsHelper;
import org.eclipse.nebula.widgets.nattable.resize.command.AutoResizeColumnsCommand;
import org.eclipse.nebula.widgets.nattable.resize.command.InitializeAutoResizeColumnsCommand;
import org.eclipse.nebula.widgets.nattable.resize.command.MultiColumnResizeCommand;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
/**
* This command is triggered by the {@link InitializeAutoResizeColumnsCommand}.
* The selected columns picked from the {@link SelectionLayer} by the above
* command. This handler runs as a second step.
* <p>
* This handler assumes that the target layer is the NatTable itself on calling
* doCommand()
*/
public class AutoResizeColumnCommandHandler implements ILayerCommandHandler<AutoResizeColumnsCommand> {
/**
* The layer on which the command should be fired. Usually this will be the
* GridLayer
*/
protected final ILayer commandLayer;
/**
* The layer to use for calculation of the column positions. Needs to be a
* layer at a lower position in the layer composition. Typically the body
* layer stack.
*/
protected final ILayer positionLayer;
/**
*
* @param commandLayer
* The layer on which the command should be fired. Usually this
* will be the GridLayer.
* @param positionLayer
* The layer to use for calculation of the column positions.
* Needs to be a layer at a lower position in the layer
* composition. Typically the body layer stack.
*/
public AutoResizeColumnCommandHandler(ILayer commandLayer, ILayer positionLayer) {
this.commandLayer = commandLayer;
this.positionLayer = positionLayer;
}
/**
*
* @param gridLayer
* The {@link GridLayer} to which this command handler should be
* registered
*/
public AutoResizeColumnCommandHandler(GridLayer gridLayer) {
this.commandLayer = gridLayer;
this.positionLayer = gridLayer.getBodyLayer();
}
@Override
public Class<AutoResizeColumnsCommand> getCommandClass() {
return AutoResizeColumnsCommand.class;
}
@Override
public boolean doCommand(ILayer targetLayer, AutoResizeColumnsCommand command) {
// Need to resize selected columns even if they are outside the viewport
// As this command is triggered by the InitialAutoResizeCommand we know
// that the targetLayer is the
// NatTable itself
targetLayer.doCommand(new TurnViewportOffCommand());
int[] columnPositions = command.getColumnPositionsArray();
int[] gridColumnPositions =
command.doPositionTransformation() ? convertFromPositionToCommandLayer(columnPositions) : columnPositions;
int[] gridColumnWidths = MaxCellBoundsHelper.getPreferredColumnWidths(
command.getConfigRegistry(),
command.getGCFactory(),
this.commandLayer,
gridColumnPositions);
// only perform further actions if the widths could be calculated
// could fail and return null for example if the GCFactory fails
if (gridColumnWidths != null && gridColumnWidths.length > 0) {
this.commandLayer.doCommand(
new MultiColumnResizeCommand(this.commandLayer, gridColumnPositions, gridColumnWidths, true));
targetLayer.doCommand(new TurnViewportOnCommand());
}
return true;
}
/**
* Translates the column positions the layer stack upwards as the resulting
* {@link MultiColumnResizeCommand} will be fired on the command layer which
* is on top of the position layer.
*
* @param columnPositions
* The column positions to convert to the positions in the
* command layer
* @return The translated column positions for the local command layer.
*/
protected int[] convertFromPositionToCommandLayer(int[] columnPositions) {
int[] commandLayerColumnPositions = new int[columnPositions.length];
for (int i = 0; i < columnPositions.length; i++) {
commandLayerColumnPositions[i] =
this.commandLayer.underlyingToLocalColumnPosition(this.positionLayer, columnPositions[i]);
}
return commandLayerColumnPositions;
}
}