dmui        2003/06/01 19:47:44

  Modified:    src/java/org/apache/poi/hssf/record FormulaRecord.java
               src/java/org/apache/poi/hssf/record/aggregates
                        FormulaRecordAggregate.java
               src/java/org/apache/poi/hssf/record/formula ExpPtg.java
               src/testcases/org/apache/poi/hssf/model SheetTest.java
  Log:
  Fixed support for Cloning SharedFormulas and FormulaAggregates leaving
  out other values after it.
  
  Revision  Changes    Path
  1.21      +2 -2      
jakarta-poi/src/java/org/apache/poi/hssf/record/FormulaRecord.java
  
  Index: FormulaRecord.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/FormulaRecord.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- FormulaRecord.java        6 May 2003 13:08:08 -0000       1.20
  +++ FormulaRecord.java        2 Jun 2003 02:47:44 -0000       1.21
  @@ -607,8 +607,8 @@
         if (field_8_parsed_expr != null)
           size = field_8_parsed_expr.size();
         for (int i=0; i< size; i++) {
  -        Ptg ptg = (Ptg)((Ptg)field_8_parsed_expr.get(i)).clone();
  -        rec.field_8_parsed_expr.set(i, ptg);
  +        Ptg ptg = (Ptg)((Ptg)field_8_parsed_expr.get(i)).clone();        
  +        rec.field_8_parsed_expr.add(i, ptg);
         }
         rec.all_data = all_data;
         return rec;
  
  
  
  1.5       +27 -1     
jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java
  
  Index: FormulaRecordAggregate.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FormulaRecordAggregate.java       8 May 2003 00:02:03 -0000       1.4
  +++ FormulaRecordAggregate.java       2 Jun 2003 02:47:44 -0000       1.5
  @@ -82,6 +82,19 @@
           this.stringRecord = stringRecord;
       }
   
  +     /**
  +      * Used only in the clone
  +      * @param formulaRecord
  +      * @param stringRecord
  +      * @param sharedRecord
  +      */
  +     public FormulaRecordAggregate( FormulaRecord formulaRecord, StringRecord 
stringRecord, SharedFormulaRecord sharedRecord)
  +     {
  +               this.formulaRecord = formulaRecord;
  +               this.stringRecord = stringRecord;
  +               this.sharedFormulaRecord = sharedRecord;
  +     }
  +
   
   
       protected void validateSid( short id )
  @@ -221,7 +234,10 @@
        * @see java.lang.Object#clone()
        */
       public Object clone() {
  -        return new FormulaRecordAggregate((FormulaRecord) 
this.formulaRecord.clone(), (StringRecord) this.stringRecord.clone());
  +                     StringRecord clonedString = (stringRecord == null) ? null : 
(StringRecord)stringRecord.clone();
  +             SharedFormulaRecord clonedShared = (sharedFormulaRecord == null) ? 
null : (SharedFormulaRecord)sharedFormulaRecord.clone();
  +             
  +        return new FormulaRecordAggregate((FormulaRecord) 
this.formulaRecord.clone(), clonedString, clonedShared);
       }
   
   
  @@ -239,6 +255,16 @@
       */
      public void setSharedFormulaRecord(SharedFormulaRecord sharedFormulaRecord) {
         this.sharedFormulaRecord = sharedFormulaRecord;
  +   }
  +
  +   /* 
  +    * Setting to true so that this value does not abort the whole ValueAggregation
  +    * (non-Javadoc)
  +    * @see org.apache.poi.hssf.record.Record#isInValueSection()
  +    */
  +   public boolean isInValueSection() {
  +
  +      return true;
      }
   
   }
  
  
  
  1.8       +4 -1      
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java
  
  Index: ExpPtg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- ExpPtg.java       8 May 2003 00:02:03 -0000       1.7
  +++ ExpPtg.java       2 Jun 2003 02:47:44 -0000       1.8
  @@ -110,7 +110,10 @@
       public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
       
       public Object clone() {
  -      throw new RuntimeException("NO IDEA SHARED FORMULA EXP PTG");
  +     //can't clone one that doesnt have data can we??
  +             if (this.existing == null) throw new RuntimeException("NO IDEA SHARED 
FORMULA EXP PTG"); 
  +             
  +     return new ExpPtg(this.existing, 0);
       }
   
   }
  
  
  
  1.4       +83 -0     
