poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r696961 [2/2] - in /poi/branches/ooxml: ./ src/java/org/apache/poi/hssf/dev/ src/java/org/apache/poi/hssf/eventusermodel/ src/java/org/apache/poi/hssf/extractor/ src/java/org/apache/poi/hssf/model/ src/java/org/apache/poi/hssf/record/ src/j...
Date Fri, 19 Sep 2008 07:32:36 GMT
Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java Fri Sep 19 00:32:34 2008
@@ -17,43 +17,6 @@
 
 package org.apache.poi.ss.usermodel;
 
-import java.util.Iterator;
-import java.util.Stack;
-
-import org.apache.poi.hssf.model.FormulaParser;
-import org.apache.poi.hssf.record.NameRecord;
-import org.apache.poi.hssf.record.formula.Area3DPtg;
-import org.apache.poi.hssf.record.formula.AreaPtg;
-import org.apache.poi.hssf.record.formula.BoolPtg;
-import org.apache.poi.hssf.record.formula.ControlPtg;
-import org.apache.poi.hssf.record.formula.ErrPtg;
-import org.apache.poi.hssf.record.formula.IntPtg;
-import org.apache.poi.hssf.record.formula.MemErrPtg;
-import org.apache.poi.hssf.record.formula.MissingArgPtg;
-import org.apache.poi.hssf.record.formula.NamePtg;
-import org.apache.poi.hssf.record.formula.NameXPtg;
-import org.apache.poi.hssf.record.formula.NumberPtg;
-import org.apache.poi.hssf.record.formula.OperationPtg;
-import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.Ref3DPtg;
-import org.apache.poi.hssf.record.formula.RefPtg;
-import org.apache.poi.hssf.record.formula.StringPtg;
-import org.apache.poi.hssf.record.formula.UnionPtg;
-import org.apache.poi.hssf.record.formula.UnknownPtg;
-import org.apache.poi.hssf.record.formula.eval.AreaEval;
-import org.apache.poi.hssf.record.formula.eval.BlankEval;
-import org.apache.poi.hssf.record.formula.eval.BoolEval;
-import org.apache.poi.hssf.record.formula.eval.ErrorEval;
-import org.apache.poi.hssf.record.formula.eval.Eval;
-import org.apache.poi.hssf.record.formula.eval.FunctionEval;
-import org.apache.poi.hssf.record.formula.eval.NameEval;
-import org.apache.poi.hssf.record.formula.eval.NameXEval;
-import org.apache.poi.hssf.record.formula.eval.NumberEval;
-import org.apache.poi.hssf.record.formula.eval.OperationEval;
-import org.apache.poi.hssf.record.formula.eval.RefEval;
-import org.apache.poi.hssf.record.formula.eval.StringEval;
-import org.apache.poi.hssf.record.formula.eval.ValueEval;
-import org.apache.poi.hssf.util.CellReference;
 
 /**
  * Evaluates formula cells.<p/>
@@ -65,85 +28,15 @@
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
  * @author Josh Micich
  */
