You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2008/05/28 13:06:36 UTC

svn commit: r660905 [2/2] - in /poi/branches/ooxml: ./ src/documentation/content/xdocs/ src/java/org/apache/poi/hssf/model/ src/java/org/apache/poi/hssf/record/ src/java/org/apache/poi/hssf/record/formula/ src/java/org/apache/poi/hssf/usermodel/ src/ja...

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ptg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ptg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ptg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ptg.java Wed May 28 04:06:34 2008
@@ -119,254 +119,14 @@
         return stack;
     }
 
-    public static Ptg createPtg(RecordInputStream in)
-    {
-        byte id     = in.readByte();
-        Ptg  retval = null;
-
-        switch (id)
-        {
-             case ExpPtg.sid :                  // 0x01
-                 retval = new ExpPtg(in);
-                 break;
-
-             case AddPtg.sid :                  // 0x03
-                 retval = new AddPtg(in);
-                 break;
-
-             case SubtractPtg.sid :             // 0x04
-                 retval = new SubtractPtg(in);
-                 break;
-
-             case MultiplyPtg.sid :             // 0x05
-                 retval = new MultiplyPtg(in);
-                 break;
-
-             case DividePtg.sid :               // 0x06
-                  retval = new DividePtg(in);
-                  break;
-
-             case PowerPtg.sid :                // 0x07
-                 retval = new PowerPtg(in);
-                 break;
-
-             case ConcatPtg.sid :               // 0x08
-                 retval = new ConcatPtg(in);
-                              break;
-
-             case LessThanPtg.sid:              // 0x09
-                 retval = new LessThanPtg(in);
-                              break;
-
-              case LessEqualPtg.sid :            // 0x0a
-                 retval = new LessEqualPtg(in);
-                              break;
-
-             case EqualPtg.sid :                // 0x0b
-                 retval = new EqualPtg(in);
-                              break;
-
-             case GreaterEqualPtg.sid :         // 0x0c
-                 retval = new GreaterEqualPtg(in);
-                              break;
-
-             case GreaterThanPtg.sid :          // 0x0d
-                 retval = new GreaterThanPtg(in);
-                              break;
-
-             case NotEqualPtg.sid :             // 0x0e
-                 retval = new NotEqualPtg(in);
-                              break;
-
-             case IntersectionPtg.sid :         // 0x0f
-                 retval = new IntersectionPtg(in);
-                              break;
-              case UnionPtg.sid :                // 0x10
-                 retval = new UnionPtg(in);
-                              break;
-
-             case RangePtg.sid :                // 0x11
-                 retval = new RangePtg(in);
-                              break;
-
-             case UnaryPlusPtg.sid :            // 0x12
-                 retval = new UnaryPlusPtg(in);
-                              break;
-
-             case UnaryMinusPtg.sid :           // 0x13
-                 retval = new UnaryMinusPtg(in);
-                              break;
-
-             case PercentPtg.sid :              // 0x14
-                 retval = new PercentPtg(in);
-                              break;
-
-             case ParenthesisPtg.sid :          // 0x15
-                 retval = new ParenthesisPtg(in);
-                              break;
-
-             case MissingArgPtg.sid :           // 0x16
-                 retval = new MissingArgPtg(in);
-                              break;
-
-             case StringPtg.sid :               // 0x17
-                retval = new StringPtg(in);
-                break;
-
-             case AttrPtg.sid :                 // 0x19
-             case 0x1a :
-                 retval = new AttrPtg(in);
-                              break;
-
-             case ErrPtg.sid :                  // 0x1c
-                 retval = new ErrPtg(in);
-                              break;
-
-             case BoolPtg.sid :                 // 0x1d
-                retval = new BoolPtg(in);
-                break;
-
-             case IntPtg.sid :                  // 0x1e
-                 retval = new IntPtg(in);
-                              break;
-
-             case NumberPtg.sid :               // 0x1f
-                  retval = new NumberPtg(in);
-                  break;
-
-             case ArrayPtg.sid :                // 0x20
-                 retval = new ArrayPtg(in);
-                 break;
-             case ArrayPtgV.sid :               // 0x40
-                 retval = new ArrayPtgV(in);
-                 break;
-             case ArrayPtgA.sid :               // 0x60
-                 retval = new ArrayPtgA(in);
-                 break;
-
-             case FuncPtg.sid :                 // 0x21
-             case FuncPtg.sid + 0x20 :          // 0x41
-             case FuncPtg.sid + 0x40 :          // 0x61
-                 retval = new FuncPtg(in);
-                 break;
-
-             case FuncVarPtg.sid :              // 0x22
-             case FuncVarPtg.sid + 0x20 :       // 0x42
-             case FuncVarPtg.sid + 0x40 :       // 0x62
-                 retval = new FuncVarPtg(in);
-                              break;
-
-             case ReferencePtg.sid :            // 0x24
-                 retval = new ReferencePtg(in);
-                              break;
-             case RefAPtg.sid :                 // 0x64
-                 retval = new RefAPtg(in);
-                 break;
-             case RefVPtg.sid :                 // 0x44
-                 retval = new RefVPtg(in);
-                 break;
-             case RefNAPtg.sid :                // 0x6C
-                 retval = new RefNAPtg(in);
-                 break;
-             case RefNPtg.sid :                 // 0x2C
-                 retval = new RefNPtg(in);
-                 break;
-             case RefNVPtg.sid :                // 0x4C
-                 retval = new RefNVPtg(in);
-                 break;
-
-             case AreaPtg.sid :                 // 0x25
-                 retval = new AreaPtg(in);
-                              break;
-             case AreaVPtg.sid:                 // 0x45
-                 retval = new AreaVPtg(in);
-                 break;
-             case AreaAPtg.sid:                 // 0x65
-                 retval = new AreaAPtg(in);
-                 break;
-             case AreaNAPtg.sid :               // 0x6D
-                 retval = new AreaNAPtg(in);
-                  break;
-             case AreaNPtg.sid :                // 0x2D
-                 retval = new AreaNPtg(in);
-                 break;
-             case AreaNVPtg.sid :               // 0x4D
-                retval = new AreaNVPtg(in);
-                break;
-
-             case MemAreaPtg.sid :              // 0x26
-             case MemAreaPtg.sid + 0x40 :       // 0x46
-             case MemAreaPtg.sid + 0x20 :       // 0x66
-                 retval = new MemAreaPtg(in);
-                 break;
-
-             case MemErrPtg.sid :               // 0x27
-             case MemErrPtg.sid + 0x20 :        // 0x47
-             case MemErrPtg.sid + 0x40 :        // 0x67
-                 retval = new MemErrPtg(in);
-                              break;
-
-             case MemFuncPtg.sid :              // 0x29
-                 retval = new MemFuncPtg(in);
-                 break;
-
-             case RefErrorPtg.sid :             // 0x2a
-             case RefErrorPtg.sid + 0x20 :      // 0x4a
-             case RefErrorPtg.sid + 0x40 :      // 0x6a
-                 retval = new RefErrorPtg(in);
-                              break;
-
-             case AreaErrPtg.sid :              // 0x2b
-             case AreaErrPtg.sid + 0x20 :       // 0x4b
-             case AreaErrPtg.sid + 0x40 :       // 0x6b
-                 retval = new AreaErrPtg(in);
-                              break;
-
-             case NamePtg.sid :                 // 0x23
-             case NamePtg.sid + 0x20 :          // 0x43
-             case NamePtg.sid + 0x40 :          // 0x63
-                 retval = new NamePtg(in);
-                 break;
-
-             case NameXPtg.sid :                // 0x39
-             case NameXPtg.sid + 0x20 :         // 0x45
-             case NameXPtg.sid + 0x40 :         // 0x79
-                 retval = new NameXPtg(in);
-                              break;
-
-             case Area3DPtg.sid :               // 0x3b
-             case Area3DPtg.sid + 0x20 :        // 0x5b
-             case Area3DPtg.sid + 0x40 :        // 0x7b
-                 retval = new Area3DPtg(in);
-                              break;
-
-             case Ref3DPtg.sid :                // 0x3a
-             case Ref3DPtg.sid + 0x20:          // 0x5a
-             case Ref3DPtg.sid + 0x40:          // 0x7a
-                 retval = new Ref3DPtg(in);
-                              break;
-
-             case DeletedRef3DPtg.sid:          // 0x3c
-             case DeletedRef3DPtg.sid + 0x20:   // 0x5c
-             case DeletedRef3DPtg.sid + 0x40:   // 0x7c
-                 retval = new DeletedRef3DPtg(in);
-                              break;
-
-             case DeletedArea3DPtg.sid :        // 0x3d
-             case DeletedArea3DPtg.sid + 0x20 : // 0x5d
-             case DeletedArea3DPtg.sid + 0x40 : // 0x7d
-                 retval = new DeletedArea3DPtg(in);
-                 break;
-
-             case 0x00:
-                 retval = new UnknownPtg();
-                 break;
-
-            default :
-                 //retval = new UnknownPtg();
-                 throw new java.lang.UnsupportedOperationException(" Unknown Ptg in Formula: 0x"+
-                        Integer.toHexString(( int ) id) + " (" + ( int ) id + ")");
+    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);
@@ -380,6 +140,118 @@
 
     }
 
