/*****************************************************************************
* 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;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.coordinate.IndexCoordinate;
import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
import org.eclipse.nebula.widgets.nattable.layer.LayerUtil;
import org.eclipse.nebula.widgets.nattable.tooltip.NatTableContentTooltip;
import org.eclipse.swt.widgets.Event;
/**
* {@link FormulaErrorReporter} implementation that shows formula errors in a
* tooltip. Extends {@link NatTableContentTooltip} for showing the error.
*
* @since 1.4
*/
public class FormulaTooltipErrorReporter extends NatTableContentTooltip implements FormulaErrorReporter {
protected Map<IndexCoordinate, String> formulaErrors = new HashMap<IndexCoordinate, String>();
protected IUniqueIndexLayer bodyDataLayer;
/**
* Creates a {@link FormulaTooltipErrorReporter} for the given
* {@link NatTable} instance that shows formula error tooltips for
* {@link GridRegion#BODY}.
*
* @param natTable
* The {@link NatTable} to which the tooltip should be bound.
* @param bodyDataLayer
* The {@link DataLayer} of the body region, needed to perform
* index transformations.
*/
public FormulaTooltipErrorReporter(NatTable natTable, IUniqueIndexLayer bodyDataLayer) {
this(natTable, bodyDataLayer, GridRegion.BODY);
}
/**
* Creates a {@link FormulaTooltipErrorReporter} for the given
* {@link NatTable} instance that shows formula error tooltips for the given
* grid regions.
*
* <p>
* This constructor is intended to be used for subclassing, if additionally
* to formula errors, tooltips should be shown in other grid regions too.
* Note that in this case {@link FormulaTooltipErrorReporter#getText(Event)}
* needs to be overriden too.
* </p>
*
* @param natTable
* The {@link NatTable} to which the tooltip should be bound.
* @param bodyDataLayer
* The {@link DataLayer} of the body region, needed to perform
* index transformations.
* @param tooltipRegions
* The regions for which this {@link FormulaTooltipErrorReporter}
* should be activated.
*/
public FormulaTooltipErrorReporter(NatTable natTable, IUniqueIndexLayer bodyDataLayer, String... tooltipRegions) {
super(natTable, tooltipRegions);
this.bodyDataLayer = bodyDataLayer;
}
@Override
protected String getText(Event event) {
int col = this.natTable.getColumnPositionByX(event.x);
int row = this.natTable.getRowPositionByY(event.y);
int colIdx = LayerUtil.convertColumnPosition(this.natTable, col, this.bodyDataLayer);
int rowIdx = LayerUtil.convertRowPosition(this.natTable, row, this.bodyDataLayer);
IndexCoordinate coord = new IndexCoordinate(colIdx, rowIdx);
if (this.formulaErrors.containsKey(coord)) {
return this.formulaErrors.get(coord);
}
return null;
}
@Override
public void addFormulaError(int column, int row, String message) {
this.formulaErrors.put(new IndexCoordinate(column, row), message);
}
@Override
public void clearFormulaError(int column, int row) {
this.formulaErrors.remove(new IndexCoordinate(column, row));
}
@Override
public boolean hasFormulaError(int column, int row) {
return this.formulaErrors.containsKey(new IndexCoordinate(column, row));
}
@Override
public String getFormulaError(int column, int row) {
return this.formulaErrors.get(new IndexCoordinate(column, row));
}
}