/*******************************************************************************
* Copyright (c) 2012, 2013 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.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.AutoResizeRowsCommand;
import org.eclipse.nebula.widgets.nattable.resize.command.InitializeAutoResizeRowsCommand;
import org.eclipse.nebula.widgets.nattable.resize.command.MultiRowResizeCommand;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
import org.eclipse.nebula.widgets.nattable.util.ObjectUtils;
/**
* This command is triggered by the {@link InitializeAutoResizeRowsCommand}. 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 AutoResizeRowCommandHandler implements
ILayerCommandHandler<AutoResizeRowsCommand> {
/**
* 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 row 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 row positions. Needs
* to be a layer at a lower position in the layer composition.
* Typically the body layer stack.
*/
public AutoResizeRowCommandHandler(ILayer commandLayer, ILayer positionLayer) {
this.commandLayer = commandLayer;
this.positionLayer = positionLayer;
}
/**
*
* @param gridLayer
* The {@link GridLayer} to which this command handler should be
* registered
*/
public AutoResizeRowCommandHandler(GridLayer gridLayer) {
this.commandLayer = gridLayer;
this.positionLayer = gridLayer.getBodyLayer();
}
@Override
public Class<AutoResizeRowsCommand> getCommandClass() {
return AutoResizeRowsCommand.class;
}
@Override
public boolean doCommand(ILayer targetLayer, AutoResizeRowsCommand command) {
// Need to resize selected rows even if they are outside the viewport
targetLayer.doCommand(new TurnViewportOffCommand());
int[] rowPositions = ObjectUtils.asIntArray(command.getRowPositions());
int[] gridRowPositions = convertFromPositionToCommandLayer(rowPositions);
int[] gridRowHeights = MaxCellBoundsHelper.getPreferredRowHeights(
command.getConfigRegistry(), command.getGCFactory(),
this.commandLayer, gridRowPositions);
this.commandLayer.doCommand(new MultiRowResizeCommand(this.commandLayer,
gridRowPositions, gridRowHeights));
targetLayer.doCommand(new TurnViewportOnCommand());
return true;
}
/**
* Translates the row positions the layer stack upwards as the resulting
* {@link MultiRowResizeCommand} will be fired on the command layer which is
* on top of the position layer.
*
* @param rowPositions
* The row positions to convert to the positions in the command
* layer
* @return The translated row positions for the local command layer.
*/
protected int[] convertFromPositionToCommandLayer(int[] rowPositions) {
int[] commandLayerRowPositions = new int[rowPositions.length];
for (int i = 0; i < rowPositions.length; i++) {
commandLayerRowPositions[i] = this.commandLayer
.underlyingToLocalRowPosition(this.positionLayer,
rowPositions[i]);
}
return commandLayerRowPositions;
}
}