/*********************************************************************
*
* Copyright (C) 2002 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the7 Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
package jxl.biff.formula;
import jxl.common.Assert;
import jxl.common.Logger;
import jxl.Cell;
import jxl.WorkbookSettings;
import jxl.biff.WorkbookMethods;
/**
* Parses the formula passed in (either as parsed strings or as a string)
* into a tree of operators and operands
*/
public class FormulaParser
{
/**
* The logger
*/
private static final Logger logger = Logger.getLogger(FormulaParser.class);
/**
* The formula parser. The object implementing this interface will either
* parse tokens or strings
*/
private Parser parser;
/**
* Constructor which creates the parse tree out of tokens
*
* @param tokens the list of parsed tokens
* @param rt the cell containing the formula
* @param es a handle to the external sheet
* @param nt a handle to the name table
* @param ws the workbook settings
* @param pc the parse context
* @exception FormulaException
*/
public FormulaParser(byte[] tokens,
Cell rt,
ExternalSheet es,
WorkbookMethods nt,
WorkbookSettings ws)
throws FormulaException
{
// A null workbook bof means that it is a writable workbook and therefore
// must be biff8
if (es.getWorkbookBof() != null &&
!es.getWorkbookBof().isBiff8())
{
throw new FormulaException(FormulaException.BIFF8_SUPPORTED);
}
Assert.verify(nt != null);
parser = new TokenFormulaParser(tokens, rt, es, nt, ws,
ParseContext.DEFAULT);
}
/**
* Constructor which creates the parse tree out of tokens
*
* @param tokens the list of parsed tokens
* @param rt the cell containing the formula
* @param es a handle to the external sheet
* @param nt a handle to the name table
* @param ws the workbook settings
* @param pc the parse context
* @exception FormulaException
*/
public FormulaParser(byte[] tokens,
Cell rt,
ExternalSheet es,
WorkbookMethods nt,
WorkbookSettings ws,
ParseContext pc)
throws FormulaException
{
// A null workbook bof means that it is a writable workbook and therefore
// must be biff8
if (es.getWorkbookBof() != null &&
!es.getWorkbookBof().isBiff8())
{
throw new FormulaException(FormulaException.BIFF8_SUPPORTED);
}
Assert.verify(nt != null);
parser = new TokenFormulaParser(tokens, rt, es, nt, ws, pc);
}
/**
* Constructor which creates the parse tree out of the string
*
* @param form the formula string
* @param es the external sheet handle
* @param nt the name table
* @param ws the workbook settings
*/
public FormulaParser(String form,
ExternalSheet es,
WorkbookMethods nt,
WorkbookSettings ws)
{
parser = new StringFormulaParser(form, es, nt, ws,
ParseContext.DEFAULT);
}
/**
* Constructor which creates the parse tree out of the string
*
* @param form the formula string
* @param es the external sheet handle
* @param nt the name table
* @param ws the workbook settings
* @param pc the context of the parse
*/
public FormulaParser(String form,
ExternalSheet es,
WorkbookMethods nt,
WorkbookSettings ws,
ParseContext pc)
{
parser = new StringFormulaParser(form, es, nt, ws, pc);
}
/**
* Adjusts all the relative cell references in this formula by the
* amount specified. Used when copying formulas
*
* @param colAdjust the amount to add on to each relative cell reference
* @param rowAdjust the amount to add on to each relative row reference
*/
public void adjustRelativeCellReferences(int colAdjust, int rowAdjust)
{
parser.adjustRelativeCellReferences(colAdjust, rowAdjust);
}
/**
* Parses the formula into a parse tree
*
* @exception FormulaException
*/
public void parse() throws FormulaException
{
parser.parse();
}
/**
* Gets the formula as a string
*
* @return the formula as a string
* @exception FormulaException
*/
public String getFormula() throws FormulaException
{
return parser.getFormula();
}
/**
* Gets the bytes for the formula. This takes into account any
* token mapping necessary because of shared formulas
*
* @return the bytes in RPN
*/
public byte[] getBytes()
{
return parser.getBytes();
}
/**
* Called when a column is inserted on the specified sheet. Tells
* the formula parser to update all of its cell references beyond this
* column
*
* @param sheetIndex the sheet on which the column was inserted
* @param col the column number which was inserted
* @param currentSheet TRUE if this formula is on the sheet in which the
* column was inserted, FALSE otherwise
*/
public void columnInserted(int sheetIndex, int col, boolean currentSheet)
{
parser.columnInserted(sheetIndex, col, currentSheet);
}
/**
* Called when a column is inserted on the specified sheet. Tells
* the formula parser to update all of its cell references beyond this
* column
*
* @param sheetIndex the sheet on which the column was inserted
* @param col the column number which was removed
* @param currentSheet TRUE if this formula is on the sheet in which the
* column was inserted, FALSE otherwise
*/
public void columnRemoved(int sheetIndex, int col, boolean currentSheet)
{
parser.columnRemoved(sheetIndex, col, currentSheet);
}
/**
* Called when a column is inserted on the specified sheet. Tells
* the formula parser to update all of its cell references beyond this
* column
*
* @param sheetIndex the sheet on which the column was inserted
* @param row the row number which was inserted
* @param currentSheet TRUE if this formula is on the sheet in which the
* column was inserted, FALSE otherwise
*/
public void rowInserted(int sheetIndex, int row, boolean currentSheet)
{
parser.rowInserted(sheetIndex, row, currentSheet);
}
/**
* Called when a column is inserted on the specified sheet. Tells
* the formula parser to update all of its cell references beyond this
* column
*
* @param sheetIndex the sheet on which the column was inserted
* @param row the row number which was removed
* @param currentSheet TRUE if this formula is on the sheet in which the
* column was inserted, FALSE otherwise
*/
public void rowRemoved(int sheetIndex, int row, boolean currentSheet)
{
parser.rowRemoved(sheetIndex, row, currentSheet);
}
/**
* If this formula was on an imported sheet, check that
* cell references to another sheet are warned appropriately
*
* @return TRUE if the formula is valid import, FALSE otherwise
*/
public boolean handleImportedCellReferences()
{
return parser.handleImportedCellReferences();
}
}
|