blob: 8727153c3301a42d840c2fb302c382a625807394 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Dirk Fauth.
* 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:
* Dirk Fauth <dirk.fauth@googlemail.com> - initial API and implementation
******************************************************************************/
package org.eclipse.nebula.widgets.nattable.group.performance.command;
import java.util.List;
import org.eclipse.nebula.widgets.nattable.group.performance.GroupModel.Group;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
import org.eclipse.nebula.widgets.nattable.reorder.command.MultiRowReorderCommand;
/**
* Specialization of the {@link MultiRowReorderCommand} that ensures on
* conversion that the toPosition is between two groups.
*
* @since 1.6
*/
public class GroupMultiRowReorderCommand extends MultiRowReorderCommand {
private Group groupToTop;
private Group groupToBottom;
/**
*
* @param layer
* The layer to which the row positions match.
* @param fromRowPositions
* The row positions to reorder.
* @param toRowPosition
* The target row position to reorder to.
* @since 2.0
*/
public GroupMultiRowReorderCommand(ILayer layer, List<Integer> fromRowPositions, int toRowPosition) {
this(layer,
fromRowPositions,
toRowPosition < layer.getRowCount() ? toRowPosition : toRowPosition - 1,
toRowPosition < layer.getRowCount());
}
/**
*
* @param layer
* The layer to which the row positions match.
* @param fromRowPositions
* The row positions to reorder.
* @param toRowPosition
* The target row position to reorder to.
* @param reorderToTopEdge
* <code>true</code> if the reorder operation should be done on
* the top edge of the toRowPosition, <code>false</code> if it
* should be reordered to the bottom edge.
* @since 2.0
*/
public GroupMultiRowReorderCommand(
ILayer layer,
List<Integer> fromRowPositions,
int toRowPosition,
boolean reorderToTopEdge) {
super(layer, fromRowPositions, toRowPosition, reorderToTopEdge);
}
/**
* Clone constructor.
*
* @param command
* The command to clone.
*/
protected GroupMultiRowReorderCommand(GroupMultiRowReorderCommand command) {
super(command);
this.groupToTop = command.groupToTop;
this.groupToBottom = command.groupToBottom;
}
@Override
public boolean convertToTargetLayer(ILayer targetLayer) {
if (super.convertToTargetLayer(targetLayer)) {
// check if we need to update the toPosition which could be
// necessary in case rows at the group beginning are hidden
if (this.groupToBottom != null) {
if (isReorderToTopEdge() && targetLayer instanceof IUniqueIndexLayer) {
int groupStartPosition = ((IUniqueIndexLayer) targetLayer).getRowPositionByIndex(this.groupToBottom.getStartIndex());
if (groupStartPosition >= 0 && groupStartPosition < getToRowPosition()) {
this.toRowPositionCoordinate.rowPosition = groupStartPosition;
}
}
} else if (this.groupToTop != null) {
// check if there are positions for the group members that would
// be more to the right. this could happen e.g. if rows at
// the group end are hidden
if (!isReorderToTopEdge() && targetLayer instanceof IUniqueIndexLayer) {
int groupEndPosition = this.groupToTop.getGroupEndPosition((IUniqueIndexLayer) targetLayer);
if (groupEndPosition >= 0 && groupEndPosition > getToRowPosition()) {
this.toRowPositionCoordinate.rowPosition = groupEndPosition;
}
}
}
return true;
}
return false;
}
/**
*
* @param groupToTop
* The {@link Group} that is on top of the toRowPosition. Needed
* to calculate the correct position to the bottom edge of a
* group in case of hidden rows.
* @since 2.0
*/
public void setGroupToTop(Group groupToTop) {
this.groupToTop = groupToTop;
}
/**
*
* @param groupToBottom
* The {@link Group} that is at the toRowPosition. Needed to
* calculate the correct position to the top edge of a group in
* case of hidden rows.
* @since 2.0
*/
public void setGroupToBottom(Group groupToBottom) {
this.groupToBottom = groupToBottom;
}
@Override
public GroupMultiRowReorderCommand cloneCommand() {
return new GroupMultiRowReorderCommand(this);
}
}