/*****************************************************************************
* Copyright (c) 2015 CEA LIST.
*
* 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.formula.action;
import java.math.BigDecimal;
import java.util.Date;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.copy.InternalCellClipboard;
import org.eclipse.nebula.widgets.nattable.fillhandle.action.FillHandleDragMode;
import org.eclipse.nebula.widgets.nattable.formula.FormulaDataProvider;
import org.eclipse.nebula.widgets.nattable.formula.command.DisableFormulaEvaluationCommand;
import org.eclipse.nebula.widgets.nattable.formula.command.EnableFormulaEvaluationCommand;
import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
/**
* Specialized {@link FillHandleDragMode} that also opens the dialog in case of
* String values that can be converted to {@link BigDecimal} values using the
* {@link FormulaDataProvider}.
*
* @since 1.4
*/
public class FormulaFillHandleDragMode extends FillHandleDragMode {
protected FormulaDataProvider dataProvider;
/**
*
* @param selectionLayer
* The {@link SelectionLayer} needed to determine the fill handle
* region and perform the update command.
* @param clipboard
* The internal clipboard that carries the cells for the copy
* & paste operation triggered by using the fill handle.
* @param dataProvider
* The {@link FormulaDataProvider} that is needed to determine
* whether a value is a number value.
*/
public FormulaFillHandleDragMode(SelectionLayer selectionLayer, InternalCellClipboard clipboard,
FormulaDataProvider dataProvider) {
super(selectionLayer, clipboard);
this.dataProvider = dataProvider;
}
@Override
protected boolean showMenu(final NatTable natTable) {
natTable.doCommand(new DisableFormulaEvaluationCommand());
try {
Class<?> type = null;
for (ILayerCell[] cells : this.clipboard.getCopiedCells()) {
for (ILayerCell cell : cells) {
if (cell.getDataValue() == null) {
return false;
} else {
if (type == null) {
type = cell.getDataValue().getClass();
if (!Number.class.isAssignableFrom(type)
&& !Date.class.isAssignableFrom(type)
&& (String.class.isAssignableFrom(type)
&& !this.dataProvider.getFormulaParser().isNumber((String) cell.getDataValue()))) {
return false;
}
} else if (type != cell.getDataValue().getClass()) {
return false;
}
}
}
}
} finally {
natTable.doCommand(new EnableFormulaEvaluationCommand());
}
return true;
}
}