From 6527e63ed164eaa0120dd4794aee8c24139b96b0 Mon Sep 17 00:00:00 2001 From: Josh Micich Date: Fri, 20 Jun 2008 07:10:03 +0000 Subject: [PATCH] Fix for bug 30978 - small re-arrangement of class Ptg hierarchy for DeletedRef3DPtg and DeletedArea3DPtg. Similar to c664220 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@669809 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 1 + src/documentation/content/xdocs/status.xml | 1 + .../apache/poi/hssf/record/NameRecord.java | 54 ++----------------- .../poi/hssf/record/formula/Area3DPtg.java | 2 +- .../hssf/record/formula/DeletedArea3DPtg.java | 40 +++++++++----- .../hssf/record/formula/DeletedRef3DPtg.java | 37 +++++++++---- .../poi/hssf/record/formula/Ref3DPtg.java | 2 +- .../apache/poi/hssf/usermodel/TestBugs.java | 2 +- 8 files changed, 63 insertions(+), 76 deletions(-) diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index ad6552e6d..6bce0e56b 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,7 @@ + 30978 - Fixed re-serialization of tRefErr3d and tAreaErr3d 45234 - Removed incorrect shared formula conversion in CFRuleRecord 45001 - Improved HWPF Range.replaceText() 44692 - Fixed HSSFPicture.resize() to properly resize pictures if the underlying columns/rows have modified size diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 82ee8cee8..50c81b726 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 30978 - Fixed re-serialization of tRefErr3d and tAreaErr3d 45234 - Removed incorrect shared formula conversion in CFRuleRecord 45001 - Improved HWPF Range.replaceText() 44692 - Fixed HSSFPicture.resize() to properly resize pictures if the underlying columns/rows have modified size diff --git a/src/java/org/apache/poi/hssf/record/NameRecord.java b/src/java/org/apache/poi/hssf/record/NameRecord.java index 786c0b3d6..dbd796991 100644 --- a/src/java/org/apache/poi/hssf/record/NameRecord.java +++ b/src/java/org/apache/poi/hssf/record/NameRecord.java @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; @@ -22,9 +21,8 @@ import java.util.Iterator; import java.util.List; import java.util.Stack; +import org.apache.poi.hssf.model.FormulaParser; import org.apache.poi.hssf.record.formula.Area3DPtg; -import org.apache.poi.hssf.record.formula.DeletedArea3DPtg; -import org.apache.poi.hssf.record.formula.DeletedRef3DPtg; import org.apache.poi.hssf.record.formula.Ptg; import org.apache.poi.hssf.record.formula.Ref3DPtg; import org.apache.poi.hssf.record.formula.UnionPtg; @@ -44,8 +42,7 @@ import org.apache.poi.util.StringUtil; * @author Glen Stampoultzis (glens at apache.org) * @version 1.0-pre */ - -public class NameRecord extends Record { +public final class NameRecord extends Record { /** */ public final static short sid = 0x18; //Docs says that it is 0x218 @@ -650,50 +647,9 @@ public class NameRecord extends Record { /** gets the reference , the area only (range) * @return area reference */ - public String getAreaReference(HSSFWorkbook book){ - if (field_13_name_definition == null || field_13_name_definition.isEmpty()) return "Error"; - Ptg ptg = (Ptg) field_13_name_definition.peek(); - String result = ""; - - // If it's a union, descend in and process - if (ptg.getClass() == UnionPtg.class) { - Iterator it =field_13_name_definition.iterator(); - while( it.hasNext() ) { - Ptg p = (Ptg)it.next(); - - String thisRes = getAreaRefString(p, book); - if(thisRes.length() > 0) { - // Add a comma to the end if needed - if(result.length() > 0 && !result.endsWith(",")) { - result += ","; - } - // And add the string it corresponds to - result += thisRes; - } - } - } else { - // Otherwise just get the string - result = getAreaRefString(ptg, book); - } - - return result; - } - - /** - * Turn the given ptg into a string, or - * return an empty string if nothing is possible - * for it. - */ - private String getAreaRefString(Ptg ptg,HSSFWorkbook book) { - if (ptg.getClass() == Area3DPtg.class){ - return ptg.toFormulaString(book); - } else if (ptg.getClass() == Ref3DPtg.class){ - return ptg.toFormulaString(book); - } else if (ptg.getClass() == DeletedArea3DPtg.class || ptg.getClass() == DeletedRef3DPtg.class) { - return "#REF!"; - } - return ""; - } + public String getAreaReference(HSSFWorkbook book){ + return FormulaParser.toFormulaString(book, field_13_name_definition); + } /** sets the reference , the area only (range) * @param ref area reference diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java index 5dcada24a..dded3cd39 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java @@ -35,7 +35,7 @@ import org.apache.poi.util.LittleEndian; * @author Jason Height (jheight at chariot dot net dot au) * @version 1.0-pre */ -public class Area3DPtg extends OperandPtg implements AreaI { +public final class Area3DPtg extends OperandPtg implements AreaI { public final static byte sid = 0x3b; private final static int SIZE = 11; // 10 + 1 for Ptg private short field_1_index_extern_sheet; diff --git a/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java index 36d7e1686..74ccc8b36 100644 --- a/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/DeletedArea3DPtg.java @@ -18,6 +18,9 @@ package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; +import org.apache.poi.hssf.usermodel.HSSFErrorConstants; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.util.LittleEndian; /** * Title: Deleted Area 3D Ptg - 3D referecnce (Sheet + Area)

@@ -26,19 +29,30 @@ import org.apache.poi.hssf.record.RecordInputStream; * @author Patrick Luby * @version 1.0-pre */ - -public class DeletedArea3DPtg extends Area3DPtg -{ +public final class DeletedArea3DPtg extends OperandPtg { public final static byte sid = 0x3d; + private final int field_1_index_extern_sheet; + private final int unused1; + private final int unused2; - /** Creates new DeletedArea3DPtg */ - public DeletedArea3DPtg( String arearef, short externIdx ) - { - super(arearef, externIdx); - } - - public DeletedArea3DPtg( RecordInputStream in) - { - super(in); - } + public DeletedArea3DPtg( RecordInputStream in) { + field_1_index_extern_sheet = in.readUShort(); + unused1 = in.readInt(); + unused2 = in.readInt(); + } + public String toFormulaString(HSSFWorkbook book) { + return HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF); + } + public byte getDefaultOperandClass() { + return Ptg.CLASS_REF; + } + public int getSize() { + return 11; + } + public void writeBytes(byte[] data, int offset) { + LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); + LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); + LittleEndian.putInt(data, 3 + offset, unused1); + LittleEndian.putInt(data, 7 + offset, unused2); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java index a3c780965..b2c2a0e37 100644 --- a/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/DeletedRef3DPtg.java @@ -15,11 +15,13 @@ limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record.formula; import org.apache.poi.hssf.record.RecordInputStream; +import org.apache.poi.hssf.usermodel.HSSFErrorConstants; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.util.LittleEndian; /** * Title: Deleted Reference 3D Ptg

@@ -28,16 +30,29 @@ import org.apache.poi.hssf.record.RecordInputStream; * @author Patrick Luby * @version 1.0-pre */ +public final class DeletedRef3DPtg extends OperandPtg { + public final static byte sid = 0x3c; + private final int field_1_index_extern_sheet; + private final int unused1; -public class DeletedRef3DPtg extends Ref3DPtg { - public final static byte sid = 0x3c; + /** Creates new DeletedRef3DPtg */ + public DeletedRef3DPtg(RecordInputStream in) { + field_1_index_extern_sheet = in.readUShort(); + unused1 = in.readInt(); + } - /** Creates new DeletedRef3DPtg */ - public DeletedRef3DPtg(RecordInputStream in) { - super(in); - } - - public DeletedRef3DPtg(String cellref, short externIdx ) { - super(cellref, externIdx); - } + public String toFormulaString(HSSFWorkbook book) { + return HSSFErrorConstants.getText(HSSFErrorConstants.ERROR_REF); + } + public byte getDefaultOperandClass() { + return Ptg.CLASS_REF; + } + public int getSize() { + return 7; + } + public void writeBytes(byte[] data, int offset) { + LittleEndian.putByte(data, 0 + offset, sid + getPtgClass()); + LittleEndian.putUShort(data, 1 + offset, field_1_index_extern_sheet); + LittleEndian.putInt(data, 3 + offset, unused1); + } } diff --git a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java index 930651659..8e21e1e97 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Ref3DPtg.java @@ -34,7 +34,7 @@ import org.apache.poi.util.LittleEndian; * @author Jason Height (jheight at chariot dot net dot au) * @version 1.0-pre */ -public class Ref3DPtg extends OperandPtg { +public final 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; diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index ab247b7c8..5fe3cf687 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -999,7 +999,7 @@ public final class TestBugs extends TestCase { * used for printing stuff. * Currently broken, as we change the Ptg */ - public void BROKENtest30978() throws Exception { + public void test30978() throws Exception { HSSFWorkbook wb = openSample("30978-alt.xls"); assertEquals(1, wb.getNumberOfNames()); assertEquals(3, wb.getNumberOfSheets());