You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by jo...@apache.org on 2008/09/18 23:22:25 UTC

svn commit: r696813 - in /poi/trunk/src: java/org/apache/poi/hssf/dev/ java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/formula/ java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/ss/ java/org/apache/poi/ss/formula/ testcases/org/ap...

Author: josh
Date: Thu Sep 18 14:22:23 2008
New Revision: 696813

URL: http://svn.apache.org/viewvc?rev=696813&view=rev
Log:
Partitioning common formula logic.  Introduced FormulaRenderingWorkbook interface to make merge with ooxml branch easier

Added:
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
    poi/trunk/src/java/org/apache/poi/ss/
    poi/trunk/src/java/org/apache/poi/ss/formula/
    poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderer.java
    poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java
    poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookDependentFormula.java
    poi/trunk/src/java/org/apache/poi/ss/formula/package.html
Modified:
    poi/trunk/src/java/org/apache/poi/hssf/dev/FormulaViewer.java
    poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExternSheetNameResolver.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/NamePtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperandPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ptg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/TblPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
    poi/trunk/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
    poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
    poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
    poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParserIf.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSharedFormulaRecord.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArea3DPtg.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java
    poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestRef3DPtg.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorBugs.java
    poi/trunk/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/dev/FormulaViewer.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/dev/FormulaViewer.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/dev/FormulaViewer.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/dev/FormulaViewer.java Thu Sep 18 14:22:23 2008
@@ -97,7 +97,7 @@
             StringBuffer buf = new StringBuffer();
             
             if (token instanceof ExpPtg) return;
