]> source.dussan.org Git - poi.git/commitdiff
Don't swap AreaPtg references from relative to absolute, by correctly processing...
authorNick Burch <nick@apache.org>
Fri, 25 Jan 2008 16:15:49 +0000 (16:15 +0000)
committerNick Burch <nick@apache.org>
Fri, 25 Jan 2008 16:15:49 +0000 (16:15 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@615255 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/record/formula/AreaPtg.java
src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java [new file with mode: 0644]

index f11d64ad267e9b486de47cac5041370a431ca4da..b1d8184e75c6812453767edb5af7f8c35d9be6f1 100644 (file)
@@ -36,6 +36,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.0.2-FINAL" date="2008-??-??">
+            <action dev="POI-DEVELOPERS" type="fix">44293 - Avoid swapping AreaPtgs from relative to absolute</action>
             <action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
             <action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
             <action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
index 73375a336e93964fe414ecbc4ad3f2c213a50743..8221954c09c9b6a49cbe3efceacada2c884e9f35 100644 (file)
@@ -33,6 +33,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.0.2-FINAL" date="2008-??-??">
+            <action dev="POI-DEVELOPERS" type="fix">44293 - Avoid swapping AreaPtgs from relative to absolute</action>
             <action dev="POI-DEVELOPERS" type="fix">44292 - Correctly process the last paragraph in a word file</action>
             <action dev="POI-DEVELOPERS" type="fix">44254 - Avoid some unread byte warnings, and properly understand DVALRecord</action>
             <action dev="POI-DEVELOPERS" type="add">Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself.</action>
index 32579a69f3d76c0d46284a4fb29265b0036781e9..908c8d5e3cce9bbcaf1619f98519cd79dee3b0d9 100644 (file)
@@ -43,9 +43,9 @@ public class AreaPtg
     private short             field_3_first_column;
     private short             field_4_last_column;
     
-    private BitField         rowRelative = BitFieldFactory.getInstance(0x8000);
-    private BitField         colRelative = BitFieldFactory.getInstance(0x4000);
-    private BitField         column      = BitFieldFactory.getInstance(0x3FFF);
+    private final static BitField   rowRelative = BitFieldFactory.getInstance(0x8000);
+    private final static BitField   colRelative = BitFieldFactory.getInstance(0x4000);
+    private final static BitField   columnMask      = BitFieldFactory.getInstance(0x3FFF);
 
     protected AreaPtg() {
       //Required for clone methods
@@ -157,7 +157,7 @@ public class AreaPtg
      */
     public short getFirstColumn()
     {
-        return column.getShortValue(field_3_first_column);
+        return columnMask.getShortValue(field_3_first_column);
     }
 
     /**
@@ -204,7 +204,7 @@ public class AreaPtg
      */
     public void setFirstColumn(short column)
     {
-        field_3_first_column = column;   // fixme
+       field_3_first_column=columnMask.setShortValue(field_3_first_column, column);
     }
 
     /**
@@ -220,7 +220,7 @@ public class AreaPtg
      */
     public short getLastColumn()
     {
-        return column.getShortValue(field_4_last_column);
+        return columnMask.getShortValue(field_4_last_column);
     }
 
     /**
@@ -269,7 +269,7 @@ public class AreaPtg
      */
     public void setLastColumn(short column)
     {
-        field_4_last_column = column;   // fixme
+       field_4_last_column=columnMask.setShortValue(field_4_last_column, column);
     }
 
     /**
diff --git a/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java b/src/testcases/org/apache/poi/hssf/record/formula/TestAreaPtg.java
new file mode 100644 (file)
index 0000000..522a5bc
--- /dev/null
@@ -0,0 +1,114 @@
+        
+/* ====================================================================
+   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 junit.framework.TestCase;
+
+import org.apache.poi.hssf.model.FormulaParser;
+
+/**
+ * Tests for {@link AreaPtg}.
+ *
+ * @author Dmitriy Kumshayev
+ */
+public class TestAreaPtg extends TestCase
+{
+
+       AreaPtg relative;
+       AreaPtg absolute;
+       
+       protected void setUp() throws Exception
+       {
+               super.setUp();
+               short firstRow=5;
+               short lastRow=13;
+               short firstCol=7;
+               short lastCol=17;
+               relative = new AreaPtg(firstRow,lastRow,firstCol,lastCol,true,true,true,true);
+               absolute = new AreaPtg(firstRow,lastRow,firstCol,lastCol,false,false,false,false);
+       }
+
+       public void testSetColumnsAbsolute()
+       {
+               resetColumns(absolute);
+               validateReference(true, absolute);
+       }
+       public void testSetColumnsRelative()
+       {
+               resetColumns(relative);
+               validateReference(false, relative);
+       }
+
+       private void validateReference(boolean abs, AreaPtg ref)
+       {
+               assertEquals("First column reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstColRelative());
+               assertEquals("Last column reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastColRelative());
+               assertEquals("First row reference is not "+(abs?"absolute":"relative"),abs,!ref.isFirstRowRelative());
+               assertEquals("Last row reference is not "+(abs?"absolute":"relative"),abs,!ref.isLastRowRelative());
+       }
+
+
+       public void resetColumns(AreaPtg aptg)
+       {
+               short fc = aptg.getFirstColumn();
+               short lc = aptg.getLastColumn();
+               aptg.setFirstColumn(fc);
+               aptg.setLastColumn(lc);
+               assertEquals(fc , aptg.getFirstColumn() );
+               assertEquals(lc , aptg.getLastColumn() );
+       }
+       
+       public void testFormulaParser()
+       {
+               String formula1="SUM($E$5:$E$6)";
+               String expectedFormula1="SUM($F$5:$F$6)";
+               String newFormula1 = shiftAllColumnsBy1(formula1);
+               assertEquals("Absolute references changed", expectedFormula1, newFormula1);
+               
+               String formula2="SUM(E5:E6)";
+               String expectedFormula2="SUM(F5:F6)";
+               String newFormula2 = shiftAllColumnsBy1(formula2);
+               assertEquals("Relative references changed", expectedFormula2, newFormula2);
+       }
+       
+       private String shiftAllColumnsBy1(String  formula)
+       {
+               int letUsShiftColumn1By1Column=1;
+               
+               FormulaParser parser = new FormulaParser(formula,null);
+               parser.parse();
+
+               final Ptg[] ptgs = parser.getRPNPtg();
+               for(int i=0; i<ptgs.length; i++)
+               {
+                       Ptg ptg = ptgs[i];
+                       if (ptg instanceof AreaPtg )
+                       {
+                               AreaPtg aptg = (AreaPtg)ptg;
+                               aptg.setFirstColumn((short)(aptg.getFirstColumn()+letUsShiftColumn1By1Column));
+                               aptg.setLastColumn((short)(aptg.getLastColumn()+letUsShiftColumn1By1Column));
+                       }
+               }
+               String newFormula = parser.toFormulaString(ptgs);
+               return newFormula;
+       }
+       
+       
+
+}