+	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 + ")");
+	}
+
+	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
+		}
+		throw new RuntimeException("Unexpected base token id (" + id + ")");
+	}
+    /**
+     * 
+     * 
+     */
+	public static int getEncodedSize(Stack ptgs) {
+		return getEncodedSize(toPtgArray(ptgs));
+	}
+	private static Ptg[] toPtgArray(List l) {
+		Ptg[] result = new Ptg[l.size()];
+		l.toArray(result);
+		return result;
+	}
+    private static Stack createStack(Ptg[] formulaTokens) {
+		Stack result = new Stack();
+		for (int i = 0; i < formulaTokens.length; i++) {
+			result.add(formulaTokens[i]);
+		} 
+		return result;
+	}
+	// TODO - several duplicates of this code should be refactored here
+	public static int getEncodedSize(Ptg[] ptgs) {
+		int result = 0;
+		for (int i = 0; i < ptgs.length; i++) {
+			result += ptgs[i].getSize();
+		}
+		return result;
+	}
+
     public static int serializePtgStack(Stack expression, byte[] array, int offset) {
         int pos = 0;
         int size = 0;
@@ -408,7 +280,15 @@
         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()
     {
@@ -455,10 +335,15 @@
     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;
     }
 
-    /** returns the class (REF/VALUE/ARRAY) for this Ptg */
+    /**
+     *  @return the 'operand class' (REF/VALUE/ARRAY) for this Ptg
+     */
     public byte getPtgClass() {
         return ptgClass;
     }
@@ -468,5 +353,8 @@
     public abstract Object clone();
 
 
-
+    /**
+     * @return <code>false</code> if this token is classified as 'reference', 'value', or 'array'
+     */
+    public abstract boolean isBaseToken();
 }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RangePtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RangePtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RangePtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RangePtg.java Wed May 28 04:06:34 2008
