/*******************************************************************************
* Copyright (c) 2014 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.selection;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.coordinate.PositionCoordinate;
import org.eclipse.nebula.widgets.nattable.edit.command.EditUtils;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
/**
* Wrapper for basic {@link ITraversalStrategy} implementations that add target
* checks. Requests for traversal scope, cycle and step count will be delegated
* to the wrapped {@link ITraversalStrategy}.
* {@link #isValidTarget(ILayerCell, ILayerCell)} will check whether the
* {@link ILayerCell} from which the movement should be performed is in edit
* mode or not. If it is in edit mode, validations will be performed to check
* whether the target cell is also editable.
*/
public class EditTraversalStrategy implements ITraversalStrategy {
/**
* The {@link ITraversalStrategy} that is wrapped by this
* {@link EditTraversalStrategy}.
*/
protected ITraversalStrategy baseStrategy;
/**
* The current NatTable instance this strategy is connected to. Needed to be
* able to perform checks related to NatTable states and configurations.
*/
protected NatTable natTable;
/**
*
* @param baseStrategy
* The {@link ITraversalStrategy} that shoud be wrapped by this
* {@link EditTraversalStrategy}.
* @param natTable
* The NatTable instance this strategy is connected to. Needed to
* be able to perform checks related to NatTable states and
* configurations.
*/
public EditTraversalStrategy(ITraversalStrategy baseStrategy, NatTable natTable) {
this.baseStrategy = baseStrategy;
this.natTable = natTable;
}
@Override
public TraversalScope getTraversalScope() {
return this.baseStrategy.getTraversalScope();
}
@Override
public boolean isCycle() {
return this.baseStrategy.isCycle();
}
@Override
public int getStepCount() {
return this.baseStrategy.getStepCount();
}
@Override
public boolean isValidTarget(ILayerCell from, ILayerCell to) {
// check if NatTable is currently in edit mode
if (this.natTable.getActiveCellEditor() != null) {
// if there is an open editor, we suppose that the movement should
// be performed from there, as the focus is typically in the editor
return EditUtils.isCellEditable(
to.getLayer(),
this.natTable.getConfigRegistry(),
new PositionCoordinate(to.getLayer(), to.getColumnPosition(), to.getRowPosition()));
}
return true;
}
}