-public class FormulaEvaluator {
-
-    /**
-     * used to track the number of evaluations
-     */
-    private static final class Counter {
-        public int value;
-        public int depth;
-        public Counter() {
-            value = 0;
-        }
-    }
-
-    protected final Workbook _workbook;
-    private final EvaluationCache _cache;
-
-    private Counter _evaluationCounter;
-
-    /**
-     * @deprecated (Sep 2008) Sheet parameter is ignored
-     */
-    public FormulaEvaluator(Sheet sheet, Workbook workbook) {
-        this(workbook);
-        if (false) {
-            sheet.toString(); // suppress unused parameter compiler warning
-        }
-    }
-    public FormulaEvaluator(Workbook workbook) {
-        this(workbook, new EvaluationCache(), new Counter());
-    }
-
-    private FormulaEvaluator(Workbook workbook, EvaluationCache cache, Counter evaluationCounter) {
-        _workbook = workbook;
-        _cache = cache;
-        _evaluationCounter = evaluationCounter;
-    }
-
-    /**
-     * for debug use. Used in toString methods
-     */
-    public String getSheetName(Sheet sheet) {
-        return _workbook.getSheetName(_workbook.getSheetIndex(sheet));
-    }
-    /**
-     * for debug/test use
-     */
-    public int getEvaluationCount() {
-        return _evaluationCounter.value;
-    }
-
-    private static boolean isDebugLogEnabled() {
-        return false;
-    }
-    private static void logDebug(String s) {
-        if (isDebugLogEnabled()) {
-            System.out.println(s);
-        }
-    }
-
-    /**
-     * Does nothing
-     * @deprecated (Aug 2008) - not needed, since the current row can be derived from the cell
-     */
-    public void setCurrentRow(Row row) {
-        // do nothing
-        if (false) {
-            row.getClass(); // suppress unused parameter compiler warning
-        }
-    }
+public interface FormulaEvaluator {
 
     /**
      * Should be called whenever there are changes to input cells in the evaluated workbook.
      * Failure to call this method after changing cell values will cause incorrect behaviour
      * of the evaluate~ methods of this class
      */
-    public void clearCache() {
-        _cache.clear();
-    }
-
+    void clearAllCachedResultValues();
+    void clearCachedResultValue(Sheet sheet, int rowIndex, int columnIndex);
     /**
      * If cell contains a formula, the formula is evaluated and returned,
      * else the CellValue simply copies the appropriate cell value from
@@ -152,25 +45,7 @@
      * original cell.
      * @param cell
      */
-    public CellValue evaluate(Cell cell) {
-        if (cell == null) {
-            return null;
-        }
-        
-        switch (cell.getCellType()) {
-            case Cell.CELL_TYPE_BOOLEAN:
-                return CellValue.valueOf(cell.getBooleanCellValue());
-            case Cell.CELL_TYPE_ERROR:
-                return CellValue.getError(cell.getErrorCellValue());
-            case Cell.CELL_TYPE_FORMULA:
-                return evaluateFormulaCellValue(cell);
-            case Cell.CELL_TYPE_NUMERIC:
-                return new CellValue(cell.getNumericCellValue(), _workbook.getCreationHelper());
-            case Cell.CELL_TYPE_STRING:
-                return new CellValue(cell.getRichStringCellValue().getString(), _workbook.getCreationHelper());
-        }
-        throw new IllegalStateException("Bad cell type (" + cell.getCellType() + ")");
-    }
+    CellValue evaluate(Cell cell);
 
 
     /**
@@ -191,15 +66,7 @@
      * @param cell The cell to evaluate
      * @return The type of the formula result (the cell's type remains as Cell.CELL_TYPE_FORMULA however)
      */
-    public int evaluateFormulaCell(Cell cell) {
-        if (cell == null || cell.getCellType() != Cell.CELL_TYPE_FORMULA) {
-            return -1;
-        }
-        CellValue cv = evaluateFormulaCellValue(cell);
-        // cell remains a formula cell, but the cached value is changed
-        setCellValue(cell, cv);
-        return cv.getCellType();
-    }
+    int evaluateFormulaCell(Cell cell);
 
     /**
      * If cell contains formula, it evaluates the formula, and
@@ -217,462 +84,5 @@
      *  value computed for you, use {@link #evaluateFormulaCell(Cell)}
      * @param cell
      */
-    public Cell evaluateInCell(Cell cell) {
-        if (cell == null) {
-            return null;
-        }
-        if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
-            CellValue cv = evaluateFormulaCellValue(cell);
-            setCellType(cell, cv); // cell will no longer be a formula cell
-            setCellValue(cell, cv);
-        }
-        return cell;
-    }
-    private static void setCellType(Cell cell, CellValue cv) {
-        int cellType = cv.getCellType();
-        switch (cellType) {
-            case Cell.CELL_TYPE_BOOLEAN:
-            case Cell.CELL_TYPE_ERROR:
-            case Cell.CELL_TYPE_NUMERIC:
-            case Cell.CELL_TYPE_STRING:
-                cell.setCellType(cellType);
-                return;
-            case Cell.CELL_TYPE_BLANK:
-                // never happens - blanks eventually get translated to zero
-            case Cell.CELL_TYPE_FORMULA:
-                // this will never happen, we have already evaluated the formula
-        }
-        throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
-    }
-
-    private static void setCellValue(Cell cell, CellValue cv) {
-        int cellType = cv.getCellType();
-        switch (cellType) {
-            case Cell.CELL_TYPE_BOOLEAN:
-                cell.setCellValue(cv.getBooleanValue());
-                break;
-            case Cell.CELL_TYPE_ERROR:
-                cell.setCellErrorValue(cv.getErrorValue());
-                break;
-            case Cell.CELL_TYPE_NUMERIC:
-                cell.setCellValue(cv.getNumberValue());
-                break;
-            case Cell.CELL_TYPE_STRING:
-                cell.setCellValue(cv.getRichTextStringValue());
-                break;
-            case Cell.CELL_TYPE_BLANK:
-                // never happens - blanks eventually get translated to zero
-            case Cell.CELL_TYPE_FORMULA:
-                // this will never happen, we have already evaluated the formula
-            default:
-                throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
-        }
-    }
-
-    /**
-     * Loops over all cells in all sheets of the supplied
-     *  workbook.
-     * For cells that contain formulas, their formulas are
-     *  evaluated, and the results are saved. These cells
-     *  remain as formula cells.
-     * For cells that do not contain formulas, no changes
-     *  are made.
-     * This is a helpful wrapper around looping over all
-     *  cells, and calling evaluateFormulaCell on each one.
-     */
-    public static void evaluateAllFormulaCells(Workbook wb) {
-        FormulaEvaluator evaluator = new FormulaEvaluator(wb);
-        for(int i=0; i<wb.getNumberOfSheets(); i++) {
-            Sheet sheet = wb.getSheetAt(i);
-
-            for (Iterator rit = sheet.rowIterator(); rit.hasNext();) {
-                Row r = (Row)rit.next();
-
-                for (Iterator cit = r.cellIterator(); cit.hasNext();) {
-                    Cell c = (Cell)cit.next();
-                    if (c.getCellType() == Cell.CELL_TYPE_FORMULA)
-                        evaluator.evaluateFormulaCell(c);
-                }
-            }
-        }
-    }
-
-    /**
-     * Returns a CellValue wrapper around the supplied ValueEval instance.
-     * @param eval
-     */
-    private CellValue evaluateFormulaCellValue(Cell cell) {
-        ValueEval eval = internalEvaluate(cell);
-        if (eval instanceof NumberEval) {
-            NumberEval ne = (NumberEval) eval;
-            return new CellValue(ne.getNumberValue(), _workbook.getCreationHelper());
-        }
-        if (eval instanceof BoolEval) {
-            BoolEval be = (BoolEval) eval;
-            return CellValue.valueOf(be.getBooleanValue());
-        }
-        if (eval instanceof StringEval) {
-            StringEval ne = (StringEval) eval;
-            return new CellValue(ne.getStringValue(), _workbook.getCreationHelper());
-        }
-        if (eval instanceof ErrorEval) {
-            return CellValue.getError(((ErrorEval)eval).getErrorCode());
-        }
-        throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")");
-    }
-
-    /**
-     * Dev. Note: Internal evaluate must be passed only a formula cell
-     * else a runtime exception will be thrown somewhere inside the method.
-     * (Hence this is a private method.)
-     * @return never <code>null</code>, never {@link BlankEval}
-     */
-    private ValueEval internalEvaluate(Cell srcCell) {
-        int srcRowNum = srcCell.getRowIndex();
-        int srcColNum = srcCell.getCellNum();
-
-        ValueEval result;
-
-        int sheetIndex = _workbook.getSheetIndex(srcCell.getSheet());
-        result = _cache.getValue(sheetIndex, srcRowNum, srcColNum);
-        if (result != null) {
-            return result;
-        }
-        _evaluationCounter.value++;
-        _evaluationCounter.depth++;
-
-        EvaluationCycleDetector tracker = EvaluationCycleDetectorManager.getTracker();
-
-        if(!tracker.startEvaluate(_workbook, sheetIndex, srcRowNum, srcColNum)) {
-            return ErrorEval.CIRCULAR_REF_ERROR;
-        }
-        try {
-            result = evaluateCell(sheetIndex, srcRowNum, (short)srcColNum, srcCell.getCellFormula());
-        } finally {
-            tracker.endEvaluate(_workbook, sheetIndex, srcRowNum, srcColNum);
-            _cache.setValue(sheetIndex, srcRowNum, srcColNum, result);
-            _evaluationCounter.depth--;
-        }
-        if (isDebugLogEnabled()) {
-            String sheetName = _workbook.getSheetName(sheetIndex);
-            CellReference cr = new CellReference(srcRowNum, srcColNum);
-            logDebug("Evaluated " + sheetName + "!" + cr.formatAsString() + " to " + result.toString());
-        }
-        return result;
-    }
-    private ValueEval evaluateCell(int sheetIndex, int srcRowNum, short srcColNum, String cellFormulaText) {
-
-        Ptg[] ptgs = FormulaParser.parse(cellFormulaText, _workbook);
-
-        Stack stack = new Stack();
-        for (int i = 0, iSize = ptgs.length; i < iSize; i++) {
-
-            // since we don't know how to handle these yet :(
-            Ptg ptg = ptgs[i];
-            if (ptg instanceof ControlPtg) {
-                // skip Parentheses, Attr, etc
-                continue;
-            }
-            if (ptg instanceof MemErrPtg) { continue; }
-            if (ptg instanceof MissingArgPtg) {
-                // TODO - might need to push BlankEval or MissingArgEval
-                continue;
-            }
-            Eval opResult;
-            if (ptg instanceof OperationPtg) {
-                OperationPtg optg = (OperationPtg) ptg;
-
-                if (optg instanceof UnionPtg) { continue; }
-
-                OperationEval operation = OperationEvaluatorFactory.create(optg);
-
-                int numops = operation.getNumberOfOperands();
-                Eval[] ops = new Eval[numops];
-
-                // storing the ops in reverse order since they are popping
-                for (int j = numops - 1; j >= 0; j--) {
-                    Eval p = (Eval) stack.pop();
-                    ops[j] = p;
-                }
-//                logDebug("invoke " + operation + " (nAgs=" + numops + ")");
-                opResult = invokeOperation(operation, ops, _workbook, sheetIndex, srcRowNum, srcColNum);
-            } else {
-                opResult = getEvalForPtg(ptg, sheetIndex);
-            }
-            if (opResult == null) {
-                throw new RuntimeException("Evaluation result must not be null");
-            }
-//            logDebug("push " + opResult);
-            stack.push(opResult);
-        }
-
-        ValueEval value = ((ValueEval) stack.pop());
-        if (!stack.isEmpty()) {
-            throw new IllegalStateException("evaluation stack not empty");
-        }
-        value = dereferenceValue(value, srcRowNum, srcColNum);
-        if (value == BlankEval.INSTANCE) {
-            // Note Excel behaviour here. A blank final final value is converted to zero.
-            return NumberEval.ZERO;
-            // Formulas _never_ evaluate to blank.  If a formula appears to have evaluated to
-            // blank, the actual value is empty string. This can be verified with ISBLANK().
-        }
-        return value;
-    }
-
-    /**
-     * Dereferences a single value from any AreaEval or RefEval evaluation result.
-     * If the supplied evaluationResult is just a plain value, it is returned as-is.
-     * @return a <tt>NumberEval</tt>, <tt>StringEval</tt>, <tt>BoolEval</tt>,
-     *  <tt>BlankEval</tt> or <tt>ErrorEval</tt>. Never <code>null</code>.
-     */
-    private static ValueEval dereferenceValue(ValueEval evaluationResult, int srcRowNum, short srcColNum) {
-        if (evaluationResult instanceof RefEval) {
-            RefEval rv = (RefEval) evaluationResult;
-            return rv.getInnerValueEval();
-        }
-        if (evaluationResult instanceof AreaEval) {
-            AreaEval ae = (AreaEval) evaluationResult;
-            if (ae.isRow()) {
-                if(ae.isColumn()) {
-                    return ae.getRelativeValue(0, 0);
-                }
-                return ae.getValueAt(ae.getFirstRow(), srcColNum);
-            }
-            if (ae.isColumn()) {
-                return ae.getValueAt(srcRowNum, ae.getFirstColumn());
-            }
-            return ErrorEval.VALUE_INVALID;
-        }
-        return evaluationResult;
-    }
-
-    private static Eval invokeOperation(OperationEval operation, Eval[] ops, 
-            Workbook workbook, int sheetIndex, int srcRowNum, int srcColNum) {
-
-        if(operation instanceof FunctionEval) {
-            FunctionEval fe = (FunctionEval) operation;
-            if(fe.isFreeRefFunction()) {
-                return fe.getFreeRefFunction().evaluate(ops, workbook, sheetIndex, srcRowNum, srcColNum);
-            }
-        }
-        return operation.evaluate(ops, srcRowNum, (short)srcColNum);
-    }
-
-    private Sheet getOtherSheet(int externSheetIndex) {
-        return _workbook.getSheetAt(_workbook.getSheetIndexFromExternSheetIndex(externSheetIndex));
-    }
-
-    /**
-     * returns an appropriate Eval impl instance for the Ptg. The Ptg must be
-     * one of: Area3DPtg, AreaPtg, ReferencePtg, Ref3DPtg, IntPtg, NumberPtg,
-     * StringPtg, BoolPtg <br/>special Note: OperationPtg subtypes cannot be
-     * passed here!
-     */
-    private Eval getEvalForPtg(Ptg ptg, int sheetIndex) {
-        if (ptg instanceof NamePtg) {
-            // named ranges, macro functions
-            NamePtg namePtg = (NamePtg) ptg;
-            int numberOfNames = _workbook.getNumberOfNames();
-            int nameIndex = namePtg.getIndex();
-            if(nameIndex < 0 || nameIndex >= numberOfNames) {
-                throw new RuntimeException("Bad name index (" + nameIndex
-                        + "). Allowed range is (0.." + (numberOfNames-1) + ")");
-            }
-			if(_workbook instanceof org.apache.poi.hssf.usermodel.HSSFWorkbook) {
-				NameRecord nameRecord = ((org.apache.poi.hssf.usermodel.HSSFWorkbook)_workbook).getNameRecord(nameIndex);
-				if (nameRecord.isFunctionName()) {
-					return new NameEval(nameRecord.getNameText());
-				}
-				if (nameRecord.hasFormula()) {
-					return evaluateNameFormula(nameRecord.getNameDefinition(), sheetIndex);
-				}
-
-				throw new RuntimeException("Don't now how to evalate name '" + nameRecord.getNameText() + "'");
-			}
-			throw new RuntimeException("Don't now how to evalate name for XSSFWorkbook");
-        }
-        if (ptg instanceof NameXPtg) {
-            NameXPtg nameXPtg = (NameXPtg) ptg;
-            return new NameXEval(nameXPtg.getSheetRefIndex(), nameXPtg.getNameIndex());
-        }
-
-        if (ptg instanceof IntPtg) {
-            return new NumberEval(((IntPtg)ptg).getValue());
-        }
-        if (ptg instanceof NumberPtg) {
-            return new NumberEval(((NumberPtg)ptg).getValue());
-        }
-        if (ptg instanceof StringPtg) {
-            return new StringEval(((StringPtg) ptg).getValue());
-        }
-        if (ptg instanceof BoolPtg) {
-            return BoolEval.valueOf(((BoolPtg) ptg).getValue());
-        }
-        if (ptg instanceof ErrPtg) {
-            return ErrorEval.valueOf(((ErrPtg) ptg).getErrorCode());
-        }
-        Sheet sheet = _workbook.getSheetAt(sheetIndex);
-        if (ptg instanceof RefPtg) {
-            return new LazyRefEval(((RefPtg) ptg), sheet, this);
-        }
-        if (ptg instanceof AreaPtg) {
-            return new LazyAreaEval(((AreaPtg) ptg), sheet, this);
-        }
-        if (ptg instanceof Ref3DPtg) {
-            Ref3DPtg refPtg = (Ref3DPtg) ptg;
-            Sheet xsheet = getOtherSheet(refPtg.getExternSheetIndex());
-            return new LazyRefEval(refPtg, xsheet, this);
-        }
-        if (ptg instanceof Area3DPtg) {
-            Area3DPtg a3dp = (Area3DPtg) ptg;
-            Sheet xsheet = getOtherSheet(a3dp.getExternSheetIndex());
-            return new LazyAreaEval(a3dp, xsheet, this);
-        }
-
-        if (ptg instanceof UnknownPtg) {
-            // POI uses UnknownPtg when the encoded Ptg array seems to be corrupted.
-            // This seems to occur in very rare cases (e.g. unused name formulas in bug 44774, attachment 21790)
-            // In any case, formulas are re-parsed before execution, so UnknownPtg should not get here 
-            throw new RuntimeException("UnknownPtg not allowed");
-        }
-        
-        throw new RuntimeException("Unexpected ptg class (" + ptg.getClass().getName() + ")");
-    }
-    private Eval evaluateNameFormula(Ptg[] ptgs, int sheetIndex) {
-        if (ptgs.length > 1) {
-            throw new RuntimeException("Complex name formulas not supported yet");
-        }
-        return getEvalForPtg(ptgs[0], sheetIndex);
-    }
-
-    /**
-     * Given a cell, find its type and from that create an appropriate ValueEval
-     * impl instance and return that. Since the cell could be an external
-     * reference, we need the sheet that this belongs to.
-     * Non existent cells are treated as empty.
-     */
-    public ValueEval getEvalForCell(Cell cell) {
-
-        if (cell == null) {
-            return BlankEval.INSTANCE;
-        }
-        switch (cell.getCellType()) {
-            case Cell.CELL_TYPE_NUMERIC:
-                return new NumberEval(cell.getNumericCellValue());
-            case Cell.CELL_TYPE_STRING:
-                return new StringEval(cell.getRichStringCellValue().getString());
-            case Cell.CELL_TYPE_FORMULA:
-                return internalEvaluate(cell);
-            case Cell.CELL_TYPE_BOOLEAN:
-                return BoolEval.valueOf(cell.getBooleanCellValue());
-            case Cell.CELL_TYPE_BLANK:
-                return BlankEval.INSTANCE;
-            case Cell.CELL_TYPE_ERROR:
-                return ErrorEval.valueOf(cell.getErrorCellValue());
-        }
-        throw new RuntimeException("Unexpected cell type (" + cell.getCellType() + ")");
-    }
-
-    /**
-     * Mimics the 'data view' of a cell. This allows formula evaluator
-     * to return a CellValue instead of precasting the value to String
-     * or Number or boolean type.
-     * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
-     */
-    public static final class CellValue {
-        public static final CellValue TRUE = new CellValue(Cell.CELL_TYPE_BOOLEAN, 0.0, true,  null, 0, null);
-        public static final CellValue FALSE= new CellValue(Cell.CELL_TYPE_BOOLEAN, 0.0, false, null, 0, null);
-        
-        private final int _cellType;
-        private final double _numberValue;
-        private final boolean _booleanValue;
-        private final String _textValue;
-        private final int _errorCode;
-		private CreationHelper _creationHelper;
-
-        private CellValue(int cellType, double numberValue, boolean booleanValue, 
-                String textValue, int errorCode, CreationHelper creationHelper) {
-            _cellType = cellType;
-            _numberValue = numberValue;
-            _booleanValue = booleanValue;
-            _textValue = textValue;
-            _errorCode = errorCode;
-			_creationHelper = creationHelper;
-        }
-        
-        
-        /* package*/ CellValue(double numberValue, CreationHelper creationHelper) {
-            this(Cell.CELL_TYPE_NUMERIC, numberValue, false, null, 0, creationHelper);
-        }
-        /* package*/ static CellValue valueOf(boolean booleanValue) {
-            return booleanValue ? TRUE : FALSE;
-        }
-        /* package*/ CellValue(String stringValue, CreationHelper creationHelper) {
-            this(Cell.CELL_TYPE_STRING, 0.0, false, stringValue, 0, creationHelper);
-        }
-        /* package*/ static CellValue getError(int errorCode) {
-            return new CellValue(Cell.CELL_TYPE_ERROR, 0.0, false, null, errorCode, null);
-        }
-        
-        
-        /**
-         * @return Returns the booleanValue.
-         */
-        public boolean getBooleanValue() {
-            return _booleanValue;
-        }
-        /**
-         * @return Returns the numberValue.
-         */
-        public double getNumberValue() {
-            return _numberValue;
-        }
-        /**
-         * @return Returns the stringValue.
-         */
-        public String getStringValue() {
-            return _textValue;
-        }
-        /**
-         * @return Returns the cellType.
-         */
-        public int getCellType() {
-            return _cellType;
-        }
-        /**
-         * @return Returns the errorValue.
-         */
-        public byte getErrorValue() {
-            return (byte) _errorCode;
-        }
-        /**
-         * @return Returns the richTextStringValue.
-         * @deprecated (Sep 2008) Text formatting is lost during formula evaluation.  Use {@link #getStringValue()}  
-         */
-        public RichTextString getRichTextStringValue() {
-            return _creationHelper.createRichTextString(_textValue);
-        }
-        public String toString() {
-            StringBuffer sb = new StringBuffer(64);
-            sb.append(getClass().getName()).append(" [");
-            sb.append(formatAsString());
-            sb.append("]");
-            return sb.toString();
-        }
-
-        public String formatAsString() {
-            switch (_cellType) {
-                case Cell.CELL_TYPE_NUMERIC:
-                    return String.valueOf(_numberValue);
-                case Cell.CELL_TYPE_STRING:
-                    return '"' + _textValue + '"';
-                case Cell.CELL_TYPE_BOOLEAN:
-                    return _booleanValue ? "TRUE" : "FALSE";
-                case Cell.CELL_TYPE_ERROR:
-                    return ErrorEval.getText(_errorCode);
-            }
-            return "<error unexpected cell type " + _cellType + ">";
-        }
-    }
+    Cell evaluateInCell(Cell cell);
 }

