]> source.dussan.org Git - poi.git/commitdiff
Apply patch from bug #49820 - Fix HWPF paragraph levels, so that outline levels can...
authorNick Burch <nick@apache.org>
Mon, 20 Sep 2010 11:45:53 +0000 (11:45 +0000)
committerNick Burch <nick@apache.org>
Mon, 20 Sep 2010 11:45:53 +0000 (11:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@998897 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/scratchpad/src/org/apache/poi/hwpf/sprm/ParagraphSprmUncompressor.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/Paragraph.java
src/scratchpad/src/org/apache/poi/hwpf/usermodel/ParagraphProperties.java
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java [new file with mode: 0644]
test-data/document/Bug49820.doc [new file with mode: 0644]

index 9123d65c13b2d19d468cd42781c95b94bb885dff..f1b71436e1f76da8166f277f7483752fd5acf72d 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta3" date="2010-??-??">
+           <action dev="poi-developers" type="fix">49820 - Fix HWPF paragraph levels, so that outline levels can be properly fetched</action>
            <action dev="poi-developers" type="fix">47271 - Avoid infinite loops on broken HWPF documents with a corrupt CHP style with a parent of itself</action>
            <action dev="poi-developers" type="fix">49936 - Handle HWPF documents with problematic HeaderStories better</action>
            <action dev="poi-developers" type="fix">49933 - Support sections in Word 6 and Word 95 files (HWPFOldDocument)</action>
index a6b12ec2dace0ed3d2ee78d457be8cb0bc61d2d6..695de596464b789180b4a27a0a2ab88a7b2a395f 100644 (file)
@@ -337,11 +337,12 @@ public final class ParagraphSprmUncompressor
         }
         break;
       case 0x40:
-
-        //newPAP._lvl = param;
-        if (newPAP.getIstd () >= 1 && newPAP.getIstd () <= 9)
+        // This condition commented out, as Word seems to set outline levels even for 
+        //  paragraph with other styles than Heading 1..9, even though specification 
+        //  does not say so. See bug 49820 for discussion.
+        //if (newPAP.getIstd () < 1 && newPAP.getIstd () > 9)
         {
-          newPAP.setIlvl ((byte) sprm.getOperand());
+          newPAP.setLvl ((byte) sprm.getOperand());
         }
         break;
       case 0x41:
index 087c6c5c16b83de70ad0a26a1f6c34caff82da09..87fe4d7f1d1628c345d2f12b034b0f64f4476b5b 100644 (file)
@@ -435,14 +435,19 @@ public class Paragraph extends Range implements Cloneable {
   }
 
   public int getIlfo()
-   {
+  {
      return _props.getIlfo();
-   }
+  }
 
-   public int getIlvl()
-   {
+  public int getIlvl()
+  {
      return _props.getIlvl();
-   }
+  }
+
+  public int getLvl()
+  {
+     return _props.getLvl();
+  }
 
   void setTableRowEnd(TableProperties props)
   {
index 8944eb06005429c9496ca1e23df8e36050e1dfe9..8ab3d904a1fe0105ea23c67667c75f4a63555489 100644 (file)
@@ -35,7 +35,7 @@ public final class ParagraphProperties extends PAPAbstractType implements Clonea
     this.field_17_fWidowControl = 1;
     this.field_21_lspd.setMultiLinespace((short)1);
     this.field_21_lspd.setDyaLine((short)240);
-    this.field_12_ilvl = (byte)9;
+    this.field_58_lvl = (byte)9;
     this.field_66_rgdxaTab = new int[0];
     this.field_67_rgtbd = new byte[0];
     this.field_63_dttmPropRMark = new DateAndTime();
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestBug49820.java
new file mode 100644 (file)
index 0000000..4e96646
--- /dev/null
@@ -0,0 +1,63 @@
+/* ====================================================================\r
+   Licensed to the Apache Software Foundation (ASF) under one or more\r
+   contributor license agreements.  See the NOTICE file distributed with\r
+   this work for additional information regarding copyright ownership.\r
+   The ASF licenses this file to You under the Apache License, Version 2.0\r
+   (the "License"); you may not use this file except in compliance with\r
+   the License.  You may obtain a copy of the License at\r
+\r
+       http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+   Unless required by applicable law or agreed to in writing, software\r
+   distributed under the License is distributed on an "AS IS" BASIS,\r
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+   See the License for the specific language governing permissions and\r
+   limitations under the License.\r
+==================================================================== */\r
+\r
+package org.apache.poi.hwpf.usermodel;\r
+\r
+import java.io.IOException;\r
+import junit.framework.TestCase;\r
+\r
+import org.apache.poi.hwpf.HWPFDocument;\r
+import org.apache.poi.hwpf.HWPFTestDataSamples;\r
+import org.apache.poi.hwpf.model.StyleSheet;\r
+\r
+public final class TestBug49820 extends TestCase {\r
+\r
+  public void test() throws IOException {\r
+    HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug49820.doc");\r
+    \r
+    Range documentRange = doc.getRange();\r
+    StyleSheet styleSheet = doc.getStyleSheet();\r
+    \r
+    // JUnit asserts\r
+    assertLevels(documentRange, styleSheet, 0, 0, 0);\r
+    assertLevels(documentRange, styleSheet, 1, 1, 1);\r
+    assertLevels(documentRange, styleSheet, 2, 2, 2);\r
+    assertLevels(documentRange, styleSheet, 3, 3, 3);\r
+    assertLevels(documentRange, styleSheet, 4, 4, 4);\r
+    assertLevels(documentRange, styleSheet, 5, 5, 5);\r
+    assertLevels(documentRange, styleSheet, 6, 6, 6);\r
+    assertLevels(documentRange, styleSheet, 7, 7, 7);\r
+    assertLevels(documentRange, styleSheet, 8, 8, 8);\r
+    assertLevels(documentRange, styleSheet, 9, 9, 9);\r
+    assertLevels(documentRange, styleSheet, 10, 9, 0);\r
+    assertLevels(documentRange, styleSheet, 11, 9, 4);\r
+    \r
+    // output to console\r
+    /*for (int i=0; i<documentRange.numParagraphs(); i++) {\r
+      Paragraph par = documentRange.getParagraph(i);\r
+      int styleLvl = styleSheet.getParagraphStyle(par.getStyleIndex()).getLvl();\r
+      int parLvl = par.getLvl();\r
+      System.out.println("Style level: " + styleLvl + ", paragraph level: " + parLvl + ", text: " + par.text());\r
+    }*/\r
+  }\r
+\r
+  private void assertLevels(Range documentRange, StyleSheet styleSheet, int parIndex, int expectedStyleLvl, int expectedParLvl) {\r
+    Paragraph par = documentRange.getParagraph(parIndex);\r
+    assertEquals(expectedStyleLvl, styleSheet.getParagraphStyle(par.getStyleIndex()).getLvl());\r
+    assertEquals(expectedParLvl, par.getLvl());\r
+  }\r
+}
\ No newline at end of file
diff --git a/test-data/document/Bug49820.doc b/test-data/document/Bug49820.doc
new file mode 100644 (file)
index 0000000..b3a4aea
Binary files /dev/null and b/test-data/document/Bug49820.doc differ