]> source.dussan.org Git - poi.git/commitdiff
Improve how XWPFParagraph works, so it is child order aware
authorNick Burch <nick@apache.org>
Sat, 9 Aug 2008 12:15:32 +0000 (12:15 +0000)
committerNick Burch <nick@apache.org>
Sat, 9 Aug 2008 12:15:32 +0000 (12:15 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@684239 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xwpf/XWPFDocument.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java [new file with mode: 0644]

index d53cfa57637013aaf91b2fecf69b99f3d4f070fd..6b25a42b9ebba502bb82501213afc14baff6878f 100644 (file)
@@ -159,10 +159,14 @@ public class XWPFDocument extends POIXMLDocument {
                return wordDoc.getDocument();
        }
        
-       public Iterator<XWPFParagraph> getParagraphsIterator()
-       {
+       public Iterator<XWPFParagraph> getParagraphsIterator() {
                return paragraphs.iterator();
        }
+       public XWPFParagraph[] getParagraphs() {
+               return paragraphs.toArray(
+                       new XWPFParagraph[paragraphs.size()]
+               );
+       }
        
        public Iterator<XWPFTable> getTablesIterator()
        {
index 4b1325f183e4afdf1aab07f8c5954c3137ecf834..7150014e27e3e9e4e2b5d56ef192a5be55ac3cd0 100644 (file)
@@ -30,4 +30,39 @@ public abstract class XWPFHeaderFooter {
        protected XWPFHeaderFooter() {
                headerFooter = CTHdrFtr.Factory.newInstance();
        }
+       
+       public CTHdrFtr _getHdrFtr() {
+               return headerFooter;
+       }
+
+       /**
+        * Returns the paragraph(s) that holds
+        *  the text of the header or footer.
+        * Normally there is only the one paragraph, but
+        *  there could be more in certain cases.
+        */
+       public XWPFParagraph[] getParagraphs() {
+               XWPFParagraph[] paras = 
+                       new XWPFParagraph[headerFooter.getPArray().length];
+               for(int i=0; i<paras.length; i++) {
+                       paras[i] = new XWPFParagraph(
+                                       headerFooter.getPArray(i)
+                       );
+               }
+               return paras;
+       }
+       
+       /**
+        * Returns the textual content of the header/footer,
+        *  by flattening out the text of its paragraph(s)
+        */
+       public String getText() {
+               StringBuffer t = new StringBuffer();
+               XWPFParagraph[] paras = getParagraphs();
+               for (int i = 0; i < paras.length; i++) {
+                       t.append(paras[i].getText());
+                       t.append('\n');
+               }
+               return t.toString(); 
+       }
 }
index 09fe099e8235c3c7b1241c1113374acef2e998ad..e42ec0186d401cf54b1d21f67686c7d29733c191 100644 (file)
 ==================================================================== */
 package org.apache.poi.xwpf.usermodel;
 
-import org.apache.poi.xwpf.model.XMLParagraph;
 import org.apache.poi.xwpf.XWPFDocument;
+import org.apache.poi.xwpf.model.XMLParagraph;
+import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPTab;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
@@ -45,16 +47,22 @@ public class XWPFParagraph extends XMLParagraph
         this.docRef = docRef; 
         CTR[] rs = paragraph.getRArray();
     
-        // Get text
+        // Get text of the paragraph
         for (int j = 0; j < rs.length; j++) {
-            // Loop over text runs
-            CTText[] texts = rs[j].getTArray();
-            for (int k = 0; k < texts.length; k++) {
-                text.append(
-                        texts[k].getStringValue()
-                );
-            }
-            
+            // Grab the text and tabs of the paragraph
+               // Do so in a way that preserves the ordering
+               XmlCursor c = rs[j].newCursor();
+               c.selectPath( "./*" );
+               while(c.toNextSelection()) {
+                       XmlObject o = c.getObject();
+                       if(o instanceof CTText) {
+                               text.append( ((CTText)o).getStringValue() );
+                       }
+                       if(o instanceof CTPTab) {
+                               text.append("\t");
+                       }
+               }
+               
             // Loop over pictures inside our
             //  paragraph, looking for text in them
             CTPicture[] picts = rs[j].getPictArray();
@@ -80,6 +88,12 @@ public class XWPFParagraph extends XMLParagraph
         this(paragraph.getCTP());
     }
     
+    
+    public boolean isEmpty() {
+       return !paragraph.getDomNode().hasChildNodes();
+    }
+    
+    
     public XWPFDocument getDocRef() {
         return docRef;
     }
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java
new file mode 100644 (file)
index 0000000..b88f937
--- /dev/null
@@ -0,0 +1,96 @@
+/* ====================================================================
+   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.xwpf.usermodel;
+
+import java.io.File;
+
+import org.apache.poi.POIXMLDocument;
+import org.apache.poi.xwpf.XWPFDocument;
+
+import junit.framework.TestCase;
+
+/**
+ * Tests for XWPF Paragraphs
+ */
+public class TestXWPFParagraph extends TestCase {
+       /**
+        * A simple file
+        */
+       private XWPFDocument xml;
+       private File file;
+       
+       protected void setUp() throws Exception {
+               super.setUp();
+               
+               file = new File(
+                               System.getProperty("HWPF.testdata.path") +
+                               File.separator + "ThreeColHead.docx"
+               );
+               assertTrue(file.exists());
+               xml = new XWPFDocument(POIXMLDocument.openPackage(file.toString()));
+       }
+       
+       /**
+        * Check that we get the right paragraph from the header
+        */
+       public void testHeaderParagraph() throws Exception {
+               XWPFHeader hdr = xml.getDocumentHeader();
+               assertNotNull(hdr);
+               
+               XWPFParagraph[] ps = hdr.getParagraphs();
+               assertEquals(1, ps.length);
+               XWPFParagraph p = ps[0];
+               
+               assertEquals(5, p.getCTP().getRArray().length);
+               assertEquals(
+                               "First header column!\tMid header\tRight header!",
+                               p.getText()
+               );
+       }
+       
+       /**
+        * Check that we get the right paragraphs from the document
+        */
+       public void testDocumentParagraph() throws Exception {
+               XWPFParagraph[] ps = xml.getParagraphs();
+               assertEquals(10, ps.length);
+               
+               assertFalse(ps[0].isEmpty());
+               assertEquals(
+                               "This is a sample word document. It has two pages. It has a three column heading, but no footer.",
+                               ps[0].getText()
+               );
+               
+               assertTrue(ps[1].isEmpty());
+               assertEquals("", ps[1].getText());
+               
+               assertFalse(ps[2].isEmpty());
+               assertEquals(
+                               "HEADING TEXT",
+                               ps[2].getText()
+               );
+               
+               assertTrue(ps[3].isEmpty());
+               assertEquals("", ps[3].getText());
+               
+               assertFalse(ps[4].isEmpty());
+               assertEquals(
+                               "More on page one",
+                               ps[4].getText()
+               );
+       }
+}