Modified: poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java (original)
+++ poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Workbook.java Fri Sep 19 00:32:34 2008
@@ -122,15 +122,6 @@
     int getSheetIndex(Sheet sheet);
 
     /**
-     * Returns the external sheet index of the sheet
-     *  with the given internal index, creating one
-     *  if needed.
-     * Used by some of the more obscure formula and
-     *  named range things.
-     */
-    int getExternalSheetIndex(int internalSheetIndex);
-
-    /**
      * create an HSSFSheet for this HSSFWorkbook, adds it to the sheets and returns
      * the high level representation.  Use this to create new sheets.
      *
@@ -165,14 +156,6 @@
     int getNumberOfSheets();
 
     /**
-     * Finds the sheet index for a particular external sheet number.
-     * @param externSheetNumber The external sheet number to convert
-     * @return  The index to the sheet found.
-     */
-    int getSheetIndexFromExternSheetIndex(int externSheetNumber);
-
-
-    /**
      * Get the HSSFSheet object at the given index.
      * @param index of the sheet number (0-based physical & logical)
      * @return HSSFSheet at the provided index
@@ -194,8 +177,6 @@
      */
 
     void removeSheetAt(int index);
-
-    String findSheetNameFromExternSheet(int externSheetIndex);
     
     /**
      * determine whether the Excel GUI will backup the workbook when saving.
@@ -334,14 +315,6 @@
     String getNameName(int index);
 
     /**
-     * TODO - make this less cryptic / move elsewhere
-     * @param refIndex Index to REF entry in EXTERNSHEET record in the Link Table
-     * @param definedNameIndex zero-based to DEFINEDNAME or EXTERNALNAME record
-     * @return the string representation of the defined or external name
-     */
-    String resolveNameXText(int refIndex, int definedNameIndex);
-
-    /**
      * Sets the printarea for the sheet provided
      * <p>
      * i.e. Reference = $A$1:$B$2

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java?rev=696961&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java Fri Sep 19 00:32:34 2008
@@ -0,0 +1,167 @@
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.hssf.record.formula.NamePtg;
+import org.apache.poi.hssf.record.formula.NameXPtg;
+import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.ss.formula.EvaluationName;
+import org.apache.poi.ss.formula.EvaluationWorkbook;
+import org.apache.poi.ss.formula.FormulaParser;
+import org.apache.poi.ss.formula.FormulaParsingWorkbook;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
+
+/**
+ * Internal POI use only
+ * 
+ * @author Josh Micich
+ */
+public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, EvaluationWorkbook, FormulaParsingWorkbook {
+
+	private final XSSFWorkbook _uBook;
+	
+	public static XSSFEvaluationWorkbook create(XSSFWorkbook book) {
+		if (book == null) {
+			return null;
+		}
+		return new XSSFEvaluationWorkbook(book);
+	}
+
+	private XSSFEvaluationWorkbook(XSSFWorkbook book) {
+		_uBook = book;
+	}
+
+	private int convertFromExternalSheetIndex(int externSheetIndex) {
+		return externSheetIndex;
+	}
+	/**
+	 * @returns the external sheet index of the sheet with the given internal
+	 *          index, creating one if needed. Used by some of the more obscure
+	 *          formula and named range things. Fairly easy on XSSF (we
+	 *          think...) since the internal and external indicies are the same
+	 */
+	private int convertToExternalSheetIndex(int sheetIndex) {
+		return sheetIndex;
+	}
+
+	public int getExternalSheetIndex(String sheetName) {
+		int sheetIndex = _uBook.getSheetIndex(sheetName);
+		return convertToExternalSheetIndex(sheetIndex);
+	}
+
+	public EvaluationName getName(int index) {
+		return new Name(_uBook.getNameAt(index), index, this);
+	}
+
+	public EvaluationName getName(String name) {
+		for(int i=0; i < _uBook.getNumberOfNames(); i++) {
+			String nameText = _uBook.getNameName(i);
+			if (name.equalsIgnoreCase(nameText)) {
+				return new Name(_uBook.getNameAt(i), i, this);
+			}
+		}
+		return null;
+	}
+
+	public int getSheetIndex(Sheet sheet) {
+		return _uBook.getSheetIndex(sheet);
+	}
+
+	public String getSheetName(int sheetIndex) {
+		return _uBook.getSheetName(sheetIndex);
+	}
+
+	public int getNameIndex(String name) {
+		return _uBook.getNameIndex(name);
+	}
+
+	public NameXPtg getNameXPtg(String name) {
+		// may require to return null to make tests pass
+		throw new RuntimeException("Not implemented yet");
+	}
+
+	public Sheet getSheet(int sheetIndex) {
+		return _uBook.getSheetAt(sheetIndex);
+	}
+
+    /**
+     * Doesn't do anything - returns the same index
+     * TODO - figure out if this is a ole2 specific thing, or
+     *  if we need to do something proper here too!
+     */
+	public Sheet getSheetByExternSheetIndex(int externSheetIndex) {
+		int sheetIndex = convertFromExternalSheetIndex(externSheetIndex);
+		return _uBook.getSheetAt(sheetIndex);
+	}
+
+	public Workbook getWorkbook() {
+		return _uBook;
+	}
+
+    /**
+     * TODO - figure out what the hell this methods does in
+     *  HSSF...
+     */
+	public String resolveNameXText(NameXPtg n) {
+		throw new RuntimeException("method not implemented yet");
+	}
+
+	public String getSheetNameByExternSheet(int externSheetIndex) {
+		int sheetIndex = convertFromExternalSheetIndex(externSheetIndex);
+		return _uBook.getSheetName(sheetIndex);
+	}
+
+	public String getNameText(NamePtg namePtg) {
+		return _uBook.getNameAt(namePtg.getIndex()).getNameName();
+	}
+	public EvaluationName getName(NamePtg namePtg) {
+		int ix = namePtg.getIndex();
+		return new Name(_uBook.getNameAt(ix), ix, this);
+	}
+	public Ptg[] getFormulaTokens(Cell cell) {
+		XSSFEvaluationWorkbook frBook = XSSFEvaluationWorkbook.create(_uBook);
+		return FormulaParser.parse(cell.getCellFormula(), frBook);
+	}
+
+	private static final class Name implements EvaluationName {
+
+		private final XSSFName _nameRecord;
+		private final int _index;
+		private final FormulaParsingWorkbook _fpBook;
+
+		public Name(XSSFName name, int index, FormulaParsingWorkbook fpBook) {
+			_nameRecord = name;
+			_index = index;
+			_fpBook = fpBook;
+		}
+
+		public Ptg[] getNameDefinition() {
+			
+			return FormulaParser.parse(_nameRecord.getReference(), _fpBook);
+		}
+
+		public String getNameText() {
+			return _nameRecord.getNameName();
+		}
+
+		public boolean hasFormula() {
+			// TODO - no idea if this is right
+			CTDefinedName ctn = _nameRecord.getCTName();
+			String strVal = ctn.getStringValue();
+			return !ctn.getFunction() && strVal != null && strVal.length() > 0;
+		}
+
+		public boolean isFunctionName() {
+			return _nameRecord.isFunctionName();
+		}
+
+		public boolean isRange() {
+			return hasFormula(); // TODO - is this right?
+		}
+		public NamePtg createPtg() {
+			return new NamePtg(_index);
+		}
+	}
+}

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java?rev=696961&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFormulaEvaluator.java Fri Sep 19 00:32:34 2008
@@ -0,0 +1,256 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.xssf.usermodel;
+
+import java.util.Iterator;
+
+import org.apache.poi.hssf.record.formula.eval.BoolEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.StringEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.ss.formula.WorkbookEvaluator;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellValue;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+
+/**
+ * Evaluates formula cells.<p/>
+ *
+ * For performance reasons, this class keeps a cache of all previously calculated intermediate
+ * cell values.  Be sure to call {@link #clearCache()} if any workbook cells are changed between
+ * calls to evaluate~ methods on this class.
+ *
+ * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
+ * @author Josh Micich
+ */
+public class XSSFFormulaEvaluator implements FormulaEvaluator {
+
+	private WorkbookEvaluator _bookEvaluator;
+
+	public XSSFFormulaEvaluator(XSSFWorkbook workbook) {
+   		_bookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(workbook));
+	}
+
+	/**
+	 * TODO for debug/test use
+	 */
+	/* package */ int getEvaluationCount() {
+		return _bookEvaluator.getEvaluationCount();
+	}
+
+
+	/**
+	 * Should be called whenever there are major changes (e.g. moving sheets) to input cells
+	 * in the evaluated workbook.
+	 * Failure to call this method after changing cell values will cause incorrect behaviour
+	 * of the evaluate~ methods of this class
+	 */
+	public void clearAllCachedResultValues() {
+		_bookEvaluator.clearAllCachedResultValues();
+	}
+	/**
+	 * Should be called whenever there are changes to individual input cells in the evaluated workbook.
+	 * Failure to call this method after changing cell values will cause incorrect behaviour
+	 * of the evaluate~ methods of this class
+	 */
+	public void clearCachedResultValue(Sheet sheet, int rowIndex, int columnIndex) {
+		_bookEvaluator.clearCachedResultValue(sheet, rowIndex, columnIndex);
+	}
+
+	/**
+	 * If cell contains a formula, the formula is evaluated and returned,
+	 * else the CellValue simply copies the appropriate cell value from
+	 * the cell and also its cell type. This method should be preferred over
+	 * evaluateInCell() when the call should not modify the contents of the
+	 * original cell.
+	 * @param cell
+	 */
+	public CellValue evaluate(Cell cell) {
+		if (cell == null) {
+			return null;
+		}
+
+		switch (cell.getCellType()) {
+			case XSSFCell.CELL_TYPE_BOOLEAN:
+				return CellValue.valueOf(cell.getBooleanCellValue());
+			case XSSFCell.CELL_TYPE_ERROR:
+				return CellValue.getError(cell.getErrorCellValue());
+			case XSSFCell.CELL_TYPE_FORMULA:
+				return evaluateFormulaCellValue(cell);
+			case XSSFCell.CELL_TYPE_NUMERIC:
+				return new CellValue(cell.getNumericCellValue());
+			case XSSFCell.CELL_TYPE_STRING:
+				return new CellValue(cell.getRichStringCellValue().getString());
+		}
+		throw new IllegalStateException("Bad cell type (" + cell.getCellType() + ")");
+	}
+
+
+	/**
+	 * If cell contains formula, it evaluates the formula,
+	 *  and saves the result of the formula. The cell
+	 *  remains as a formula cell.
+	 * Else if cell does not contain formula, this method leaves
+	 *  the cell unchanged.
+	 * Note that the type of the formula result is returned,
+	 *  so you know what kind of value is also stored with
+	 *  the formula.
+	 * <pre>
+	 * int evaluatedCellType = evaluator.evaluateFormulaCell(cell);
+	 * </pre>
+	 * Be aware that your cell will hold both the formula,
+	 *  and the result. If you want the cell replaced with
+	 *  the result of the formula, use {@link #evaluateInCell(HSSFCell)}
+	 * @param cell The cell to evaluate
+	 * @return The type of the formula result (the cell's type remains as HSSFCell.CELL_TYPE_FORMULA however)
+	 */
+	public int evaluateFormulaCell(Cell cell) {
+		if (cell == null || cell.getCellType() != XSSFCell.CELL_TYPE_FORMULA) {
+			return -1;
+		}
+		CellValue cv = evaluateFormulaCellValue(cell);
+		// cell remains a formula cell, but the cached value is changed
+		setCellValue(cell, cv);
+		return cv.getCellType();
+	}
+
+	/**
+	 * If cell contains formula, it evaluates the formula, and
+	 *  puts the formula result back into the cell, in place
+	 *  of the old formula.
+	 * Else if cell does not contain formula, this method leaves
+	 *  the cell unchanged.
+	 * Note that the same instance of HSSFCell is returned to
+	 * allow chained calls like:
+	 * <pre>
+	 * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
+	 * </pre>
+	 * Be aware that your cell value will be changed to hold the
+	 *  result of the formula. If you simply want the formula
+	 *  value computed for you, use {@link #evaluateFormulaCell(HSSFCell)}
+	 * @param cell
+	 */
+	public XSSFCell evaluateInCell(Cell cell) {
+		if (cell == null) {
+			return null;
+		}
+		XSSFCell result = (XSSFCell) cell;
+		if (cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA) {
+			CellValue cv = evaluateFormulaCellValue(cell);
+			setCellType(cell, cv); // cell will no longer be a formula cell
+			setCellValue(cell, cv);
+		}
+		return result;
+	}
+	private static void setCellType(Cell cell, CellValue cv) {
+		int cellType = cv.getCellType();
+		switch (cellType) {
+			case XSSFCell.CELL_TYPE_BOOLEAN:
+			case XSSFCell.CELL_TYPE_ERROR:
+			case XSSFCell.CELL_TYPE_NUMERIC:
+			case XSSFCell.CELL_TYPE_STRING:
+				cell.setCellType(cellType);
+				return;
+			case XSSFCell.CELL_TYPE_BLANK:
+				// never happens - blanks eventually get translated to zero
+			case XSSFCell.CELL_TYPE_FORMULA:
+				// this will never happen, we have already evaluated the formula
+		}
+		throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+	}
+
+	private static void setCellValue(Cell cell, CellValue cv) {
+		int cellType = cv.getCellType();
+		switch (cellType) {
+			case XSSFCell.CELL_TYPE_BOOLEAN:
+				cell.setCellValue(cv.getBooleanValue());
+				break;
+			case XSSFCell.CELL_TYPE_ERROR:
+				cell.setCellErrorValue(cv.getErrorValue());
+				break;
+			case XSSFCell.CELL_TYPE_NUMERIC:
+				cell.setCellValue(cv.getNumberValue());
+				break;
+			case XSSFCell.CELL_TYPE_STRING:
+				cell.setCellValue(new XSSFRichTextString(cv.getStringValue()));
+				break;
+			case XSSFCell.CELL_TYPE_BLANK:
+				// never happens - blanks eventually get translated to zero
+			case XSSFCell.CELL_TYPE_FORMULA:
+				// this will never happen, we have already evaluated the formula
+			default:
+				throw new IllegalStateException("Unexpected cell value type (" + cellType + ")");
+		}
+	}
+
+	/**
+	 * Loops over all cells in all sheets of the supplied
+	 *  workbook.
+	 * For cells that contain formulas, their formulas are
+	 *  evaluated, and the results are saved. These cells
+	 *  remain as formula cells.
+	 * For cells that do not contain formulas, no changes
+	 *  are made.
+	 * This is a helpful wrapper around looping over all
+	 *  cells, and calling evaluateFormulaCell on each one.
+	 */
+	public static void evaluateAllFormulaCells(XSSFWorkbook wb) {
+		XSSFFormulaEvaluator evaluator = new XSSFFormulaEvaluator(wb);
+		for(int i=0; i<wb.getNumberOfSheets(); i++) {
+			Sheet sheet = wb.getSheetAt(i);
+
+			for (Iterator<Row> rit = sheet.rowIterator(); rit.hasNext();) {
+				Row r = rit.next();
+
+				for (Iterator cit = r.cellIterator(); cit.hasNext();) {
+					XSSFCell c = (XSSFCell) cit.next();
+					if (c.getCellType() == XSSFCell.CELL_TYPE_FORMULA)
+						evaluator.evaluateFormulaCell(c);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Returns a CellValue wrapper around the supplied ValueEval instance.
+	 * @param eval
+	 */
+	private CellValue evaluateFormulaCellValue(Cell cell) {
+		ValueEval eval = _bookEvaluator.evaluate(cell);
+		if (eval instanceof NumberEval) {
+			NumberEval ne = (NumberEval) eval;
+			return new CellValue(ne.getNumberValue());
+		}
+		if (eval instanceof BoolEval) {
+			BoolEval be = (BoolEval) eval;
+			return CellValue.valueOf(be.getBooleanValue());
+		}
+		if (eval instanceof StringEval) {
+			StringEval ne = (StringEval) eval;
+			return new CellValue(ne.getStringValue());
+		}
+		if (eval instanceof ErrorEval) {
+			return CellValue.getError(((ErrorEval)eval).getErrorCode());
+		}
+		throw new RuntimeException("Unexpected eval class (" + eval.getClass().getName() + ")");
+	}
+}

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java Fri Sep 19 00:32:34 2008
@@ -37,7 +37,7 @@
 	
 	public boolean isFunctionName() {
 		// TODO Figure out how HSSF does this, and do the same!
-		return false;
+		return ctName.getFunction(); // maybe this works - verify
 	}
 	/**
 	 * Returns the underlying named range object

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Fri Sep 19 00:32:34 2008
@@ -408,15 +408,6 @@
     	return -1;
     }
 
-    /**
-     * TODO - figure out what the hell this methods does in
-     *  HSSF...
-     */
-    public String resolveNameXText(int refIndex, int definedNameIndex) {
-		// TODO Replace with something proper
-		return null;
-	}
-
     public short getNumCellStyles() {
         return (short) ((StylesTable)stylesSource).getNumCellStyles();
     }
@@ -450,23 +441,6 @@
         return -1;
     }
 
-    /**
-     * Doesn't do anything - returns the same index
-     * TODO - figure out if this is a ole2 specific thing, or
-     *  if we need to do something proper here too!
-     */
-    public int getSheetIndexFromExternSheetIndex(int externSheetNumber) {
-		return externSheetNumber;
-	}
-    /**
-     * Doesn't do anything special - returns the same as getSheetName()
-     * TODO - figure out if this is a ole2 specific thing, or
-     *  if we need to do something proper here too!
-     */
-    public String findSheetNameFromExternSheet(int externSheetIndex) {
-		return getSheetName(externSheetIndex);
-	}
-
 	public Sheet getSheet(String name) {
         CTSheet[] sheets = this.workbook.getSheets().getSheetArray();
         for (int i = 0 ; i < sheets.length ; ++i) {
@@ -495,19 +469,6 @@
         return this.sheets.indexOf(sheet);
     }
 
-    /**
-     * Returns the external sheet index of the sheet
-     *  with the given internal index, creating one
-     *  if needed.
-     * Used by some of the more obscure formula and
-     *  named range things.
-     * Fairly easy on XSSF (we think...) since the
-     *  internal and external indicies are the same
-     */
-    public int getExternalSheetIndex(int internalSheetIndex) {
-    	return internalSheetIndex;
-    }
-
     public String getSheetName(int sheet) {
         return this.workbook.getSheets().getSheetArray(sheet).getName();
     }

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestFormulaEvaluatorOnXSSF.java Fri Sep 19 00:32:34 2008
@@ -28,10 +28,10 @@
 import org.apache.poi.hssf.record.formula.eval.TestFormulasFromSpreadsheet;
 import org.apache.poi.hssf.record.formula.functions.TestMathX;
 import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellValue;
 import org.apache.poi.ss.usermodel.FormulaEvaluator;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
 import org.openxml4j.opc.Package;
 
 /**
@@ -90,7 +90,7 @@
 		public static final int NUMBER_OF_ROWS_PER_FUNCTION = 4;
 	}
 
-	private Workbook workbook;
+	private XSSFWorkbook workbook;
 	private Sheet sheet;
 	// Note - multiple failures are aggregated before ending.  
 	// If one or more functions fail, a single AssertionFailedError is thrown at the end
@@ -107,7 +107,7 @@
 	}
 
 
-	private static void confirmExpectedResult(String msg, Cell expected, FormulaEvaluator.CellValue actual) {
+	private static void confirmExpectedResult(String msg, Cell expected, CellValue actual) {
 		if (expected == null) {
 			throw new AssertionFailedError(msg + " - Bad setup data expected value is null");
 		}
@@ -199,7 +199,7 @@
 	 */
 	private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) {
  
-		FormulaEvaluator evaluator = new FormulaEvaluator(workbook);
+		FormulaEvaluator evaluator = new XSSFFormulaEvaluator(workbook);
 
 		int rowIndex = startRowIndex;
 		while (true) {
@@ -256,7 +256,7 @@
 				continue;
 			}
 
-			FormulaEvaluator.CellValue actualValue;
+			CellValue actualValue;
 			try {
 				actualValue = evaluator.evaluate(c);
 			} catch (RuntimeException e) {

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaEvaluation.java Fri Sep 19 00:32:34 2008
@@ -17,15 +17,14 @@
 
 package org.apache.poi.xssf.usermodel;
 
+import junit.framework.TestCase;
+
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.FormulaEvaluator;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
-
-import junit.framework.TestCase;
 
-public class TestXSSFFormulaEvaluation extends TestCase {
+public final class TestXSSFFormulaEvaluation extends TestCase {
 	public TestXSSFFormulaEvaluation(String name) {
 		super(name);
 		
@@ -37,7 +36,7 @@
 	}
 
 	public void testSimpleArithmatic() {
-		Workbook wb = new XSSFWorkbook();
+		XSSFWorkbook wb = new XSSFWorkbook();
 		Sheet s = wb.createSheet();
 		Row r = s.createRow(0);
 		
@@ -49,7 +48,7 @@
 		c2.setCellFormula("10/2");
 		assertTrue( Double.isNaN(c2.getNumericCellValue()) );
 		
-		FormulaEvaluator fe = new FormulaEvaluator(s, wb);
+		FormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
 		
 		fe.evaluateFormulaCell(c1);
 		fe.evaluateFormulaCell(c2);
@@ -59,7 +58,7 @@
 	}
 	
 	public void testSumCount() {
-		Workbook wb = new XSSFWorkbook();
+		XSSFWorkbook wb = new XSSFWorkbook();
 		Sheet s = wb.createSheet();
 		Row r = s.createRow(0);
 		r.createCell(0).setCellValue(2.5);
@@ -87,7 +86,7 @@
 
 
 		// Evaluate and test
-		FormulaEvaluator fe = new FormulaEvaluator(s, wb);
+		FormulaEvaluator fe = new XSSFFormulaEvaluator(wb);
 		
 		fe.evaluateFormulaCell(c1);
 		fe.evaluateFormulaCell(c2);

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java Fri Sep 19 00:32:34 2008
@@ -26,7 +26,7 @@
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
-import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.hssf.record.FormulaRecord;
 import org.apache.poi.hssf.record.Record;
@@ -101,7 +101,7 @@
 		
 		// Check we can get the formula without breaking
 		for(int i=0; i<fRecs.length; i++) {
-			FormulaParser.toFormulaString(stubHSSF, fRecs[i].getParsedExpression());
+			HSSFFormulaParser.toFormulaString(stubHSSF, fRecs[i].getParsedExpression());
 		}
 		
 		// Peer into just one formula, and check that
@@ -123,19 +123,19 @@
 		fr = fRecs[0];
 		assertEquals(1, fr.getRow());
 		assertEquals(0, fr.getColumn());
-		assertEquals("Sheet1!A1", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
+		assertEquals("Sheet1!A1", HSSFFormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
 		
 		// Sheet 1 A5 is to another sheet
 		fr = fRecs[3];
 		assertEquals(4, fr.getRow());
 		assertEquals(0, fr.getColumn());
-		assertEquals("'S2'!A1", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
+		assertEquals("'S2'!A1", HSSFFormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
 		
 		// Sheet 1 A7 is to another sheet, range
 		fr = fRecs[5];
 		assertEquals(6, fr.getRow());
 		assertEquals(0, fr.getColumn());
-		assertEquals("SUM(Sh3!A1:A4)", FormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
+		assertEquals("SUM(Sh3!A1:A4)", HSSFFormulaParser.toFormulaString(stubHSSF, fr.getParsedExpression()));
 		
 		
 		// Now, load via Usermodel and re-check

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Fri Sep 19 00:32:34 2008
@@ -21,7 +21,6 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.model.FormulaParser.FormulaParseException;
 import org.apache.poi.hssf.record.constant.ErrorConstant;
 import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
 import org.apache.poi.hssf.record.formula.AddPtg;
@@ -56,6 +55,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.FormulaParserTestHelper;
 
 /**
  * Test the low level formula parser functionality. High level tests are to
@@ -67,10 +67,13 @@
 	 * @return parsed token array already confirmed not <code>null</code>
 	 */
 	/* package */ static Ptg[] parseFormula(String formula) {
-		Ptg[] result = FormulaParser.parse(formula, null);
+		Ptg[] result = HSSFFormulaParser.parse(formula, (HSSFWorkbook)null);
 		assertNotNull("Ptg array should not be null", result);
 		return result;
 	}
+	private static String toFormulaString(Ptg[] ptgs) {
+		return HSSFFormulaParser.toFormulaString((HSSFWorkbook)null, ptgs);
+	}
 
 	public void testSimpleFormula() {
 		Ptg[] ptgs = parseFormula("2+2");
@@ -133,7 +136,7 @@
 		HSSFWorkbook w = HSSFTestDataSamples.openSampleWorkbook("testNames.xls");
 		HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(w);
 
-		Ptg[] ptg = FormulaParser.parse("myFunc()", w);
+		Ptg[] ptg = HSSFFormulaParser.parse("myFunc()", w);
 		// myFunc() actually takes 1 parameter.  Don't know if POI will ever be able to detect this problem
 
 		// the name gets encoded as the first arg
@@ -405,7 +408,7 @@
 		Ptg[] ptgs = {
 				new FuncPtg(10),
 		};
-		assertEquals("NA()", FormulaParser.toFormulaString(book, ptgs));
+		assertEquals("NA()", HSSFFormulaParser.toFormulaString(book, ptgs));
 	}
 
 	public void testPercent() {
@@ -639,11 +642,11 @@
 		String formulaString;
 		Ptg[] ptgs;
 		ptgs = parseFormula("sum(5, 2, if(3>2, sum(A1:A2), 6))");
-		formulaString = FormulaParser.toFormulaString(null, ptgs);
+		formulaString = toFormulaString(ptgs);
 		assertEquals("SUM(5,2,IF(3>2,SUM(A1:A2),6))", formulaString);
 
 		ptgs = parseFormula("if(1<2,sum(5, 2, if(3>2, sum(A1:A2), 6)),4)");
-		formulaString = FormulaParser.toFormulaString(null, ptgs);
+		formulaString = toFormulaString(ptgs);
 		assertEquals("IF(1<2,SUM(5,2,IF(3>2,SUM(A1:A2),6)),4)", formulaString);
 	}
 	public void testParserErrors() {
@@ -665,12 +668,9 @@
 		try {
 			parseFormula(formula);
 			throw new AssertionFailedError("expected parse exception");
-		} catch (FormulaParseException e) {
-			// expected during successful test
-			assertNotNull(e.getMessage());
 		} catch (RuntimeException e) {
-			e.printStackTrace();
-			fail("Wrong exception:" + e.getMessage());
+			// expected during successful test
+			FormulaParserTestHelper.confirmParseException(e);
 		}
 	}
 
@@ -697,7 +697,7 @@
 		Ptg[] ptgs = { spacePtg, new IntPtg(4), };
 		String formulaString;
 		try {
-			formulaString = FormulaParser.toFormulaString(null, ptgs);
+			formulaString = toFormulaString(ptgs);
 		} catch (IllegalStateException e) {
 			if(e.getMessage().equalsIgnoreCase("too much stuff left on the stack")) {
 				throw new AssertionFailedError("Identified bug 44609");
@@ -709,7 +709,7 @@
 		assertEquals("4", formulaString);
 
 		ptgs = new Ptg[] { new IntPtg(3), spacePtg, new IntPtg(4), spacePtg, AddPtg.instance, };
-		formulaString = FormulaParser.toFormulaString(null, ptgs);
+		formulaString = toFormulaString(ptgs);
 		assertEquals("3+4", formulaString);
 	}
 
@@ -725,7 +725,7 @@
 				DividePtg.instance,
 		};
 		try {
-			FormulaParser.toFormulaString(null, ptgs);
+			toFormulaString(ptgs);
 			fail("Expected exception was not thrown");
 		} catch (IllegalStateException e) {
 			// expected during successful test
@@ -764,10 +764,10 @@
 	private static void confirmArgCountMsg(String formula, String expectedMessage) {
 		HSSFWorkbook book = new HSSFWorkbook();
 		try {
-			FormulaParser.parse(formula, book);
+			HSSFFormulaParser.parse(formula, book);
 			throw new AssertionFailedError("Didn't get parse exception as expected");
-		} catch (FormulaParseException e) {
-			assertEquals(expectedMessage, e.getMessage());
+		} catch (RuntimeException e) {
+			FormulaParserTestHelper.confirmParseException(e, expectedMessage);
 		}
 	}
 
@@ -776,15 +776,17 @@
 		try {
 			parseFormula("round(3.14;2)");
 			throw new AssertionFailedError("Didn't get parse exception as expected");
-		} catch (FormulaParseException e) {
-			assertEquals("Parse error near char 10 ';' in specified formula 'round(3.14;2)'. Expected ',' or ')'", e.getMessage());
+		} catch (RuntimeException e) {
+			FormulaParserTestHelper.confirmParseException(e, 
+					"Parse error near char 10 ';' in specified formula 'round(3.14;2)'. Expected ',' or ')'");
 		}
 
 		try {
 			parseFormula(" =2+2");
 			throw new AssertionFailedError("Didn't get parse exception as expected");
-		} catch (FormulaParseException e) {
-			assertEquals("The specified formula ' =2+2' starts with an equals sign which is not allowed.", e.getMessage());
+		} catch (RuntimeException e) {
+			FormulaParserTestHelper.confirmParseException(e, 
+					"The specified formula ' =2+2' starts with an equals sign which is not allowed.");
 		}
 	}
 	
@@ -819,7 +821,7 @@
 
 		Ptg[] ptgs;
 		try {
-			ptgs = FormulaParser.parse("count(pfy1)", wb);
+			ptgs = HSSFFormulaParser.parse("count(pfy1)", wb);
 		} catch (IllegalArgumentException e) {
 			if (e.getMessage().equals("Specified colIx (1012) is out of range")) {
 				throw new AssertionFailedError("Identified bug 45354");
@@ -835,10 +837,9 @@
 		try {
 			cell.setCellFormula("count(pf1)");
 			throw new AssertionFailedError("Expected formula parse execption");
-		} catch (FormulaParseException e) {
-			if (!e.getMessage().equals("Specified named range 'pf1' does not exist in the current workbook.")) {
-				throw e;
-			}
+		} catch (RuntimeException e) {
+			FormulaParserTestHelper.confirmParseException(e, 
+					"Specified named range 'pf1' does not exist in the current workbook.");
 		}
 		cell.setCellFormula("count(fp1)"); // plain cell ref, col is in range
 	}
@@ -850,14 +851,14 @@
 		HSSFWorkbook book = new HSSFWorkbook();
 		book.createSheet("Sheet1");
 		
-		ptgs = FormulaParser.parse("Sheet1!A10:A40000", book);
+		ptgs = HSSFFormulaParser.parse("Sheet1!A10:A40000", book);
 		aptg = (AreaI) ptgs[0];
 		if (aptg.getLastRow() == -25537) {
 			throw new AssertionFailedError("Identified bug 45358");
 		}
 		assertEquals(39999, aptg.getLastRow());
 		
-		ptgs = FormulaParser.parse("Sheet1!A10:A65536", book);
+		ptgs = HSSFFormulaParser.parse("Sheet1!A10:A65536", book);
 		aptg = (AreaI) ptgs[0];
 		assertEquals(65535, aptg.getLastRow());
 		

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParserEval.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParserEval.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParserEval.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParserEval.java Fri Sep 19 00:32:34 2008
@@ -17,9 +17,9 @@
 
 package org.apache.poi.hssf.model;
 
+import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
-import org.apache.poi.hssf.model.FormulaParser.FormulaParseException;
 import org.apache.poi.hssf.record.formula.FuncVarPtg;
 import org.apache.poi.hssf.record.formula.NamePtg;
 import org.apache.poi.hssf.record.formula.Ptg;
@@ -29,7 +29,8 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.formula.FormulaParserTestHelper;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Test the low level formula parser functionality,
@@ -51,21 +52,21 @@
 		name.setNameName("testName");
 		name.setReference("A1:A2");
 
-		ptgs = FormulaParser.parse("SUM(testName)", workbook);
+		ptgs = HSSFFormulaParser.parse("SUM(testName)", workbook);
 		assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
 		assertEquals(NamePtg.class, ptgs[0].getClass());
 		assertEquals(FuncVarPtg.class, ptgs[1].getClass());
 
 		// Now make it a single cell
 		name.setReference("C3");
-		ptgs = FormulaParser.parse("SUM(testName)", workbook);
+		ptgs = HSSFFormulaParser.parse("SUM(testName)", workbook);
 		assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
 		assertEquals(NamePtg.class, ptgs[0].getClass());
 		assertEquals(FuncVarPtg.class, ptgs[1].getClass());
 		
 		// And make it non-contiguous
 		name.setReference("A1:A2,C3");
-		ptgs = FormulaParser.parse("SUM(testName)", workbook);
+		ptgs = HSSFFormulaParser.parse("SUM(testName)", workbook);
 		assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2);
 		assertEquals(NamePtg.class, ptgs[0].getClass());
 		assertEquals(FuncVarPtg.class, ptgs[1].getClass());
@@ -89,11 +90,12 @@
 		CellValue result;
 		try {
 			result = fe.evaluate(cell);
-		} catch (FormulaParseException e) {
-			if(e.getMessage().equals("Found reference to named range \"A\", but that named range wasn't defined!")) {
-				fail("Identifed bug 44539");
+		} catch (RuntimeException e) {
+			FormulaParserTestHelper.confirmParseException(e);
+			if (!e.getMessage().equals("Found reference to named range \"A\", but that named range wasn't defined!")) {
+				throw new AssertionFailedError("Identifed bug 44539");
 			}
-			throw new RuntimeException(e);
+			throw e;
 		}
 		assertEquals(HSSFCell.CELL_TYPE_NUMERIC, result.getCellType());
 		assertEquals(42.0, result.getNumberValue(), 0.0);

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestOperandClassTransformer.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestOperandClassTransformer.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestOperandClassTransformer.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestOperandClassTransformer.java Fri Sep 19 00:32:34 2008
@@ -23,6 +23,7 @@
 import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
 import org.apache.poi.hssf.record.formula.FuncVarPtg;
 import org.apache.poi.hssf.record.formula.Ptg;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * Tests specific formula examples in <tt>OperandClassTransformer</tt>.
@@ -31,9 +32,15 @@
  */
 public final class TestOperandClassTransformer extends TestCase {
 
+	private static Ptg[] parseFormula(String formula) {
+		Ptg[] result = HSSFFormulaParser.parse(formula, (HSSFWorkbook)null);
+		assertNotNull("Ptg array should not be null", result);
+		return result;
+	}
+	
 	public void testMdeterm() {
 		String formula = "MDETERM(ABS(A1))";
-		Ptg[] ptgs = FormulaParser.parse(formula, null);
+		Ptg[] ptgs = parseFormula(formula);
 
 		confirmTokenClass(ptgs, 0, Ptg.CLASS_ARRAY);
 		confirmFuncClass(ptgs, 1, "ABS", Ptg.CLASS_ARRAY);
@@ -51,7 +58,7 @@
 	 */
 	public void DISABLED_testIndexPi1() {
 		String formula = "INDEX(PI(),1)";
-		Ptg[] ptgs = FormulaParser.parse(formula, null);
+		Ptg[] ptgs = parseFormula(formula);
 
 		confirmFuncClass(ptgs, 1, "PI", Ptg.CLASS_ARRAY); // fails as of POI 3.1
 		confirmFuncClass(ptgs, 2, "INDEX", Ptg.CLASS_VALUE);
@@ -63,7 +70,7 @@
 	 */
 	public void testDirectOperandOfValueOperator() {
 		String formula = "COUNT(A1*1)";
-		Ptg[] ptgs = FormulaParser.parse(formula, null);
+		Ptg[] ptgs = parseFormula(formula);
 		if (ptgs[0].getPtgClass() == Ptg.CLASS_REF) {
 			throw new AssertionFailedError("Identified bug 45348");
 		}
@@ -78,13 +85,13 @@
 	public void testRtoV() {
 
 		String formula = "lookup(A1, A3:A52, B3:B52)";
-		Ptg[] ptgs = FormulaParser.parse(formula, null);
+		Ptg[] ptgs = parseFormula(formula);
 		confirmTokenClass(ptgs, 0, Ptg.CLASS_VALUE);
 	}
 	
 	public void testComplexIRR_bug45041() {
 		String formula = "(1+IRR(SUMIF(A:A,ROW(INDIRECT(MIN(A:A)&\":\"&MAX(A:A))),B:B),0))^365-1";
-		Ptg[] ptgs = FormulaParser.parse(formula, null);
+		Ptg[] ptgs = parseFormula(formula);
 
 		FuncVarPtg rowFunc = (FuncVarPtg) ptgs[10];
 		FuncVarPtg sumifFunc = (FuncVarPtg) ptgs[12];

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestRVA.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestRVA.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestRVA.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestRVA.java Fri Sep 19 00:32:34 2008
@@ -82,7 +82,7 @@
 
 	private void confirmCell(HSSFCell formulaCell, String formula, HSSFWorkbook wb) {
 		Ptg[] excelPtgs = FormulaExtractor.getPtgs(formulaCell);
-		Ptg[] poiPtgs = FormulaParser.parse(formula, wb);
+		Ptg[] poiPtgs = HSSFFormulaParser.parse(formula, wb);
 		int nExcelTokens = excelPtgs.length;
 		int nPoiTokens = poiPtgs.length;
 		if (nExcelTokens != nPoiTokens) {

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java Fri Sep 19 00:32:34 2008
@@ -20,7 +20,7 @@
 
 import junit.framework.TestCase;
 
-import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
@@ -87,7 +87,7 @@
 	private static String shiftAllColumnsBy1(String  formula) {
 		int letUsShiftColumn1By1Column=1;
 		HSSFWorkbook wb = null;
-		Ptg[] ptgs = FormulaParser.parse(formula, wb);
+		Ptg[] ptgs = HSSFFormulaParser.parse(formula, wb);
 		for(int i=0; i<ptgs.length; i++)
 		{
 			Ptg ptg = ptgs[i];
@@ -98,7 +98,7 @@
 				aptg.setLastColumn((short)(aptg.getLastColumn()+letUsShiftColumn1By1Column));
 			}
 		}
-		String newFormula = FormulaParser.toFormulaString(wb, ptgs);
+		String newFormula = HSSFFormulaParser.toFormulaString(wb, ptgs);
 		return newFormula;
 	}
 }

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestExternalFunctionFormulas.java Fri Sep 19 00:32:34 2008
@@ -24,12 +24,12 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 /**
  * Tests for functions from external workbooks (e.g. YEARFRAC).
  * 
@@ -52,7 +52,7 @@
 	
 	public void testParse() {
 		HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("externalFunctionExample.xls");
-		Ptg[] ptgs = FormulaParser.parse("YEARFRAC(B1,C1)", wb);
+		Ptg[] ptgs = HSSFFormulaParser.parse("YEARFRAC(B1,C1)", wb);
 		assertEquals(4, ptgs.length);
 		assertEquals(NameXPtg.class, ptgs[0].getClass());
 		

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestFuncVarPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestFuncVarPtg.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestFuncVarPtg.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestFuncVarPtg.java Fri Sep 19 00:32:34 2008
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 import junit.framework.AssertionFailedError;
@@ -36,7 +36,7 @@
 	 */
 	public void testOperandClass() {
 		HSSFWorkbook book = new HSSFWorkbook();
-		Ptg[] ptgs = FormulaParser.parse("sum(A1:A2)", book);
+		Ptg[] ptgs = HSSFFormulaParser.parse("sum(A1:A2)", book);
 		assertEquals(2, ptgs.length);
 		assertEquals(AreaPtg.class, ptgs[0].getClass());
 		

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestCircularReferences.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestCircularReferences.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestCircularReferences.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestCircularReferences.java Fri Sep 19 00:32:34 2008
@@ -25,7 +25,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 /**
  * Tests HSSFFormulaEvaluator for its handling of cell formula circular references.
  * 

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestExternalFunction.java Fri Sep 19 00:32:34 2008
@@ -28,7 +28,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 /**
  * 
  * @author Josh Micich

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulaBugs.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulaBugs.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulaBugs.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulaBugs.java Fri Sep 19 00:32:34 2008
@@ -30,7 +30,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Miscellaneous tests for bugzilla entries.<p/> The test name contains the

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestFormulasFromSpreadsheet.java Fri Sep 19 00:32:34 2008
@@ -25,12 +25,12 @@
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.record.formula.functions.TestMathX;
+import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.CellValue;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;;
 
 /**
  * Tests formulas and operators as loaded from a test data spreadsheet.<p/>
@@ -88,7 +88,7 @@
 		public static final int NUMBER_OF_ROWS_PER_FUNCTION = 4;
 	}
 
-	private Workbook workbook;
+	private HSSFWorkbook workbook;
 	private Sheet sheet;
 	// Note - multiple failures are aggregated before ending.  
 	// If one or more functions fail, a single AssertionFailedError is thrown at the end
@@ -105,7 +105,7 @@
 	}
 
 
-	private static void confirmExpectedResult(String msg, Cell expected, FormulaEvaluator.CellValue actual) {
+	private static void confirmExpectedResult(String msg, Cell expected, CellValue actual) {
 		if (expected == null) {
 			throw new AssertionFailedError(msg + " - Bad setup data expected value is null");
 		}
@@ -178,7 +178,7 @@
 	 * Typically pass <code>null</code> to test all functions
 	 */
 	private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) {
-		FormulaEvaluator evaluator = new FormulaEvaluator(workbook);
+		HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
 
 		int rowIndex = startRowIndex;
 		while (true) {
@@ -219,7 +219,7 @@
 	 * @return a constant from the local Result class denoting whether there were any evaluation
 	 * cases, and whether they all succeeded.
 	 */
-	private int processFunctionRow(FormulaEvaluator evaluator, String targetFunctionName, 
+	private int processFunctionRow(HSSFFormulaEvaluator evaluator, String targetFunctionName, 
 			Row formulasRow, Row expectedValuesRow) {
 		
 		int result = Result.NO_EVALUATIONS_FOUND; // so far
@@ -232,7 +232,7 @@
 				continue;
 			}
 
-			FormulaEvaluator.CellValue actualValue = evaluator.evaluate(c);
+			CellValue actualValue = evaluator.evaluate(c);
 
 			Cell expectedValueCell = getExpectedValueCell(expectedValuesRow, colnum);
 			try {

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java Fri Sep 19 00:32:34 2008
@@ -27,7 +27,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Test for percent operator evaluator.

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestParseMissingBuiltInFuncs.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestParseMissingBuiltInFuncs.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestParseMissingBuiltInFuncs.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/function/TestParseMissingBuiltInFuncs.java Fri Sep 19 00:32:34 2008
@@ -20,7 +20,7 @@
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
-import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.model.HSSFFormulaParser;
 import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
 import org.apache.poi.hssf.record.formula.FuncPtg;
 import org.apache.poi.hssf.record.formula.FuncVarPtg;
@@ -36,7 +36,7 @@
 
 	private static Ptg[] parse(String formula) {
 		HSSFWorkbook book = new HSSFWorkbook();
-		return FormulaParser.parse(formula, book);
+		return HSSFFormulaParser.parse(formula, book);
 	}
 	private static void confirmFunc(String formula, int expPtgArraySize, boolean isVarArgFunc, int funcIx) {
 		Ptg[] ptgs = parse(formula);
@@ -58,7 +58,7 @@
 		
 		// check that parsed Ptg array converts back to formula text OK
 		HSSFWorkbook book = new HSSFWorkbook();
-		String reRenderedFormula = FormulaParser.toFormulaString(book, ptgs);
+		String reRenderedFormula = HSSFFormulaParser.toFormulaString(book, ptgs);
 		assertEquals(formula, reRenderedFormula);
 	}
 	

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java Fri Sep 19 00:32:34 2008
@@ -34,7 +34,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Test cases for COUNT(), COUNTA() COUNTIF(), COUNTBLANK()

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestDate.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestDate.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestDate.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestDate.java Fri Sep 19 00:32:34 2008
@@ -76,7 +76,7 @@
 
     private void confirm(String formulaText, double expectedResult) {
         cell11.setCellFormula(formulaText);
-        evaluator.clearCache();
+        evaluator.clearAllCachedResultValues();
         double actualValue = evaluator.evaluate(cell11).getNumberValue();
         assertEquals(expectedResult, actualValue, 0);
     }

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIndexFunctionFromSpreadsheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIndexFunctionFromSpreadsheet.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIndexFunctionFromSpreadsheet.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIndexFunctionFromSpreadsheet.java Fri Sep 19 00:32:34 2008
@@ -31,7 +31,7 @@
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Tests INDEX() as loaded from a test data spreadsheet.<p/>
@@ -66,7 +66,7 @@
 
 
 
-	private static void confirmExpectedResult(String msg, HSSFCell expected, HSSFFormulaEvaluator.CellValue actual) {
+	private static void confirmExpectedResult(String msg, HSSFCell expected, CellValue actual) {
 		if (expected == null) {
 			throw new AssertionFailedError(msg + " - Bad setup data expected value is null");
 		}

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIsBlank.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIsBlank.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIsBlank.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestIsBlank.java Fri Sep 19 00:32:34 2008
@@ -24,7 +24,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 /**
  * Tests for Excel function ISBLANK()
  * 

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLookupFunctionsFromSpreadsheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLookupFunctionsFromSpreadsheet.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLookupFunctionsFromSpreadsheet.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestLookupFunctionsFromSpreadsheet.java Fri Sep 19 00:32:34 2008
@@ -30,8 +30,8 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
 import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Tests lookup functions (VLOOKUP, HLOOKUP, LOOKUP, MATCH) as loaded from a test data spreadsheet.<p/>

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java Fri Sep 19 00:32:34 2008
@@ -25,8 +25,8 @@
 import org.apache.poi.hssf.record.FormulaRecord;
 import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
 import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
 import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * 

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFFormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFFormulaEvaluator.java?rev=696961&r1=696960&r2=696961&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFFormulaEvaluator.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFFormulaEvaluator.java Fri Sep 19 00:32:34 2008
@@ -17,10 +17,10 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.HSSFTestDataSamples;
-import org.apache.poi.ss.usermodel.FormulaEvaluator.CellValue;
-
 import junit.framework.TestCase;
+
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.ss.usermodel.CellValue;
 /**
  * 
  * @author Josh Micich

Propchange: poi/branches/ooxml/src/testcases/org/apache/poi/ss/
------------------------------------------------------------------------------
--- svn:mergeinfo (added)
+++ svn:mergeinfo Fri Sep 19 00:32:34 2008
@@ -0,0 +1 @@
+/poi/trunk/src/testcases/org/apache/poi/ss:693591-694881,695264-695420,695621,695649-696813



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org


Mime
View raw message