jakarta-poi/src/testcases/org/apache/poi/hssf/model/SheetTest.java
  
  Index: SheetTest.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/model/SheetTest.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SheetTest.java    9 May 2003 12:39:08 -0000       1.3
  +++ SheetTest.java    2 Jun 2003 02:47:44 -0000       1.4
  @@ -6,9 +6,18 @@
   
   import junit.framework.TestCase;
   
  +import org.apache.poi.hssf.record.BOFRecord;
  +import org.apache.poi.hssf.record.BlankRecord;
   import org.apache.poi.hssf.record.ColumnInfoRecord;
  +import org.apache.poi.hssf.record.EOFRecord;
  +import org.apache.poi.hssf.record.FormulaRecord;
  +import org.apache.poi.hssf.record.LabelSSTRecord;
   import org.apache.poi.hssf.record.RowRecord;
  +import org.apache.poi.hssf.record.SharedFormulaRecord;
   import org.apache.poi.hssf.record.StringRecord;
  +import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate;
  +import org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate;
  +import org.apache.poi.hssf.record.formula.ExpPtg;
   
   /**
    * @author Tony Poppleton
  @@ -147,6 +156,80 @@
                
        }
   
  +     /**
  +      * Make sure that a sheet with the sharedformula works when cloned, it used to 
not fail
  +      *
  +      */
  +     public void testSharedFormulaClone() {
  +             Sheet sheet;
  +             List records = new ArrayList();
  +             
  +             FormulaRecord formula = new FormulaRecord();
  +             byte[] array = {(byte)0,(byte)0,(byte)0,(byte)0,(byte)0};
  +             ExpPtg expPtg = new ExpPtg(array, 0);
  +             //an empty expptg will not be cloned
  +             
  +             formula.setExpressionLength((short)5);
  +             formula.pushExpressionToken(expPtg);
  +             
  +             records.add(new RowRecord());
  +             records.add(formula);   
  +             records.add(new SharedFormulaRecord());
  +             
  +             
  +             sheet = Sheet.createSheet(records, 0);
  +             
  +             sheet.cloneSheet();
  +             
  +     }
  +
  +
  +     /**
  +      * FormulaRecordAggregates within blanks/values cause values afterwards to not 
be aggregated.
  +      * This usually occurs during clones 
  +      *
  +      */
  +     public void testValueAggregateWithSharedFormulas() {
  +             Sheet sheet;
  +             List records = new ArrayList();
  +             
  +             FormulaRecord formula = new FormulaRecord();
  +             StringRecord stringRecord = new StringRecord();
  +             FormulaRecordAggregate formulaAggregate = new 
FormulaRecordAggregate(formula, stringRecord);
  +             
  +             formula.setExpressionLength((short)5);
  +             formula.pushExpressionToken(new ExpPtg());
  +             BlankRecord blank = new BlankRecord();
  +             blank.setColumn((short)0);
  +             blank.setRow(1);
  +             
  +             records.add(new BOFRecord());
  +             records.add(new RowRecord());
  +             
  +             blank.setColumn((short)0);
  +             blank.setRow(1);
  +             
  +             records.add(blank);
  +             records.add(new LabelSSTRecord());
  +             records.add(formula);   
  +             records.add(new SharedFormulaRecord());
  +             records.add(formulaAggregate);
  +             
  +             blank = new BlankRecord();              
  +             blank.setColumn((short)0);
  +             blank.setRow(2);
  +
  +             
  +             records.add(blank);
  +             records.add(new EOFRecord());
  +             
  +             sheet = Sheet.createSheet(records, 0);
  +             ValueRecordsAggregate valueAggregate = sheet.cells;
  +             
  +             assertEquals("Aggregated cells not correct, the blank record following 
sharedformula is not here", 3, valueAggregate.getPhysicalNumberOfCells());             
  
  +             
  +             
  +     }
   
        public static void main(String [] args) {
                System.out
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to