@@ -23,8 +23,7 @@
 /**
  * @author Daniel Noll (daniel at nuix dot com dot au)
  */
-public class RangePtg extends OperationPtg
-{
+public final class RangePtg  extends OperationPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x11;
 
@@ -37,6 +36,10 @@
     	// No contents
     }
 
+    public final boolean isBaseToken() {
+        return true;
+    }
+
 
     public int getSize()
     {

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java Wed May 28 04:06:34 2008
@@ -35,8 +35,7 @@
  * @author Jason Height (jheight at chariot dot net dot au)
  * @version 1.0-pre
  */
-
-public class Ref3DPtg extends Ptg {
+public class Ref3DPtg extends OperandPtg {
     public final static byte sid  = 0x3a;
     private final static int  SIZE = 7; // 6 + 1 for Ptg
     private short             field_1_index_extern_sheet;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/RefErrorPtg.java Wed May 28 04:06:34 2008
@@ -28,9 +28,8 @@
  * RefError - handles deleted cell reference
  * @author Jason Height (jheight at chariot dot net dot au)
  */
+public final class RefErrorPtg extends OperandPtg {
 
-public class RefErrorPtg extends Ptg
-{
     private final static int SIZE = 5;
     public final static byte sid  = 0x2a;
     private int              field_1_reserved;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/ReferencePtg.java Wed May 28 04:06:34 2008
@@ -30,14 +30,14 @@
  * @author  Andrew C. Oliver (acoliver@apache.org)
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-public class ReferencePtg extends Ptg {
+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.  
+     * 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() {
@@ -46,14 +46,14 @@
 
     private final static int SIZE = 5;
     public final static byte sid  = 0x24;
-    private final static int MAX_ROW_NUMBER = 65536;             
+    private final static int MAX_ROW_NUMBER = 65536;
 
    /** The row index - zero based unsigned 16 bit value */
     private int            field_1_row;
-    /** Field 2 
-     * - lower 8 bits is the zero based unsigned byte column index 
+    /** Field 2
+     * - lower 8 bits is the zero based unsigned byte column index
      * - bit 16 - isRowRelative
-     * - bit 15 - isColumnRelative 
+     * - bit 15 - isColumnRelative
      */
     private int            field_2_col;
     private static final BitField         rowRelative = BitFieldFactory.getInstance(0x8000);
@@ -63,9 +63,9 @@
     protected ReferencePtg() {
       //Required for clone methods
     }
-    
+
     /**
-     * Takes in a String represnetation of a cell reference and fills out the 
+     * Takes in a String represnetation of a cell reference and fills out the
      * numeric fields.
      */
     public ReferencePtg(String cellref) {
@@ -75,13 +75,13 @@
         setColRelative(!c.isColAbsolute());
         setRowRelative(!c.isRowAbsolute());
     }
-    
+
     public ReferencePtg(int row, int column, boolean isRowRelative, boolean isColumnRelative) {
       setRow(row);
       setColumn(column);
       setRowRelative(isRowRelative);
       setColRelative(isColumnRelative);
-    }    
+    }
 
     /** Creates new ValueReferencePtg */
 
@@ -90,22 +90,19 @@
         field_1_row = in.readUShort();
         field_2_col = in.readUShort();
     }
-    
+
     public String getRefPtgName() {
       return "ReferencePtg";
-    }    
+    }
 
-    public String toString()
-    {
-        StringBuffer buffer = new StringBuffer("[");
-        buffer.append(getRefPtgName());
-        buffer.append("]\n");
-
-        buffer.append("row = ").append(getRow()).append("\n");
-        buffer.append("col = ").append(getColumn()).append("\n");
-        buffer.append("rowrelative = ").append(isRowRelative()).append("\n");
-        buffer.append("colrelative = ").append(isColRelative()).append("\n");
-        return buffer.toString();
+    public String toString() {
+        CellReference cr = new CellReference(getRow(), getColumn(), !isRowRelative(),!isColRelative());
+        StringBuffer sb = new StringBuffer();
+        sb.append(getClass().getName());
+        sb.append(" [");
+        sb.append(cr.formatAsString());
+        sb.append("]");
+        return sb.toString();
     }
 
     public void writeBytes(byte [] array, int offset)
@@ -147,16 +144,16 @@
     {
         return rowRelative.isSet(field_2_col);
     }
-    
+
     public void setRowRelative(boolean rel) {
         field_2_col=rowRelative.setBoolean(field_2_col,rel);
     }
-    
+
     public boolean isColRelative()
     {
         return colRelative.isSet(field_2_col);
     }
-    
+
     public void setColRelative(boolean rel) {
         field_2_col=colRelative.setBoolean(field_2_col,rel);
     }
@@ -193,11 +190,11 @@
         //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() {
         return Ptg.CLASS_REF;
     }
-    
+
     public Object clone() {
       ReferencePtg ptg = new ReferencePtg();
       ptg.field_1_row = field_1_row;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/StringPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/StringPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/StringPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/StringPtg.java Wed May 28 04:06:34 2008
@@ -31,7 +31,7 @@
  * @author Jason Height (jheight at chariot dot net dot au)
  * @author Bernard Chesnoy
  */
-public final class StringPtg extends Ptg {
+public final class StringPtg extends ScalarConstantPtg {
     public final static int SIZE = 9;
     public final static byte sid = 0x17;
     private static final BitField fHighByte = BitFieldFactory.getInstance(0x01);
@@ -124,10 +124,6 @@
         return sb.toString();
     }
 
-    public byte getDefaultOperandClass() {
-        return Ptg.CLASS_VALUE;
-    }
-
     public Object clone() {
         StringPtg ptg = new StringPtg();
         ptg.field_1_length = field_1_length;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/SubtractPtg.java Wed May 28 04:06:34 2008
@@ -26,10 +26,7 @@
  * @author  andy
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-
-public class SubtractPtg
-    extends OperationPtg    
-{
+public final class SubtractPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x04;
 

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java Wed May 28 04:06:34 2008
@@ -28,8 +28,7 @@
  * @author Avik Sengupta
  */
 
-public class UnaryMinusPtg extends OperationPtg
-{
+public final class UnaryMinusPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x13;
     
@@ -82,8 +81,6 @@
         return buffer.toString();
     }
     
-    public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
-           
     public Object clone() {
       return new UnaryPlusPtg();
     }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java Wed May 28 04:06:34 2008
@@ -28,8 +28,7 @@
  * @author Avik Sengupta
  */
 
-public class UnaryPlusPtg extends OperationPtg
-{
+public final class UnaryPlusPtg extends ValueOperatorPtg {
     public final static int  SIZE = 1;
     public final static byte sid  = 0x12;
     
@@ -82,8 +81,6 @@
         return buffer.toString();
     }
     
-    public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
-           
     public Object clone() {
       return new UnaryPlusPtg();
     }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnionPtg.java Wed May 28 04:06:34 2008
@@ -23,8 +23,7 @@
 /**
  * @author Glen Stampoultzis (glens at apache.org)
  */
-public class UnionPtg extends OperationPtg
-{
+public final class UnionPtg extends OperationPtg {
     public final static byte sid  = 0x10;
 
 
@@ -37,6 +36,9 @@
         // doesn't need anything
     }
 
+    public final boolean isBaseToken() {
+        return true;
+    }
 
     public int getSize()
     {

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/UnknownPtg.java Wed May 28 04:06:34 2008
@@ -24,10 +24,7 @@
  * @author  andy
  * @author Jason Height (jheight at chariot dot net dot au)
  */
-
-public class UnknownPtg
-    extends Ptg
-{
+public class UnknownPtg extends Ptg {
     private short size = 1;
 
     /** Creates new UnknownPtg */
@@ -36,12 +33,13 @@
     {
     }
 
-    public UnknownPtg(RecordInputStream in)
-    {
-
+    public UnknownPtg(RecordInputStream in) {
         // doesn't need anything
     }
 
+    public boolean isBaseToken() {
+    	return true;
+    }
     public void writeBytes(byte [] array, int offset)
     {
     }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFObjectData.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFObjectData.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFObjectData.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFObjectData.java Wed May 28 04:06:34 2008
@@ -55,36 +55,72 @@
         this.record = record;
         this.poifs = poifs;
     }
+    
+    /**
+     * Returns the OLE2 Class Name of the object
+     */
+    public String getOLE2ClassName() {
+    	EmbeddedObjectRefSubRecord subRecord = findObjectRecord();
+    	return subRecord.field_5_ole_classname;
+    }
 
     /**
-     * Gets the object data.
+     * Gets the object data. Only call for ones that have
+     *  data though. See {@link #hasDirectoryEntry()}
      *
      * @return the object data as an OLE2 directory.
      * @throws IOException if there was an error reading the data.
      */
-    public DirectoryEntry getDirectory() throws IOException
-    {
+    public DirectoryEntry getDirectory() throws IOException {
+    	EmbeddedObjectRefSubRecord subRecord = findObjectRecord();
+
+    	int streamId = ((EmbeddedObjectRefSubRecord) subRecord).getStreamId();
+        String streamName = "MBD" + HexDump.toHex(streamId);
+
+        Entry entry = poifs.getRoot().getEntry(streamName);
+        if (entry instanceof DirectoryEntry) {
+            return (DirectoryEntry) entry;
+        } else {
+            throw new IOException("Stream " + streamName + " was not an OLE2 directory");
+        }
+    }
+    
+    /**
+     * Returns the data portion, for an ObjectData
+     *  that doesn't have an associated POIFS Directory
+     *  Entry
+     */
+    public byte[] getObjectData() {
+    	EmbeddedObjectRefSubRecord subRecord = findObjectRecord();
+    	return subRecord.remainingBytes;
+    }
+    
+    /**
+     * Does this ObjectData have an associated POIFS 
+     *  Directory Entry?
+     * (Not all do, those that don't have a data portion)
+     */
+    public boolean hasDirectoryEntry() {
+    	EmbeddedObjectRefSubRecord subRecord = findObjectRecord();
+    	
+    	// Field 6 tells you
+    	return (subRecord.field_6_stream_id != 0);
+    }
+    
+    /**
+     * Finds the EmbeddedObjectRefSubRecord, or throws an 
+     *  Exception if there wasn't one
+     */
+    protected EmbeddedObjectRefSubRecord findObjectRecord() {
         Iterator subRecordIter = record.getSubRecords().iterator();
-        while (subRecordIter.hasNext())
-        {
+        
+        while (subRecordIter.hasNext()) {
             Object subRecord = subRecordIter.next();
-            if (subRecord instanceof EmbeddedObjectRefSubRecord)
-            {
-                int streamId = ((EmbeddedObjectRefSubRecord) subRecord).getStreamId();
-                String streamName = "MBD" + HexDump.toHex(streamId);
-
-                Entry entry = poifs.getRoot().getEntry(streamName);
-                if (entry instanceof DirectoryEntry)
-                {
-                    return (DirectoryEntry) entry;
-                }
-                else
-                {
-                    throw new IOException("Stream " + streamName + " was not an OLE2 directory");
-                }
+            if (subRecord instanceof EmbeddedObjectRefSubRecord) {
+            	return (EmbeddedObjectRefSubRecord)subRecord;
             }
         }
-
+        
         throw new IllegalStateException("Object data does not contain a reference to an embedded object OLE2 directory");
     }
 }

Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/DateUtil.java Wed May 28 04:06:34 2008
@@ -220,9 +220,13 @@
     	//  switching stuff, which we can ignore
     	fs = fs.replaceAll(";@", "");
     	
-    	// If it starts with [$-...], then it is a date, but
+    	// If it starts with [$-...], then could be a date, but
     	//  who knows what that starting bit is all about
-    	fs = fs.replaceAll("\\[\\$\\-.*?\\]", "");
+    	fs = fs.replaceAll("^\\[\\$\\-.*?\\]", "");
+    	
+    	// If it starts with something like [Black] or [Yellow],
+    	//  then it could be a date
+    	fs = fs.replaceAll("^\\[[a-zA-Z]+\\]", "");
     	
     	// Otherwise, check it's only made up, in any case, of:
     	//  y m d h s - / , . :

Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/ss/usermodel/FormulaEvaluator.java Wed May 28 04:06:34 2008
@@ -330,31 +330,27 @@
     }
     private static ValueEval evaluateCell(Workbook workbook, Sheet sheet, 
             int srcRowNum, short srcColNum, String cellFormulaText) {
-    	
-    	FormulaParser parser =
-    		new FormulaParser(cellFormulaText, workbook);
-    	
-        parser.parse();
-        Ptg[] ptgs = parser.getRPNPtg();
-        // -- parsing over --
-        
+        Ptg[] ptgs = FormulaParser.parse(cellFormulaText, workbook);
 
         Stack stack = new Stack();
         for (int i = 0, iSize = ptgs.length; i < iSize; i++) {
 
             // since we don't know how to handle these yet :(
             Ptg ptg = ptgs[i];
-            if (ptg instanceof ControlPtg) { continue; }
+            if (ptg instanceof ControlPtg) {
+                // skip Parentheses, Attr, etc
+                continue;
+            }
             if (ptg instanceof MemErrPtg) { continue; }
             if (ptg instanceof MissingArgPtg) { continue; }
             if (ptg instanceof NamePtg) { 
-            	// named ranges, macro functions
+                // named ranges, macro functions
                 NamePtg namePtg = (NamePtg) ptg;
                 stack.push(new NameEval(namePtg.getIndex()));
                 continue; 
             }
             if (ptg instanceof NameXPtg) {
-            	// TODO - external functions
+                // TODO - external functions
                 continue;
             }
             if (ptg instanceof UnknownPtg) { continue; }
@@ -362,9 +358,6 @@
             if (ptg instanceof OperationPtg) {
                 OperationPtg optg = (OperationPtg) ptg;
 
-                // parens can be ignored since we have RPN tokens
-                if (optg instanceof ParenthesisPtg) { continue; }
-                if (optg instanceof AttrPtg) { continue; }
                 if (optg instanceof UnionPtg) { continue; }
 
                 OperationEval operation = OperationEvaluatorFactory.create(optg);

Modified: poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt (original)
+++ poi/branches/ooxml/src/resources/main/org/apache/poi/hssf/record/formula/function/functionMetadata.txt Wed May 28 04:06:34 2008
@@ -15,6 +15,7 @@
 
 # Created by (org.apache.poi.hssf.record.formula.function.ExcelFileFormatDocFunctionExtractor)
 # from source file 'excelfileformat.odt' (size=356107, md5=0x8f789cb6e75594caf068f8e193004ef4)
+#  ! + some manual edits !
 #
 #Columns: (index, name, minParams, maxParams, returnClass, paramClasses, isVolatile, hasFootnote )
 
@@ -78,8 +79,8 @@
 58	NPER	3	5	V	V V V V V		
 59	PMT	3	5	V	V V V V V		
 60	RATE	3	6	V	V V V V V V		
-61	MIRR	3	3	V	R V V		
-62	IRR	1	2	V	R V		
+61	MIRR	3	3	V	A V V		
+62	IRR	1	2	V	A V		
 63	RAND	0	0	V	-	x	
 64	MATCH	2	3	V	V R R		
 65	DATE	3	3	V	V V V		
@@ -93,8 +94,8 @@
 73	SECOND	1	1	V	V		
 74	NOW	0	0	V	-	x	
 75	AREAS	1	1	V	R		
-76	ROWS	1	1	V	R		
-77	COLUMNS	1	1	V	R		
+76	ROWS	1	1	V	A		
+77	COLUMNS	1	1	V	A		
 78	OFFSET	3	5	R	R V V V V	x	
 82	SEARCH	2	3	V	V V V		
 83	TRANSPOSE	1	1	A	A		

Modified: poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java (original)
+++ poi/branches/ooxml/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFChart.java Wed May 28 04:06:34 2008
@@ -213,6 +213,23 @@
     		charts.toArray( new HSSFChart[charts.size()] );
     }
 
+    /** Get the X offset of the chart */
+    public int getChartX() { return chartRecord.getX(); }
+    /** Get the Y offset of the chart */
+    public int getChartY() { return chartRecord.getY(); }
+    /** Get the width of the chart. {@link ChartRecord} */
+    public int getChartWidth() { return chartRecord.getWidth(); }
+    /** Get the height of the chart. {@link ChartRecord} */
+    public int getChartHeight() { return chartRecord.getHeight(); }
+
+    /** Sets the X offset of the chart */
+    public void setChartX(int x) { chartRecord.setX(x); }
+    /** Sets the Y offset of the chart */
+    public void setChartY(int y) { chartRecord.setY(y); }
+    /** Sets the width of the chart. {@link ChartRecord} */
+    public void setChartWidth(int width) { chartRecord.setWidth(width); }
+    /** Sets the height of the chart. {@link ChartRecord} */
+    public void setChartHeight(int height) { chartRecord.setHeight(height); }
     
     /**
      * Returns the series of the chart

Modified: poi/branches/ooxml/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java (original)
+++ poi/branches/ooxml/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestHSSFChart.java Wed May 28 04:06:34 2008
@@ -53,6 +53,12 @@
 		assertEquals("1st Column", charts[0].getSeries()[0].getSeriesTitle());
 		assertEquals("2nd Column", charts[0].getSeries()[1].getSeriesTitle());
 		assertEquals(null, charts[0].getChartTitle());
+		
+		// Check x, y, width, height
+		assertEquals(0, charts[0].getChartX());
+		assertEquals(0, charts[0].getChartY());
+		assertEquals(26492928, charts[0].getChartWidth());
+		assertEquals(15040512, charts[0].getChartHeight());
 	}
 
 	public void testTwoCharts() throws Exception {

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/AllModelTests.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/AllModelTests.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/AllModelTests.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/AllModelTests.java Wed May 28 04:06:34 2008
@@ -33,6 +33,9 @@
 		result.addTestSuite(TestDrawingManager2.class);
 		result.addTestSuite(TestFormulaParser.class);
 		result.addTestSuite(TestFormulaParserEval.class);
+		result.addTestSuite(TestFormulaParserIf.class);
+		result.addTestSuite(TestOperandClassTransformer.class);
+		result.addTestSuite(TestRVA.class);
 		result.addTestSuite(TestSheet.class);
 		result.addTestSuite(TestSheetAdditional.class);
 		return result;

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java Wed May 28 04:06:34 2008
@@ -33,12 +33,9 @@
 import org.apache.poi.hssf.record.formula.FuncPtg;
 import org.apache.poi.hssf.record.formula.FuncVarPtg;
 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.NotEqualPtg;
 import org.apache.poi.hssf.record.formula.NumberPtg;
 import org.apache.poi.hssf.record.formula.PercentPtg;
 import org.apache.poi.hssf.record.formula.PowerPtg;
@@ -62,10 +59,8 @@
 	/**
 	 * @return parsed token array already confirmed not <code>null</code>
 	 */
-	private static Ptg[] parseFormula(String s) {
-		FormulaParser fp = new FormulaParser(s, null);
-		fp.parse();
-		Ptg[] result = fp.getRPNPtg();
+	/* package */ static Ptg[] parseFormula(String formula) {
+		Ptg[] result = FormulaParser.parse(formula, null);
 		assertNotNull("Ptg array should not be null", result);
 		return result;
 	}
@@ -105,83 +100,6 @@
 		assertEquals(true, flag.getValue());
 	}
 
-	public void testYN() {
-		Ptg[] ptgs = parseFormula("IF(TRUE,\"Y\",\"N\")");
-		assertEquals(7, ptgs.length);
-
-		BoolPtg flag  = (BoolPtg) ptgs[0];
-		AttrPtg funif = (AttrPtg) ptgs[1];
-		StringPtg y = (StringPtg) ptgs[2];
-		AttrPtg goto1 = (AttrPtg) ptgs[3];
-		StringPtg n = (StringPtg) ptgs[4];
-
-
-		assertEquals(true, flag.getValue());
-		assertEquals("Y", y.getValue());
-		assertEquals("N", n.getValue());
-		assertEquals("IF", funif.toFormulaString((HSSFWorkbook) null));
-		assertTrue("Goto ptg exists", goto1.isGoto());
-	}
-
-	public void testSimpleIf() {
-		String formula = "IF(1=1,0,1)";
-
-		Class[] expectedClasses = {
-			IntPtg.class,
-			IntPtg.class,
-			EqualPtg.class,
-			AttrPtg.class,
-			IntPtg.class,
-			AttrPtg.class,
-			IntPtg.class,
-			AttrPtg.class,
-			FuncVarPtg.class,
-		};
-		confirmTokenClasses(formula, expectedClasses);
-		
-		Ptg[] ptgs = parseFormula(formula);
-
-		AttrPtg ifPtg = (AttrPtg) ptgs[3];
-		AttrPtg ptgGoto= (AttrPtg) ptgs[5];
-		assertEquals("Goto 1 Length", 10, ptgGoto.getData());
-
-		AttrPtg ptgGoto2 = (AttrPtg) ptgs[7];
-		assertEquals("Goto 2 Length", 3, ptgGoto2.getData());
-		assertEquals("If FALSE offset", 7, ifPtg.getData());
-	}
-
-	/**
-	 * Make sure the ptgs are generated properly with two functions embedded
-	 *
-	 */
-	public void testNestedFunctionIf() {
-		Ptg[] ptgs = parseFormula("IF(A1=B1,AVERAGE(A1:B1),AVERAGE(A2:B2))");
-		assertEquals(11, ptgs.length);
-
-		assertTrue("IF Attr set correctly", (ptgs[3] instanceof AttrPtg));
-		AttrPtg ifFunc = (AttrPtg)ptgs[3];
-		assertTrue("It is not an if", ifFunc.isOptimizedIf());
-
-		assertTrue("Average Function set correctly", (ptgs[5] instanceof FuncVarPtg));
-	}
-
-	public void testIfSingleCondition(){
-		Ptg[] ptgs = parseFormula("IF(1=1,10)");
-		assertEquals(7, ptgs.length);
-
-		assertTrue("IF Attr set correctly", (ptgs[3] instanceof AttrPtg));
-		AttrPtg ifFunc = (AttrPtg)ptgs[3];
-		assertTrue("It is not an if", ifFunc.isOptimizedIf());
-
-		assertTrue("Single Value is not an IntPtg", (ptgs[4] instanceof IntPtg));
-		IntPtg intPtg = (IntPtg)ptgs[4];
-		assertEquals("Result", (short)10, intPtg.getValue());
-
-		assertTrue("Ptg is not a Variable Function", (ptgs[6] instanceof FuncVarPtg));
-		FuncVarPtg funcPtg = (FuncVarPtg)ptgs[6];
-		assertEquals("Arguments", 2, funcPtg.getNumberOfOperands());
-	}
-
 	public void testSumIf() {
 		Ptg[] ptgs = parseFormula("SUMIF(A1:A5,\">4000\",B1:B5)");
 		assertEquals(4, ptgs.length);
@@ -203,33 +121,9 @@
 		//the PTG order isn't 100% correct but it still works - dmui
 	}
 
-	public void testSimpleLogical() {
-	 Ptg[] ptgs = parseFormula("IF(A1<A2,B1,B2)");
-	 assertEquals(9, ptgs.length);
-	 assertEquals("3rd Ptg is less than", LessThanPtg.class, ptgs[2].getClass());
-	}
-
-	public void testParenIf() {
-		Ptg[] ptgs = parseFormula("IF((A1+A2)<=3,\"yes\",\"no\")");
-		assertEquals(12, ptgs.length);
-		assertEquals("6th Ptg is less than equal",LessEqualPtg.class,ptgs[5].getClass());
-		assertEquals("11th Ptg is not a goto (Attr) ptg",AttrPtg.class,ptgs[10].getClass());
-	}
-
-	public void testEmbeddedIf() {
-		Ptg[] ptgs = parseFormula("IF(3>=1,\"*\",IF(4<>1,\"first\",\"second\"))");
-		assertEquals(17, ptgs.length);
-
-		assertEquals("6th Ptg is not a goto (Attr) ptg",AttrPtg.class,ptgs[5].getClass());
-		assertEquals("9th Ptg is not a not equal ptg",NotEqualPtg.class,ptgs[8].getClass());
-		assertEquals("15th Ptg is not the inner IF variable function ptg",FuncVarPtg.class,ptgs[14].getClass());
-	}
-
 	public void testMacroFunction() {
 		HSSFWorkbook w = new HSSFWorkbook();
-		FormulaParser fp = new FormulaParser("FOO()", w);
-		fp.parse();
-		Ptg[] ptg = fp.getRPNPtg();
+		Ptg[] ptg = FormulaParser.parse("FOO()", w);
 
 		// the name gets encoded as the first arg
 		NamePtg tname = (NamePtg) ptg[0];
@@ -597,7 +491,7 @@
 		confirmTokenClasses("2^200%", expClss);
 	}
 
-	private static void confirmTokenClasses(String formula, Class[] expectedClasses) {
+	/* package */ static Ptg[] confirmTokenClasses(String formula, Class[] expectedClasses) {
 		Ptg[] ptgs = parseFormula(formula);
 		assertEquals(expectedClasses.length, ptgs.length);
 		for (int i = 0; i < expectedClasses.length; i++) {
@@ -607,6 +501,7 @@
 					+ ptgs[i].getClass().getName() + ")");
 			}
 		}
+		return ptgs;
 	}
 
 	public void testPower() {
@@ -644,8 +539,16 @@
 
 		Class[] expClss;
 
-		expClss = new Class[] { ReferencePtg.class, MissingArgPtg.class, ReferencePtg.class,
-				FuncVarPtg.class, };
+		expClss = new Class[] { 
+				ReferencePtg.class, 
+				AttrPtg.class, // tAttrIf
+				MissingArgPtg.class, 
+				AttrPtg.class, // tAttrSkip
+				ReferencePtg.class,
+				AttrPtg.class, // tAttrSkip
+				FuncVarPtg.class, 
+		};
+
 		confirmTokenClasses("if(A1, ,C1)", expClss);
 
 		expClss = new Class[] { MissingArgPtg.class, AreaPtg.class, MissingArgPtg.class,
@@ -814,7 +717,7 @@
 			fail("Expected exception was not thrown");
 		} catch (IllegalStateException e) {
 			// expected during successful test
-			assertTrue(e.getMessage().startsWith("Too few arguments suppled to operation token"));
+			assertTrue(e.getMessage().startsWith("Too few arguments supplied to operation"));
 		}
 	}
 	/**

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/TestArrayPtg.java Wed May 28 04:06:34 2008
@@ -19,8 +19,10 @@
 
 import java.util.Arrays;
 
+import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.hssf.record.TestcaseRecordInputStream;
 import org.apache.poi.hssf.record.UnicodeString;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
@@ -77,7 +79,7 @@
 	}
 
 	/**
-	 * make sure constant elements are stored row by row 
+	 * 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));
@@ -86,10 +88,27 @@
 		assertEquals(2, ptg.getRowCount());
 		
 		assertEquals(0, ptg.getValueIndex(0, 0));
-		assertEquals(1, ptg.getValueIndex(1, 0));
-		assertEquals(2, ptg.getValueIndex(2, 0));
-		assertEquals(3, ptg.getValueIndex(0, 1));
-		assertEquals(4, ptg.getValueIndex(1, 1));
+		assertEquals(2, ptg.getValueIndex(1, 0));
+		assertEquals(4, ptg.getValueIndex(2, 0));
+		assertEquals(1, ptg.getValueIndex(0, 1));
+		assertEquals(3, ptg.getValueIndex(1, 1));
 		assertEquals(5, ptg.getValueIndex(2, 1));
 	}
+	
+	/**
+	 * Test for a bug which was temporarily introduced by the fix for bug 42564.
+	 * A spreadsheet was added to make the ordering clearer.
+	 */
+	public void testElementOrderingInSpreadsheet() {
+		HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("ex42564-elementOrder.xls");
+
+		// The formula has an array with 3 rows and 5 column 
+		String formula = wb.getSheetAt(0).getRow(0).getCell((short)0).getCellFormula();
+		// TODO - These number literals should not have '.0'. Excel has different number rendering rules
+
+		if (formula.equals("SUM({1.0,6.0,11.0;2.0,7.0,12.0;3.0,8.0,13.0;4.0,9.0,14.0;5.0,10.0,15.0})")) {
+			throw new AssertionFailedError("Identified bug 42564 b");
+		}
+		assertEquals("SUM({1.0,2.0,3.0;4.0,5.0,6.0;7.0,8.0,9.0;10.0,11.0,12.0;13.0,14.0,15.0})", formula);
+	}
 }

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java Wed May 28 04:06:34 2008
@@ -18,9 +18,11 @@
 package org.apache.poi.hssf.usermodel;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Iterator;
+import java.util.List;
 
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
@@ -28,6 +30,7 @@
 import org.apache.poi.ss.util.Region;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.record.EmbeddedObjectRefSubRecord;
 import org.apache.poi.util.TempFile;
 
 /**
@@ -951,4 +954,40 @@
         writeOutAndReadBack(wb);
         assertTrue("no errors writing sample xls", true);
     }
+    
+    /**
+     * Problems with extracting check boxes from
+     *  HSSFObjectData
+     * @throws Exception
+     */
+    public void test44840() throws Exception {
+        HSSFWorkbook wb = openSample("WithCheckBoxes.xls");
+
+        // Take a look at the embeded objects
+        List objects = wb.getAllEmbeddedObjects();
+        assertEquals(1, objects.size());
+        
+        HSSFObjectData obj = (HSSFObjectData)objects.get(0);
+        assertNotNull(obj);
+        
+        // Peek inside the underlying record
+        EmbeddedObjectRefSubRecord rec = obj.findObjectRecord();
+        assertNotNull(rec);
+        
+        assertEquals(32, rec.field_1_stream_id_offset);
+        assertEquals(0, rec.field_6_stream_id); // WRONG!
+        assertEquals("Forms.CheckBox.1", rec.field_5_ole_classname);
+        assertEquals(12, rec.remainingBytes.length);
+        
+        // Doesn't have a directory
+        assertFalse(obj.hasDirectoryEntry());
+        assertNotNull(obj.getObjectData());
+        assertEquals(12, obj.getObjectData().length);
+        assertEquals("Forms.CheckBox.1", obj.getOLE2ClassName());
+        
+        try {
+        	obj.getDirectory();
+        	fail();
+        } catch(FileNotFoundException e) {}
+    }
 }

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java?rev=660905&r1=660904&r2=660905&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFDateUtil.java Wed May 28 04:06:34 2008
@@ -257,9 +257,15 @@
                 // (who knows what they mean though...)
                 "[$-F800]dddd\\,\\ mmm\\ dd\\,\\ yyyy",
                 "[$-F900]ddd/mm/yyy",
+                // These ones specify colours, who knew that was allowed?
+                "[BLACK]dddd/mm/yy",
+                "[yeLLow]yyyy-mm-dd"
         };
         for(int i=0; i<formats.length; i++) {
-            assertTrue( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+            assertTrue(
+            		formats[i] + " is a date format", 
+            		HSSFDateUtil.isADateFormat(formatId, formats[i])
+            );
         }
         
         // Then time based ones too
@@ -270,7 +276,10 @@
                 "mm/dd HH:MM PM", "mm/dd HH:MM pm" 
         };
         for(int i=0; i<formats.length; i++) {
-            assertTrue( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+            assertTrue(
+            		formats[i] + " is a datetime format", 
+            		HSSFDateUtil.isADateFormat(formatId, formats[i])
+            );
         }
         
         // Then invalid ones
@@ -278,10 +287,14 @@
                 "yyyy*mm*dd", 
                 "0.0", "0.000",
                 "0%", "0.0%",
+                "[]Foo", "[BLACK]0.00%",
                 "", null
         };
         for(int i=0; i<formats.length; i++) {
-            assertFalse( HSSFDateUtil.isADateFormat(formatId, formats[i]) );
+            assertFalse( 
+            		formats[i] + " is not a date or datetime format",
+            		HSSFDateUtil.isADateFormat(formatId, formats[i])
+            );
         }
         
         // And these are ones we probably shouldn't allow,



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