From fabf35b20d877f0b1d807af5290c55b0f33c7646 Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Wed, 17 Dec 2008 20:05:16 +0000 Subject: [PATCH] applied patches by Gisella Bronzetti:46299 - support for carriage return and line break in XWPFRun 46300 - support for line spacing in XWPFParagraph 46308 - initial support for creation of XWPFTable git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@727498 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 3 + src/documentation/content/xdocs/status.xml | 3 + .../poi/xwpf/usermodel/SimpleDocument.java | 46 +- .../poi/xwpf/usermodel/SimpleTable.java | 56 +++ .../apache/poi/xwpf/usermodel/BreakClear.java | 111 +++++ .../apache/poi/xwpf/usermodel/BreakType.java | 84 ++++ .../poi/xwpf/usermodel/LineSpacingRule.java | 76 +++ .../poi/xwpf/usermodel/XWPFDocument.java | 18 + .../poi/xwpf/usermodel/XWPFParagraph.java | 469 ++++++++++-------- .../apache/poi/xwpf/usermodel/XWPFRun.java | 138 +++++- .../apache/poi/xwpf/usermodel/XWPFTable.java | 188 ++++++- .../poi/xwpf/usermodel/XWPFTableCell.java | 65 +++ .../poi/xwpf/usermodel/XWPFTableRow.java | 91 ++++ .../poi/xwpf/usermodel/TestXWPFParagraph.java | 82 ++- .../poi/xwpf/usermodel/TestXWPFRun.java | 66 ++- .../poi/xwpf/usermodel/TestXWPFTable.java | 117 +++++ 16 files changed, 1317 insertions(+), 296 deletions(-) create mode 100755 src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java create mode 100755 src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakClear.java create mode 100755 src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakType.java create mode 100755 src/ooxml/java/org/apache/poi/xwpf/usermodel/LineSpacingRule.java create mode 100755 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java create mode 100755 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java create mode 100755 src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index b04cc4a79..6ea6b15af 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -37,6 +37,9 @@ + 46299 - support for carriage return and line break in XWPFRun + 46300 - support for line spacing in XWPFParagraph + 46308 - initial support for creation of XWPFTable Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow() 46385 - (also patch 46362) fix serialization of StyleRecord with unicode name 46368 - Fix HSSFRichTextRun and strings longer than 32768 characters diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 61ae91cd4..9d8f33e24 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,9 @@ + 46299 - support for carriage return and line break in XWPFRun + 46300 - support for line spacing in XWPFParagraph + 46308 - initial support for creation of XWPFTable Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow() 46385 - (also patch 46362) fix serialization of StyleRecord with unicode name 46368 - Fix HSSFRichTextRun and strings longer than 32768 characters diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleDocument.java b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleDocument.java index 363bc8716..b7e4da2d4 100755 --- a/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleDocument.java +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleDocument.java @@ -17,7 +17,6 @@ package org.apache.poi.xwpf.usermodel; import java.io.FileOutputStream; -import java.math.BigInteger; /** * A simple WOrdprocessingML document created by POI XWPF API @@ -46,7 +45,7 @@ public class SimpleDocument { r1.setBold(true); r1.setFontFamily("Courier"); r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH); - r1.setTextPosition(new BigInteger("100")); + r1.setTextPosition(100); XWPFParagraph p2 = doc.createParagraph(); p2.setAlignment(ParagraphAlignment.RIGHT); @@ -61,51 +60,58 @@ public class SimpleDocument { XWPFRun r2 = p2.createRun(); r2.setText("jumped over the lazy dog"); r2.setStrike(true); - r2.setFontSize(new BigInteger("20")); + r2.setFontSize(20); XWPFRun r3 = p2.createRun(); r3.setText("and went away"); r3.setStrike(true); - r3.setFontSize(new BigInteger("20")); + r3.setFontSize(20); r3.setSubscript(VerticalAlign.SUPERSCRIPT); XWPFParagraph p3 = doc.createParagraph(); p3.setWordWrap(true); p3.setPageBreak(true); - p3.setAlignment(ParagraphAlignment.DISTRIBUTE); - p3.setIndentationFirstLine(new BigInteger("600")); - p3.setSpacingAfter(new BigInteger("250")); - p3.setSpacingBefore(new BigInteger("250")); + + //p3.setAlignment(ParagraphAlignment.DISTRIBUTE); + p3.setAlignment(ParagraphAlignment.BOTH); + p3.setSpacingLineRule(LineSpacingRule.EXACT); + + p3.setIndentationFirstLine(600); + XWPFRun r4 = p3.createRun(); - r4.setTextPosition(new BigInteger("20")); + r4.setTextPosition(20); r4.setText("To be, or not to be: that is the question: " + "Whether 'tis nobler in the mind to suffer " + "The slings and arrows of outrageous fortune, " + "Or to take arms against a sea of troubles, " - + "And by opposing end them? To die: to sleep; " - + "No more; and by a sleep to say we end " + + "And by opposing end them? To die: to sleep; "); + r4.addBreak(BreakType.PAGE); + r4.setText("No more; and by a sleep to say we end " + "The heart-ache and the thousand natural shocks " + "That flesh is heir to, 'tis a consummation " + "Devoutly to be wish'd. To die, to sleep; " + "To sleep: perchance to dream: ay, there's the rub; " + "......."); r4.setItalic(true); - +//This would imply that this break shall be treated as a simple line break, and break the line after that word: XWPFRun r5 = p3.createRun(); - r5.setTextPosition(new BigInteger("-10")); - r5.setText("For in that sleep of death what dreams may come" - + "When we have shuffled off this mortal coil," + r5.setTextPosition(-10); + r5.setText("For in that sleep of death what dreams may come"); + r5.addCarriageReturn(); + r5.setText("When we have shuffled off this mortal coil," + "Must give us pause: there's the respect" - + "That makes calamity of so long life;" - + "For who would bear the whips and scorns of time," - + "The oppressor's wrong, the proud man's contumely," - + "The pangs of despised love, the law's delay," + + "That makes calamity of so long life;"); + r5.addBreak(); + r5.setText("For who would bear the whips and scorns of time," + + "The oppressor's wrong, the proud man's contumely,"); + + r5.addBreak(BreakClear.ALL); + r5.setText("The pangs of despised love, the law's delay," + "The insolence of office and the spurns" + "......."); - FileOutputStream out = new FileOutputStream("simple.docx"); doc.write(out); out.close(); diff --git a/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java new file mode 100755 index 000000000..d3ff82996 --- /dev/null +++ b/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleTable.java @@ -0,0 +1,56 @@ +/* ==================================================================== + 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.FileOutputStream; + +/** + * A simple WOrdprocessingML table created by POI XWPF API + * + * @author gisella bronzetti + */ +public class SimpleTable { + + public static void main(String[] args) throws Exception { + XWPFDocument doc = new XWPFDocument(); + + XWPFTable table=doc.createTable(3,3); + + table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE"); + + + XWPFParagraph p1 = doc.createParagraph(); + + XWPFRun r1 = p1.createRun(); + r1.setBold(true); + r1.setText("The quick brown fox"); + r1.setBold(true); + r1.setFontFamily("Courier"); + r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH); + r1.setTextPosition(100); + + table.getRow(0).getCell(0).setParagraph(p1); + + + table.getRow(2).getCell(2).setText("only text"); + + FileOutputStream out = new FileOutputStream("simpleTable.docx"); + doc.write(out); + out.close(); + + } +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakClear.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakClear.java new file mode 100755 index 000000000..ef66541bd --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakClear.java @@ -0,0 +1,111 @@ +/* ==================================================================== + 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.util.HashMap; +import java.util.Map; + +/** + * Specifies the set of possible restart locations which may be used as to + * determine the next available line when a breakÕs type attribute has a value + * of textWrapping. + * + * @author Gisella Bronzetti + */ +public enum BreakClear { + + /** + * Specifies that the text wrapping break shall advance the text to the next + * line in the WordprocessingML document, regardless of its position left to + * right or the presence of any floating objects which intersect with the + * line, + * + * This is the setting for a typical line break in a document. + */ + + NONE(1), + + /** + * Specifies that the text wrapping break shall behave as follows: + *
    + *
  • If this line is broken into multiple regions (a floating object in + * the center of the page has text wrapping on both sides: + *
      + *
    • If this is the leftmost region of text flow on this line, advance + * the text to the next position on the line
    • + *
    • Otherwise, treat this as a text wrapping break of type all.
    • + *
    + *
  • + *
  • If this line is not broken into multiple regions, then treat this + * break as a text wrapping break of type none.
  • + *
+ *
  • If the parent paragraph is right to left, then these behaviors are + * also reversed.
  • + */ + LEFT(2), + + /** + * Specifies that the text wrapping break shall behave as follows: + *
      + *
    • If this line is broken into multiple regions (a floating object in + * the center of the page has text wrapping on both sides: + *
        + *
      • If this is the rightmost region of text flow on this line, advance + * the text to the next position on the next line
      • + *
      • Otherwise, treat this as a text wrapping break of type all.
      • + *
      + *
    • If this line is not broken into multiple regions, then treat this + * break as a text wrapping break of type none.
    • + *
    • If the parent paragraph is right to left, then these beha viors are + * also reversed.
    • + *
    + */ + RIGHT(3), + + /** + * Specifies that the text wrapping break shall advance the text to the next + * line in the WordprocessingML document which spans the full width of the + * line. + */ + ALL(4); + + private final int value; + + private BreakClear(int val) { + value = val; + } + + public int getValue() { + return value; + } + + private static Map imap = new HashMap(); + static { + for (BreakClear p : values()) { + imap.put(p.getValue(), p); + } + } + + public static BreakClear valueOf(int type) { + BreakClear bType = imap.get(type); + if (bType == null) + throw new IllegalArgumentException("Unknown break clear type: " + + type); + return bType; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakType.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakType.java new file mode 100755 index 000000000..97e9ad27d --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/BreakType.java @@ -0,0 +1,84 @@ +/* ==================================================================== + 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.util.HashMap; +import java.util.Map; + +/** + * Specifies the possible types of break characters in a WordprocessingML + * document. + * The break type determines the next location where text shall be + * placed after this manual break is applied to the text contents + * + * @author Gisella Bronzetti + */ +public enum BreakType { + + + /** + * Specifies that the current break shall restart itself on the next page of + * the document when the document is displayed in page view. + */ + PAGE(1), + + /** + * Specifies that the current break shall restart itself on the next column + * available on the current page when the document is displayed in page + * view. + *

    + * If the current section is not divided into columns, or the column break + * occurs in the last column on the current page when displayed, then the + * restart location for text shall be the next page in the document. + *

    + */ + COLUMN(2), + + /** + * Specifies that the current break shall restart itself on the next line in + * the document when the document is displayed in page view. + * The determine of the next line shall be done subject to the value of the clear + * attribute on the specified break character. + */ + TEXT_WRAPPING(3); + + private final int value; + + private BreakType(int val) { + value = val; + } + + public int getValue() { + return value; + } + + private static Map imap = new HashMap(); + static { + for (BreakType p : values()) { + imap.put(p.getValue(), p); + } + } + + public static BreakType valueOf(int type) { + BreakType bType = imap.get(type); + if (bType == null) + throw new IllegalArgumentException("Unknown break type: " + + type); + return bType; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/LineSpacingRule.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/LineSpacingRule.java new file mode 100755 index 000000000..be77ff70d --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/LineSpacingRule.java @@ -0,0 +1,76 @@ +/* ==================================================================== + 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.util.HashMap; +import java.util.Map; + +/** + * Specifies the logic which shall be used to calculate the line spacing of the + * parent object when it is displayed in the document. + * + * @author Gisella Bronzetti + */ +public enum LineSpacingRule { + + /** + * Specifies that the line spacing of the parent object shall be + * automatically determined by the size of its contents, with no + * predetermined minimum or maximum size. + */ + + AUTO(1), + + /** + * Specifies that the height of the line shall be exactly the value + * specified, regardless of the size of the contents If the contents are too + * large for the specified height, then they shall be clipped as necessary. + */ + EXACT(2), + + /** + * Specifies that the height of the line shall be at least the value + * specified, but may be expanded to fit its content as needed. + */ + AT_LEAST(3); + + + private final int value; + + private LineSpacingRule(int val) { + value = val; + } + + public int getValue() { + return value; + } + + private static Map imap = new HashMap(); + static { + for (LineSpacingRule p : values()) { + imap.put(p.getValue(), p); + } + } + + public static LineSpacingRule valueOf(int type) { + LineSpacingRule lineType = imap.get(type); + if (lineType == null) + throw new IllegalArgumentException("Unknown line type: " + type); + return lineType; + } + +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java index fdf6c9797..b5f132aff 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java @@ -318,5 +318,23 @@ public class XWPFDocument extends POIXMLDocument { return new XWPFParagraph(ctDocument.getBody().addNewP(), this); } + /** + * Create an empty table with one row and one column as default. + * + * @return a new table + */ + public XWPFTable createTable(){ + return new XWPFTable(ctDocument.getBody().addNewTbl()); + } + + /** + * Create an empty table with a number of rows and cols specified + * @param rows + * @param cols + * @return table + */ + public XWPFTable createTable(int rows, int cols) { + return new XWPFTable(ctDocument.getBody().addNewTbl(), rows, cols); + } } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index 450686b83..2f2aa4945 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -38,6 +38,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTextAlignment; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; import org.w3c.dom.NodeList; @@ -58,80 +59,86 @@ public class XWPFParagraph { private StringBuffer text = new StringBuffer(); private StringBuffer pictureText = new StringBuffer(); + + protected XWPFParagraph(CTP prgrph) { + this(prgrph, null); + } + + protected XWPFParagraph(CTP prgrph, XWPFDocument docRef) { - this.paragraph = prgrph; - this.document = docRef; + this.paragraph = prgrph; + this.document = docRef; - if (!isEmpty()) { - // All the runs to loop over - // TODO - replace this with some sort of XPath expression - // to directly find all the CTRs, in the right order - ArrayList rs = new ArrayList(); - CTR[] tmp; + if (!isEmpty()) { + // All the runs to loop over + // TODO - replace this with some sort of XPath expression + // to directly find all the CTRs, in the right order + ArrayList rs = new ArrayList(); + CTR[] tmp; - // Get the main text runs - tmp = paragraph.getRArray(); - for (int i = 0; i < tmp.length; i++) { - rs.add(tmp[i]); - } + // Get the main text runs + tmp = paragraph.getRArray(); + for (int i = 0; i < tmp.length; i++) { + rs.add(tmp[i]); + } - // Not sure quite what these are, but they hold - // more text runs - CTSdtRun[] sdts = paragraph.getSdtArray(); - for (int i = 0; i < sdts.length; i++) { - CTSdtContentRun run = sdts[i].getSdtContent(); - tmp = run.getRArray(); - for (int j = 0; j < tmp.length; j++) { - rs.add(tmp[j]); - } - } + // Not sure quite what these are, but they hold + // more text runs + CTSdtRun[] sdts = paragraph.getSdtArray(); + for (int i = 0; i < sdts.length; i++) { + CTSdtContentRun run = sdts[i].getSdtContent(); + tmp = run.getRArray(); + for (int j = 0; j < tmp.length; j++) { + rs.add(tmp[j]); + } + } - // Get text of the paragraph - for (int j = 0; j < rs.size(); j++) { - // Grab the text and tabs of the paragraph - // Do so in a way that preserves the ordering - XmlCursor c = rs.get(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"); - } - } + // Get text of the paragraph + for (int j = 0; j < rs.size(); j++) { + // Grab the text and tabs of the paragraph + // Do so in a way that preserves the ordering + XmlCursor c = rs.get(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.get(j).getPictArray(); - for (int k = 0; k < picts.length; k++) { - XmlObject[] t = picts[k] - .selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t"); - for (int m = 0; m < t.length; m++) { - NodeList kids = t[m].getDomNode().getChildNodes(); - for (int n = 0; n < kids.getLength(); n++) { - if (kids.item(n) instanceof Text) { - pictureText.append("\n"); - pictureText.append(kids.item(n).getNodeValue()); - } - } - } - } - } - } + // Loop over pictures inside our + // paragraph, looking for text in them + CTPicture[] picts = rs.get(j).getPictArray(); + for (int k = 0; k < picts.length; k++) { + XmlObject[] t = picts[k] + .selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t"); + for (int m = 0; m < t.length; m++) { + NodeList kids = t[m].getDomNode().getChildNodes(); + for (int n = 0; n < kids.getLength(); n++) { + if (kids.item(n) instanceof Text) { + pictureText.append("\n"); + pictureText.append(kids.item(n).getNodeValue()); + } + } + } + } + } + } } public CTP getCTP() { - return paragraph; + return paragraph; } public boolean isEmpty() { - return !paragraph.getDomNode().hasChildNodes(); + return !paragraph.getDomNode().hasChildNodes(); } public XWPFDocument getDocument() { - return document; + return document; } /** @@ -139,7 +146,7 @@ public class XWPFParagraph { * in it. */ public String getText() { - return getParagraphText() + getPictureText(); + return getParagraphText() + getPictureText(); } /** @@ -147,14 +154,14 @@ public class XWPFParagraph { * paragraph */ public String getParagraphText() { - return text.toString(); + return text.toString(); } /** * Returns any text from any suitable pictures in the paragraph */ public String getPictureText() { - return pictureText.toString(); + return pictureText.toString(); } /** @@ -163,7 +170,7 @@ public class XWPFParagraph { * @return a new text run */ public XWPFRun createRun() { - return new XWPFRun(paragraph.addNewR(), this); + return new XWPFRun(paragraph.addNewR(), this); } /** @@ -181,7 +188,7 @@ public class XWPFParagraph { * @return the paragraph alignment of this paragraph. */ public ParagraphAlignment getAlignment() { - CTPPr pr = paragraph.getPPr(); + CTPPr pr = getCTPPr(); return pr == null || !pr.isSetJc() ? ParagraphAlignment.LEFT : ParagraphAlignment.valueOf(pr.getJc().getVal().intValue()); } @@ -201,8 +208,7 @@ public class XWPFParagraph { * @param align the paragraph alignment to apply to this paragraph. */ public void setAlignment(ParagraphAlignment align) { - CTPPr pr = paragraph.isSetPPr() ? paragraph.getPPr() : paragraph - .addNewPPr(); + CTPPr pr = getCTPPr(); CTJc jc = pr.isSetJc() ? pr.getJc() : pr.addNewJc(); STJc.Enum en = STJc.Enum.forInt(align.getValue()); jc.setVal(en); @@ -227,8 +233,8 @@ public class XWPFParagraph { * @return the vertical alignment of this paragraph. */ public TextAlignment getVerticalAlignment() { - CTPPr pr = paragraph.getPPr(); - return pr == null || !pr.isSetTextAlignment() ? TextAlignment.AUTO + CTPPr pr = getCTPPr(); + return (pr == null || !pr.isSetTextAlignment()) ? TextAlignment.AUTO : TextAlignment.valueOf(pr.getTextAlignment().getVal() .intValue()); } @@ -253,8 +259,7 @@ public class XWPFParagraph { * paragraph. */ public void setVerticalAlignment(TextAlignment valign) { - CTPPr pr = paragraph.isSetPPr() ? paragraph.getPPr() : paragraph - .addNewPPr(); + CTPPr pr = getCTPPr(); CTTextAlignment textAlignment = pr.isSetTextAlignment() ? pr .getTextAlignment() : pr.addNewTextAlignment(); STTextAlignment.Enum en = STTextAlignment.Enum @@ -291,7 +296,8 @@ public class XWPFParagraph { */ public void setBorderTop(Borders border) { CTPBdr ct = getCTPBrd(true); - CTBorder pr = ct.isSetTop() ? ct.getTop() : ct.addNewTop(); + + CTBorder pr = (ct != null && ct.isSetTop()) ? ct.getTop() : ct.addNewTop(); if (border.getValue() == Borders.NONE.getValue()) ct.unsetTop(); else @@ -308,13 +314,12 @@ public class XWPFParagraph { */ public Borders getBorderTop() { CTPBdr border = getCTPBrd(false); - CTBorder ct; + CTBorder ct = null; if (border != null) { ct = border.getTop(); - STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; - return Borders.valueOf(ptrn.intValue()); } - return Borders.NONE; + STBorder.Enum ptrn = (ct != null) ? ct.getVal() : STBorder.NONE; + return Borders.valueOf(ptrn.intValue()); } /** @@ -345,12 +350,12 @@ public class XWPFParagraph { * @see Borders a list of all types of borders */ public void setBorderBottom(Borders border) { - CTPBdr ct = getCTPBrd(true); - CTBorder pr = ct.isSetBottom() ? ct.getBottom() : ct.addNewBottom(); - if (border.getValue() == Borders.NONE.getValue()) - ct.unsetBottom(); - else - pr.setVal(STBorder.Enum.forInt(border.getValue())); + CTPBdr ct = getCTPBrd(true); + CTBorder pr = ct.isSetBottom() ? ct.getBottom() : ct.addNewBottom(); + if (border.getValue() == Borders.NONE.getValue()) + ct.unsetBottom(); + else + pr.setVal(STBorder.Enum.forInt(border.getValue())); } /** @@ -362,13 +367,13 @@ public class XWPFParagraph { * @see Borders a list of all types of borders */ public Borders getBorderBottom() { - CTPBdr border = getCTPBrd(false); - CTBorder ct = null; - if (border != null) { - ct = border.getBottom(); - } - STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; - return Borders.valueOf(ptrn.intValue()); + CTPBdr border = getCTPBrd(false); + CTBorder ct = null; + if (border != null) { + ct = border.getBottom(); + } + STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; + return Borders.valueOf(ptrn.intValue()); } /** @@ -394,12 +399,12 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public void setBorderLeft(Borders border) { - CTPBdr ct = getCTPBrd(true); - CTBorder pr = ct.isSetLeft() ? ct.getLeft() : ct.addNewLeft(); - if (border.getValue() == Borders.NONE.getValue()) - ct.unsetLeft(); - else - pr.setVal(STBorder.Enum.forInt(border.getValue())); + CTPBdr ct = getCTPBrd(true); + CTBorder pr = ct.isSetLeft() ? ct.getLeft() : ct.addNewLeft(); + if (border.getValue() == Borders.NONE.getValue()) + ct.unsetLeft(); + else + pr.setVal(STBorder.Enum.forInt(border.getValue())); } /** @@ -411,13 +416,13 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public Borders getBorderLeft() { - CTPBdr border = getCTPBrd(false); - CTBorder ct = null; - if (border != null) { - ct = border.getLeft(); - } - STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; - return Borders.valueOf(ptrn.intValue()); + CTPBdr border = getCTPBrd(false); + CTBorder ct = null; + if (border != null) { + ct = border.getLeft(); + } + STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; + return Borders.valueOf(ptrn.intValue()); } /** @@ -443,12 +448,12 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public void setBorderRight(Borders border) { - CTPBdr ct = getCTPBrd(true); - CTBorder pr = ct.isSetRight() ? ct.getRight() : ct.addNewRight(); - if (border.getValue() == Borders.NONE.getValue()) - ct.unsetRight(); - else - pr.setVal(STBorder.Enum.forInt(border.getValue())); + CTPBdr ct = getCTPBrd(true); + CTBorder pr = ct.isSetRight() ? ct.getRight() : ct.addNewRight(); + if (border.getValue() == Borders.NONE.getValue()) + ct.unsetRight(); + else + pr.setVal(STBorder.Enum.forInt(border.getValue())); } /** @@ -460,13 +465,13 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public Borders getBorderRight() { - CTPBdr border = getCTPBrd(false); - CTBorder ct = null; - if (border != null) { - ct = border.getRight(); - } - STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; - return Borders.valueOf(ptrn.intValue()); + CTPBdr border = getCTPBrd(false); + CTBorder ct = null; + if (border != null) { + ct = border.getRight(); + } + STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; + return Borders.valueOf(ptrn.intValue()); } /** @@ -496,12 +501,12 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public void setBorderBetween(Borders border) { - CTPBdr ct = getCTPBrd(true); - CTBorder pr = ct.isSetBetween() ? ct.getBetween() : ct.addNewBetween(); - if (border.getValue() == Borders.NONE.getValue()) - ct.unsetBetween(); - else - pr.setVal(STBorder.Enum.forInt(border.getValue())); + CTPBdr ct = getCTPBrd(true); + CTBorder pr = ct.isSetBetween() ? ct.getBetween() : ct.addNewBetween(); + if (border.getValue() == Borders.NONE.getValue()) + ct.unsetBetween(); + else + pr.setVal(STBorder.Enum.forInt(border.getValue())); } /** @@ -513,13 +518,13 @@ public class XWPFParagraph { * @see Borders for a list of all possible borders */ public Borders getBorderBetween() { - CTPBdr border = getCTPBrd(false); - CTBorder ct = null; - if (border != null) { - ct = border.getBetween(); - } - STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; - return Borders.valueOf(ptrn.intValue()); + CTPBdr border = getCTPBrd(false); + CTBorder ct = null; + if (border != null) { + ct = border.getBetween(); + } + STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; + return Borders.valueOf(ptrn.intValue()); } /** @@ -539,13 +544,13 @@ public class XWPFParagraph { * boolean value */ public void setPageBreak(boolean pageBreak) { - CTPPr ppr = getCTPPr(); - CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr - .getPageBreakBefore() : ppr.addNewPageBreakBefore(); - if (pageBreak) - ct_pageBreak.setVal(STOnOff.TRUE); - else - ct_pageBreak.setVal(STOnOff.FALSE); + CTPPr ppr = getCTPPr(); + CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr + .getPageBreakBefore() : ppr.addNewPageBreakBefore(); + if (pageBreak) + ct_pageBreak.setVal(STOnOff.TRUE); + else + ct_pageBreak.setVal(STOnOff.FALSE); } /** @@ -564,14 +569,14 @@ public class XWPFParagraph { * @return boolean - if page break is set */ public boolean isPageBreak() { - CTPPr ppr = getCTPPr(); - CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr - .getPageBreakBefore() : null; - if (ct_pageBreak != null - && ct_pageBreak.getVal().intValue() == STOnOff.INT_TRUE) - return true; - else - return false; + CTPPr ppr = getCTPPr(); + CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr + .getPageBreakBefore() : null; + if (ct_pageBreak != null + && ct_pageBreak.getVal().intValue() == STOnOff.INT_TRUE) + return true; + else + return false; } /** @@ -586,21 +591,24 @@ public class XWPFParagraph { * a positive whole number, whose contents consist of a * measurement in twentieths of a point. */ - public void setSpacingAfter(BigInteger spaces) { + public void setSpacingAfter(int spaces) { CTSpacing spacing = getCTSpacing(true); - if (spacing != null) - spacing.setAfter(spaces); + if (spacing != null) { + BigInteger bi = new BigInteger("" + spaces); + spacing.setAfter(bi); + } + } /** * Specifies the spacing that should be added after the last line in this * paragraph in the document in absolute units. * - * @return bigInteger - value representing the spacing after the paragraph + * @return int - value representing the spacing after the paragraph */ - public BigInteger getSpacingAfter() { + public int getSpacingAfter() { CTSpacing spacing = getCTSpacing(false); - return spacing.isSetAfter() ? spacing.getAfter() : null; + return (spacing != null && spacing.isSetAfter()) ? spacing.getAfter().intValue() : -1; } /** @@ -620,9 +628,10 @@ public class XWPFParagraph { * a positive whole number, whose contents consist of a * measurement in twentieths of a */ - public void setSpacingAfterLines(BigInteger spaces) { + public void setSpacingAfterLines(int spaces) { CTSpacing spacing = getCTSpacing(true); - spacing.setAfterLines(spaces); + BigInteger bi = new BigInteger("" + spaces); + spacing.setAfterLines(bi); } @@ -633,11 +642,12 @@ public class XWPFParagraph { * @return bigInteger - value representing the spacing after the paragraph * @see #setSpacingAfterLines(BigInteger) */ - public BigInteger getSpacingAfterLines() { + public int getSpacingAfterLines() { CTSpacing spacing = getCTSpacing(false); - return spacing.isSetAfterLines() ? spacing.getAfterLines() : null; + return (spacing != null && spacing.isSetAfterLines()) ? spacing.getAfterLines().intValue() : -1; } + /** * Specifies the spacing that should be added above the first line in this * paragraph in the document in absolute units. @@ -648,9 +658,10 @@ public class XWPFParagraph { * * @param spaces */ - public void setSpacingBefore(BigInteger spaces) { + public void setSpacingBefore(int spaces) { CTSpacing spacing = getCTSpacing(true); - spacing.setBefore(spaces); + BigInteger bi = new BigInteger("" + spaces); + spacing.setBefore(bi); } /** @@ -660,9 +671,9 @@ public class XWPFParagraph { * @return the spacing that should be added above the first line * @see #setSpacingBefore(BigInteger) */ - public BigInteger getSpacingBefore() { + public int getSpacingBefore() { CTSpacing spacing = getCTSpacing(false); - return spacing.isSetBefore() ? spacing.getBefore() : null; + return (spacing != null && spacing.isSetBefore()) ? spacing.getBefore().intValue() : -1; } /** @@ -677,9 +688,10 @@ public class XWPFParagraph { * * @param spaces */ - public void setSpacingBeforeLines(BigInteger spaces) { + public void setSpacingBeforeLines(int spaces) { CTSpacing spacing = getCTSpacing(true); - spacing.setBeforeLines(spaces); + BigInteger bi = new BigInteger("" + spaces); + spacing.setBeforeLines(bi); } /** @@ -690,11 +702,41 @@ public class XWPFParagraph { * @return the spacing that should be added before the first line in this paragraph * @see #setSpacingBeforeLines(BigInteger) */ - public BigInteger getSpacingBeforeLines() { + public int getSpacingBeforeLines() { CTSpacing spacing = getCTSpacing(false); - return spacing.isSetBeforeLines() ? spacing.getBeforeLines() : null; + return (spacing != null && spacing.isSetBeforeLines()) ? spacing.getBeforeLines().intValue() : -1; } + + /** + * Specifies how the spacing between lines is calculated as stored in the + * line attribute. If this attribute is omitted, then it shall be assumed to + * be of a value auto if a line attribute value is present. + * + * @param rule + * @see LineSpacingRule + */ + public void setSpacingLineRule(LineSpacingRule rule) { + CTSpacing spacing = getCTSpacing(true); + spacing.setLineRule(STLineSpacingRule.Enum.forInt(rule.getValue())); + } + + /** + * Specifies how the spacing between lines is calculated as stored in the + * line attribute. If this attribute is omitted, then it shall be assumed to + * be of a value auto if a line attribute value is present. + * + * @return rule + * @see LineSpacingRule + * @see #setSpacingLineRule(LineSpacingRule) + */ + public LineSpacingRule getSpacingLineRule() { + CTSpacing spacing = getCTSpacing(false); + return (spacing != null && spacing.isSetLineRule()) ? LineSpacingRule.valueOf(spacing + .getLineRule().intValue()) : LineSpacingRule.AUTO; + } + + /** * Specifies the indentation which shall be placed between the left text * margin for this paragraph and the left edge of that paragraph's content @@ -708,9 +750,10 @@ public class XWPFParagraph { * * @param indentation */ - public void setIndentationLeft(BigInteger indentation) { + public void setIndentationLeft(int indentation) { CTInd indent = getCTInd(true); - indent.setLeft(indentation); + BigInteger bi = new BigInteger("" + indentation); + indent.setLeft(bi); } /** @@ -726,10 +769,10 @@ public class XWPFParagraph { * * @return indentation or null if indentation is not set */ - public BigInteger getIndentationLeft() { + public int getIndentationLeft() { CTInd indentation = getCTInd(false); - return indentation.isSetLeft() ? indentation.getLeft() - : new BigInteger("0"); + return (indentation != null && indentation.isSetLeft()) ? indentation.getLeft().intValue() + : -1; } /** @@ -745,9 +788,10 @@ public class XWPFParagraph { * * @param indentation */ - public void setIndentationRight(BigInteger indentation) { + public void setIndentationRight(int indentation) { CTInd indent = getCTInd(true); - indent.setRight(indentation); + BigInteger bi = new BigInteger("" + indentation); + indent.setRight(bi); } /** @@ -764,10 +808,10 @@ public class XWPFParagraph { * @return indentation or null if indentation is not set */ - public BigInteger getIndentationRight() { + public int getIndentationRight() { CTInd indentation = getCTInd(false); - return indentation.isSetRight() ? indentation.getRight() - : new BigInteger("0"); + return (indentation != null && indentation.isSetRight()) ? indentation.getRight().intValue() + : -1; } /** @@ -784,9 +828,10 @@ public class XWPFParagraph { * @param indentation */ - public void setIndentationHanging(BigInteger indentation) { + public void setIndentationHanging(int indentation) { CTInd indent = getCTInd(true); - indent.setHanging(indentation); + BigInteger bi = new BigInteger("" + indentation); + indent.setHanging(bi); } /** @@ -802,9 +847,9 @@ public class XWPFParagraph { * * @return indentation or null if indentation is not set */ - public BigInteger getIndentationHanging() { + public int getIndentationHanging() { CTInd indentation = getCTInd(false); - return indentation.isSetHanging() ? indentation.getHanging() : null; + return (indentation != null && indentation.isSetHanging()) ? indentation.getHanging().intValue() : -1; } /** @@ -821,9 +866,10 @@ public class XWPFParagraph { * * @param indentation */ - public void setIndentationFirstLine(BigInteger indentation) { + public void setIndentationFirstLine(int indentation) { CTInd indent = getCTInd(true); - indent.setFirstLine(indentation); + BigInteger bi = new BigInteger("" + indentation); + indent.setFirstLine(bi); } /** @@ -841,10 +887,10 @@ public class XWPFParagraph { * * @return indentation or null if indentation is not set */ - public BigInteger getIndentationFirstLine() { + public int getIndentationFirstLine() { CTInd indentation = getCTInd(false); - return indentation.isSetFirstLine() ? indentation.getFirstLine() - : new BigInteger("0"); + return (indentation != null && indentation.isSetFirstLine()) ? indentation.getFirstLine().intValue() + : -1; } /** @@ -856,12 +902,12 @@ public class XWPFParagraph { * @param wrap - boolean */ public void setWordWrap(boolean wrap) { - CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() - .getWordWrap() : getCTPPr().addNewWordWrap(); - if (wrap) - wordWrap.setVal(STOnOff.TRUE); - else - wordWrap.unsetVal(); + CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() + .getWordWrap() : getCTPPr().addNewWordWrap(); + if (wrap) + wordWrap.setVal(STOnOff.TRUE); + else + wordWrap.unsetVal(); } /** @@ -873,14 +919,14 @@ public class XWPFParagraph { * @return boolean */ public boolean isWordWrap() { - CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() - .getWordWrap() : null; - if (wordWrap != null) { - return (wordWrap.getVal() == STOnOff.ON - || wordWrap.getVal() == STOnOff.TRUE || wordWrap.getVal() == STOnOff.X_1) ? true - : false; - } else - return false; + CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() + .getWordWrap() : null; + if (wordWrap != null) { + return (wordWrap.getVal() == STOnOff.ON + || wordWrap.getVal() == STOnOff.TRUE || wordWrap.getVal() == STOnOff.X_1) ? true + : false; + } else + return false; } /** @@ -889,13 +935,10 @@ public class XWPFParagraph { */ private CTPBdr getCTPBrd(boolean create) { CTPPr pr = getCTPPr(); - if (pr != null) { - CTPBdr ct = pr.isSetPBdr() ? pr.getPBdr() : null; - if (create && ct == null) - ct = pr.addNewPBdr(); - return ct; - } - return null; + CTPBdr ct = pr.isSetPBdr() ? pr.getPBdr() : null; + if (create && ct == null) + ct = pr.addNewPBdr(); + return ct; } /** @@ -904,13 +947,10 @@ public class XWPFParagraph { */ private CTSpacing getCTSpacing(boolean create) { CTPPr pr = getCTPPr(); - if (pr != null) { - CTSpacing ct = pr.isSetSpacing() ? pr.getSpacing() : null; - if (create && ct == null) - ct = pr.addNewSpacing(); - return ct; - } - return null; + CTSpacing ct = pr.getSpacing() == null ? null : pr.getSpacing(); + if (create && ct == null) + ct = pr.addNewSpacing(); + return ct; } /** @@ -919,15 +959,16 @@ public class XWPFParagraph { */ private CTInd getCTInd(boolean create) { CTPPr pr = getCTPPr(); - if (pr != null) { - CTInd ct = pr.isSetInd() ? pr.getInd() : null; - if (create && ct == null) - ct = pr.addNewInd(); - return ct; - } - return null; + CTInd ct = pr.getInd() == null ? null : pr.getInd(); + if (create && ct == null) + ct = pr.addNewInd(); + return ct; } + /** + * Get a copy of the currently used CTPPr, if none is used, return + * a new instance. + */ private CTPPr getCTPPr() { CTPPr pr = paragraph.getPPr() == null ? paragraph.addNewPPr() : paragraph.getPPr(); diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java index 8933b494c..60ebac5c8 100755 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java @@ -18,6 +18,7 @@ package org.apache.poi.xwpf.usermodel; import java.math.BigInteger; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; @@ -27,6 +28,8 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSignedHpsMeasure import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalAlignRun; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrClear; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrType; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; @@ -49,10 +52,18 @@ public class XWPFRun { this.paragraph = p; } + /** + * Get the currently used CTR object + * @return ctr object + */ public CTR getCTR() { return run; } + /** + * Get the currenty referenced paragraph object + * @return current paragraph + */ public XWPFParagraph getParagraph() { return paragraph; } @@ -70,9 +81,8 @@ public class XWPFRun { /** * Whether the bold property shall be applied to all non-complex script - * characters in the contents of this run when displayed in a document - *

    - *

    + * characters in the contents of this run when displayed in a document. + *

    * This formatting property is a toggle property, which specifies that its * behavior differs between its use within a style definition and its use as * direct formatting. When used as part of a style definition, setting this @@ -83,7 +93,7 @@ public class XWPFRun { * direct formatting, setting this property to true or false shall set the * absolute state of the resulting property. *

    - *

    + *

    * If this element is not present, the default value is to leave the * formatting applied at previous level in the style hierarchy. If this * element is never applied in the style hierarchy, then bold shall not be @@ -104,8 +114,8 @@ public class XWPFRun { * * @return the text of this text run or null if not set */ - public String getText() { - return run.sizeOfTArray() == 0 ? null : run.getTArray(0) + public String getText(int pos) { + return run.sizeOfTArray() == 0 ? null : run.getTArray(pos) .getStringValue(); } @@ -115,10 +125,22 @@ public class XWPFRun { * @param value the literal text which shall be displayed in the document */ public void setText(String value) { - CTText t = run.sizeOfTArray() == 0 ? run.addNewT() : run.getTArray(0); + setText(value,run.getTArray().length); + } + + /** + * Sets the text of this text run in the + * + * @param value the literal text which shall be displayed in the document + * @param pos - position in the text array (NB: 0 based) + */ + public void setText(String value, int pos) { + if(pos > run.sizeOfTArray()) throw new ArrayIndexOutOfBoundsException("Value too large for the parameter position in XWPFRun.setText(String value,int pos)"); + CTText t = (pos < run.sizeOfTArray() && pos >= 0) ? run.getTArray(pos) : run.addNewT(); t.setStringValue(value); } + /** * Whether the italic property should be applied to all non-complex script * characters in the contents of this run when displayed in a document. @@ -171,7 +193,7 @@ public class XWPFRun { public UnderlinePatterns getUnderline() { CTRPr pr = run.getRPr(); return (pr != null && pr.isSetU()) ? UnderlinePatterns.valueOf(pr - .getU().getVal().intValue()) : null; + .getU().getVal().intValue()) : UnderlinePatterns.NONE; } /** @@ -191,7 +213,7 @@ public class XWPFRun { */ public void setUnderline(UnderlinePatterns value) { CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr(); - CTUnderline underline = pr.isSetU() ? pr.getU() : pr.addNewU(); + CTUnderline underline = (pr.getU() == null) ? pr.addNewU() : pr.getU(); underline.setVal(STUnderline.Enum.forInt(value.getValue())); } @@ -248,7 +270,7 @@ public class XWPFRun { public VerticalAlign getSubscript() { CTRPr pr = run.getRPr(); return (pr != null && pr.isSetVertAlign()) ? VerticalAlign.valueOf(pr - .getVertAlign().getVal().intValue()) : null; + .getVertAlign().getVal().intValue()) : VerticalAlign.BASELINE; } /** @@ -305,9 +327,9 @@ public class XWPFRun { * * @return value representing the font size */ - public BigInteger getFontSize() { + public int getFontSize() { CTRPr pr = run.getRPr(); - return (pr != null && pr.isSetSz()) ? pr.getSz().getVal().divide(new BigInteger("2")) : null; + return (pr != null && pr.isSetSz()) ? pr.getSz().getVal().divide(new BigInteger("2")).intValue() : -1; } /** @@ -322,10 +344,11 @@ public class XWPFRun { * * @param size */ - public void setFontSize(BigInteger size) { + public void setFontSize(int size) { + BigInteger bint=new BigInteger(""+size); CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr(); CTHpsMeasure ctSize = pr.isSetSz() ? pr.getSz() : pr.addNewSz(); - ctSize.setVal(size.multiply(new BigInteger("2"))); + ctSize.setVal(bint.multiply(new BigInteger("2"))); } /** @@ -336,10 +359,10 @@ public class XWPFRun { * * @return a big integer representing the amount of text shall be "moved" */ - public BigInteger getTextPosition() { + public int getTextPosition() { CTRPr pr = run.getRPr(); - return (pr != null && pr.isSetPosition()) ? pr.getPosition().getVal() - : null; + return (pr != null && pr.isSetPosition()) ? pr.getPosition().getVal().intValue() + : -1; } /** @@ -364,10 +387,87 @@ public class XWPFRun { * * @param val */ - public void setTextPosition(BigInteger val) { + public void setTextPosition(int val) { + BigInteger bint=new BigInteger(""+val); CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr(); CTSignedHpsMeasure position = pr.isSetPosition() ? pr.getPosition() : pr.addNewPosition(); - position.setVal(val); + position.setVal(bint); } + /** + * + */ + public void removeBreak() { + // TODO + } + + /** + * Specifies that a break shall be placed at the current location in the run + * content. + * A break is a special character which is used to override the + * normal line breaking that would be performed based on the normal layout + * of the documentÕs contents. + * @see addCarriageReturn() + */ + public void addBreak() { + run.addNewBr(); + } + + /** + * Specifies that a break shall be placed at the current location in the run + * content. + * A break is a special character which is used to override the + * normal line breaking that would be performed based on the normal layout + * of the documentÕs contents. + *

    + * The behavior of this break character (the + * location where text shall be restarted after this break) shall be + * determined by its type values. + *

    + * @see BreakType + */ + public void addBreak(BreakType type){ + CTBr br=run.addNewBr(); + br.setType(STBrType.Enum.forInt(type.getValue())); + } + + + /** + * Specifies that a break shall be placed at the current location in the run + * content. A break is a special character which is used to override the + * normal line breaking that would be performed based on the normal layout + * of the documentÕs contents. + *

    + * The behavior of this break character (the + * location where text shall be restarted after this break) shall be + * determined by its type (in this case is BreakType.TEXT_WRAPPING as default) and clear attribute values. + *

    + * @see BreakClear + */ + public void addBreak(BreakClear clear){ + CTBr br=run.addNewBr(); + br.setType(STBrType.Enum.forInt(BreakType.TEXT_WRAPPING.getValue())); + br.setClear(STBrClear.Enum.forInt(clear.getValue())); + } + + /** + * Specifies that a carriage return shall be placed at the + * current location in the run content. + * A carriage return is used to end the current line of text in + * Wordprocess. + * The behavior of a carriage return in run content shall be + * identical to a break character with null type and clear attributes, which + * shall end the current line and find the next available line on which to + * continue. + * The carriage return character forced the following text to be + * restarted on the next available line in the document. + */ + public void addCarriageReturn() { + run.addNewCr(); + } + + public void removeCarriageReturn() { + //TODO + } + } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java index 352181219..59a849766 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTable.java @@ -16,42 +16,188 @@ ==================================================================== */ package org.apache.poi.xwpf.usermodel; -import org.apache.poi.xwpf.usermodel.XWPFParagraph; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; -import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; +import java.math.BigInteger; + import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth; /** * Sketch of XWPFTable class. Only table's text is being hold. - * + *

    + * Specifies the contents of a table present in the document. A table is a set + * of paragraphs (and other block-level content) arranged in rows and columns. + * * @author Yury Batrakov (batrakov at gmail.com) - * */ -public class XWPFTable -{ - protected StringBuffer text=new StringBuffer(); - +public class XWPFTable { + + protected StringBuffer text = new StringBuffer(); + private CTTbl ctTbl; + + + public XWPFTable(CTTbl table, int row, int col) { + this(table); + for (int i = 0; i < row; i++) { + XWPFTableRow tabRow = (getRow(i) == null) ? createRow() : getRow(i); + for (int k = 0; k < col; k++) { + XWPFTableCell tabCell = (tabRow.getCell(k) == null) ? tabRow + .createCell() : null; + } + } + } + + public XWPFTable(CTTbl table) { - for(CTRow row : table.getTrArray()) { - StringBuffer rowText = new StringBuffer(); - for(CTTc cell : row.getTcArray()) { - for(CTP ctp : cell.getPArray()) { + this.ctTbl = table; + + // is an empty table: I add one row and one column as default + if (table.sizeOfTrArray() == 0) + createEmptyTable(table); + + for (CTRow row : table.getTrArray()) { + StringBuffer rowText = new StringBuffer(); + for (CTTc cell : row.getTcArray()) { + for (CTP ctp : cell.getPArray()) { XWPFParagraph p = new XWPFParagraph(ctp, null); - if(rowText.length() > 0) { - rowText.append('\t'); + if (rowText.length() > 0) { + rowText.append('\t'); } rowText.append(p.getText()); } } - if(rowText.length() > 0) { - this.text.append(rowText); - this.text.append('\n'); + if (rowText.length() > 0) { + this.text.append(rowText); + this.text.append('\n'); } } } - + + private void createEmptyTable(CTTbl table) { + // MINIMUM ELEMENTS FOR A TABLE + table.addNewTr().addNewTc().addNewP(); + + CTTblPr tblpro = table.addNewTblPr(); + tblpro.addNewTblW().setW(new BigInteger("0")); + tblpro.getTblW().setType(STTblWidth.AUTO); + + // layout + // tblpro.addNewTblLayout().setType(STTblLayoutType.AUTOFIT); + + // borders + CTTblBorders borders = tblpro.addNewTblBorders(); + borders.addNewBottom().setVal(STBorder.SINGLE); + borders.addNewInsideH().setVal(STBorder.SINGLE); + borders.addNewInsideV().setVal(STBorder.SINGLE); + borders.addNewLeft().setVal(STBorder.SINGLE); + borders.addNewRight().setVal(STBorder.SINGLE); + borders.addNewTop().setVal(STBorder.SINGLE); + + /* + * CTTblGrid tblgrid=table.addNewTblGrid(); + * tblgrid.addNewGridCol().setW(new BigInteger("2000")); + */ + + } + + /** + * @return ctTbl object + */ + public CTTbl getCTTbl() { + return ctTbl; + } + + /** + * @return text + */ public String getText() { return text.toString(); } -} + + + public void addNewRowBetween(int start, int end) { + // TODO + } + + + /** + * add a new column for each row in this table + */ + public void addNewCol() { + if (ctTbl.sizeOfTrArray() == 0) createRow(); + for (int i = 0; i < ctTbl.sizeOfTrArray(); i++) { + XWPFTableRow tabRow = new XWPFTableRow(ctTbl.getTrArray(i)); + tabRow.createCell(); + } + } + + /** + * create a new XWPFTableRow object with as many cells as the number of columns defined in that moment + * + * @return tableRow + */ + public XWPFTableRow createRow() { + int sizeCol = ctTbl.sizeOfTrArray() > 0 ? ctTbl.getTrArray(0) + .sizeOfTcArray() : 0; + XWPFTableRow tabRow = new XWPFTableRow(ctTbl.addNewTr()); + addColumn(tabRow, sizeCol); + return tabRow; + } + + /** + * @param pos - index of the row + * @return the row at the position specified or null if no rows is defined or if the position is greather than the max size of rows array + */ + public XWPFTableRow getRow(int pos) { + if (pos >= 0 && pos < ctTbl.sizeOfTrArray()) + return new XWPFTableRow(ctTbl.getTrArray(pos)); + else + return null; + } + + + /** + * @param width + */ + public void setWidth(int width) { + CTTblPr tblPr = getTrPr(); + CTTblWidth tblWidth = tblPr.isSetTblW() ? tblPr.getTblW() : tblPr + .addNewTblW(); + tblWidth.setW(new BigInteger("" + width)); + } + + /** + * @return width value + */ + public int getWidth() { + CTTblPr tblPr = getTrPr(); + return tblPr.isSetTblW() ? tblPr.getTblW().getW().intValue() : -1; + } + + /** + * @return number of rows in table + */ + public int getNumberOfRows() { + return ctTbl.sizeOfTrArray(); + } + + private CTTblPr getTrPr() { + return (ctTbl.getTblPr() != null) ? ctTbl.getTblPr() : ctTbl + .addNewTblPr(); + } + + private void addColumn(XWPFTableRow tabRow, int sizeCol) { + if (sizeCol > 0) { + for (int i = 0; i < sizeCol; i++) { + tabRow.createCell(); + } + } + } + +}// end class diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java new file mode 100755 index 000000000..4a93c9838 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableCell.java @@ -0,0 +1,65 @@ +/* ==================================================================== + 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 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; + + +public class XWPFTableCell { + + private CTTc ctTc; + + /** + * If a table cell does not include at least one block-level element, then this document shall be considered corrupt + */ + public XWPFTableCell(CTTc cell) { + this.ctTc = cell; + // NB: If a table cell does not include at least one block-level element, then this document shall be considered corrupt. + cell.addNewP(); + } + + + public CTTc getCTTc() { + return ctTc; + } + + public void setParagraph(XWPFParagraph p) { + if (ctTc.sizeOfPArray() == 0) { + ctTc.addNewP(); + } + ctTc.setPArray(0, p.getCTP()); + } + + public XWPFParagraph getParagraph() { + return ctTc.sizeOfPArray() == 0 ? null : new XWPFParagraph(ctTc.getPArray(0)); + } + + + public void setText(String text) { + CTP ctP = (ctTc.sizeOfPArray() == 0) ? ctTc.addNewP() : ctTc.getPArray(0); + XWPFParagraph par = new XWPFParagraph(ctP); + par.createRun().setText(text); + } + + public String getText() { + //TODO + return null; + } + + +}// end class diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java new file mode 100755 index 000000000..d34541cfd --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFTableRow.java @@ -0,0 +1,91 @@ +/* ==================================================================== + 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.math.BigInteger; + +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHeight; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTrPr; + + +/** + * @author gisellabronzetti + */ +public class XWPFTableRow { + + private CTRow ctRow; + + public XWPFTableRow(CTRow row) { + this.ctRow = row; + } + + public CTRow getCtRow() { + return ctRow; + } + + + public XWPFTableCell createCell() { + return new XWPFTableCell(ctRow.addNewTc()); + } + + public XWPFTableCell getCell(int pos) { + if (pos >= 0 && pos < ctRow.sizeOfTcArray()) + return new XWPFTableCell(ctRow.getTcArray(pos)); + else + return null; + } + + /** + * This element specifies the height of the current table row within the + * current table. This height shall be used to determine the resulting + * height of the table row, which may be absolute or relative (depending on + * its attribute values). If omitted, then the table row shall automatically + * resize its height to the height required by its contents (the equivalent + * of an hRule value of auto). + * + * @param height + */ + public void setHeight(int height) { + CTTrPr properties = getTrPr(); + CTHeight h = properties.getTrHeightArray(0) == null ? properties.addNewTrHeight() : properties.getTrHeightArray(0); + h.setVal(new BigInteger("" + height)); + //properties.setTrHeightArray(0,height); + } + + /** + * This element specifies the height of the current table row within the + * current table. This height shall be used to determine the resulting + * height of the table row, which may be absolute or relative (depending on + * its attribute values). If omitted, then the table row shall automatically + * resize its height to the height required by its contents (the equivalent + * of an hRule value of auto). + * + * @return height + */ + public int getHeight() { + CTTrPr properties = getTrPr(); + return properties.getTrHeightArray(0) == null ? 0 : properties.getTrHeightArray(0).getVal().intValue(); + } + + + private CTTrPr getTrPr() { + return (ctRow.isSetTrPr()) ? ctRow.getTrPr() : ctRow.addNewTrPr(); + } + + +}// end class diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index c43f3ebd1..e7e90c447 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -21,7 +21,9 @@ import java.math.BigInteger; import junit.framework.TestCase; +import org.openxmlformats.schemas.officeDocument.x2006.math.STSpacingRule; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; @@ -31,9 +33,9 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSpacing; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTextAlignment; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; -import org.apache.poi.POIXMLDocument; /** * Tests for XWPF Paragraphs @@ -44,7 +46,7 @@ public class TestXWPFParagraph extends TestCase { */ private XWPFDocument xml; private File file; - +/* protected void setUp() throws Exception { super.setUp(); @@ -55,10 +57,11 @@ public class TestXWPFParagraph extends TestCase { 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.getHeaderFooterPolicy().getDefaultHeader(); assertNotNull(hdr); @@ -71,10 +74,11 @@ public class TestXWPFParagraph extends TestCase { 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); @@ -96,20 +100,24 @@ public class TestXWPFParagraph extends TestCase { assertFalse(ps[4].isEmpty()); assertEquals("More on page one", ps[4].getText()); } - +*/ public void testSetGetBorderTop() { //new clean instance of paragraph XWPFDocument doc = new XWPFDocument(); XWPFParagraph p = doc.createParagraph(); + assertEquals(STBorder.NONE.intValue(), p.getBorderTop().getValue()); + CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); + //bordi CTPBdr bdr = ppr.addNewPBdr(); CTBorder borderTop = bdr.addNewTop(); - borderTop.setVal(STBorder.APPLES); + borderTop.setVal(STBorder.DOUBLE); bdr.setTop(borderTop); - assertEquals(Borders.APPLES, p.getBorderTop()); + + assertEquals(Borders.DOUBLE, p.getBorderTop()); p.setBorderTop(Borders.SINGLE); assertEquals(STBorder.SINGLE, borderTop.getVal()); } @@ -119,8 +127,10 @@ public class TestXWPFParagraph extends TestCase { XWPFDocument doc = new XWPFDocument(); XWPFParagraph p = doc.createParagraph(); + assertEquals(STJc.LEFT.intValue(), p.getAlignment().getValue()); + CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); CTJc align = ppr.addNewJc(); align.setVal(STJc.CENTER); @@ -130,29 +140,67 @@ public class TestXWPFParagraph extends TestCase { assertEquals(STJc.BOTH, ppr.getJc().getVal()); } + public void testSetGetSpacing() { XWPFDocument doc = new XWPFDocument(); XWPFParagraph p = doc.createParagraph(); CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); - //TEST ALL OTHERS POSSIBLE COMBINATIONS + assertEquals(-1, p.getSpacingAfter()); + CTSpacing spacing = ppr.addNewSpacing(); spacing.setAfter(new BigInteger("10")); - assertEquals(10, p.getSpacingAfter().longValue()); + assertEquals(10, p.getSpacingAfter()); - p.setSpacingAfter(new BigInteger("100")); - assertEquals(100, spacing.getAfter().longValue()); + p.setSpacingAfter(100); + assertEquals(100, spacing.getAfter().intValue()); } + public void testSetGetSpacingLineRule() { + XWPFDocument doc = new XWPFDocument(); + XWPFParagraph p = doc.createParagraph(); + + CTP ctp = p.getCTP(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); + + assertEquals(STLineSpacingRule.INT_AUTO, p.getSpacingLineRule().getValue()); + + CTSpacing spacing = ppr.addNewSpacing(); + spacing.setLineRule(STLineSpacingRule.AT_LEAST); + assertEquals(LineSpacingRule.AT_LEAST, p.getSpacingLineRule()); + + p.setSpacingAfter(100); + assertEquals(100, spacing.getAfter().intValue()); + } + + public void testSetGetIndentation() { + XWPFDocument doc = new XWPFDocument(); + XWPFParagraph p = doc.createParagraph(); + + assertEquals(-1, p.getIndentationLeft()); + + CTP ctp = p.getCTP(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); + + assertEquals(-1, p.getIndentationLeft()); + + CTInd ind = ppr.addNewInd(); + ind.setLeft(new BigInteger("10")); + assertEquals(10, p.getIndentationLeft()); + + p.setIndentationLeft(100); + assertEquals(100, ind.getLeft().intValue()); + } + public void testSetGetVerticalAlignment() { //new clean instance of paragraph XWPFDocument doc = new XWPFDocument(); XWPFParagraph p = doc.createParagraph(); CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); CTTextAlignment txtAlign = ppr.addNewTextAlignment(); txtAlign.setVal(STTextAlignment.CENTER); @@ -167,7 +215,7 @@ public class TestXWPFParagraph extends TestCase { XWPFParagraph p = doc.createParagraph(); CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); CTOnOff wordWrap = ppr.addNewWordWrap(); wordWrap.setVal(STOnOff.FALSE); @@ -183,7 +231,7 @@ public class TestXWPFParagraph extends TestCase { XWPFParagraph p = doc.createParagraph(); CTP ctp = p.getCTP(); - CTPPr ppr = ctp.addNewPPr(); + CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr(); CTOnOff pageBreak = ppr.addNewPageBreakBefore(); pageBreak.setVal(STOnOff.FALSE); diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java index 8f8c60412..ea758c88a 100755 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java @@ -20,8 +20,10 @@ import java.math.BigInteger; import junit.framework.TestCase; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrClear; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; @@ -39,9 +41,26 @@ public class TestXWPFRun extends TestCase { p = doc.createParagraph(); this.ctRun = CTR.Factory.newInstance(); - + } + public void testSetGetText() { + ctRun.addNewT().setStringValue("TEST STRING"); + ctRun.addNewT().setStringValue("TEST2 STRING"); + ctRun.addNewT().setStringValue("TEST3 STRING"); + + assertEquals(3,ctRun.sizeOfTArray()); + XWPFRun run = new XWPFRun(ctRun, p); + + assertEquals("TEST2 STRING",run.getText(1)); + + run.setText("NEW STRING",0); + assertEquals("NEW STRING",run.getText(0)); + + //run.setText("xxx",14); + //fail("Position wrong"); + } + public void testSetGetBold() { CTRPr rpr = ctRun.addNewRPr(); rpr.addNewB().setVal(STOnOff.TRUE); @@ -118,9 +137,9 @@ public class TestXWPFRun extends TestCase { rpr.addNewSz().setVal(new BigInteger("14")); XWPFRun run = new XWPFRun(ctRun, p); - assertEquals(7, run.getFontSize().longValue()); + assertEquals(7, run.getFontSize()); - run.setFontSize(new BigInteger("24")); + run.setFontSize(24); assertEquals(48, rpr.getSz().getVal().longValue()); } @@ -130,11 +149,48 @@ public class TestXWPFRun extends TestCase { rpr.addNewPosition().setVal(new BigInteger("4000")); XWPFRun run = new XWPFRun(ctRun, p); - assertEquals(4000, run.getTextPosition().longValue()); + assertEquals(4000, run.getTextPosition()); - run.setTextPosition(new BigInteger("2400")); + run.setTextPosition(2400); assertEquals(2400, rpr.getPosition().getVal().longValue()); } + public void testAddCarriageReturn() { + + ctRun.addNewT().setStringValue("TEST STRING"); + ctRun.addNewCr(); + ctRun.addNewT().setStringValue("TEST2 STRING"); + ctRun.addNewCr(); + ctRun.addNewT().setStringValue("TEST3 STRING"); + assertEquals(2, ctRun.sizeOfCrArray()); + + XWPFRun run = new XWPFRun(CTR.Factory.newInstance(), p); + run.setText("T1"); + run.addCarriageReturn(); + run.addCarriageReturn(); + run.setText("T2"); + run.addCarriageReturn(); + assertEquals(3, run.getCTR().getCrArray().length); + + } + + public void testAddPageBreak() { + ctRun.addNewT().setStringValue("TEST STRING"); + ctRun.addNewBr(); + ctRun.addNewT().setStringValue("TEST2 STRING"); + CTBr breac=ctRun.addNewBr(); + breac.setClear(STBrClear.LEFT); + ctRun.addNewT().setStringValue("TEST3 STRING"); + assertEquals(2, ctRun.sizeOfBrArray()); + + XWPFRun run = new XWPFRun(CTR.Factory.newInstance(), p); + run.setText("TEXT1"); + run.addBreak(); + run.setText("TEXT2"); + run.addBreak(); + assertEquals(2, run.getCTR().sizeOfBrArray()); + } + + } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java new file mode 100755 index 000000000..0819d4a38 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFTable.java @@ -0,0 +1,117 @@ +/* ==================================================================== + 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.math.BigInteger; + +import junit.framework.TestCase; + +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; + +/** + * Tests for XWPF Run + */ +public class TestXWPFTable extends TestCase { + + protected void setUp() { + /* + XWPFDocument doc = new XWPFDocument(); + p = doc.createParagraph(); + + this.ctRun = CTR.Factory.newInstance(); + */ + } + + public void testConstructor() { + CTTbl ctTable=CTTbl.Factory.newInstance(); + XWPFTable xtab=new XWPFTable(ctTable); + assertNotNull(xtab); + assertEquals(1,ctTable.sizeOfTrArray()); + assertEquals(1,ctTable.getTrArray(0).sizeOfTcArray()); + assertNotNull(ctTable.getTrArray(0).getTcArray(0).getPArray(0)); + + ctTable=CTTbl.Factory.newInstance(); + xtab=new XWPFTable(ctTable, 3,2); + assertNotNull(xtab); + assertEquals(3,ctTable.sizeOfTrArray()); + assertEquals(2,ctTable.getTrArray(0).sizeOfTcArray()); + assertNotNull(ctTable.getTrArray(0).getTcArray(0).getPArray(0)); + } + + + public void testGetText(){ + CTTbl table = CTTbl.Factory.newInstance(); + CTRow row=table.addNewTr(); + CTTc cell=row.addNewTc(); + CTP paragraph=cell.addNewP(); + CTR run=paragraph.addNewR(); + CTText text=run.addNewT(); + text.setStringValue("finally I can write!"); + + XWPFTable xtab=new XWPFTable(table); + assertEquals("finally I can write!\n",xtab.getText()); + } + + + public void testCreateRow(){ + CTTbl table = CTTbl.Factory.newInstance(); + CTRow r1=table.addNewTr(); + r1.addNewTc().addNewP(); + r1.addNewTc().addNewP(); + CTRow r2=table.addNewTr(); + r2.addNewTc().addNewP(); + r2.addNewTc().addNewP(); + CTRow r3=table.addNewTr(); + r3.addNewTc().addNewP(); + r3.addNewTc().addNewP(); + + XWPFTable xtab=new XWPFTable(table); + assertEquals(3,xtab.getNumberOfRows()); + assertNotNull(xtab.getRow(2)); + + //add a new row + xtab.createRow(); + + //check number of cols + assertEquals(2,table.getTrArray(0).sizeOfTcArray()); + + //check creation of first row + xtab=new XWPFTable(CTTbl.Factory.newInstance()); + assertEquals(1,xtab.getCTTbl().getTrArray(0).sizeOfTcArray()); + } + + + public void testSetGetWidth(){ + CTTbl table = CTTbl.Factory.newInstance(); + table.addNewTblPr().addNewTblW().setW(new BigInteger("1000")); + + XWPFTable xtab=new XWPFTable(table); + + assertEquals(1000,xtab.getWidth()); + + xtab.setWidth(100); + assertEquals(100,table.getTblPr().getTblW().getW().intValue()); + } + + + +} \ No newline at end of file