-            buf.append(((OperationPtg) token).toFormulaString((HSSFWorkbook)null));
+            buf.append(((OperationPtg) token).toFormulaString());
             buf.append(sep);
             switch (token.getPtgClass()) {
                 case Ptg.CLASS_REF :
@@ -161,7 +161,7 @@
 		Ptg[] tokens = record.getParsedExpression();
 		for (int i = 0; i < tokens.length; i++) {
 			Ptg token = tokens[i];
-            buf.append( token.toFormulaString((HSSFWorkbook)null));
+            buf.append( token.toFormulaString());
             switch (token.getPtgClass()) {
                 case Ptg.CLASS_REF :
                     buf.append("(R)");

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/FormulaParser.java Thu Sep 18 14:22:23 2008
@@ -19,21 +19,53 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Stack;
 
-//import PTGs .. since we need everything, import *
 import org.apache.poi.hssf.record.UnicodeString;
 import org.apache.poi.hssf.record.constant.ErrorConstant;
-import org.apache.poi.hssf.record.formula.*;
+import org.apache.poi.hssf.record.formula.AbstractFunctionPtg;
+import org.apache.poi.hssf.record.formula.AddPtg;
+import org.apache.poi.hssf.record.formula.Area3DPtg;
+import org.apache.poi.hssf.record.formula.AreaPtg;
+import org.apache.poi.hssf.record.formula.ArrayPtg;
+import org.apache.poi.hssf.record.formula.BoolPtg;
+import org.apache.poi.hssf.record.formula.ConcatPtg;
+import org.apache.poi.hssf.record.formula.DividePtg;
+import org.apache.poi.hssf.record.formula.EqualPtg;
+import org.apache.poi.hssf.record.formula.ErrPtg;
+import org.apache.poi.hssf.record.formula.FuncPtg;
+import org.apache.poi.hssf.record.formula.FuncVarPtg;
+import org.apache.poi.hssf.record.formula.GreaterEqualPtg;
+import org.apache.poi.hssf.record.formula.GreaterThanPtg;
+import org.apache.poi.hssf.record.formula.IntPtg;
+import org.apache.poi.hssf.record.formula.LessEqualPtg;
+import org.apache.poi.hssf.record.formula.LessThanPtg;
+import org.apache.poi.hssf.record.formula.MissingArgPtg;
+import org.apache.poi.hssf.record.formula.MultiplyPtg;
+import org.apache.poi.hssf.record.formula.NamePtg;
+import org.apache.poi.hssf.record.formula.NameXPtg;
+import org.apache.poi.hssf.record.formula.NotEqualPtg;
+import org.apache.poi.hssf.record.formula.NumberPtg;
+import org.apache.poi.hssf.record.formula.ParenthesisPtg;
+import org.apache.poi.hssf.record.formula.PercentPtg;
+import org.apache.poi.hssf.record.formula.PowerPtg;
+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.SubtractPtg;
+import org.apache.poi.hssf.record.formula.UnaryMinusPtg;
+import org.apache.poi.hssf.record.formula.UnaryPlusPtg;
 import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
 import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
 import org.apache.poi.hssf.usermodel.HSSFName;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.util.AreaReference;
 import org.apache.poi.hssf.util.CellReference;
 import org.apache.poi.hssf.util.CellReference.NameType;
+import org.apache.poi.ss.formula.FormulaRenderer;
 
 /**
  * This class parses a formula string into a List of tokens in RPN order.
@@ -1001,94 +1033,6 @@
      * @return a human readable String
      */
     public static String toFormulaString(HSSFWorkbook book, Ptg[] ptgs) {
-        if (ptgs == null || ptgs.length == 0) {
-            // TODO - what is the justification for returning "#NAME" (which is not "#NAME?", btw)
-            return "#NAME";
-        }
-        Stack stack = new Stack();
-
-        for (int i=0 ; i < ptgs.length; i++) {
-            Ptg ptg = ptgs[i];
-            // TODO - what about MemNoMemPtg?
-            if(ptg instanceof MemAreaPtg || ptg instanceof MemFuncPtg || ptg instanceof MemErrPtg) {
-                // marks the start of a list of area expressions which will be naturally combined
-                // by their trailing operators (e.g. UnionPtg)
-                // TODO - put comment and throw exception in toFormulaString() of these classes
-                continue;
-            }
-            if (ptg instanceof ParenthesisPtg) {
-                String contents = (String)stack.pop();
-                stack.push ("(" + contents + ")");
-                continue;
-            }
-            if (ptg instanceof AttrPtg) {
-                AttrPtg attrPtg = ((AttrPtg) ptg);
-                if (attrPtg.isOptimizedIf() || attrPtg.isOptimizedChoose() || attrPtg.isGoto()) {
-                    continue;
-                }
-                if (attrPtg.isSpace()) {
-                    // POI currently doesn't render spaces in formulas
-                    continue;
-                    // but if it ever did, care must be taken:
-                    // tAttrSpace comes *before* the operand it applies to, which may be consistent
-                    // with how the formula text appears but is against the RPN ordering assumed here
-                }
-                if (attrPtg.isSemiVolatile()) {
-                    // similar to tAttrSpace - RPN is violated
-                    continue;
-                }
-                if (attrPtg.isSum()) {
-                    String[] operands = getOperands(stack, attrPtg.getNumberOfOperands());
-                    stack.push(attrPtg.toFormulaString(operands));
-                    continue;
-                }
-                throw new RuntimeException("Unexpected tAttr: " + attrPtg.toString());
-            }
-
-            if (! (ptg instanceof OperationPtg)) {
-                stack.push(ptg.toFormulaString(book));
-                continue;
-            }
-
-            OperationPtg o = (OperationPtg) ptg;
-            String[] operands = getOperands(stack, o.getNumberOfOperands());
-            stack.push(o.toFormulaString(operands));
-        }
-        if(stack.isEmpty()) {
-            // inspection of the code above reveals that every stack.pop() is followed by a
-            // stack.push(). So this is either an internal error or impossible.
-            throw new IllegalStateException("Stack underflow");
-        }
-        String result = (String) stack.pop();
-        if(!stack.isEmpty()) {
-            // Might be caused by some tokens like AttrPtg and Mem*Ptg, which really shouldn't
-            // put anything on the stack
-            throw new IllegalStateException("too much stuff left on the stack");
-        }
-        return result;
-    }
-
-    private static String[] getOperands(Stack stack, int nOperands) {
-        String[] operands = new String[nOperands];
-
-        for (int j = nOperands-1; j >= 0; j--) { // reverse iteration because args were pushed in-order
-            if(stack.isEmpty()) {
-               String msg = "Too few arguments supplied to operation. Expected (" + nOperands
-                    + ") operands but got (" + (nOperands - j - 1) + ")";
-                throw new IllegalStateException(msg);
-            }
-            operands[j] = (String) stack.pop();
-        }
-        return operands;
-    }
-    /**
-     * Static method to convert an array of Ptgs in RPN order
-     *  to a human readable string format in infix mode. Works
-     *  on the current workbook for named and 3D references.
-     * @param ptgs  array of Ptg, can be null or empty
-     * @return a human readable String
-     */
-    public String toFormulaString(Ptg[] ptgs) {
-        return toFormulaString(book, ptgs);
+        return FormulaRenderer.toFormulaString(HSSFEvaluationWorkbook.create(book), ptgs);
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/AbstractFunctionPtg.java Thu Sep 18 14:22:23 2008
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.formula.function.FunctionMetadata;
 import org.apache.poi.hssf.record.formula.function.FunctionMetadataRegistry;
 
@@ -71,7 +70,7 @@
         return field_2_fnc_index == FUNCTION_INDEX_EXTERNAL;
     }
 
-    public String toFormulaString(HSSFWorkbook book) {
+    public String toFormulaString() {
         return getName();
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area2DPtgBase.java Thu Sep 18 14:22:23 2008
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -45,7 +44,7 @@
 	public final int getSize() {
 		return SIZE;
 	}
-	public final String toFormulaString(HSSFWorkbook book) {
+	public final String toFormulaString() {
     	return formatReferenceAsString();
 	}
     public final String toString() {

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java Thu Sep 18 14:22:23 2008
@@ -19,6 +19,8 @@
 
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -30,7 +32,7 @@
  * @author Jason Height (jheight at chariot dot net dot au)
  * @version 1.0-pre
  */
-public final class Area3DPtg extends AreaPtgBase {
+public final class Area3DPtg extends AreaPtgBase implements WorkbookDependentFormula {
 	public final static byte sid = 0x3b;
 	private final static int SIZE = 11; // 10 + 1 for Ptg
 	
@@ -87,7 +89,10 @@
 	 * @return text representation of this area reference that can be used in text
 	 *  formulas. The sheet name will get properly delimited if required.
 	 */
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString(FormulaRenderingWorkbook book) {
 		return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
 	}
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaErrPtg.java Thu Sep 18 14:22:23 2008
@@ -19,7 +19,6 @@
 
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -49,7 +48,7 @@
 		LittleEndian.putInt(array, offset + 5, unused2);
 	}
 
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString() {
 		return HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF);
 	}
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/AreaPtgBase.java Thu Sep 18 14:22:23 2008
@@ -17,14 +17,12 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-import org.apache.poi.util.BitFieldFactory;
-
+import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.util.AreaReference;
 import org.apache.poi.hssf.util.CellReference;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.util.BitField;
+import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * Specifies a rectangular area of cells A1:A4 for instance.
@@ -269,7 +267,7 @@
         return topLeft.formatAsString() + ":" + botRight.formatAsString(); 
     }
     
-    public String toFormulaString(HSSFWorkbook book) {
+    public String toFormulaString() {
         return formatReferenceAsString();
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ArrayPtg.java Thu Sep 18 14:22:23 2008
@@ -184,7 +184,7 @@
 			+ ConstantValueParser.getEncodedSize(token_3_arrayValues);
 	}
 
-	public String formatAsString() {
+	public String formatAsString() { // TODO - fold into toFormulaString
 		StringBuffer b = new StringBuffer();
 		b.append("{");
 	  	for (int y=0;y<getRowCount();y++) {
@@ -202,7 +202,7 @@
 		b.append("}");
 		return b.toString();
 	}
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString() {
 		return formatAsString();
 	}
 	

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/AttrPtg.java Thu Sep 18 14:22:23 2008
@@ -17,12 +17,10 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
-
-import org.apache.poi.util.LittleEndian;
 import org.apache.poi.util.BitField;
 import org.apache.poi.util.BitFieldFactory;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * "Special Attributes"
@@ -244,11 +242,11 @@
         if(space.isSet(field_1_options)) {
             return operands[ 0 ];
         } else if (optiIf.isSet(field_1_options)) {
-            return toFormulaString((HSSFWorkbook)null) + "(" + operands[ 0 ]             +")";
+            return toFormulaString() + "(" + operands[ 0 ]             +")";
         } else if (optGoto.isSet(field_1_options)) {
-            return toFormulaString((HSSFWorkbook)null) + operands[0];   //goto isn't a real formula element should not show up
+            return toFormulaString() + operands[0];   //goto isn't a real formula element should not show up
         } else {
-            return toFormulaString((HSSFWorkbook)null) + "(" + operands[ 0 ] + ")";
+            return toFormulaString() + "(" + operands[ 0 ] + ")";
         }
     }
   
@@ -263,7 +261,7 @@
         return -1;
     }
         
-   public String toFormulaString(HSSFWorkbook book) {
+   public String toFormulaString() {
       if(semiVolatile.isSet(field_1_options)) {
         return "ATTR(semiVolatile)";
       }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/BoolPtg.java Thu Sep 18 14:22:23 2008
@@ -52,7 +52,7 @@
         return SIZE;
     }
 
-    protected String toFormulaString() {
+    public String toFormulaString() {
         return _value ? "TRUE" : "FALSE";
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java Thu Sep 18 14:22:23 2008
@@ -19,7 +19,8 @@
 
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -29,7 +30,7 @@
  * @author Patrick Luby
  * @version 1.0-pre
  */
-public final class DeletedArea3DPtg extends OperandPtg {
+public final class DeletedArea3DPtg extends OperandPtg implements WorkbookDependentFormula {
 	public final static byte sid = 0x3d;
 	private final int field_1_index_extern_sheet;
 	private final int unused1;
@@ -46,10 +47,13 @@
 		unused1 = in.readInt();
 		unused2 = in.readInt();
 	}
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString(FormulaRenderingWorkbook book) {
 		return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, 
 				HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF));
 	}
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
+	}
 	public byte getDefaultOperandClass() {
 		return Ptg.CLASS_REF;
 	}

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java Thu Sep 18 14:22:23 2008
@@ -20,7 +20,8 @@
 
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -30,7 +31,7 @@
  * @author Patrick Luby
  * @version 1.0-pre
  */
-public final class DeletedRef3DPtg extends OperandPtg {
+public final class DeletedRef3DPtg extends OperandPtg implements WorkbookDependentFormula {
 	public final static byte sid  = 0x3c;
 	private final int field_1_index_extern_sheet;
 	private final int unused1;
@@ -46,10 +47,13 @@
 		unused1 = 0;
 	}
 
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString(FormulaRenderingWorkbook book) {
 		return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, 
 				HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF));
 	}
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
+	}
 	public byte getDefaultOperandClass() {
 		return Ptg.CLASS_REF;
 	}

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java Thu Sep 18 14:22:23 2008
@@ -67,7 +67,7 @@
         array[offset + 1] = (byte)field_1_error_code;
     }
 
-    protected String toFormulaString() {
+    public String toFormulaString() {
         return HSSFErrorConstants.getText(field_1_error_code);
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java Thu Sep 18 14:22:23 2008
@@ -17,10 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordFormatException;
 import org.apache.poi.hssf.record.RecordInputStream;
-
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -61,7 +59,7 @@
       return field_2_first_col;
     }    
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         throw new RecordFormatException("Coding Error: Expected ExpPtg to be converted from Shared to Non-Shared Formula by ValueRecordsAggregate, but it wasn't");
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExternSheetNameResolver.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExternSheetNameResolver.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExternSheetNameResolver.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ExternSheetNameResolver.java Thu Sep 18 14:22:23 2008
@@ -17,8 +17,7 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 
 /**
  * @author Josh Micich
@@ -29,8 +28,8 @@
 		// no instances of this class
 	}
 
-	public static String prependSheetName(HSSFWorkbook book, int field_1_index_extern_sheet, String cellRefText) {
-		String sheetName = book.findSheetNameFromExternSheet(field_1_index_extern_sheet);
+	public static String prependSheetName(FormulaRenderingWorkbook book, int field_1_index_extern_sheet, String cellRefText) {
+		String sheetName = book.getSheetNameByExternSheet(field_1_index_extern_sheet);
 		StringBuffer sb = new StringBuffer(sheetName.length() + cellRefText.length() + 4);
 		if (sheetName.length() < 1) {
 			// What excel does if sheet has been deleted

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntPtg.java Thu Sep 18 14:22:23 2008
@@ -68,7 +68,7 @@
         return SIZE;
     }
 
-    protected String toFormulaString() {
+    public String toFormulaString() {
         return String.valueOf(getValue());
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/IntersectionPtg.java Thu Sep 18 14:22:23 2008
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
@@ -46,7 +45,7 @@
     }
 
     /** Implementation of method from Ptg */
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return " ";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemAreaPtg.java Thu Sep 18 14:22:23 2008
@@ -17,9 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
@@ -74,7 +73,7 @@
         return SIZE;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return ""; // TODO: Not sure how to format this. -- DN
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemErrPtg.java Thu Sep 18 14:22:23 2008
@@ -45,7 +45,7 @@
         array[offset] = (byte) (sid + getPtgClass());
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return "ERR#";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/MemFuncPtg.java Thu Sep 18 14:22:23 2008
@@ -17,9 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
@@ -51,7 +50,7 @@
         LittleEndian.putUShort( array, offset + 1, field_1_len_ref_subexpression );
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return "";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/MissingArgPtg.java Thu Sep 18 14:22:23 2008
@@ -42,7 +42,7 @@
         return SIZE;
     }
    
-    protected String toFormulaString() {
+    public String toFormulaString() {
         return " ";
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/NamePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/NamePtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/NamePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/NamePtg.java Thu Sep 18 14:22:23 2008
@@ -18,8 +18,8 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFName;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -27,7 +27,7 @@
  * @author  andy
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-public final class NamePtg extends OperandPtg {
+public final class NamePtg extends OperandPtg implements WorkbookDependentFormula {
     public final static short sid  = 0x23;
     private final static int  SIZE = 5;
     /** one-based index to defined name record */
@@ -65,10 +65,13 @@
         return SIZE;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString(FormulaRenderingWorkbook book)
     {
-    	return book.getNameName(field_1_label_index - 1);
+    	return book.getNameText(this);
     }
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
+	}
     
     public byte getDefaultOperandClass() {
 		return Ptg.CLASS_REF;

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/NameXPtg.java Thu Sep 18 14:22:23 2008
@@ -17,15 +17,16 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * 
  * @author aviks
  */
-public final class NameXPtg extends OperandPtg {
+public final class NameXPtg extends OperandPtg implements WorkbookDependentFormula {
 	public final static short sid = 0x39;
 	private final static int SIZE = 7;
 
@@ -65,9 +66,12 @@
 		return SIZE;
 	}
 
-	public String toFormulaString(HSSFWorkbook book) {
+	public String toFormulaString(FormulaRenderingWorkbook book) {
 		// -1 to convert definedNameIndex from 1-based to zero-based
-		return book.resolveNameXText(_sheetRefIndex, _nameNumber - 1);
+		return book.resolveNameXText(this);
+	}
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
 	}
 
 	public byte getDefaultOperandClass() {

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/NumberPtg.java Thu Sep 18 14:22:23 2008
@@ -63,7 +63,7 @@
         return SIZE;
     }
 
-    protected String toFormulaString() {
+    public String toFormulaString() {
         // TODO - java's rendering of double values is not quite same as excel's
         return String.valueOf(field_1_value);
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperandPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperandPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperandPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperandPtg.java Thu Sep 18 14:22:23 2008
@@ -17,6 +17,7 @@
 
 package org.apache.poi.hssf.record.formula;
 
+
 /**
  * @author Josh Micich
  */

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/OperationPtg.java Thu Sep 18 14:22:23 2008
@@ -17,6 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+
 /**
  * defines a Ptg that is an operation instead of an operand
  * @author  andy
@@ -46,5 +48,10 @@
     	// TODO remove "int getType();" from Eval hierarchy
     	throw new RuntimeException("remove this method");
     }
+
+	public String toFormulaString(FormulaRenderingWorkbook book) {
+		// TODO Auto-generated method stub
+		return null;
+	}
     
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ParenthesisPtg.java Thu Sep 18 14:22:23 2008
@@ -18,10 +18,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import java.util.List;
-
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
 
 /**
  * While formula tokens are stored in RPN order and thus do not need parenthesis for 
@@ -52,7 +48,7 @@
         return SIZE;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return "()";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ptg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ptg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ptg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ptg.java Thu Sep 18 14:22:23 2008
@@ -305,7 +305,7 @@
 	/**
 	 * return a string representation of this token alone
 	 */
-	public abstract String toFormulaString(HSSFWorkbook book);
+	public abstract String toFormulaString();
 	/**
 	 * dump a debug representation (hexdump) to a string
 	 */

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/RangePtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/RangePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/RangePtg.java Thu Sep 18 14:22:23 2008
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
@@ -46,7 +45,7 @@
         array[ offset + 0 ] = sid;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return ":";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref2DPtgBase.java Thu Sep 18 14:22:23 2008
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -49,7 +48,7 @@
     	LittleEndian.putByte(array, offset+0, getSid() + getPtgClass());
     	writeCoordinates(array, offset+1);
     }
-    public final String toFormulaString(HSSFWorkbook book) {
+    public final String toFormulaString() {
     	return formatReferenceAsString();
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java Thu Sep 18 14:22:23 2008
@@ -20,6 +20,8 @@
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.util.CellReference;
+import org.apache.poi.ss.formula.WorkbookDependentFormula;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -30,7 +32,7 @@
  * @author Jason Height (jheight at chariot dot net dot au)
  * @version 1.0-pre
  */
-public final class Ref3DPtg extends RefPtgBase {
+public final class Ref3DPtg extends RefPtgBase implements WorkbookDependentFormula {
     public final static byte sid  = 0x3a;
 
     private final static int  SIZE = 7; // 6 + 1 for Ptg
@@ -86,7 +88,10 @@
      * @return text representation of this cell reference that can be used in text 
      * formulas. The sheet name will get properly delimited if required.
      */
-    public String toFormulaString(HSSFWorkbook book) {
+    public String toFormulaString(FormulaRenderingWorkbook book) {
 		return ExternSheetNameResolver.prependSheetName(book, field_1_index_extern_sheet, formatReferenceAsString());
     }
+	public String toFormulaString() {
+		throw new RuntimeException("3D references need a workbook to determine formula text");
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java Thu Sep 18 14:22:23 2008
@@ -53,7 +53,7 @@
         return SIZE;
     }
 
-    public String toFormulaString(HSSFWorkbook book) {
+    public String toFormulaString() {
         return HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF);
     }
     

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ScalarConstantPtg.java Thu Sep 18 14:22:23 2008
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * @author Josh Micich
@@ -31,12 +30,6 @@
 		return Ptg.CLASS_VALUE;
 	}
 
-	public final String toFormulaString(HSSFWorkbook book) {
-		return toFormulaString();
-	}
-
-	protected abstract String toFormulaString();
-
 	public final String toString() {
 		StringBuffer sb = new StringBuffer(64);
 		sb.append(getClass().getName()).append(" [");

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/StringPtg.java Thu Sep 18 14:22:23 2008
@@ -97,7 +97,7 @@
         }
     }
 
-    protected String toFormulaString() {
+    public String toFormulaString() {
         String value = field_3_string;
         int len = value.length();
         StringBuffer sb = new StringBuffer(len + 4);

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/TblPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/TblPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/TblPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/TblPtg.java Thu Sep 18 14:22:23 2008
@@ -17,10 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordFormatException;
 import org.apache.poi.hssf.record.RecordInputStream;
-
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -68,7 +66,7 @@
       return field_2_first_col;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         // table(....)[][]
         throw new RecordFormatException("Table and Arrays are not yet supported");

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java Thu Sep 18 14:22:23 2008
@@ -17,7 +17,6 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
@@ -45,7 +44,7 @@
         array[ offset + 0 ] = sid;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return ",";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java Thu Sep 18 14:22:23 2008
@@ -16,7 +16,6 @@
 ==================================================================== */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
 
 /**
@@ -49,7 +48,7 @@
         return size;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
+    public String toFormulaString()
     {
         return "UNKNOWN";
     }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/ValueOperatorPtg.java Thu Sep 18 14:22:23 2008
@@ -47,7 +47,7 @@
 	public final int getSize() {
 		return 1;
 	}
-    public final String toFormulaString(HSSFWorkbook book) {
+    public final String toFormulaString() {
     	// TODO - prune this method out of the hierarchy
     	throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs");
 	}

Added: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java?rev=696813&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java Thu Sep 18 14:22:23 2008
@@ -0,0 +1,38 @@
+package org.apache.poi.hssf.usermodel;
+
+import org.apache.poi.hssf.model.Workbook;
+import org.apache.poi.hssf.record.formula.NamePtg;
+import org.apache.poi.hssf.record.formula.NameXPtg;
+import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+
+/**
+ * Internal POI use only
+ * 
+ * @author Josh Micich
+ */
+public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook {
+
+	private final Workbook _iBook;
+	
+	public static HSSFEvaluationWorkbook create(HSSFWorkbook book) {
+		if (book == null) {
+			return null;
+		}
+		return new HSSFEvaluationWorkbook(book);
+	}
+
+	private HSSFEvaluationWorkbook(HSSFWorkbook book) {
+		_iBook = book.getWorkbook();
+	}
+
+	public String resolveNameXText(NameXPtg n) {
+		return _iBook.resolveNameXText(n.getSheetRefIndex(), n.getNameIndex());
+	}
+
+	public String getSheetNameByExternSheet(int externSheetIndex) {
+		return _iBook.findSheetNameFromExternSheet(externSheetIndex);
+	}
+	public String getNameText(NamePtg namePtg) {
+		return _iBook.getNameRecord(namePtg.getIndex()).getNameText();
+	}
+}

Added: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderer.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderer.java?rev=696813&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderer.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderer.java Thu Sep 18 14:22:23 2008
@@ -0,0 +1,124 @@
+package org.apache.poi.ss.formula;
+
+import java.util.List;
+import java.util.Stack;
+
+import org.apache.poi.hssf.record.formula.AttrPtg;
+import org.apache.poi.hssf.record.formula.MemAreaPtg;
+import org.apache.poi.hssf.record.formula.MemErrPtg;
+import org.apache.poi.hssf.record.formula.MemFuncPtg;
+import org.apache.poi.hssf.record.formula.OperationPtg;
+import org.apache.poi.hssf.record.formula.ParenthesisPtg;
+import org.apache.poi.hssf.record.formula.Ptg;
+
+public class FormulaRenderer {
+    /**
+     * Convenience method which takes in a list then passes it to the
+     *  other toFormulaString signature.
+     * @param book   workbook for 3D and named references
+     * @param lptgs  list of Ptg, can be null or empty
+     * @return a human readable String
+     */
+    public static String toFormulaString(FormulaRenderingWorkbook book, List lptgs) {
+        String retval = null;
+        if (lptgs == null || lptgs.size() == 0) return "#NAME";
+        Ptg[] ptgs = new Ptg[lptgs.size()];
+        ptgs = (Ptg[])lptgs.toArray(ptgs);
+        retval = toFormulaString(book, ptgs);
+        return retval;
+    }
+    
+    /**
+     * Static method to convert an array of Ptgs in RPN order
+     * to a human readable string format in infix mode.
+     * @param book  workbook for named and 3D references
+     * @param ptgs  array of Ptg, can be null or empty
+     * @return a human readable String
+     */
+    public static String toFormulaString(FormulaRenderingWorkbook book, Ptg[] ptgs) {
+        if (ptgs == null || ptgs.length == 0) {
+            // TODO - what is the justification for returning "#NAME" (which is not "#NAME?", btw)
+            return "#NAME";
+        }
+        Stack stack = new Stack();
+
+        for (int i=0 ; i < ptgs.length; i++) {
+            Ptg ptg = ptgs[i];
+            // TODO - what about MemNoMemPtg?
+            if(ptg instanceof MemAreaPtg || ptg instanceof MemFuncPtg || ptg instanceof MemErrPtg) {
+                // marks the start of a list of area expressions which will be naturally combined
+                // by their trailing operators (e.g. UnionPtg)
+                // TODO - put comment and throw exception in toFormulaString() of these classes
+                continue;
+            }
+            if (ptg instanceof ParenthesisPtg) {
+                String contents = (String)stack.pop();
+                stack.push ("(" + contents + ")");
+                continue;
+            }
+            if (ptg instanceof AttrPtg) {
+                AttrPtg attrPtg = ((AttrPtg) ptg);
+                if (attrPtg.isOptimizedIf() || attrPtg.isOptimizedChoose() || attrPtg.isGoto()) {
+                    continue;
+                }
+                if (attrPtg.isSpace()) {
+                    // POI currently doesn't render spaces in formulas
+                    continue;
+                    // but if it ever did, care must be taken:
+                    // tAttrSpace comes *before* the operand it applies to, which may be consistent
+                    // with how the formula text appears but is against the RPN ordering assumed here
+                }
+                if (attrPtg.isSemiVolatile()) {
+                    // similar to tAttrSpace - RPN is violated
+                    continue;
+                }
+                if (attrPtg.isSum()) {
+                    String[] operands = getOperands(stack, attrPtg.getNumberOfOperands());
+                    stack.push(attrPtg.toFormulaString(operands));
+                    continue;
+                }
+                throw new RuntimeException("Unexpected tAttr: " + attrPtg.toString());
+            }
+
+            if (ptg instanceof WorkbookDependentFormula) {
+                WorkbookDependentFormula optg = (WorkbookDependentFormula) ptg;
+				stack.push(optg.toFormulaString(book));
+                continue;
+            }
+            if (! (ptg instanceof OperationPtg)) {
+                stack.push(ptg.toFormulaString());
+                continue;
+            }
+
+            OperationPtg o = (OperationPtg) ptg;
+            String[] operands = getOperands(stack, o.getNumberOfOperands());
+            stack.push(o.toFormulaString(operands));
+        }
+        if(stack.isEmpty()) {
+            // inspection of the code above reveals that every stack.pop() is followed by a
+            // stack.push(). So this is either an internal error or impossible.
+            throw new IllegalStateException("Stack underflow");
+        }
+        String result = (String) stack.pop();
+        if(!stack.isEmpty()) {
+            // Might be caused by some tokens like AttrPtg and Mem*Ptg, which really shouldn't
+            // put anything on the stack
+            throw new IllegalStateException("too much stuff left on the stack");
+        }
+        return result;
+    }
+
+    private static String[] getOperands(Stack stack, int nOperands) {
+        String[] operands = new String[nOperands];
+
+        for (int j = nOperands-1; j >= 0; j--) { // reverse iteration because args were pushed in-order
+            if(stack.isEmpty()) {
+               String msg = "Too few arguments supplied to operation. Expected (" + nOperands
+                    + ") operands but got (" + (nOperands - j - 1) + ")";
+                throw new IllegalStateException(msg);
+            }
+            operands[j] = (String) stack.pop();
+        }
+        return operands;
+    }
+}

Added: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java?rev=696813&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaRenderingWorkbook.java Thu Sep 18 14:22:23 2008
@@ -0,0 +1,11 @@
+package org.apache.poi.ss.formula;
+
+import org.apache.poi.hssf.record.formula.NamePtg;
+import org.apache.poi.hssf.record.formula.NameXPtg;
+
+public interface FormulaRenderingWorkbook {
+
+	String getSheetNameByExternSheet(int externSheetIndex);
+	String resolveNameXText(NameXPtg nameXPtg);
+	String getNameText(NamePtg namePtg);
+}

Added: poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookDependentFormula.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookDependentFormula.java?rev=696813&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookDependentFormula.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookDependentFormula.java Thu Sep 18 14:22:23 2008
@@ -0,0 +1,5 @@
+package org.apache.poi.ss.formula;
+
+public interface WorkbookDependentFormula {
+	String toFormulaString(FormulaRenderingWorkbook book);
+}

Added: poi/trunk/src/java/org/apache/poi/ss/formula/package.html
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/package.html?rev=696813&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/package.html (added)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/package.html Thu Sep 18 14:22:23 2008
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<!--
+   ====================================================================
+   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.
+   ====================================================================
+-->
+<html>
+<head>
+</head>
+<body bgcolor="white">
+
+This package contains common internal POI code for manipulating formulas.
+Client applications should not refer to these classes directly.
+
+</body>
+</html>

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/eventusermodel/TestEventWorkbookBuilder.java Thu Sep 18 14:22:23 2008
@@ -32,6 +32,7 @@
 import org.apache.poi.hssf.record.Record;
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 /**
@@ -110,7 +111,8 @@
 		assertTrue(ptgs[0] instanceof Ref3DPtg);
 		
 		Ref3DPtg ptg = (Ref3DPtg)ptgs[0];
-		assertEquals("Sheet1!A1", ptg.toFormulaString(stubHSSF));
+		HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(stubHSSF);
+		assertEquals("Sheet1!A1", ptg.toFormulaString(book));
 		
 		
 		// Now check we get the right formula back for

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Thu Sep 18 14:22:23 2008
@@ -51,6 +51,7 @@
 import org.apache.poi.hssf.record.formula.UnaryPlusPtg;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFName;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
@@ -130,13 +131,14 @@
 	public void testMacroFunction() {
 		// testNames.xls contains a VB function called 'myFunc'
 		HSSFWorkbook w = HSSFTestDataSamples.openSampleWorkbook("testNames.xls");
+		HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(w);
 
 		Ptg[] ptg = FormulaParser.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
 		NamePtg tname = (NamePtg) ptg[0];
-		assertEquals("myFunc", tname.toFormulaString(w));
+		assertEquals("myFunc", tname.toFormulaString(book));
 
 		AbstractFunctionPtg tfunc = (AbstractFunctionPtg) ptg[1];
 		assertTrue(tfunc.isExternalFunction());
@@ -871,7 +873,7 @@
 		assertEquals(2, ptgs.length);
 		Ptg ptg0 = ptgs[0];
 		assertEquals(ArrayPtg.class, ptg0.getClass());
-		assertEquals("{1.0,2.0,2.0,#REF!;FALSE,3.0,3.0,2.0}", ptg0.toFormulaString(null));
+		assertEquals("{1.0,2.0,2.0,#REF!;FALSE,3.0,3.0,2.0}", ptg0.toFormulaString());
 		
 		ArrayPtg aptg = (ArrayPtg) ptg0;
 		Object[][] values = aptg.getTokenArrayValues();

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParserIf.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParserIf.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParserIf.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestFormulaParserIf.java Thu Sep 18 14:22:23 2008
@@ -33,7 +33,6 @@
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.StringPtg;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * Tests <tt>FormulaParser</tt> specifically with respect to IF() functions
@@ -202,7 +201,7 @@
 		assertEquals(true, flag.getValue());
 		assertEquals("Y", y.getValue());
 		assertEquals("N", n.getValue());
-		assertEquals("IF", funif.toFormulaString((HSSFWorkbook) null));
+		assertEquals("IF", funif.toFormulaString());
 		assertTrue("Goto ptg exists", goto1.isGoto());
 	}
 	/**

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSharedFormulaRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSharedFormulaRecord.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSharedFormulaRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestSharedFormulaRecord.java Thu Sep 18 14:22:23 2008
@@ -66,7 +66,7 @@
 		Ptg[] convertedFormula = SharedFormulaRecord.convertSharedFormulas(sharedFormula, 100, 200);
 		
 		RefPtg refPtg = (RefPtg) convertedFormula[1];
-		assertEquals("$C101", refPtg.toFormulaString(null));
+		assertEquals("$C101", refPtg.toFormulaString());
 		if (refPtg.getPtgClass() == Ptg.CLASS_REF) {
 			throw new AssertionFailedError("Identified bug 45123");
 		}

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArea3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArea3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArea3DPtg.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArea3DPtg.java Thu Sep 18 14:22:23 2008
@@ -14,10 +14,10 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
 
 package org.apache.poi.hssf.record.formula;
 
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
@@ -27,21 +27,22 @@
  */
 public final class TestArea3DPtg extends AbstractPtgTestCase {
 
-    /**
-     * confirms that sheet names get properly escaped
-     */
+	/**
+	 * confirms that sheet names get properly escaped
+	 */
 	public void testToFormulaString() {
-		
+
 		Area3DPtg target = new Area3DPtg("A1:B1", (short)0);
-		
+
 		String sheetName = "my sheet";
-		HSSFWorkbook book = createWorkbookWithSheet(sheetName);
+		HSSFWorkbook wb = createWorkbookWithSheet(sheetName);
+		HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(wb);
 		assertEquals("'my sheet'!A1:B1", target.toFormulaString(book));
-		
-        book.setSheetName(0, "Sheet1");
-        assertEquals("Sheet1!A1:B1", target.toFormulaString(book));
-        
-        book.setSheetName(0, "C64");
-        assertEquals("'C64'!A1:B1", target.toFormulaString(book));
+
+		wb.setSheetName(0, "Sheet1");
+		assertEquals("Sheet1!A1:B1", target.toFormulaString(book));
+
+		wb.setSheetName(0, "C64");
+		assertEquals("'C64'!A1:B1", target.toFormulaString(book));
 	}
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java Thu Sep 18 14:22:23 2008
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.model.FormulaParser;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * Tests for {@link AreaPtg}.
@@ -83,14 +84,10 @@
 		assertEquals("Relative references changed", expectedFormula2, newFormula2);
 	}
 	
-	private String shiftAllColumnsBy1(String  formula)
-	{
+	private static String shiftAllColumnsBy1(String  formula) {
 		int letUsShiftColumn1By1Column=1;
-		
-		FormulaParser parser = new FormulaParser(formula,null);
-		parser.parse();
-
-		final Ptg[] ptgs = parser.getRPNPtg();
+		HSSFWorkbook wb = null;
+		Ptg[] ptgs = FormulaParser.parse(formula, wb);
 		for(int i=0; i<ptgs.length; i++)
 		{
 			Ptg ptg = ptgs[i];
@@ -101,10 +98,7 @@
 				aptg.setLastColumn((short)(aptg.getLastColumn()+letUsShiftColumn1By1Column));
 			}
 		}
-		String newFormula = parser.toFormulaString(ptgs);
+		String newFormula = FormulaParser.toFormulaString(wb, ptgs);
 		return newFormula;
 	}
-	
-	
-
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java Thu Sep 18 14:22:23 2008
@@ -119,7 +119,7 @@
 		
 		String actualFormula;
 		try {
-			actualFormula = ptg.toFormulaString(null);
+			actualFormula = ptg.toFormulaString();
 		} catch (IllegalArgumentException e) {
 			if (e.getMessage().equals("Unexpected constant class (java.lang.Boolean)")) {
 				throw new AssertionFailedError("Identified bug 45380");

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestRef3DPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestRef3DPtg.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestRef3DPtg.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestRef3DPtg.java Thu Sep 18 14:22:23 2008
@@ -14,10 +14,10 @@
    See the License for the specific language governing permissions and
    limitations under the License.
 ==================================================================== */
-        
 
 package org.apache.poi.hssf.record.formula;
 
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
@@ -28,17 +28,17 @@
 public final class TestRef3DPtg extends AbstractPtgTestCase {
 
 	public void testToFormulaString() {
-		
+
 		Ref3DPtg target = new Ref3DPtg("A1", (short)0);
-		
-		HSSFWorkbook book = createWorkbookWithSheet("my sheet");
-		
+
+		HSSFWorkbook wb = createWorkbookWithSheet("my sheet");
+		HSSFEvaluationWorkbook book = HSSFEvaluationWorkbook.create(wb);
 		assertEquals("'my sheet'!A1", target.toFormulaString(book));
 
-        book.setSheetName(0, "ProfitAndLoss");
-        assertEquals("ProfitAndLoss!A1", target.toFormulaString(book));
-        
-        book.setSheetName(0, "profit+loss");
-        assertEquals("'profit+loss'!A1", target.toFormulaString(book));
+		wb.setSheetName(0, "ProfitAndLoss");
+		assertEquals("ProfitAndLoss!A1", target.toFormulaString(book));
+
+		wb.setSheetName(0, "profit+loss");
+		assertEquals("'profit+loss'!A1", target.toFormulaString(book));
 	}
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorBugs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorBugs.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorBugs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorBugs.java Thu Sep 18 14:22:23 2008
@@ -202,7 +202,7 @@
 		assertEquals(2, ptg.getLastColumn());
 		assertEquals(0, ptg.getFirstRow());
 		assertEquals(65535, ptg.getLastRow());
-		assertEquals("C:C", ptg.toFormulaString(wb));
+		assertEquals("C:C", ptg.toFormulaString());
 
 		// Will show as C:C, but won't know how many
 		// rows it covers as we don't have the sheet
@@ -316,6 +316,7 @@
 		evaluator.evaluate(cell);
 		int evalCount = evaluator.getEvaluationCount();
 		// With caching, the evaluationCount is 8 which is a big improvement
+		assertTrue(evalCount > 0);  // make sure the counter is actually working
 		if (evalCount > 10) {
 			// Without caching, evaluating cell 'A9' takes 21845 evaluations which consumes
 			// much time (~3 sec on Core 2 Duo 2.2GHz)

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java?rev=696813&r1=696812&r2=696813&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java Thu Sep 18 14:22:23 2008
@@ -30,6 +30,7 @@
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.UnionPtg;
 import org.apache.poi.hssf.usermodel.HSSFCell;
+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
 import org.apache.poi.hssf.usermodel.HSSFName;
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
@@ -190,6 +191,7 @@
         InputStream is = HSSFTestDataSamples.openSampleFileStream("44167.xls");
         HSSFWB wb = new HSSFWB(is);
         Workbook workbook = wb.getWorkbook();
+        HSSFEvaluationWorkbook eb = HSSFEvaluationWorkbook.create(wb);
 
         assertEquals(1, wb.getNumberOfNames());
         String sheetName = "Tabelle1";
@@ -211,10 +213,10 @@
         Area3DPtg ptgB = (Area3DPtg)def[1];
         Area3DPtg ptgC = (Area3DPtg)def[2];
         UnionPtg ptgD = (UnionPtg)def[3];
-        assertEquals("", ptgA.toFormulaString(wb));
-        assertEquals(refA, ptgB.toFormulaString(wb));
-        assertEquals(refB, ptgC.toFormulaString(wb));
-        assertEquals(",", ptgD.toFormulaString(wb));
+        assertEquals("", ptgA.toFormulaString());
+        assertEquals(refA, ptgB.toFormulaString(eb));
+        assertEquals(refB, ptgC.toFormulaString(eb));
+        assertEquals(",", ptgD.toFormulaString());
 
         assertEquals(ref, nr.getAreaReference(wb));
 



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