]> source.dussan.org Git - poi.git/commitdiff
Fix for NPE in bug #40036. The TextBox will still be fairly useless though
authorNick Burch <nick@apache.org>
Tue, 26 Sep 2006 15:53:21 +0000 (15:53 +0000)
committerNick Burch <nick@apache.org>
Tue, 26 Sep 2006 15:53:21 +0000 (15:53 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@450097 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hslf/model/TextBox.java
src/scratchpad/testcases/org/apache/poi/hslf/data/empty_textbox.ppt [new file with mode: 0644]
src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java

index 755dd4d988514191d0f896b844968ac1361cac90..44cee7c0ef289adc6eefe92a75f1690a1cacf5b8 100644 (file)
@@ -84,6 +84,12 @@ public class TextBox extends SimpleShape {
      * TextHeaderAtom, TextBytesAtom ot TextCharsAtom, StyleTextPropAtom etc.\r
      */\r
     protected EscherTextboxWrapper _txtbox;\r
+    \r
+    /**\r
+     * Is the TextBox missing the text records which actually\r
+     *  store the text?\r
+     */\r
+    private boolean _missingTextRecords = false;\r
 \r
     /**\r
      * Create a TextBox object and initialize it from the supplied Record container.\r
@@ -544,10 +550,20 @@ public class TextBox extends SimpleShape {
     public void setSheet(Sheet sheet){\r
         _sheet = sheet;\r
 \r
-        //initialize _txtrun object.\r
-        //we can't do it in the constructor because the sheet is not assigned yet\r
+        // Initialize _txtrun object.\r
+        // (We can't do it in the constructor because the sheet\r
+        //  is not assigned then, it's only built once we have\r
+        //  all the records)\r
         if(_txtrun == null) initTextRun();\r
-\r
+        if(_txtrun == null) {\r
+               // No text records found, skip\r
+               _missingTextRecords = true;\r
+               return;\r
+        } else {\r
+               _missingTextRecords = false;\r
+        }\r
+        \r
+        // Supply the sheet to our child RichTextRuns\r
         RichTextRun[] rt = _txtrun.getRichTextRuns();\r
         for (int i = 0; i < rt.length; i++) {\r
             rt[i].supplySlideShow(_sheet.getSlideShow());\r
@@ -555,12 +571,13 @@ public class TextBox extends SimpleShape {
     }\r
 \r
     private void initTextRun(){\r
-\r
         TextHeaderAtom tha = null;\r
         TextCharsAtom tca = null;\r
         TextBytesAtom tba = null;\r
         StyleTextPropAtom sta = null;\r
         OutlineTextRefAtom ota = null;\r
+        \r
+        // Find the interesting child records \r
         Record[] child = _txtbox.getChildRecords();\r
         for (int i = 0; i < child.length; i++) {\r
             if (child[i] instanceof TextHeaderAtom) tha = (TextHeaderAtom)child[i];\r
@@ -570,8 +587,10 @@ public class TextBox extends SimpleShape {
             else if (child[i] instanceof TextCharsAtom) tca = (TextCharsAtom)child[i];\r
         }\r
 \r
-        if (ota != null){\r
-            //TextHeaderAtom, TextBytesAtom and  StyleTextPropAtom are stored outside of  EscherContainerRecord\r
+        // Special handling for cases where there's an OutlineTextRefAtom\r
+        if (ota != null) {\r
+            // TextHeaderAtom, TextBytesAtom and StyleTextPropAtom are\r
+               //  stored outside of  EscherContainerRecord\r
             int idx = ota.getTextIndex();\r
             Slide sl = (Slide)getSheet();\r
             Record[] rec = sl.getSlideAtomsSet().getSlideRecords();\r
@@ -591,7 +610,17 @@ public class TextBox extends SimpleShape {
                 }\r
             }\r
         }\r
-        if(tba != null) _txtrun = new TextRun(tha,tba,sta);\r
-        else if (tca != null) _txtrun = new TextRun(tha,tca,sta);\r
+        \r
+        // If we found the records we needed, create a TextRun\r
+        if(tba != null) {\r
+               // Bytes based Text Run\r
+               _txtrun = new TextRun(tha,tba,sta);\r
+        } else if (tca != null) {\r
+               // Characters (unicode) based Text Run\r
+               _txtrun = new TextRun(tha,tca,sta);\r
+        } else {\r
+               // Empty text box\r
+               System.err.println("Warning - no text records found for TextBox");\r
+        }\r
     }\r
 }\r
diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/empty_textbox.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/empty_textbox.ppt
new file mode 100644 (file)
index 0000000..403b286
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hslf/data/empty_textbox.ppt differ
index 959593e45c6284cde9d12bcf3b9683c8842af368..6d2f1fcc3561e4d28b087739d25dcc7d02025799 100644 (file)
@@ -33,11 +33,15 @@ import java.util.ArrayList;
  */\r
 public class TestShapes extends TestCase {\r
     private SlideShow ppt;\r
+    private SlideShow pptB;\r
 \r
     protected void setUp() throws Exception {\r
                String dirname = System.getProperty("HSLF.testdata.path");\r
                String filename = dirname + "/empty.ppt";\r
                ppt = new SlideShow(new HSLFSlideShow(filename));\r
+               \r
+               String filenameB = dirname + "/empty_textbox.ppt";\r
+               pptB = new SlideShow(new HSLFSlideShow(filenameB));\r
     }\r
 \r
     public void testGraphics() throws Exception {\r
@@ -169,6 +173,19 @@ public class TestShapes extends TestCase {
         assertEquals("Arial", rt.getFontName());\r
         assertEquals(Color.red, txtbox.getFontColor());\r
     }\r
+    \r
+    /**\r
+     * Test with an empty text box\r
+     */\r
+    public void testEmptyTextBox() throws Exception {\r
+       assertEquals(2, pptB.getSlides().length);\r
+       Slide s1 = pptB.getSlides()[0];\r
+       Slide s2 = pptB.getSlides()[1];\r
+       \r
+       // Check we can get the shapes count\r
+       assertEquals(2, s1.getShapes().length);\r
+       assertEquals(2, s2.getShapes().length);\r
+    }\r
 \r
     /**\r
      * If you iterate over text shapes in a slide and collect them in a set\r