avik        2002/06/26 11:05:40

  Modified:    src/java/org/apache/poi/hssf/model Workbook.java
               src/java/org/apache/poi/hssf/record/formula Area3DPtg.java
                        AreaPtg.java Ref3DPtg.java
               src/java/org/apache/poi/hssf/usermodel HSSFCell.java
               src/testcases/org/apache/poi/hssf/usermodel
                        TestFormulas.java
  Log:
  better support for sheet functions.... more refactoring after i have written tests 
for named range. Inclueds a fix for bug 9632
  
  Revision  Changes    Path
  1.9       +2 -0      jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java
  
  Index: Workbook.java
  ===================================================================
  RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Workbook.java     2 Jun 2002 07:30:40 -0000       1.8
  +++ Workbook.java     26 Jun 2002 18:05:39 -0000      1.9
  @@ -88,6 +88,8 @@
   public class Workbook {
       private static final int   DEBUG       = POILogger.DEBUG;
       
  +    public static ThreadLocal currentBook = new ThreadLocal();
  +    
       /**
        * constant used to set the "codepage" wherever "codepage" is set in records
        * (which is duplciated in more than one record)
  
  
  
  1.6       +65 -20    
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java
  
  Index: Area3DPtg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Area3DPtg.java    25 Jun 2002 08:35:16 -0000      1.5
  +++ Area3DPtg.java    26 Jun 2002 18:05:39 -0000      1.6
  @@ -58,12 +58,17 @@
   import org.apache.poi.util.LittleEndian;
   import org.apache.poi.hssf.util.RangeAddress;
   import org.apache.poi.hssf.util.AreaReference;
  +import org.apache.poi.hssf.util.CellReference;
  +
  +import org.apache.poi.hssf.model.Workbook;
  +import org.apache.poi.util.BitField;
   
   /**
    * Title:        Area 3D Ptg - 3D referecnce (Sheet + Area)<P>
    * Description:  Defined a area in Extern Sheet. <P>
    * REFERENCE:  <P>
    * @author Libin Roman (Vista Portal LDT. Developer)
  + * @author avik
    * @version 1.0-pre
    */
   
  @@ -76,6 +81,9 @@
       private short             field_3_last_row;
       private short             field_4_first_column;
       private short             field_5_last_column;
  +    
  +    private BitField         rowRelative = new BitField(0x8000);
  +    private BitField         colRelative = new BitField(0x4000);
   
       /** Creates new AreaPtg */
       public Area3DPtg() {}
  @@ -87,10 +95,10 @@
           setFirstColumn((short)ar.getCells()[0].getCol());
           setLastRow((short)ar.getCells()[1].getRow());
           setLastColumn((short)ar.getCells()[1].getCol());
  -        //setFirstColRelative(!ar.getCells()[0].isColAbsolute());
  -        //setLastColRelative(!ar.getCells()[1].isColAbsolute());
  -        //setFirstRowRelative(!ar.getCells()[0].isRowAbsolute());
  -        //setLastRowRelative(!ar.getCells()[1].isRowAbsolute());
  +        setFirstColRelative(!ar.getCells()[0].isColAbsolute());
  +        setLastColRelative(!ar.getCells()[1].isColAbsolute());
  +        setFirstRowRelative(!ar.getCells()[0].isRowAbsolute());
  +        setLastRowRelative(!ar.getCells()[1].isRowAbsolute());
           setExternSheetIndex(externIdx);
           
       }
  @@ -114,10 +122,10 @@
           buffer.append("lastRow  = " + getLastRow()).append("\n");
           buffer.append("firstCol = " + getFirstColumn()).append("\n");
           buffer.append("lastCol  = " + getLastColumn()).append("\n");
  -        buffer.append("firstColRowRel= "
  -                      + isFirstColRowRelative()).append("\n");
  +        buffer.append("firstColRel= "
  +                      + isFirstRowRelative()).append("\n");
           buffer.append("lastColRowRel = "
  -                      + isLastColRowRelative()).append("\n");
  +                      + isLastRowRelative()).append("\n");
           buffer.append("firstColRel   = " + isFirstColRelative()).append("\n");
           buffer.append("lastColRel    = " + isLastColRelative()).append("\n");
           return buffer.toString();
  @@ -176,14 +184,14 @@
           return field_4_first_column;
       }
   
  -    public boolean isFirstColRowRelative()
  +    public boolean isFirstRowRelative()
       {
  -        return (((getFirstColumnRaw()) & 0x8000) == 0x8000);
  +        return rowRelative.isSet(field_4_first_column);
       }
  -
  +    
       public boolean isFirstColRelative()
       {
  -        return (((getFirstColumnRaw()) & 0x4000) == 0x4000);
  +        return colRelative.isSet(field_4_first_column);
       }
   
       public void setFirstColumn(short column)
  @@ -207,16 +215,15 @@
           return field_5_last_column;
       }
   
  -    public boolean isLastColRowRelative()
  +     public boolean isLastRowRelative()
       {
  -        return (((getLastColumnRaw()) & 0x8000) == 1);
  +        return rowRelative.isSet(field_5_last_column);
       }
  -
       public boolean isLastColRelative()
       {
  -        return (((getFirstColumnRaw()) & 0x4000) == 1);
  +        return colRelative.isSet(field_5_last_column);
       }
  -
  +    
       public void setLastColumn(short column)
       {
           field_5_last_column &= 0xFF00;
  @@ -227,6 +234,37 @@
       {
           field_5_last_column = column;
       }
  +    
  +        /**
  +     * sets the first row to relative or not
  +     * @param isRelative or not.
  +     */
  +    public void setFirstRowRelative(boolean rel) {
  +        field_4_first_column=rowRelative.setShortBoolean(field_4_first_column,rel);
  +    }
  +
  +    /**
  +     * set whether the first column is relative 
  +     */
  +    public void setFirstColRelative(boolean rel) {
  +        field_4_first_column=colRelative.setShortBoolean(field_4_first_column,rel);
  +    }
  +    
  +    /**
  +     * set whether the last row is relative or not
  +     * @param last row relative
  +     */
  +    public void setLastRowRelative(boolean rel) {
  +        field_5_last_column=rowRelative.setShortBoolean(field_5_last_column,rel);
  +    }
  +    
  +    /**
  +     * set whether the last column should be relative or not
  +     */
  +    public void setLastColRelative(boolean rel) {
  +        field_5_last_column=colRelative.setShortBoolean(field_5_last_column,rel);
  +    }
  +    
   
       public String getArea(){
           RangeAddress ra = new RangeAddress( getFirstColumn(),getFirstRow() + 1, 
getLastColumn(), getLastRow() + 1);
  @@ -250,13 +288,20 @@
   
       public String toFormulaString()
       {
  -        String result = getArea();
  -
  -        return result;
  +        StringBuffer retval = new StringBuffer();
  +        Object book = Workbook.currentBook.get();
  +        if (book != null) {
  +            retval.append(((Workbook) 
book).findSheetNameFromExternSheet(this.field_1_index_extern_sheet));
  +            retval.append('!');
  +        }
  +        retval.append((new 
CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString());
 
  +        retval.append(':');
  +        retval.append((new 
CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString());
  +        return retval.toString();
       }
   
      public byte getDefaultOperandClass() {
  -       return Ptg.CLASS_VALUE;
  +       return Ptg.CLASS_REF;
      }
   
   }
  
  
  
  1.10      +0 -2      
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
  
  Index: AreaPtg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/AreaPtg.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- AreaPtg.java      11 Jun 2002 20:18:28 -0000      1.9
  +++ AreaPtg.java      26 Jun 2002 18:05:39 -0000      1.10
  @@ -88,9 +88,7 @@
       
      
       protected AreaPtg(String arearef) {
  -        //int[] xyxy = ReferenceUtil.getXYXYFromAreaRef(arearef);
           AreaReference ar = new AreaReference(arearef);
  -        
           setFirstRow((short)ar.getCells()[0].getRow());
           setFirstColumn((short)ar.getCells()[0].getCol());
           setLastRow((short)ar.getCells()[1].getRow());
  
  
  
  1.5       +32 -13    
jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java
  
  Index: Ref3DPtg.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Ref3DPtg.java     25 Jun 2002 08:35:16 -0000      1.4
  +++ Ref3DPtg.java     26 Jun 2002 18:05:39 -0000      1.5
  @@ -59,6 +59,9 @@
   import org.apache.poi.util.LittleEndian;
   import org.apache.poi.hssf.util.RangeAddress;
   import org.apache.poi.hssf.util.CellReference;
  +import org.apache.poi.util.BitField;
  +import org.apache.poi.hssf.model.Workbook;
  +
   /**
    * Title:        Reference 3D Ptg <P>
    * Description:  Defined a cell in extern sheet. <P>
  @@ -73,6 +76,8 @@
       private short             field_1_index_extern_sheet;
       private short             field_2_row;
       private short             field_3_column;
  +    private BitField         rowRelative = new BitField(0x8000);
  +    private BitField         colRelative = new BitField(0x4000);
   
       /** Creates new AreaPtg */
       public Ref3DPtg() {}
  @@ -88,8 +93,8 @@
           CellReference c= new CellReference(cellref);
           setRow((short) c.getRow());
           setColumn((short) c.getCol());
  -        //setColRelative(!c.isColAbsolute());
  -        //setRowRelative(!c.isRowAbsolute());   
  +        setColRelative(!c.isColAbsolute());
  +        setRowRelative(!c.isRowAbsolute());   
           setExternSheetIndex(externIdx);
       }
   
  @@ -101,7 +106,7 @@
           buffer.append("Row = " + getRow()).append("\n");
           buffer.append("Col  = " + getColumn()).append("\n");
           buffer.append("ColRowRel= "
  -        + isColRowRelative()).append("\n");
  +        + isRowRelative()).append("\n");
           buffer.append("ColRel   = " + isColRelative()).append("\n");
           return buffer.toString();
       }
  @@ -141,14 +146,23 @@
           return field_3_column;
       }
   
  -    public boolean isColRowRelative() {
  -        return (((getColumnRaw()) & 0x8000) == 0x8000);
  +     public boolean isRowRelative()
  +    {
  +        return rowRelative.isSet(field_3_column);
       }
  -
  -    public boolean isColRelative() {
  -        return (((getColumnRaw()) & 0x4000) == 0x4000);
  +    
  +    public void setRowRelative(boolean rel) {
  +        field_3_column=rowRelative.setShortBoolean(field_3_column,rel);
  +    }
  +    
  +    public boolean isColRelative()
  +    {
  +        return colRelative.isSet(field_3_column);
  +    }
  +    
  +    public void setColRelative(boolean rel) {
  +        field_3_column=colRelative.setShortBoolean(field_3_column,rel);
       }
  -
       public void setColumn(short column) {
           field_3_column &= 0xFF00;
           field_3_column |= column & 0xFF;
  @@ -177,11 +191,16 @@
       }
   
       public String toFormulaString() {
  -        String result = getArea();
  -
  -        return result;
  +        StringBuffer retval = new StringBuffer();
  +        Object book = Workbook.currentBook.get();
  +        if (book != null) {
  +            retval.append(((Workbook) 
book).findSheetNameFromExternSheet(this.field_1_index_extern_sheet));
  +            retval.append('!');
  +        }
  +        retval.append((new 
CellReference(getRow(),getColumn(),!isRowRelative(),!isColRelative())).toString()); 
  +        return retval.toString();
       }
   
  -   public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
  +   public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
   
   }
  
  
  
  1.11      +5 -8      jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java
  
  Index: HSSFCell.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- HSSFCell.java     25 Jun 2002 08:35:16 -0000      1.10
  +++ HSSFCell.java     26 Jun 2002 18:05:40 -0000      1.11
  @@ -692,10 +692,10 @@
       }
   
       public void setCellFormula(String formula) {
  +        Workbook.currentBook.set(book);
           if (formula==null) {
               setCellType(CELL_TYPE_BLANK,false);
           } else {
  -            
               setCellType(CELL_TYPE_FORMULA,false);
               FormulaRecord rec = (FormulaRecord) record;
               rec.setOptions(( short ) 2);
  @@ -711,17 +711,14 @@
                   rec.pushExpressionToken(ptg[ k ]);
               }
               rec.setExpressionLength(( short ) size);
  -            //return rec;
  -            
  +            Workbook.currentBook.set(null);
           }
       }
       
       public String getCellFormula() {
  -        String retval=null;
  -        
  -        retval = 
  -              
FormulaParser.toFormulaString(((FormulaRecord)record).getParsedExpression());
  -        
  +        Workbook.currentBook.set(book);
  +        String retval = 
FormulaParser.toFormulaString(((FormulaRecord)record).getParsedExpression());
  +        Workbook.currentBook.set(null);
           return retval;   
       }
       
  
  
  
  1.21      +4 -4      
jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java
  
  Index: TestFormulas.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- TestFormulas.java 25 Jun 2002 08:35:16 -0000      1.20
  +++ TestFormulas.java 26 Jun 2002 18:05:40 -0000      1.21
  @@ -756,7 +756,7 @@
       {
           String filename = System.getProperty("HSSF.testdata.path");
   
  -    File file = File.createTempFile("testSheetFormula",".xls");
  +            File file = File.createTempFile("testSheetFormula",".xls");
               FileOutputStream out    = new FileOutputStream(file);
               HSSFWorkbook     wb     = new HSSFWorkbook();
               HSSFSheet        s      = wb.createSheet("A");
  @@ -770,7 +770,7 @@
               r = s.createRow((short)0);
               c=r.createCell((short)0); c.setCellFormula("AVERAGE(A!A1:B1)");
               c=r.createCell((short)1); c.setCellFormula("A!A1+A!B1");
  -            c=r.createCell((short)2); c.setCellFormula("C!A1+C!B1");
  +            c=r.createCell((short)2); c.setCellFormula("A!$A$1+A!$B1");
               wb.write(out);
               out.close();
               
  @@ -781,9 +781,9 @@
               s = wb.getSheet("B");
               r = s.getRow(0);
               c = r.getCell((short)0);
  -            //assertTrue("expected: AVERAGE(A!A1:B1) got: "+c.getCellFormula(), 
("AVERAGE(A!A1:B1)").equals(c.getCellFormula()));
  +            assertTrue("expected: AVERAGE(A!A1:B1) got: "+c.getCellFormula(), 
("AVERAGE(A!A1:B1)").equals(c.getCellFormula()));
               c = r.getCell((short)1);
  -            //assertTrue("expected: A!A1+A!B1 got: "+c.getCellFormula(), 
("A!A1+A!B1").equals(c.getCellFormula()));
  +            assertTrue("expected: A!A1+A!B1 got: "+c.getCellFormula(), 
("A!A1+A!B1").equals(c.getCellFormula()));
               in.close();
       }
       
  
  
  

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

Reply via email to