blob: 0ec3dd35e4fd4c8701cdaa832ee75c8fcfb50954 [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.group.action;
import org.eclipse.nebula.widgets.nattable.group.ColumnGroupModel;
import org.eclipse.nebula.widgets.nattable.group.ColumnGroupUtils;
import org.eclipse.nebula.widgets.nattable.layer.ILayer;
import org.eclipse.nebula.widgets.nattable.reorder.action.ColumnReorderDragMode;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
/**
* Extends the regular column drag functionality to work with Column groups. It
* does the following checks:
* <ol>
* <li>Checks that the destination is not part of a Unbreakable column
* group</li>
* <li>Checks if the destination is between two adjoining column groups</li>
* </ol>
*/
public class ColumnHeaderReorderDragMode extends ColumnReorderDragMode {
private final ColumnGroupModel model;
public ColumnHeaderReorderDragMode(ColumnGroupModel model) {
this.model = model;
}
@Override
public boolean isValidTargetColumnPosition(ILayer natLayer,
int fromGridColumnPosition, int toGridColumnPosition) {
if (this.currentEvent != null) {
// if this method was triggered by a mouse event, we determine the
// to column position by the event
// if there is no current mouse event referenced it means the
// reorder is triggered programmatically
toGridColumnPosition = natLayer
.getColumnPositionByX(this.currentEvent.x);
}
int toColumnIndex = natLayer
.getColumnIndexByPosition(toGridColumnPosition);
int fromColumnIndex = natLayer
.getColumnIndexByPosition(fromGridColumnPosition);
// Allow moving within the unbreakable group
if (this.model.isPartOfAnUnbreakableGroup(fromColumnIndex)) {
return ColumnGroupUtils.isInTheSameGroup(fromColumnIndex,
toColumnIndex, this.model);
}
boolean betweenTwoGroups = false;
if (this.currentEvent != null) {
int minX = this.currentEvent.x
- GUIHelper.DEFAULT_RESIZE_HANDLE_SIZE;
int maxX = this.currentEvent.x
+ GUIHelper.DEFAULT_RESIZE_HANDLE_SIZE;
betweenTwoGroups = ColumnGroupUtils.isBetweenTwoGroups(natLayer,
minX, maxX, this.model);
}
return (!this.model.isPartOfAnUnbreakableGroup(toColumnIndex))
|| betweenTwoGroups;
}
}