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/06/07 02:53:03 UTC

svn commit: r664220 [2/3] - in /poi/trunk/src: documentation/content/xdocs/ java/org/apache/poi/hssf/model/ java/org/apache/poi/hssf/record/ java/org/apache/poi/hssf/record/formula/ java/org/apache/poi/hssf/record/formula/eval/ java/org/apache/poi/hssf...

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/NotEqualPtg.java Fri Jun  6 17:53:01 2008
@@ -1,4 +1,3 @@
-        
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -18,70 +17,36 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
 /**
  * Ptg class to implement not equal
  *
  * @author fred at stsci dot edu
  */
 public final class NotEqualPtg extends ValueOperatorPtg {
-    public final static int SIZE = 1;
     public final static byte sid = 0x0e;
 
-    /**
-     * Creates new NotEqualPtg
-     */
-    public NotEqualPtg()
-    {
-    }
-
-    public NotEqualPtg( RecordInputStream in )
-    {
-        // doesn't need anything
-    }
-
-    public void writeBytes( byte[] array, int offset )
-    {
-        array[offset + 0] = sid;
-    }
+    public static final ValueOperatorPtg instance = new NotEqualPtg();
 
-    public int getSize()
-    {
-        return SIZE;
+    private NotEqualPtg() {
+    	// enforce singleton
     }
-
-    public int getType()
-    {
-        return TYPE_BINARY;
+    
+    protected byte getSid() {
+    	return sid;
     }
 
-    public int getNumberOfOperands()
-    {
+    public int getNumberOfOperands() {
         return 2;
     }
 
-    public String toFormulaString( HSSFWorkbook book )
-    {
-        return "<>";
-    }
-
-    public String toFormulaString( String[] operands )
-    {
+    public String toFormulaString(String[] operands) {
         StringBuffer buffer = new StringBuffer();
 
         buffer.append( operands[0] );
 
-        buffer.append( toFormulaString( (HSSFWorkbook) null ) );
+        buffer.append("<>");
         buffer.append( operands[1] );
 
         return buffer.toString();
     }
-
-    public Object clone()
-    {
-        return new NotEqualPtg();
-    }
-
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -31,16 +31,12 @@
 public final class NumberPtg extends ScalarConstantPtg {
     public final static int  SIZE = 9;
     public final static byte sid  = 0x1f;
-    private double            field_1_value;
-
-    private NumberPtg() {
-      //Required for clone methods
-    }
+    private final double field_1_value;
         
     /** Create a NumberPtg from a byte array read from disk */
     public NumberPtg(RecordInputStream in)
     {
-        setValue(in.readDouble());
+        field_1_value = in.readDouble();
     }
     
     /** Create a NumberPtg from a string representation of  the number
@@ -49,13 +45,7 @@
      *  @param value : String representation of a floating point number
      */
     public NumberPtg(String value) {
-        setValue(Double.parseDouble(value));
-    }
-    
-    
-    public void setValue(double value)
-    {
-        field_1_value = value;
+        field_1_value = Double.parseDouble(value);
     }
     
     
@@ -79,10 +69,4 @@
     {
         return "" + getValue();
     }
-
-    public Object clone() {
-      NumberPtg ptg = new NumberPtg();
-      ptg.field_1_value = field_1_value;
-      return ptg;
-    }
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -17,21 +17,15 @@
 
 package org.apache.poi.hssf.record.formula;
 
-
-
 /**
  * defines a Ptg that is an operation instead of an operand
  * @author  andy
  */
-
-public abstract class OperationPtg extends Ptg
-{
+public abstract class OperationPtg extends Ptg {
     public final static int TYPE_UNARY    = 0;
     public final static int TYPE_BINARY   = 1;
     public final static int TYPE_FUNCTION = 2;
 
-    public abstract int getType();
-    
     /**
      *  returns a string representation of the operations
      *  the length of the input array should equal the number returned by 
@@ -45,6 +39,12 @@
      */
     public abstract int getNumberOfOperands();
     
-    public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
+    public byte getDefaultOperandClass() {
+		return Ptg.CLASS_VALUE;
+	}
+    public final int getType() {
+    	// TODO remove "int getType();" from Eval hierarchy
+    	throw new RuntimeException("remove this method");
+    }
     
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -37,18 +37,11 @@
     private final static int SIZE = 1;
     public final static byte sid  = 0x15;
    
-    public ParenthesisPtg()
-    {
-    }
-
-    public ParenthesisPtg(RecordInputStream in)
-    {
-
-        // doesn't need anything
+    public static final ControlPtg instance = new ParenthesisPtg();
+    private ParenthesisPtg() {
+    	// enforce singleton
     }
     
-  
-    
     public void writeBytes(byte [] array, int offset)
     {
         array[ offset + 0 ] = sid;
@@ -68,9 +61,4 @@
     public String toFormulaString(String[] operands) {
         return "("+operands[0]+")";
     }  
-        
-    public Object clone() {
-      return new ParenthesisPtg();
-    }
-
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/PercentPtg.java Fri Jun  6 17:53:01 2008
@@ -1,4 +1,3 @@
-
 /* ====================================================================
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
@@ -16,68 +15,33 @@
    limitations under the License.
 ==================================================================== */
 
-/*
- * PercentPtg.java
- *
- * Created on March 29, 2006, 9:23 PM
- */
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
 /**
  * Percent PTG.
  *
  * @author Daniel Noll (daniel at nuix.com.au)
  */
-
 public final class PercentPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x14;
     
     private final static String PERCENT = "%";
 
-    /** Creates new PercentPtg */
+    public static final ValueOperatorPtg instance = new PercentPtg();
 
-    public PercentPtg()
-    {
-    }
-
-    public PercentPtg(RecordInputStream in)
-    {
-
-        // doesn't need anything
+    private PercentPtg() {
+    	// enforce singleton
     }
     
-   
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[ offset + 0 ] = sid;
+    protected byte getSid() {
+    	return sid;
     }
 
-    public int getSize()
-    {
-        return SIZE;
-    }
-
-    public int getType()
-    {
-        return TYPE_UNARY;
-    }
-
-    public int getNumberOfOperands()
-    {
+    public int getNumberOfOperands() {
         return 1;
     }
-    
-    /** Implementation of method from Ptg */
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        return "%";
-    }
        
-   /** implementation of method from OperationsPtg*/  
     public String toFormulaString(String[] operands) {
         StringBuffer buffer = new StringBuffer();
 
@@ -85,9 +49,4 @@
         buffer.append(PERCENT);
         return buffer.toString();
     }
-    
-    public Object clone() {
-      return new PercentPtg();
-    }
-
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/PowerPtg.java Fri Jun  6 17:53:01 2008
@@ -17,53 +17,26 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
-
 /**
  *
  * @author  andy
  * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class PowerPtg extends ValueOperatorPtg {
-    public final static int  SIZE = 1;
     public final static byte sid  = 0x07;
 
-    /** Creates new AddPtg */
-
-   public PowerPtg()
-    {
-    }
-
-    public PowerPtg(RecordInputStream in)
-    {
-
-        // doesn't need anything
-    }
-
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[ offset + 0 ] = sid;
-    }
-
-    public int getSize()
-    {
-        return SIZE;
-    }
+    public static final ValueOperatorPtg instance = new PowerPtg();
 
-    public int getType()
-    {
-        return TYPE_BINARY;
+    private PowerPtg() {
+    	// enforce singleton
     }
-
-    public int getNumberOfOperands()
-    {
-        return 2;
+    
+    protected byte getSid() {
+    	return sid;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        return "^";
+    public int getNumberOfOperands() {
+        return 2; // TODO - 2 seems wrong (Jun 2008).  Maybe this method is not relevant
     }
  
     public String toFormulaString(String[] operands) {
@@ -71,13 +44,8 @@
 
         
         buffer.append(operands[ 0 ]);
-        buffer.append(toFormulaString((HSSFWorkbook)null));
+        buffer.append("^");
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }       
-
-    public Object clone() {
-      return new PowerPtg();
-    }
-
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -17,226 +17,243 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import java.util.List;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Stack;
 
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.hssf.record.RecordInputStream;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
+ * <tt>Ptg</tt> represents a syntactic token in a formula.  'PTG' is an acronym for 
+ * '<b>p</b>arse <b>t</b>hin<b>g</b>'.  Originally, the name referred to the single 
+ * byte identifier at the start of the token, but in POI, <tt>Ptg</tt> encapsulates
+ * the whole formula token (initial byte + value data).
+ * <p/>
+ * 
+ * <tt>Ptg</tt>s are logically arranged in a tree representing the structure of the
+ * parsed formula.  However, in BIFF files <tt>Ptg</tt>s are written/read in 
+ * <em>Reverse-Polish Notation</em> order. The RPN ordering also simplifies formula
+ * evaluation logic, so POI mostly accesses <tt>Ptg</tt>s in the same way.
  *
  * @author  andy
  * @author avik
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-public abstract class Ptg
-{
+public abstract class Ptg implements Cloneable {
 
+	/* convert infix order ptg list to rpn order ptg list
+	 * @return List ptgs in RPN order
+	 * @param infixPtgs List of ptgs in infix order
+	 */
+
+	/* DO NOT REMOVE
+	 *we keep this method in case we wish to change the way we parse
+	 *It needs a getPrecedence in OperationsPtg
+
+	public static List ptgsToRpn(List infixPtgs) {
+		java.util.Stack operands = new java.util.Stack();
+		java.util.List retval = new java.util.Stack();
+
+		java.util.ListIterator i = infixPtgs.listIterator();
+		Object p;
+		OperationPtg o ;
+		boolean weHaveABracket = false;
+		while (i.hasNext()) {
+			p=i.next();
+			if (p instanceof OperationPtg) {
+				if (p instanceof ParenthesisPtg) {
+					if (!weHaveABracket) {
+						operands.push(p);
+						weHaveABracket = true;
+					} else {
+						o = (OperationPtg) operands.pop();
+						while (!(o instanceof ParenthesisPtg)) {
+							retval.add(o);
+						}
+						weHaveABracket = false;
+					}
+				} else {
+
+					while  (!operands.isEmpty() && ((OperationPtg) operands.peek()).getPrecedence() >= ((OperationPtg) p).getPrecedence() ) { //TODO handle ^ since it is right associative
+						retval.add(operands.pop());
+					}
+					operands.push(p);
+				}
+			} else {
+				retval.add(p);
+			}
+		}
+		while (!operands.isEmpty()) {
+			if (operands.peek() instanceof ParenthesisPtg ){
+				//throw some error
+			} else {
+				retval.add(operands.pop());
+			}
+		}
+		return retval;
+	}
+	*/
+	
+	/**
+	 * Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
+	 * Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
+	 */
+	public static Ptg[] readTokens(int size, RecordInputStream in) {
+		Stack temp = createParsedExpressionTokens((short)size, in);
+		return toPtgArray(temp);
+	}
+
+	/**
+	 * @deprecated - use readTokens()
+	 */
+	public static Stack createParsedExpressionTokens(short size, RecordInputStream in)
+	{
+		Stack stack = new Stack();
+		int pos = 0;
+		List arrayPtgs = null;
+		while ( pos < size )
+		{
+			Ptg ptg = Ptg.createPtg( in );
+			if (ptg instanceof ArrayPtg) {
+				if (arrayPtgs == null)
+					arrayPtgs = new ArrayList(5);
+				arrayPtgs.add(ptg);
+				pos += 8;
+			} else pos += ptg.getSize();
+			stack.push( ptg );
+		}
+		if(pos != size) {
+			throw new RuntimeException("Ptg array size mismatch");
+		}
+		if (arrayPtgs != null) {
+			for (int i=0;i<arrayPtgs.size();i++) {
+				ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
+				p.readTokenValues(in);
+			}
+		}
+		return stack;
+	}
 
-    /* convert infix order ptg list to rpn order ptg list
-     * @return List ptgs in RPN order
-     * @param infixPtgs List of ptgs in infix order
-     */
-
-    /* DO NOT REMOVE
-     *we keep this method in case we wish to change the way we parse
-     *It needs a getPrecedence in OperationsPtg
-
-    public static List ptgsToRpn(List infixPtgs) {
-        java.util.Stack operands = new java.util.Stack();
-        java.util.List retval = new java.util.Stack();
-
-        java.util.ListIterator i = infixPtgs.listIterator();
-        Object p;
-        OperationPtg o ;
-        boolean weHaveABracket = false;
-        while (i.hasNext()) {
-            p=i.next();
-            if (p instanceof OperationPtg) {
-                if (p instanceof ParenthesisPtg) {
-                    if (!weHaveABracket) {
-                        operands.push(p);
-                        weHaveABracket = true;
-                    } else {
-                        o = (OperationPtg) operands.pop();
-                        while (!(o instanceof ParenthesisPtg)) {
-                            retval.add(o);
-                        }
-                        weHaveABracket = false;
-                    }
-                } else {
-
-                    while  (!operands.isEmpty() && ((OperationPtg) operands.peek()).getPrecedence() >= ((OperationPtg) p).getPrecedence() ) { //TODO handle ^ since it is right associative
-                        retval.add(operands.pop());
-                    }
-                    operands.push(p);
-                }
-            } else {
-                retval.add(p);
-            }
-        }
-        while (!operands.isEmpty()) {
-            if (operands.peek() instanceof ParenthesisPtg ){
-                //throw some error
-            } else {
-                retval.add(operands.pop());
-            }
-        }
-        return retval;
-    }
-    */
-
-    /**
-     * Reads <tt>size</tt> bytes of the input stream, to create an array of <tt>Ptg</tt>s.
-     * Extra data (beyond <tt>size</tt>) may be read if and <tt>ArrayPtg</tt>s are present.
-     */
-    public static Stack createParsedExpressionTokens(short size,  RecordInputStream in )
-    {
-        Stack stack = new Stack();
-        int pos = 0;
-        List arrayPtgs = null;
-        while ( pos < size )
-        {
-            Ptg ptg = Ptg.createPtg( in );
-            if (ptg instanceof ArrayPtg) {
-                if (arrayPtgs == null)
-                    arrayPtgs = new ArrayList(5);
-                arrayPtgs.add(ptg);
-                pos += 8;
-            } else pos += ptg.getSize();
-            stack.push( ptg );
-        }
-        if(pos != size) {
-            throw new RuntimeException("Ptg array size mismatch");
-        }
-        if (arrayPtgs != null) {
-            for (int i=0;i<arrayPtgs.size();i++) {
-                ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
-                p.readTokenValues(in);
-            }
-        }
-        return stack;
-    }
-
-    public static Ptg createPtg(RecordInputStream in) {
-        byte id = in.readByte();
-        
-        if (id < 0x20) {
-        	return createBasePtg(id, in);
-        }
-        
-        Ptg  retval = createClassifiedPtg(id, in);
-
-        if (id > 0x60) {
-            retval.setClass(CLASS_ARRAY);
-        } else if (id > 0x40) {
-            retval.setClass(CLASS_VALUE);
-        } else {
-            retval.setClass(CLASS_REF);
-        }
+	public static Ptg createPtg(RecordInputStream in) {
+		byte id = in.readByte();
+		
+		if (id < 0x20) {
+			return createBasePtg(id, in);
+		}
+		
+		Ptg  retval = createClassifiedPtg(id, in);
 
-       return retval;
+		if (id > 0x60) {
+			retval.setClass(CLASS_ARRAY);
+		} else if (id > 0x40) {
+			retval.setClass(CLASS_VALUE);
+		} else {
+			retval.setClass(CLASS_REF);
+		}
 
-    }
+	   return retval;
+	}
 
 	private static Ptg createClassifiedPtg(byte id, RecordInputStream in) {
 		
 		int baseId = id & 0x1F | 0x20;
 		
-        switch (baseId) {
-             case FuncPtg.sid:     return new FuncPtg(in);     // 0x21, 0x41, 0x61
-             case FuncVarPtg.sid:  return new FuncVarPtg(in);  // 0x22, 0x42, 0x62
-             case NamePtg.sid:     return new NamePtg(in);     // 0x23, 0x43, 0x63
-
-             case MemAreaPtg.sid:  return new MemAreaPtg(in);  // 0x26, 0x46, 0x66
-             case MemErrPtg.sid:   return new MemErrPtg(in);   // 0x27, 0x47, 0x67
-             case MemFuncPtg.sid:  return new MemFuncPtg(in);  // 0x29, 0x49, 0x69
-             case RefErrorPtg.sid: return  new RefErrorPtg(in);// 0x2a, 0x4a, 0x6a
-             case AreaErrPtg.sid:  return new AreaErrPtg(in);  // 0x2b, 0x4b, 0x6b
-
-             case NameXPtg.sid:    return new NameXPtg(in);    // 0x39, 0x49, 0x79
-             case Ref3DPtg.sid:    return  new Ref3DPtg(in);   // 0x3a, 0x5a, 0x7a
-             case Area3DPtg.sid:   return new Area3DPtg(in);   // 0x3b, 0x5b, 0x7b
-             case DeletedRef3DPtg.sid:  return new DeletedRef3DPtg(in);   // 0x3c, 0x5c, 0x7c
-             case DeletedArea3DPtg.sid: return  new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d
-        }
-        
-        
-        switch (id) {
-        // TODO - why are specific subclasses needed for these Ptgs?
-            case ArrayPtg.sid:     return new ArrayPtg(in);    // 0x20
-            case ArrayPtgV.sid:    return new ArrayPtgV(in);   // 0x40
-            case ArrayPtgA.sid:    return new ArrayPtgA(in);   // 0x60
-
-            case ReferencePtg.sid: return new ReferencePtg(in);// 0x24
-            case RefAPtg.sid:      return new RefAPtg(in);     // 0x64
-            case RefVPtg.sid:      return new RefVPtg(in);     // 0x44
-
-            case RefNAPtg.sid:     return new RefNAPtg(in);    // 0x6C
-            case RefNPtg.sid:      return new RefNPtg(in);     // 0x2C
-            case RefNVPtg.sid:     return new RefNVPtg(in);    // 0x4C
-
-            case AreaPtg.sid:      return new AreaPtg(in);     // 0x25
-            case AreaVPtg.sid:      return new AreaVPtg(in);   // 0x45
-            case AreaAPtg.sid:      return new AreaAPtg(in);   // 0x65
-
-            case AreaNAPtg.sid:    return new AreaNAPtg(in);   // 0x6D
-            case AreaNPtg.sid:     return new AreaNPtg(in);    // 0x2D
-            case AreaNVPtg.sid:    return new AreaNVPtg(in);   // 0x4D
-        
-        }
-        throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
-                   Integer.toHexString(id) + " (" + ( int ) id + ")");
+		switch (baseId) {
+			case ArrayPtg.sid:     return new ArrayPtg(in);    // 0x20, 0x40, 0x60
+			 case FuncPtg.sid:     return new FuncPtg(in);     // 0x21, 0x41, 0x61
+			 case FuncVarPtg.sid:  return new FuncVarPtg(in);  // 0x22, 0x42, 0x62
+			 case NamePtg.sid:     return new NamePtg(in);     // 0x23, 0x43, 0x63
+			 case RefPtg.sid:      return new RefPtg(in);      // 0x24, 0x44, 0x64
+			 case AreaPtg.sid:     return new AreaPtg(in);     // 0x25, 0x45, 0x65
+			 case MemAreaPtg.sid:  return new MemAreaPtg(in);  // 0x26, 0x46, 0x66
+			 case MemErrPtg.sid:   return new MemErrPtg(in);   // 0x27, 0x47, 0x67
+			 case MemFuncPtg.sid:  return new MemFuncPtg(in);  // 0x29, 0x49, 0x69
+			 case RefErrorPtg.sid: return  new RefErrorPtg(in);// 0x2a, 0x4a, 0x6a
+			 case AreaErrPtg.sid:  return new AreaErrPtg(in);  // 0x2b, 0x4b, 0x6b
+			 case RefNPtg.sid:     return new RefNPtg(in);     // 0x2c, 0x4c, 0x6c
+			 case AreaNPtg.sid:    return new AreaNPtg(in);    // 0x2d, 0x4d, 0x6d
+
+			 case NameXPtg.sid:    return new NameXPtg(in);    // 0x39, 0x49, 0x79
+			 case Ref3DPtg.sid:    return  new Ref3DPtg(in);   // 0x3a, 0x5a, 0x7a
+			 case Area3DPtg.sid:   return new Area3DPtg(in);   // 0x3b, 0x5b, 0x7b
+			 case DeletedRef3DPtg.sid:  return new DeletedRef3DPtg(in);   // 0x3c, 0x5c, 0x7c
+			 case DeletedArea3DPtg.sid: return  new DeletedArea3DPtg(in); // 0x3d, 0x5d, 0x7d
+		}
+		throw new UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
+				   Integer.toHexString(id) + " (" + ( int ) id + ")");
 	}
 
 	private static Ptg createBasePtg(byte id, RecordInputStream in) {
 		switch(id) {
-		    case 0x00:                return new UnknownPtg(); // TODO - not a real Ptg
-    		case ExpPtg.sid:          return new ExpPtg(in);         // 0x01
-    		case AddPtg.sid:          return new AddPtg(in);         // 0x03
-    		case SubtractPtg.sid:     return new SubtractPtg(in);    // 0x04
-    		case MultiplyPtg.sid:     return new MultiplyPtg(in);    // 0x05
-    		case DividePtg.sid:       return new DividePtg(in);      // 0x06
-    		case PowerPtg.sid:        return new PowerPtg(in);       // 0x07
-    		case ConcatPtg.sid:       return new ConcatPtg(in);      // 0x08
-    		case LessThanPtg.sid:     return new LessThanPtg(in);    // 0x09
-    		case LessEqualPtg.sid:    return new LessEqualPtg(in);   // 0x0a
-    		case EqualPtg.sid:        return new EqualPtg(in);       // 0x0b
-    		case GreaterEqualPtg.sid: return new GreaterEqualPtg(in);// 0x0c
-    		case GreaterThanPtg.sid:  return new GreaterThanPtg(in); // 0x0d
-    		case NotEqualPtg.sid:     return new NotEqualPtg(in);    // 0x0e
-    		case IntersectionPtg.sid: return new IntersectionPtg(in);// 0x0f
-    		case UnionPtg.sid:        return new UnionPtg(in);       // 0x10
-    		case RangePtg.sid:        return new RangePtg(in);       // 0x11
-    		case UnaryPlusPtg.sid:    return new UnaryPlusPtg(in);   // 0x12
-    		case UnaryMinusPtg.sid:   return new UnaryMinusPtg(in);  // 0x13
-    		case PercentPtg.sid:      return new PercentPtg(in);     // 0x14
-    		case ParenthesisPtg.sid:  return new ParenthesisPtg(in); // 0x15
-    		case MissingArgPtg.sid:   return new MissingArgPtg(in);  // 0x16
-    		case StringPtg.sid:       return new StringPtg(in);      // 0x17
-    		case AttrPtg.sid:                
-    		case 0x1a:        return new AttrPtg(in); // 0x19
-    		case ErrPtg.sid:          return new ErrPtg(in);         // 0x1c
-    		case BoolPtg.sid:         return new BoolPtg(in);        // 0x1d
-    		case IntPtg.sid:          return new IntPtg(in);         // 0x1e
-    		case NumberPtg.sid:       return new NumberPtg(in);      // 0x1f
+			case 0x00:                return new UnknownPtg(); // TODO - not a real Ptg
+			case ExpPtg.sid:          return new ExpPtg(in);          // 0x01
+			case AddPtg.sid:          return AddPtg.instance;         // 0x03
+			case SubtractPtg.sid:     return SubtractPtg.instance;    // 0x04
+			case MultiplyPtg.sid:     return MultiplyPtg.instance;    // 0x05
+			case DividePtg.sid:       return DividePtg.instance;      // 0x06
+			case PowerPtg.sid:        return PowerPtg.instance;       // 0x07
+			case ConcatPtg.sid:       return ConcatPtg.instance;      // 0x08
+			case LessThanPtg.sid:     return LessThanPtg.instance;    // 0x09
+			case LessEqualPtg.sid:    return LessEqualPtg.instance;   // 0x0a
+			case EqualPtg.sid:        return EqualPtg.instance;       // 0x0b
+			case GreaterEqualPtg.sid: return GreaterEqualPtg.instance;// 0x0c
+			case GreaterThanPtg.sid:  return GreaterThanPtg.instance; // 0x0d
+			case NotEqualPtg.sid:     return NotEqualPtg.instance;    // 0x0e
+			case IntersectionPtg.sid: return IntersectionPtg.instance;// 0x0f
+			case UnionPtg.sid:        return UnionPtg.instance;       // 0x10
+			case RangePtg.sid:        return RangePtg.instance;       // 0x11
+			case UnaryPlusPtg.sid:    return UnaryPlusPtg.instance;   // 0x12
+			case UnaryMinusPtg.sid:   return UnaryMinusPtg.instance;  // 0x13
+			case PercentPtg.sid:      return PercentPtg.instance;     // 0x14
+			case ParenthesisPtg.sid:  return ParenthesisPtg.instance; // 0x15
+			case MissingArgPtg.sid:   return MissingArgPtg.instance;  // 0x16
+
+			case StringPtg.sid:       return new StringPtg(in);       // 0x17
+			case AttrPtg.sid:                
+			case 0x1a:        return new AttrPtg(in); // 0x19
+			case ErrPtg.sid:          return new ErrPtg(in);          // 0x1c
+			case BoolPtg.sid:         return new BoolPtg(in);         // 0x1d
+			case IntPtg.sid:          return new IntPtg(in);          // 0x1e
+			case NumberPtg.sid:       return new NumberPtg(in);       // 0x1f
 		}
 		throw new RuntimeException("Unexpected base token id (" + id + ")");
 	}
-    /**
-     * 
-     * 
-     */
+	/**
+	 * 
+	 * 
+	 */
 	public static int getEncodedSize(Stack ptgs) {
 		return getEncodedSize(toPtgArray(ptgs));
 	}
+	/**
+	 * @return a distinct copy of this <tt>Ptg</tt> if the class is mutable, or the same instance
+	 * if the class is immutable.
+	 */
+	public final Ptg copy() {
+		// TODO - all base tokens are logically immutable, but AttrPtg needs some clean-up 
+		if (this instanceof ValueOperatorPtg) {
+			return this;
+		}
+		if (this instanceof ScalarConstantPtg) {
+			return this;
+		}
+		return (Ptg) clone();
+	}
+
+	protected Object clone() {
+		try {
+			return super.clone();
+		} catch (CloneNotSupportedException e) {
+			throw new RuntimeException(e);
+		}
+	}
 	private static Ptg[] toPtgArray(List l) {
 		Ptg[] result = new Ptg[l.size()];
 		l.toArray(result);
 		return result;
 	}
-    private static Stack createStack(Ptg[] formulaTokens) {
+	private static Stack createStack(Ptg[] formulaTokens) {
 		Stack result = new Stack();
 		for (int i = 0; i < formulaTokens.length; i++) {
 			result.add(formulaTokens[i]);
@@ -251,110 +268,120 @@
 		}
 		return result;
 	}
+	/**
+	 * Writes the ptgs to the data buffer, starting at the specified offset.  
+	 *
+	 * <br/>
+	 * The 2 byte encode length field is <b>not</b> written by this method.
+	 * @return number of bytes written
+	 */
+	public static int serializePtgs(Ptg[] ptgs, byte[] data, int offset) {
+		return serializePtgStack(createStack(ptgs), data, offset);
+	}
 
-    public static int serializePtgStack(Stack expression, byte[] array, int offset) {
-        int pos = 0;
-        int size = 0;
-        if (expression != null)
-            size = expression.size();
-
-        List arrayPtgs = null;
-
-        for (int k = 0; k < size; k++) {
-            Ptg ptg = ( Ptg ) expression.get(k);
-
-            ptg.writeBytes(array, pos + offset);
-            if (ptg instanceof ArrayPtg) {
-              if (arrayPtgs == null)
-                  arrayPtgs = new ArrayList(5);
-              arrayPtgs.add(ptg);
-              pos += 8;
-            } else pos += ptg.getSize();
-        }
-        if (arrayPtgs != null) {
-            for (int i=0;i<arrayPtgs.size();i++) {
-                ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
-                pos += p.writeTokenValueBytes(array, pos + offset);
-            }
-        }
-        return pos;
-    }
-
-    /**
-     * @return the encoded length of this Ptg, including the initial Ptg type identifier byte. 
-     */
-    public abstract int getSize();
-    
-    /**
-     * @return the encoded length of this Ptg, not including the initial Ptg type identifier byte. 
-     */
+	/**
+	 * @deprecated use serializePtgs()
+	 */
+	public static int serializePtgStack(Stack expression, byte[] array, int offset) {
+		int pos = 0;
+		int size = 0;
+		if (expression != null)
+			size = expression.size();
+
+		List arrayPtgs = null;
+
+		for (int k = 0; k < size; k++) {
+			Ptg ptg = ( Ptg ) expression.get(k);
+
+			ptg.writeBytes(array, pos + offset);
+			if (ptg instanceof ArrayPtg) {
+			  if (arrayPtgs == null)
+				  arrayPtgs = new ArrayList(5);
+			  arrayPtgs.add(ptg);
+			  pos += 8;
+			} else pos += ptg.getSize();
+		}
+		if (arrayPtgs != null) {
+			for (int i=0;i<arrayPtgs.size();i++) {
+				ArrayPtg p = (ArrayPtg)arrayPtgs.get(i);
+				pos += p.writeTokenValueBytes(array, pos + offset);
+			}
+		}
+		return pos;
+	}
+
+	/**
+	 * @return the encoded length of this Ptg, including the initial Ptg type identifier byte. 
+	 */
+	public abstract int getSize();
+	
+	/**
+	 * @return the encoded length of this Ptg, not including the initial Ptg type identifier byte. 
+	 */
 //    public abstract int getDataSize();
 
-    public final byte [] getBytes()
-    {
-        int    size  = getSize();
-        byte[] bytes = new byte[ size ];
-
-        writeBytes(bytes, 0);
-        return bytes;
-    }
-    /** write this Ptg to a byte array*/
-    public abstract void writeBytes(byte [] array, int offset);
-
-    /**
-     * return a string representation of this token alone
-     */
-    public abstract String toFormulaString(HSSFWorkbook book);
-    /**
-     * dump a debug representation (hexdump) to a string
-     */
-    public String toDebugString() {
-        byte[] ba = new byte[getSize()];
-        String retval=null;
-        writeBytes(ba,0);
-        try {
-            retval = org.apache.poi.util.HexDump.dump(ba,0,0);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return retval;
-    }
-
-    /** Overridden toString method to ensure object hash is not printed.
-     * This helps get rid of gratuitous diffs when comparing two dumps
-     * Subclasses may output more relevant information by overriding this method
-     **/
-    public String toString(){
-        return this.getClass().toString();
-    }
-
-    public static final byte CLASS_REF = 0x00;
-    public static final byte CLASS_VALUE = 0x20;
-    public static final byte CLASS_ARRAY = 0x40;
-
-    protected byte ptgClass = CLASS_REF; //base ptg
-
-    public void setClass(byte thePtgClass) {
-    	if (isBaseToken()) {
-    		throw new RuntimeException("setClass should not be called on a base token");
-    	}
-        ptgClass = thePtgClass;
-    }
-
-    /**
-     *  @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
-     */
-    public byte getPtgClass() {
-        return ptgClass;
-    }
-
-    public abstract byte getDefaultOperandClass();
-
-    public abstract Object clone();
-
-
-    /**
-     * @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
-     */
-    public abstract boolean isBaseToken();
+	public final byte [] getBytes()
+	{
+		int    size  = getSize();
+		byte[] bytes = new byte[ size ];
+
+		writeBytes(bytes, 0);
+		return bytes;
+	}
+	/** write this Ptg to a byte array*/
+	public abstract void writeBytes(byte [] array, int offset);
+
+	/**
+	 * return a string representation of this token alone
+	 */
+	public abstract String toFormulaString(HSSFWorkbook book);
+	/**
+	 * dump a debug representation (hexdump) to a string
+	 */
+	public final String toDebugString() {
+		byte[] ba = new byte[getSize()];
+		String retval=null;
+		writeBytes(ba,0);
+		try {
+			retval = org.apache.poi.util.HexDump.dump(ba,0,0);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return retval;
+	}
+
+	/** Overridden toString method to ensure object hash is not printed.
+	 * This helps get rid of gratuitous diffs when comparing two dumps
+	 * Subclasses may output more relevant information by overriding this method
+	 **/
+	public String toString(){
+		return this.getClass().toString();
+	}
+
+	public static final byte CLASS_REF = 0x00;
+	public static final byte CLASS_VALUE = 0x20;
+	public static final byte CLASS_ARRAY = 0x40;
+
+	private byte ptgClass = CLASS_REF; //base ptg
+
+	public final void setClass(byte thePtgClass) {
+		if (isBaseToken()) {
+			throw new RuntimeException("setClass should not be called on a base token");
+		}
+		ptgClass = thePtgClass;
+	}
+
+	/**
+	 *  @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
+	 */
+	public final byte getPtgClass() {
+		return ptgClass;
+	}
+
+	public abstract byte getDefaultOperandClass();
+
+	/**
+	 * @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
+	 */
+	public abstract boolean isBaseToken();
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
 
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
@@ -27,20 +26,16 @@
     public final static int  SIZE = 1;
     public final static byte sid  = 0x11;
 
-    public RangePtg()
-    {
-    }
+    public static final OperationPtg instance = new RangePtg();
 
-    public RangePtg(RecordInputStream in)
-    {
-    	// No contents
+    private RangePtg() {
+    	// enforce singleton
     }
 
     public final boolean isBaseToken() {
         return true;
     }
 
-
     public int getSize()
     {
         return SIZE;
@@ -51,17 +46,6 @@
         array[ offset + 0 ] = sid;
     }
 
-    public Object clone()
-    {
-        return new RangePtg();
-    }
-
-    public int getType()
-    {
-        return TYPE_BINARY;
-    }
-
-    /** Implementation of method from Ptg */
     public String toFormulaString(HSSFWorkbook book)
     {
         return ":";

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -82,7 +82,7 @@
     }
 
     public void writeBytes(byte [] array, int offset) {
-        array[ 0 + offset ] = (byte) (sid + ptgClass);
+        array[ 0 + offset ] = (byte) (sid + getPtgClass());
         LittleEndian.putShort(array, 1 + offset , getExternSheetIndex());
         LittleEndian.putShort(array, 3 + offset , (short)getRow());
         LittleEndian.putShort(array, 5 + offset , (short)getColumnRaw());
@@ -190,14 +190,7 @@
         return retval.toString();
     }
 
-   public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
-
-   public Object clone() {
-     Ref3DPtg ptg = new Ref3DPtg();
-     ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
-     ptg.field_2_row = field_2_row;
-     ptg.field_3_column = field_3_column;
-     ptg.setClass(ptgClass);
-     return ptg;
-   }
+   public byte getDefaultOperandClass() {
+		return Ptg.CLASS_REF;
+	}
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -17,12 +17,9 @@
 
 package org.apache.poi.hssf.record.formula;
 
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.BitField;
-
-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.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.util.LittleEndian;
 
 /**
  * RefError - handles deleted cell reference
@@ -34,10 +31,6 @@
     public final static byte sid  = 0x2a;
     private int              field_1_reserved;
 
-    private RefErrorPtg() {
-      //Required for clone methods
-    }
-    
     public RefErrorPtg(RecordInputStream in)
     {
         field_1_reserved = in.readInt();
@@ -54,7 +47,7 @@
 
     public void writeBytes(byte [] array, int offset)
     {
-        array[offset] = (byte) (sid + ptgClass);
+        array[offset] = (byte) (sid + getPtgClass());
         LittleEndian.putInt(array,offset+1,field_1_reserved);
     }
 
@@ -82,11 +75,4 @@
     public byte getDefaultOperandClass() {
         return Ptg.CLASS_REF;
     }
-    
-    public Object clone() {
-      RefErrorPtg ptg = new RefErrorPtg();
-      ptg.field_1_reserved = field_1_reserved;
-      ptg.setClass(ptgClass);
-      return ptg;
-    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefNPtg.java Fri Jun  6 17:53:01 2008
@@ -18,37 +18,21 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.record.RecordInputStream;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
  * RefNPtg
  * @author Jason Height (jheight at apache dot com)
  */
-public final class RefNPtg extends ReferencePtg
-{
+public final class RefNPtg extends RefPtgBase {
     public final static byte sid  = 0x2C;
 
-    protected RefNPtg() {
-      //Required for clone methods
-    }
-
     /** Creates new ValueReferencePtg */
 
-    public RefNPtg(RecordInputStream in)
-    {
+    public RefNPtg(RecordInputStream in) {
       super(in);
     }
-
-    public String getRefPtgName() {
-      return "RefNPtg";
-    }
-
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        throw notImplemented();
-    }
-
-    public Object clone() {
-        throw notImplemented();
+    
+    protected byte getSid() {
+    	return sid;
     }
 }

Added: poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtg.java?rev=664220&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtg.java (added)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtg.java Fri Jun  6 17:53:01 2008
@@ -0,0 +1,53 @@
+/* ====================================================================
+   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.hssf.record.formula;
+
+import org.apache.poi.hssf.record.RecordInputStream;
+
+/**
+ * ReferencePtg - handles references (such as A1, A2, IA4)
+ * @author  Andrew C. Oliver (acoliver@apache.org)
+ * @author Jason Height (jheight at chariot dot net dot au)
+ */
+public final class RefPtg extends RefPtgBase {
+    public final static byte sid  = 0x24;
+
+    /**
+     * Takes in a String representation of a cell reference and fills out the
+     * numeric fields.
+     */
+    public RefPtg(String cellref) {
+    	super(cellref);
+    }
+
+    public RefPtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
+      setRow(row);
+      setColumn(column);
+      setRowRelative(isRowRelative);
+      setColRelative(isColumnRelative);
+    }
+
+    public RefPtg(RecordInputStream in) {
+        super(in);
+    }
+
+	protected byte getSid() {
+		return sid;
+	}
+    
+}

Copied: poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java (from r664139, poi/trunk/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java)
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java?p2=poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java&p1=poi/trunk/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java&r1=664139&r2=664220&rev=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/RefPtgBase.java Fri Jun  6 17:53:01 2008
@@ -26,26 +26,13 @@
 import org.apache.poi.hssf.record.RecordInputStream;
 
 /**
- * ReferencePtg - handles references (such as A1, A2, IA4)
+ * ReferencePtgBase - handles references (such as A1, A2, IA4)
  * @author  Andrew C. Oliver (acoliver@apache.org)
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-public class ReferencePtg extends OperandPtg {
-    /**
-     * TODO - (May-2008) fix subclasses of ReferencePtg 'RefN~' which are used in shared formulas.
-     * (See bugzilla 44921)
-     * The 'RefN~' instances do not work properly, and are expected to be converted by
-     * SharedFormulaRecord.convertSharedFormulas().
-     * This conversion currently does not take place for formulas of named ranges, conditional
-     * format rules and data validation rules.
-     * Furthermore, conversion is probably not appropriate in those instances.
-     */
-    protected final RuntimeException notImplemented() {
-        return new RuntimeException("Coding Error: This method should never be called. This ptg should be converted");
-    }
+public abstract class RefPtgBase extends OperandPtg {
 
     private final static int SIZE = 5;
-    public final static byte sid  = 0x24;
     private final static int MAX_ROW_NUMBER = 65536;
 
    /** The row index - zero based unsigned 16 bit value */
@@ -60,15 +47,15 @@
     private static final BitField         colRelative = BitFieldFactory.getInstance(0x4000);
     private static final BitField         column      = BitFieldFactory.getInstance(0x00FF);
 
-    protected ReferencePtg() {
+    protected RefPtgBase() {
       //Required for clone methods
     }
 
     /**
-     * Takes in a String represnetation of a cell reference and fills out the
+     * Takes in a String representation of a cell reference and fills out the
      * numeric fields.
      */
-    public ReferencePtg(String cellref) {
+    protected RefPtgBase(String cellref) {
         CellReference c= new CellReference(cellref);
         setRow(c.getRow());
         setColumn(c.getCol());
@@ -76,26 +63,19 @@
         setRowRelative(!c.isRowAbsolute());
     }
 
-    public ReferencePtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
+    protected RefPtgBase(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
       setRow(row);
       setColumn(column);
       setRowRelative(isRowRelative);
       setColRelative(isColumnRelative);
     }
 
-    /** Creates new ValueReferencePtg */
-
-    public ReferencePtg(RecordInputStream in)
-    {
+    protected RefPtgBase(RecordInputStream in) {
         field_1_row = in.readUShort();
         field_2_col = in.readUShort();
     }
 
-    public String getRefPtgName() {
-      return "ReferencePtg";
-    }
-
-    public String toString() {
+    public final String toString() {
         CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(),!isColRelative());
         StringBuffer sb = new StringBuffer();
         sb.append(getClass().getName());
@@ -105,16 +85,16 @@
         return sb.toString();
     }
 
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[offset] = (byte) (sid + ptgClass);
+    public final void writeBytes(byte [] array, int offset) {
+        array[offset] = (byte) (getSid() + getPtgClass());
 
         LittleEndian.putShort(array, offset+1, (short)field_1_row);
         LittleEndian.putShort(array, offset+3, (short)field_2_col);
     }
+    
+    protected abstract byte getSid();
 
-    public void setRow(int row)
-    {
+    public final void setRow(int row) {
         if(row < 0 || row >= MAX_ROW_NUMBER) {
            throw new IllegalArgumentException("The row number, when specified as an integer, must be between 0 and " + MAX_ROW_NUMBER);
         }
@@ -125,81 +105,61 @@
      * Returns the row number as a short, which will be
      *  wrapped (negative) for values between 32769 and 65535
      */
-    public int getRow()
-    {
+    public final int getRow(){
         return field_1_row;
     }
     /**
      * Returns the row number as an int, between 0 and 65535
      */
-    public int getRowAsInt()
-    {
-    	if(field_1_row < 0) {
-    		return field_1_row + MAX_ROW_NUMBER;
-    	}
+    public final int getRowAsInt() {
         return field_1_row;
     }
 
-    public boolean isRowRelative()
-    {
+    public final boolean isRowRelative() {
         return rowRelative.isSet(field_2_col);
     }
 
-    public void setRowRelative(boolean rel) {
+    public final void setRowRelative(boolean rel) {
         field_2_col=rowRelative.setBoolean(field_2_col,rel);
     }
 
-    public boolean isColRelative()
-    {
+    public final boolean isColRelative() {
         return colRelative.isSet(field_2_col);
     }
 
-    public void setColRelative(boolean rel) {
+    public final void setColRelative(boolean rel) {
         field_2_col=colRelative.setBoolean(field_2_col,rel);
     }
 
-    public void setColumnRaw(int col)
-    {
+    public final void setColumnRawX(int col) { // TODO
         field_2_col = col;
     }
 
-    public int getColumnRaw()
-    {
+    public int getColumnRawX() { // TODO
         return field_2_col;
     }
 
-    public void setColumn(int col)
-    {
-        if(col < 0 || col > 0x100) {
+    public final void setColumn(int col) {
+        if(col < 0 || col >= 0x100) {
             throw new IllegalArgumentException("Specified colIx (" + col + ") is out of range");
         }
     	field_2_col = column.setValue(field_2_col, col);
     }
 
-    public int getColumn() {
+    public final int getColumn() {
     	return column.getValue(field_2_col);
     }
 
-    public int getSize()
-    {
+    public final int getSize() {
         return SIZE;
     }
 
-    public String toFormulaString(HSSFWorkbook book)
-    {
+    public final String toFormulaString(HSSFWorkbook book) {
         //TODO -- should we store a cellreference instance in this ptg?? but .. memory is an issue, i believe!
         return (new CellReference(getRowAsInt(),getColumn(),!isRowRelative(),!isColRelative())).formatAsString();
     }
 
-    public byte getDefaultOperandClass() {
+    public final byte getDefaultOperandClass() {
         return Ptg.CLASS_REF;
     }
-
-    public Object clone() {
-      ReferencePtg ptg = new ReferencePtg();
-      ptg.field_1_row = field_1_row;
-      ptg.field_2_col = field_2_col;
-      ptg.setClass(ptgClass);
-      return ptg;
-    }
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -27,5 +27,4 @@
     public final byte getDefaultOperandClass() {
         return Ptg.CLASS_VALUE;
     }
-	
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -42,15 +42,11 @@
      * NOTE: OO doc says 16bit length, but BiffViewer says 8 Book says something
      * totally different, so don't look there!
      */
-    private int field_1_length;
-    private byte field_2_options;
-    private String field_3_string;
+    private final int field_1_length;
+    private final byte field_2_options;
+    private final String field_3_string;
 
-    private StringPtg() {
-        // Required for clone methods
-    }
-
-    /** Create a StringPtg from a byte array read from disk */
+    /** Create a StringPtg from a stream */
     public StringPtg(RecordInputStream in) {
         field_1_length = in.readUByte();
         field_2_options = in.readByte();
@@ -76,9 +72,7 @@
             throw new IllegalArgumentException(
                     "String literals in formulas can't be bigger than 255 characters ASCII");
         }
-        field_2_options = 0;
-        field_2_options = (byte) fHighByte.setBoolean(field_2_options, StringUtil
-                .hasMultibyte(value));
+        field_2_options = (byte) fHighByte.setBoolean(0, StringUtil.hasMultibyte(value));
         field_3_string = value;
         field_1_length = value.length(); // for the moment, we support only ASCII strings in formulas we create
     }
@@ -124,14 +118,6 @@
         return sb.toString();
     }
 
-    public Object clone() {
-        StringPtg ptg = new StringPtg();
-        ptg.field_1_length = field_1_length;
-        ptg.field_2_options = field_2_options;
-        ptg.field_3_string = field_3_string;
-        return ptg;
-    }
-
     public String toString() {
         StringBuffer sb = new StringBuffer(64);
         sb.append(getClass().getName()).append(" [");

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java Fri Jun  6 17:53:01 2008
@@ -17,54 +17,27 @@
 
 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;
-
 /**
  *
  * @author  andy
  * @author Jason Height (jheight at chariot dot net dot au)
  */
 public final class SubtractPtg extends ValueOperatorPtg {
-    public final static int  SIZE = 1;
     public final static byte sid  = 0x04;
 
-    public SubtractPtg()
-    {
-    }
-
-    public SubtractPtg(RecordInputStream in)
-    {
+    public static final ValueOperatorPtg instance = new SubtractPtg();
 
-        // doesn't need anything
+    private SubtractPtg() {
+    	// enforce singleton
     }
-
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[ offset + 0 ] = sid;
+    
+    protected byte getSid() {
+    	return sid;
     }
 
-    public int getSize()
-    {
-        return SIZE;
-    }
-
-    public int getType()
-    {
-        return TYPE_BINARY;
-    }
-
-    public int getNumberOfOperands()
-    {
+    public int getNumberOfOperands() {
         return 2;
     }
-
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        return "-";
-    }
-
        
     public String toFormulaString(String[] operands) {
         StringBuffer buffer = new StringBuffer();
@@ -74,8 +47,4 @@
         buffer.append(operands[ 1 ]);
         return buffer.toString();
     }
-
-    public Object clone() {
-      return new SubtractPtg();
-    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java Fri Jun  6 17:53:01 2008
@@ -17,62 +17,30 @@
 
 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;
-
 /**
  * Unary Plus operator
  * does not have any effect on the operand
  * @author Avik Sengupta
  */
-
 public final class UnaryMinusPtg extends ValueOperatorPtg {
-    public final static int  SIZE = 1;
     public final static byte sid  = 0x13;
     
     private final static String MINUS = "-";
 
-    /** Creates new AddPtg */
+    public static final ValueOperatorPtg instance = new UnaryMinusPtg();
 
-    public UnaryMinusPtg()
-    {
-    }
-
-    public UnaryMinusPtg(RecordInputStream in)
-    {
-
-        // doesn't need anything
+    private UnaryMinusPtg() {
+    	// enforce singleton
     }
     
-   
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[ offset + 0 ] = sid;
-    }
-
-    public int getSize()
-    {
-        return SIZE;
-    }
-
-    public int getType()
-    {
-        return this.TYPE_UNARY;
+    protected byte getSid() {
+    	return sid;
     }
 
-    public int getNumberOfOperands()
-    {
+    public int getNumberOfOperands() {
         return 1;
     }
     
-    /** Implementation of method from Ptg */
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        return "+";
-    }
-       
    /** implementation of method from OperationsPtg*/  
     public String toFormulaString(String[] operands) {
         StringBuffer buffer = new StringBuffer();
@@ -80,9 +48,4 @@
         buffer.append(operands[ 0]);
         return buffer.toString();
     }
-    
-    public Object clone() {
-      return new UnaryPlusPtg();
-    }
-
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java Fri Jun  6 17:53:01 2008
@@ -17,62 +17,30 @@
 
 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;
-
 /**
  * Unary Plus operator
  * does not have any effect on the operand
  * @author Avik Sengupta
  */
-
 public final class UnaryPlusPtg extends ValueOperatorPtg {
-    public final static int  SIZE = 1;
     public final static byte sid  = 0x12;
     
     private final static String ADD = "+";
 
-    /** Creates new AddPtg */
+    public static final ValueOperatorPtg instance = new UnaryPlusPtg();
 
-    public UnaryPlusPtg()
-    {
-    }
-
-    public UnaryPlusPtg(RecordInputStream in)
-    {
-
-        // doesn't need anything
+    private UnaryPlusPtg() {
+    	// enforce singleton
     }
     
-   
-    public void writeBytes(byte [] array, int offset)
-    {
-        array[ offset + 0 ] = sid;
-    }
-
-    public int getSize()
-    {
-        return SIZE;
-    }
-
-    public int getType()
-    {
-        return this.TYPE_UNARY;
+    protected byte getSid() {
+    	return sid;
     }
 
-    public int getNumberOfOperands()
-    {
+    public int getNumberOfOperands() {
         return 1;
     }
     
-    /** Implementation of method from Ptg */
-    public String toFormulaString(HSSFWorkbook book)
-    {
-        return "+";
-    }
-       
    /** implementation of method from OperationsPtg*/  
     public String toFormulaString(String[] operands) {
         StringBuffer buffer = new StringBuffer();
@@ -80,9 +48,4 @@
         buffer.append(operands[ 0]);
         return buffer.toString();
     }
-    
-    public Object clone() {
-      return new UnaryPlusPtg();
-    }
-
 }

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -18,7 +18,6 @@
 package org.apache.poi.hssf.record.formula;
 
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.record.RecordInputStream;
 
 /**
  * @author Glen Stampoultzis (glens at apache.org)
@@ -26,14 +25,10 @@
 public final class UnionPtg extends OperationPtg {
     public final static byte sid  = 0x10;
 
+    public static final OperationPtg instance = new UnionPtg();
 
-    public UnionPtg()
-    {
-    }
-
-    public UnionPtg(RecordInputStream in)
-    {
-        // doesn't need anything
+    private UnionPtg() {
+    	// enforce singleton
     }
 
     public final boolean isBaseToken() {
@@ -50,17 +45,6 @@
         array[ offset + 0 ] = sid;
     }
 
-    public Object clone()
-    {
-        return new UnionPtg();
-    }
-
-    public int getType()
-    {
-        return TYPE_BINARY;
-    }
-
-    /** Implementation of method from Ptg */
     public String toFormulaString(HSSFWorkbook book)
     {
         return ",";

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -17,6 +17,8 @@
 
 package org.apache.poi.hssf.record.formula;
 
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+
 /**
  * Common superclass of all value operators.
  * Subclasses include all unary and binary operators except for the reference operators (IntersectionPtg, RangePtg, UnionPtg) 
@@ -26,12 +28,27 @@
 public abstract class ValueOperatorPtg extends OperationPtg {
 
 	/**
-	 * All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classifed)  
+	 * All Operator <tt>Ptg</tt>s are base tokens (i.e. are not RVA classified)  
 	 */
 	public final boolean isBaseToken() {
 		return true;
 	}
+
 	public final byte getDefaultOperandClass() {
 		return Ptg.CLASS_VALUE;
 	}
+
+	public final void writeBytes(byte[] array, int offset) {
+		array[offset + 0] = getSid();
+	}
+
+	protected abstract byte getSid();
+
+	public final int getSize() {
+		return 1;
+	}
+    public final String toFormulaString(HSSFWorkbook book) {
+    	// TODO - prune this method out of the hierarchy
+    	throw new RuntimeException("toFormulaString(String[] operands) should be used for subclasses of OperationPtgs");
+	}
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/formula/eval/Ref2DEval.java Fri Jun  6 17:53:01 2008
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.record.formula.eval;
 
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 
 /**
  * @author adeshmukh
@@ -26,9 +26,9 @@
 public final class Ref2DEval implements RefEval {
 
     private final ValueEval value;
-    private final ReferencePtg delegate;
+    private final RefPtg delegate;
     
-    public Ref2DEval(ReferencePtg ptg, ValueEval ve) {
+    public Ref2DEval(RefPtg ptg, ValueEval ve) {
         if(ve == null) {
             throw new IllegalArgumentException("ve must not be null");
         }

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java Fri Jun  6 17:53:01 2008
@@ -40,7 +40,7 @@
 import org.apache.poi.hssf.record.formula.ParenthesisPtg;
 import org.apache.poi.hssf.record.formula.Ptg;
 import org.apache.poi.hssf.record.formula.Ref3DPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+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;
@@ -386,8 +386,8 @@
                 Eval opresult = invokeOperation(operation, ops, srcRowNum, srcColNum, workbook, sheet);
                 stack.push(opresult);
             }
-            else if (ptg instanceof ReferencePtg) {
-                ReferencePtg refPtg = (ReferencePtg) ptg;
+            else if (ptg instanceof RefPtg) {
+                RefPtg refPtg = (RefPtg) ptg;
                 int colIx = refPtg.getColumn();
                 int rowIx = refPtg.getRow();
                 HSSFRow row = sheet.getRow(rowIx);
@@ -549,7 +549,7 @@
                 Constructor constructor = clazz.getConstructor(AREA3D_CONSTRUCTOR_CLASS_ARRAY);
                 retval = (OperationEval) constructor.newInstance(new Ptg[] { ptg });
             }
-            else if (ptg instanceof ReferencePtg) {
+            else if (ptg instanceof RefPtg) {
                 Constructor constructor = clazz.getConstructor(REFERENCE_CONSTRUCTOR_CLASS_ARRAY);
                 retval = (OperationEval) constructor.newInstance(new Ptg[] { ptg });
             }
@@ -607,7 +607,7 @@
      * Creates a Ref2DEval for ReferencePtg.
      * Non existent cells are treated as RefEvals containing BlankEval.
      */
-    private static Ref2DEval createRef2DEval(ReferencePtg ptg, HSSFCell cell, 
+    private static Ref2DEval createRef2DEval(RefPtg ptg, HSSFCell cell, 
             HSSFRow row, HSSFSheet sheet, HSSFWorkbook workbook) {
         if (cell == null) {
             return new Ref2DEval(ptg, BlankEval.INSTANCE);

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Fri Jun  6 17:53:01 2008
@@ -37,7 +37,7 @@
 import org.apache.poi.hssf.model.Workbook;
 import org.apache.poi.hssf.record.*;
 import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.util.HSSFCellRangeAddress;
 import org.apache.poi.hssf.util.HSSFDataValidation;
 import org.apache.poi.hssf.util.PaneInformation;
@@ -1304,8 +1304,8 @@
                     Ptg[] ptgs = fp.getRPNPtg();
                     boolean changed = false;
                     for(int i=0; i<ptgs.length; i++) {
-                        if(ptgs[i] instanceof ReferencePtg) {
-                            ReferencePtg rptg = (ReferencePtg)ptgs[i];
+                        if(ptgs[i] instanceof RefPtg) {
+                            RefPtg rptg = (RefPtg)ptgs[i];
                             if(startRow <= rptg.getRowAsInt() &&
                                     rptg.getRowAsInt() <= endRow) {
                                 // References a row that moved

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java Fri Jun  6 17:53:01 2008
@@ -909,9 +909,7 @@
 
         if (settingRowAndColumn)
         {
-            MemFuncPtg memFuncPtg = new MemFuncPtg();
-            memFuncPtg.setLenRefSubexpression(23);
-            ptgs.add(memFuncPtg);
+            ptgs.add(new MemFuncPtg(23)); // TODO - where did constant '23' come from?
         }
         if (startColumn >= 0)
         {
@@ -935,8 +933,7 @@
         }
         if (settingRowAndColumn)
         {
-            UnionPtg unionPtg = new UnionPtg();
-            ptgs.add(unionPtg);
+            ptgs.add(UnionPtg.instance);
         }
         nameRecord.setNameDefinition(ptgs);
 

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -40,7 +40,7 @@
 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.ReferencePtg;
+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;
@@ -165,14 +165,14 @@
 	public void testUnaryMinus() {
 		Ptg[] ptgs = parseFormula("-A1");
 		assertEquals(2, ptgs.length);
-		assertTrue("first ptg is reference",ptgs[0] instanceof ReferencePtg);
+		assertTrue("first ptg is reference",ptgs[0] instanceof RefPtg);
 		assertTrue("second ptg is Minus",ptgs[1] instanceof UnaryMinusPtg);
 	}
 
 	public void testUnaryPlus() {
 		Ptg[] ptgs = parseFormula("+A1");
 		assertEquals(2, ptgs.length);
-		assertTrue("first ptg is reference",ptgs[0] instanceof ReferencePtg);
+		assertTrue("first ptg is reference",ptgs[0] instanceof RefPtg);
 		assertTrue("second ptg is Plus",ptgs[1] instanceof UnaryPlusPtg);
 	}
 
@@ -540,11 +540,11 @@
 		Class[] expClss;
 
 		expClss = new Class[] { 
-				ReferencePtg.class, 
+				RefPtg.class, 
 				AttrPtg.class, // tAttrIf
 				MissingArgPtg.class, 
 				AttrPtg.class, // tAttrSkip
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class, // tAttrSkip
 				FuncVarPtg.class, 
 		};
@@ -696,7 +696,7 @@
 		// FormulaParser strips spaces anyway
 		assertEquals("4", formulaString);
 
-		ptgs = new Ptg[] { new IntPtg(3), spacePtg, new IntPtg(4), spacePtg, new AddPtg()};
+		ptgs = new Ptg[] { new IntPtg(3), spacePtg, new IntPtg(4), spacePtg, AddPtg.instance, };
 		formulaString = FormulaParser.toFormulaString(null, ptgs);
 		assertEquals("3+4", formulaString);
 	}
@@ -710,7 +710,7 @@
 		Ptg[] ptgs = {
 				// Excel would probably have put tMissArg here
 				new IntPtg(1),
-				new DividePtg(),
+				DividePtg.instance,
 		};
 		try {
 			FormulaParser.toFormulaString(null, ptgs);

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -31,7 +31,7 @@
 import org.apache.poi.hssf.record.formula.MultiplyPtg;
 import org.apache.poi.hssf.record.formula.NotEqualPtg;
 import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.StringPtg;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
@@ -61,7 +61,7 @@
 		Class[] expClss;
 
 		expClss = new Class[] {
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class, // tAttrIf
 				IntPtg.class,
 				AttrPtg.class, // tAttrSkip
@@ -82,9 +82,9 @@
 		Class[] expClss;
 
 		expClss = new Class[] {
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class, // tAttrIf
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class, // tAttrSkip
 				FuncVarPtg.class,
 		};
@@ -100,20 +100,20 @@
 		Class[] expClss;
 
 		expClss = new Class[] {
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class, // tAttrIf
 
-				ReferencePtg.class,
+				RefPtg.class,
 				IntPtg.class,
 				MultiplyPtg.class,
-				ReferencePtg.class,
+				RefPtg.class,
 				IntPtg.class,
 				AddPtg.class,
 				FuncPtg.class,
 				AttrPtg.class, // tAttrSkip
 				
-				ReferencePtg.class,
-				ReferencePtg.class,
+				RefPtg.class,
+				RefPtg.class,
 				FuncPtg.class,
 				
 				AttrPtg.class, // tAttrSkip
@@ -133,9 +133,9 @@
 
 		expClss = new Class[] {
 
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class,	  // A tAttrIf
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class,    //   B tAttrIf
 				IntPtg.class,
 				AttrPtg.class,    //   B tAttrSkip
@@ -143,7 +143,7 @@
 				AttrPtg.class,    //   B tAttrSkip
 				FuncVarPtg.class,
 				AttrPtg.class,    // A tAttrSkip
-				ReferencePtg.class,
+				RefPtg.class,
 				AttrPtg.class,    //   C tAttrIf
 				IntPtg.class,
 				AttrPtg.class,    //   C tAttrSkip

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/model/TestRVA.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/model/TestRVA.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/model/TestRVA.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/model/TestRVA.java Fri Jun  6 17:53:01 2008
@@ -23,7 +23,7 @@
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.record.formula.AttrPtg;
 import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtgBase;
 import org.apache.poi.hssf.usermodel.FormulaExtractor;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFRow;
@@ -102,7 +102,7 @@
 		for (int i = 0; i < nExcelTokens; i++) {
 			Ptg poiPtg = poiPtgs[i];
 			Ptg excelPtg = excelPtgs[i];
-			if (!areTokenClassesSame(poiPtg, excelPtg)) {
+			if (excelPtg.getClass() != poiPtg.getClass()) {
 				hasMismatch = true;
 				sb.append("  mismatch token type[" + i + "] " + getShortClassName(excelPtg) + " "
 						+ getOperandClassName(excelPtg) + " - " + getShortClassName(poiPtg) + " "
@@ -127,17 +127,6 @@
 		}
 	}
 
-	private boolean areTokenClassesSame(Ptg poiPtg, Ptg excelPtg) {
-		if (excelPtg.getClass() == poiPtg.getClass()) {
-			return true;
-		}
-		if (poiPtg.getClass() == ReferencePtg.class) {
-			// TODO - remove funny subclasses of ReferencePtg
-			return excelPtg instanceof ReferencePtg;
-		}
-		return false;
-	}
-
 	private String getShortClassName(Object o) {
 		String cn = o.getClass().getName();
 		int pos = cn.lastIndexOf('.');

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/TestFormulaRecord.java Fri Jun  6 17:53:01 2008
@@ -26,7 +26,7 @@
 import org.apache.poi.hssf.record.formula.AttrPtg;
 import org.apache.poi.hssf.record.formula.FuncVarPtg;
 import org.apache.poi.hssf.record.formula.IntPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 
 /**
  * Tests the serialization and deserialization of the FormulaRecord
@@ -130,11 +130,11 @@
 		assertEquals(9, ptgs.size());
 		assertEquals(IntPtg.class,	   ptgs.get(0).getClass());
 		assertEquals(AttrPtg.class,	  ptgs.get(1).getClass());
-		assertEquals(ReferencePtg.class, ptgs.get(2).getClass());
+		assertEquals(RefPtg.class, ptgs.get(2).getClass());
 		assertEquals(AttrPtg.class,	  ptgs.get(3).getClass());
-		assertEquals(ReferencePtg.class, ptgs.get(4).getClass());
+		assertEquals(RefPtg.class, ptgs.get(4).getClass());
 		assertEquals(AttrPtg.class,	  ptgs.get(5).getClass());
-		assertEquals(ReferencePtg.class, ptgs.get(6).getClass());
+		assertEquals(RefPtg.class, ptgs.get(6).getClass());
 		assertEquals(AttrPtg.class,	  ptgs.get(7).getClass());
 		assertEquals(FuncVarPtg.class,   ptgs.get(8).getClass());
 		

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -25,7 +25,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.record.formula.Ptg;
-import org.apache.poi.hssf.record.formula.RefAPtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 
 /**
  * @author Josh Micich
@@ -68,7 +68,7 @@
 		
 		Stack convertedFormula = SharedFormulaRecord.convertSharedFormulas(sharedFormula, 100, 200);
 		
-		RefAPtg refPtg = (RefAPtg) convertedFormula.get(1);
+		RefPtg refPtg = (RefPtg) convertedFormula.get(1);
 		assertEquals("$C101", refPtg.toFormulaString(null));
 		if (refPtg.getPtgClass() == Ptg.CLASS_REF) {
 			throw new AssertionFailedError("Identified bug 45123");

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=664220&r1=664219&r2=664220&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 Fri Jun  6 17:53:01 2008
@@ -54,12 +54,12 @@
 	 */
 	public void testReadWriteTokenValueBytes() {
 		
-		ArrayPtg ptg = new ArrayPtgV(new TestcaseRecordInputStream(ArrayPtgV.sid, ENCODED_PTG_DATA));
+		ArrayPtg ptg = new ArrayPtg(new TestcaseRecordInputStream(ArrayPtg.sid, ENCODED_PTG_DATA));
 		
 		ptg.readTokenValues(new TestcaseRecordInputStream(0, ENCODED_CONSTANT_DATA));
 		assertEquals(3, ptg.getColumnCount());
 		assertEquals(2, ptg.getRowCount());
-		Object[] values = ptg.token_3_arrayValues;
+		Object[] values = ptg.getTokenArrayValues();
 		assertEquals(6, values.length);
 		
 		
@@ -82,7 +82,7 @@
 	 * Excel stores array elements column by column.  This test makes sure POI does the same.
 	 */
 	public void testElementOrdering() {
-		ArrayPtg ptg = new ArrayPtgV(new TestcaseRecordInputStream(ArrayPtgV.sid, ENCODED_PTG_DATA));
+		ArrayPtg ptg = new ArrayPtg(new TestcaseRecordInputStream(ArrayPtg.sid, ENCODED_PTG_DATA));
 		ptg.readTokenValues(new TestcaseRecordInputStream(0, ENCODED_CONSTANT_DATA));
 		assertEquals(3, ptg.getColumnCount());
 		assertEquals(2, ptg.getRowCount());

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestReferencePtg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestReferencePtg.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestReferencePtg.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/TestReferencePtg.java Fri Jun  6 17:53:01 2008
@@ -17,15 +17,19 @@
 
 package org.apache.poi.hssf.record.formula;
 
+import java.util.Arrays;
+import java.util.Stack;
+
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.record.TestcaseRecordInputStream;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 /**
- * Tests for {@link ReferencePtg}.
+ * Tests for {@link RefPtg}.
  */
 public final class TestReferencePtg extends TestCase {
     /**
@@ -86,5 +90,18 @@
             throw e;
         }
     }
+    private static final byte[] tRefN_data = {
+    	0x2C, 33, 44, 55, 66,
+    };
+    public void testReadWrite_tRefN_bug45091() {
+        TestcaseRecordInputStream in = new TestcaseRecordInputStream(-1, tRefN_data);
+        Stack ptgs = Ptg.createParsedExpressionTokens((short)tRefN_data.length, in);
+        byte[] outData = new byte[5];
+        Ptg.serializePtgStack(ptgs, outData, 0);
+        if (outData[0] == 0x24) {
+            throw new AssertionFailedError("Identified bug 45091");
+        }
+        assertTrue(Arrays.equals(tRefN_data, outData));
+    }
 }
 

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestPercentEval.java Fri Jun  6 17:53:01 2008
@@ -41,7 +41,7 @@
 			arg,	
 		};
 		
-		PercentEval opEval = new PercentEval(new PercentPtg());
+		PercentEval opEval = new PercentEval(PercentPtg.instance);
 		double result = NumericFunctionInvoker.invoke(opEval, args, -1, (short)-1);
 		
 		assertEquals(expectedResult, result, 0);

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestUnaryPlusEval.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestUnaryPlusEval.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestUnaryPlusEval.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/eval/TestUnaryPlusEval.java Fri Jun  6 17:53:01 2008
@@ -36,7 +36,7 @@
 	 * The code for handling column operands had been copy-pasted from the row handling code. 
 	 */
 	public void testColumnOperand() {
-		
+
 		short firstRow = (short)8;
 		short lastRow = (short)12;
 		short colNum = (short)5;
@@ -52,10 +52,9 @@
 		Eval[] args = { 
 			areaEval,	
 		};
-		
-		double result = NumericFunctionInvoker.invoke(new UnaryPlusEval(new UnaryPlusPtg()), args, 10, (short)20);
-		
+
+		double result = NumericFunctionInvoker.invoke(new UnaryPlusEval(UnaryPlusPtg.instance), args, 10, (short)20);
+
 		assertEquals(35, result, 0);
 	}
-
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/EvalFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/EvalFactory.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/EvalFactory.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/EvalFactory.java Fri Jun  6 17:53:01 2008
@@ -19,7 +19,7 @@
 package org.apache.poi.hssf.record.formula.functions;
 
 import org.apache.poi.hssf.record.formula.AreaPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.eval.Area2DEval;
 import org.apache.poi.hssf.record.formula.eval.AreaEval;
 import org.apache.poi.hssf.record.formula.eval.NumberEval;
@@ -58,6 +58,6 @@
 	 * Creates a single RefEval (with value zero)
 	 */
 	public static RefEval createRefEval(String refStr) {
-		return new Ref2DEval(new ReferencePtg(refStr), ZERO);
+		return new Ref2DEval(new RefPtg(refStr), ZERO);
 	}
 }

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestCountFuncs.java Fri Jun  6 17:53:01 2008
@@ -21,7 +21,7 @@
 import junit.framework.TestCase;
 
 import org.apache.poi.hssf.record.formula.AreaPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.eval.Area2DEval;
 import org.apache.poi.hssf.record.formula.eval.AreaEval;
 import org.apache.poi.hssf.record.formula.eval.BlankEval;
@@ -124,7 +124,7 @@
 		};
 		Area2DEval arg0 = new Area2DEval(new AreaPtg("C1:C6"), values);
 		
-		Ref2DEval criteriaArg = new Ref2DEval(new ReferencePtg("A1"), new NumberEval(25));
+		Ref2DEval criteriaArg = new Ref2DEval(new RefPtg("A1"), new NumberEval(25));
 		Eval[] args=  { arg0, criteriaArg, };
 		
 		double actual = NumericFunctionInvoker.invoke(new Countif(), args);

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestMid.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestMid.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestMid.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestMid.java Fri Jun  6 17:53:01 2008
@@ -18,7 +18,7 @@
 package org.apache.poi.hssf.record.formula.functions;
 
 import org.apache.poi.hssf.record.formula.AreaPtg;
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.eval.Area2DEval;
 import org.apache.poi.hssf.record.formula.eval.AreaEval;
 import org.apache.poi.hssf.record.formula.eval.BlankEval;
@@ -77,7 +77,7 @@
 		
 		// startPos is 1x1 area ref, numChars is cell ref
 		AreaEval aeStart = new Area2DEval(new AreaPtg("A1:A1"), new ValueEval[] { new NumberEval(2), } );
-		RefEval reNumChars = new Ref2DEval(new ReferencePtg("B1"), new NumberEval(3));
+		RefEval reNumChars = new Ref2DEval(new RefPtg("B1"), new NumberEval(3));
 		confirmMid(new StringEval("galactic"), aeStart, reNumChars, "ala");
 
 		confirmMid(new StringEval("galactic"), new NumberEval(3.1), BlankEval.INSTANCE, "");

Modified: poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestSumproduct.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestSumproduct.java?rev=664220&r1=664219&r2=664220&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestSumproduct.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestSumproduct.java Fri Jun  6 17:53:01 2008
@@ -17,7 +17,7 @@
 
 package org.apache.poi.hssf.record.formula.functions;
 
-import org.apache.poi.hssf.record.formula.ReferencePtg;
+import org.apache.poi.hssf.record.formula.RefPtg;
 import org.apache.poi.hssf.record.formula.eval.AreaEval;
 import org.apache.poi.hssf.record.formula.eval.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.Eval;
@@ -50,7 +50,7 @@
 
 	public void testScalarSimple() {
 		
-		RefEval refEval = new Ref2DEval(new ReferencePtg("A1"), new NumberEval(3));
+		RefEval refEval = new Ref2DEval(new RefPtg("A1"), new NumberEval(3));
 		Eval[] args = {
 			refEval, 
 			new NumberEval(2),



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