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
This commit is contained in:
Yegor Kozlov 2008-12-17 20:05:16 +00:00
parent 9a665498f8
commit fabf35b20d
16 changed files with 1317 additions and 296 deletions

View File

@ -37,6 +37,9 @@
<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.5-beta5" date="2008-??-??"> <release version="3.5-beta5" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="add">46299 - support for carriage return and line break in XWPFRun</action>
<action dev="POI-DEVELOPERS" type="add">46300 - support for line spacing in XWPFParagraph</action>
<action dev="POI-DEVELOPERS" type="add">46308 - initial support for creation of XWPFTable</action>
<action dev="POI-DEVELOPERS" type="add">Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow()</action> <action dev="POI-DEVELOPERS" type="add">Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow()</action>
<action dev="POI-DEVELOPERS" type="fix">46385 - (also patch 46362) fix serialization of StyleRecord with unicode name</action> <action dev="POI-DEVELOPERS" type="fix">46385 - (also patch 46362) fix serialization of StyleRecord with unicode name</action>
<action dev="POI-DEVELOPERS" type="fix">46368 - Fix HSSFRichTextRun and strings longer than 32768 characters</action> <action dev="POI-DEVELOPERS" type="fix">46368 - Fix HSSFRichTextRun and strings longer than 32768 characters</action>

View File

@ -34,6 +34,9 @@
<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.5-beta5" date="2008-??-??"> <release version="3.5-beta5" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="add">46299 - support for carriage return and line break in XWPFRun</action>
<action dev="POI-DEVELOPERS" type="add">46300 - support for line spacing in XWPFParagraph</action>
<action dev="POI-DEVELOPERS" type="add">46308 - initial support for creation of XWPFTable</action>
<action dev="POI-DEVELOPERS" type="add">Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow()</action> <action dev="POI-DEVELOPERS" type="add">Added getters to parent objects: HSSFSheet.getWorkbook(), HSSFRow.getSheet() and HSSFCell.getRow()</action>
<action dev="POI-DEVELOPERS" type="fix">46385 - (also patch 46362) fix serialization of StyleRecord with unicode name</action> <action dev="POI-DEVELOPERS" type="fix">46385 - (also patch 46362) fix serialization of StyleRecord with unicode name</action>
<action dev="POI-DEVELOPERS" type="fix">46368 - Fix HSSFRichTextRun and strings longer than 32768 characters</action> <action dev="POI-DEVELOPERS" type="fix">46368 - Fix HSSFRichTextRun and strings longer than 32768 characters</action>

View File

@ -17,7 +17,6 @@
package org.apache.poi.xwpf.usermodel; package org.apache.poi.xwpf.usermodel;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.math.BigInteger;
/** /**
* A simple WOrdprocessingML document created by POI XWPF API * A simple WOrdprocessingML document created by POI XWPF API
@ -46,7 +45,7 @@ public class SimpleDocument {
r1.setBold(true); r1.setBold(true);
r1.setFontFamily("Courier"); r1.setFontFamily("Courier");
r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH); r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
r1.setTextPosition(new BigInteger("100")); r1.setTextPosition(100);
XWPFParagraph p2 = doc.createParagraph(); XWPFParagraph p2 = doc.createParagraph();
p2.setAlignment(ParagraphAlignment.RIGHT); p2.setAlignment(ParagraphAlignment.RIGHT);
@ -61,50 +60,57 @@ public class SimpleDocument {
XWPFRun r2 = p2.createRun(); XWPFRun r2 = p2.createRun();
r2.setText("jumped over the lazy dog"); r2.setText("jumped over the lazy dog");
r2.setStrike(true); r2.setStrike(true);
r2.setFontSize(new BigInteger("20")); r2.setFontSize(20);
XWPFRun r3 = p2.createRun(); XWPFRun r3 = p2.createRun();
r3.setText("and went away"); r3.setText("and went away");
r3.setStrike(true); r3.setStrike(true);
r3.setFontSize(new BigInteger("20")); r3.setFontSize(20);
r3.setSubscript(VerticalAlign.SUPERSCRIPT); r3.setSubscript(VerticalAlign.SUPERSCRIPT);
XWPFParagraph p3 = doc.createParagraph(); XWPFParagraph p3 = doc.createParagraph();
p3.setWordWrap(true); p3.setWordWrap(true);
p3.setPageBreak(true); p3.setPageBreak(true);
p3.setAlignment(ParagraphAlignment.DISTRIBUTE);
p3.setIndentationFirstLine(new BigInteger("600")); //p3.setAlignment(ParagraphAlignment.DISTRIBUTE);
p3.setSpacingAfter(new BigInteger("250")); p3.setAlignment(ParagraphAlignment.BOTH);
p3.setSpacingBefore(new BigInteger("250")); p3.setSpacingLineRule(LineSpacingRule.EXACT);
p3.setIndentationFirstLine(600);
XWPFRun r4 = p3.createRun(); XWPFRun r4 = p3.createRun();
r4.setTextPosition(new BigInteger("20")); r4.setTextPosition(20);
r4.setText("To be, or not to be: that is the question: " r4.setText("To be, or not to be: that is the question: "
+ "Whether 'tis nobler in the mind to suffer " + "Whether 'tis nobler in the mind to suffer "
+ "The slings and arrows of outrageous fortune, " + "The slings and arrows of outrageous fortune, "
+ "Or to take arms against a sea of troubles, " + "Or to take arms against a sea of troubles, "
+ "And by opposing end them? To die: to sleep; " + "And by opposing end them? To die: to sleep; ");
+ "No more; and by a sleep to say we end " r4.addBreak(BreakType.PAGE);
r4.setText("No more; and by a sleep to say we end "
+ "The heart-ache and the thousand natural shocks " + "The heart-ache and the thousand natural shocks "
+ "That flesh is heir to, 'tis a consummation " + "That flesh is heir to, 'tis a consummation "
+ "Devoutly to be wish'd. To die, to sleep; " + "Devoutly to be wish'd. To die, to sleep; "
+ "To sleep: perchance to dream: ay, there's the rub; " + "To sleep: perchance to dream: ay, there's the rub; "
+ "......."); + ".......");
r4.setItalic(true); 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(); XWPFRun r5 = p3.createRun();
r5.setTextPosition(new BigInteger("-10")); r5.setTextPosition(-10);
r5.setText("For in that sleep of death what dreams may come" r5.setText("For in that sleep of death what dreams may come");
+ "When we have shuffled off this mortal coil," r5.addCarriageReturn();
r5.setText("When we have shuffled off this mortal coil,"
+ "Must give us pause: there's the respect" + "Must give us pause: there's the respect"
+ "That makes calamity of so long life;" + "That makes calamity of so long life;");
+ "For who would bear the whips and scorns of time," r5.addBreak();
+ "The oppressor's wrong, the proud man's contumely," r5.setText("For who would bear the whips and scorns of time,"
+ "The pangs of despised love, the law's delay," + "The oppressor's wrong, the proud man's contumely,");
+ "The insolence of office and the spurns" + ".......");
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"); FileOutputStream out = new FileOutputStream("simple.docx");
doc.write(out); doc.write(out);

View File

@ -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();
}
}

View File

@ -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:
* <ul>
* <li> If this line is broken into multiple regions (a floating object in
* the center of the page has text wrapping on both sides:
* <ul>
* <li> If this is the leftmost region of text flow on this line, advance
* the text to the next position on the line </li>
* <li>Otherwise, treat this as a text wrapping break of type all. </li>
* </ul>
* </li>
* <li> If this line is not broken into multiple regions, then treat this
* break as a text wrapping break of type none. </li>
* </ul>
* <li> If the parent paragraph is right to left, then these behaviors are
* also reversed. </li>
*/
LEFT(2),
/**
* Specifies that the text wrapping break shall behave as follows:
* <ul>
* <li> If this line is broken into multiple regions (a floating object in
* the center of the page has text wrapping on both sides:
* <ul>
* <li> If this is the rightmost region of text flow on this line, advance
* the text to the next position on the next line </li>
* <li> Otherwise, treat this as a text wrapping break of type all. </li>
* </ul>
* <li> If this line is not broken into multiple regions, then treat this
* break as a text wrapping break of type none. </li>
* <li> If the parent paragraph is right to left, then these beha viors are
* also reversed. </li>
* </ul>
*/
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<Integer, BreakClear> imap = new HashMap<Integer, BreakClear>();
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;
}
}

View File

@ -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.
* <p>
* 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.
* </p>
*/
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<Integer, BreakType> imap = new HashMap<Integer, BreakType>();
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;
}
}

View File

@ -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<Integer, LineSpacingRule> imap = new HashMap<Integer, LineSpacingRule>();
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;
}
}

View File

@ -318,5 +318,23 @@ public class XWPFDocument extends POIXMLDocument {
return new XWPFParagraph(ctDocument.getBody().addNewP(), this); 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);
}
} }

View File

@ -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.CTTextAlignment;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; 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.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@ -58,80 +59,86 @@ public class XWPFParagraph {
private StringBuffer text = new StringBuffer(); private StringBuffer text = new StringBuffer();
private StringBuffer pictureText = new StringBuffer(); private StringBuffer pictureText = new StringBuffer();
protected XWPFParagraph(CTP prgrph) {
this(prgrph, null);
}
protected XWPFParagraph(CTP prgrph, XWPFDocument docRef) { protected XWPFParagraph(CTP prgrph, XWPFDocument docRef) {
this.paragraph = prgrph; this.paragraph = prgrph;
this.document = docRef; this.document = docRef;
if (!isEmpty()) { if (!isEmpty()) {
// All the runs to loop over // All the runs to loop over
// TODO - replace this with some sort of XPath expression // TODO - replace this with some sort of XPath expression
// to directly find all the CTRs, in the right order // to directly find all the CTRs, in the right order
ArrayList<CTR> rs = new ArrayList<CTR>(); ArrayList<CTR> rs = new ArrayList<CTR>();
CTR[] tmp; CTR[] tmp;
// Get the main text runs // Get the main text runs
tmp = paragraph.getRArray(); tmp = paragraph.getRArray();
for (int i = 0; i < tmp.length; i++) { for (int i = 0; i < tmp.length; i++) {
rs.add(tmp[i]); rs.add(tmp[i]);
} }
// Not sure quite what these are, but they hold // Not sure quite what these are, but they hold
// more text runs // more text runs
CTSdtRun[] sdts = paragraph.getSdtArray(); CTSdtRun[] sdts = paragraph.getSdtArray();
for (int i = 0; i < sdts.length; i++) { for (int i = 0; i < sdts.length; i++) {
CTSdtContentRun run = sdts[i].getSdtContent(); CTSdtContentRun run = sdts[i].getSdtContent();
tmp = run.getRArray(); tmp = run.getRArray();
for (int j = 0; j < tmp.length; j++) { for (int j = 0; j < tmp.length; j++) {
rs.add(tmp[j]); rs.add(tmp[j]);
} }
} }
// Get text of the paragraph // Get text of the paragraph
for (int j = 0; j < rs.size(); j++) { for (int j = 0; j < rs.size(); j++) {
// Grab the text and tabs of the paragraph // Grab the text and tabs of the paragraph
// Do so in a way that preserves the ordering // Do so in a way that preserves the ordering
XmlCursor c = rs.get(j).newCursor(); XmlCursor c = rs.get(j).newCursor();
c.selectPath("./*"); c.selectPath("./*");
while (c.toNextSelection()) { while (c.toNextSelection()) {
XmlObject o = c.getObject(); XmlObject o = c.getObject();
if (o instanceof CTText) { if (o instanceof CTText) {
text.append(((CTText) o).getStringValue()); text.append(((CTText) o).getStringValue());
} }
if (o instanceof CTPTab) { if (o instanceof CTPTab) {
text.append("\t"); text.append("\t");
} }
} }
// Loop over pictures inside our // Loop over pictures inside our
// paragraph, looking for text in them // paragraph, looking for text in them
CTPicture[] picts = rs.get(j).getPictArray(); CTPicture[] picts = rs.get(j).getPictArray();
for (int k = 0; k < picts.length; k++) { for (int k = 0; k < picts.length; k++) {
XmlObject[] t = picts[k] XmlObject[] t = picts[k]
.selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t"); .selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t");
for (int m = 0; m < t.length; m++) { for (int m = 0; m < t.length; m++) {
NodeList kids = t[m].getDomNode().getChildNodes(); NodeList kids = t[m].getDomNode().getChildNodes();
for (int n = 0; n < kids.getLength(); n++) { for (int n = 0; n < kids.getLength(); n++) {
if (kids.item(n) instanceof Text) { if (kids.item(n) instanceof Text) {
pictureText.append("\n"); pictureText.append("\n");
pictureText.append(kids.item(n).getNodeValue()); pictureText.append(kids.item(n).getNodeValue());
} }
} }
} }
} }
} }
} }
} }
public CTP getCTP() { public CTP getCTP() {
return paragraph; return paragraph;
} }
public boolean isEmpty() { public boolean isEmpty() {
return !paragraph.getDomNode().hasChildNodes(); return !paragraph.getDomNode().hasChildNodes();
} }
public XWPFDocument getDocument() { public XWPFDocument getDocument() {
return document; return document;
} }
/** /**
@ -139,7 +146,7 @@ public class XWPFParagraph {
* in it. * in it.
*/ */
public String getText() { public String getText() {
return getParagraphText() + getPictureText(); return getParagraphText() + getPictureText();
} }
/** /**
@ -147,14 +154,14 @@ public class XWPFParagraph {
* paragraph * paragraph
*/ */
public String getParagraphText() { public String getParagraphText() {
return text.toString(); return text.toString();
} }
/** /**
* Returns any text from any suitable pictures in the paragraph * Returns any text from any suitable pictures in the paragraph
*/ */
public String getPictureText() { public String getPictureText() {
return pictureText.toString(); return pictureText.toString();
} }
/** /**
@ -163,7 +170,7 @@ public class XWPFParagraph {
* @return a new text run * @return a new text run
*/ */
public XWPFRun createRun() { 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. * @return the paragraph alignment of this paragraph.
*/ */
public ParagraphAlignment getAlignment() { public ParagraphAlignment getAlignment() {
CTPPr pr = paragraph.getPPr(); CTPPr pr = getCTPPr();
return pr == null || !pr.isSetJc() ? ParagraphAlignment.LEFT return pr == null || !pr.isSetJc() ? ParagraphAlignment.LEFT
: ParagraphAlignment.valueOf(pr.getJc().getVal().intValue()); : ParagraphAlignment.valueOf(pr.getJc().getVal().intValue());
} }
@ -201,8 +208,7 @@ public class XWPFParagraph {
* @param align the paragraph alignment to apply to this paragraph. * @param align the paragraph alignment to apply to this paragraph.
*/ */
public void setAlignment(ParagraphAlignment align) { public void setAlignment(ParagraphAlignment align) {
CTPPr pr = paragraph.isSetPPr() ? paragraph.getPPr() : paragraph CTPPr pr = getCTPPr();
.addNewPPr();
CTJc jc = pr.isSetJc() ? pr.getJc() : pr.addNewJc(); CTJc jc = pr.isSetJc() ? pr.getJc() : pr.addNewJc();
STJc.Enum en = STJc.Enum.forInt(align.getValue()); STJc.Enum en = STJc.Enum.forInt(align.getValue());
jc.setVal(en); jc.setVal(en);
@ -227,8 +233,8 @@ public class XWPFParagraph {
* @return the vertical alignment of this paragraph. * @return the vertical alignment of this paragraph.
*/ */
public TextAlignment getVerticalAlignment() { public TextAlignment getVerticalAlignment() {
CTPPr pr = paragraph.getPPr(); CTPPr pr = getCTPPr();
return pr == null || !pr.isSetTextAlignment() ? TextAlignment.AUTO return (pr == null || !pr.isSetTextAlignment()) ? TextAlignment.AUTO
: TextAlignment.valueOf(pr.getTextAlignment().getVal() : TextAlignment.valueOf(pr.getTextAlignment().getVal()
.intValue()); .intValue());
} }
@ -253,8 +259,7 @@ public class XWPFParagraph {
* paragraph. * paragraph.
*/ */
public void setVerticalAlignment(TextAlignment valign) { public void setVerticalAlignment(TextAlignment valign) {
CTPPr pr = paragraph.isSetPPr() ? paragraph.getPPr() : paragraph CTPPr pr = getCTPPr();
.addNewPPr();
CTTextAlignment textAlignment = pr.isSetTextAlignment() ? pr CTTextAlignment textAlignment = pr.isSetTextAlignment() ? pr
.getTextAlignment() : pr.addNewTextAlignment(); .getTextAlignment() : pr.addNewTextAlignment();
STTextAlignment.Enum en = STTextAlignment.Enum STTextAlignment.Enum en = STTextAlignment.Enum
@ -291,7 +296,8 @@ public class XWPFParagraph {
*/ */
public void setBorderTop(Borders border) { public void setBorderTop(Borders border) {
CTPBdr ct = getCTPBrd(true); 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()) if (border.getValue() == Borders.NONE.getValue())
ct.unsetTop(); ct.unsetTop();
else else
@ -308,13 +314,12 @@ public class XWPFParagraph {
*/ */
public Borders getBorderTop() { public Borders getBorderTop() {
CTPBdr border = getCTPBrd(false); CTPBdr border = getCTPBrd(false);
CTBorder ct; CTBorder ct = null;
if (border != null) { if (border != null) {
ct = border.getTop(); 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 * @see Borders a list of all types of borders
*/ */
public void setBorderBottom(Borders border) { public void setBorderBottom(Borders border) {
CTPBdr ct = getCTPBrd(true); CTPBdr ct = getCTPBrd(true);
CTBorder pr = ct.isSetBottom() ? ct.getBottom() : ct.addNewBottom(); CTBorder pr = ct.isSetBottom() ? ct.getBottom() : ct.addNewBottom();
if (border.getValue() == Borders.NONE.getValue()) if (border.getValue() == Borders.NONE.getValue())
ct.unsetBottom(); ct.unsetBottom();
else else
pr.setVal(STBorder.Enum.forInt(border.getValue())); pr.setVal(STBorder.Enum.forInt(border.getValue()));
} }
/** /**
@ -362,13 +367,13 @@ public class XWPFParagraph {
* @see Borders a list of all types of borders * @see Borders a list of all types of borders
*/ */
public Borders getBorderBottom() { public Borders getBorderBottom() {
CTPBdr border = getCTPBrd(false); CTPBdr border = getCTPBrd(false);
CTBorder ct = null; CTBorder ct = null;
if (border != null) { if (border != null) {
ct = border.getBottom(); ct = border.getBottom();
} }
STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE;
return Borders.valueOf(ptrn.intValue()); return Borders.valueOf(ptrn.intValue());
} }
/** /**
@ -394,12 +399,12 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public void setBorderLeft(Borders border) { public void setBorderLeft(Borders border) {
CTPBdr ct = getCTPBrd(true); CTPBdr ct = getCTPBrd(true);
CTBorder pr = ct.isSetLeft() ? ct.getLeft() : ct.addNewLeft(); CTBorder pr = ct.isSetLeft() ? ct.getLeft() : ct.addNewLeft();
if (border.getValue() == Borders.NONE.getValue()) if (border.getValue() == Borders.NONE.getValue())
ct.unsetLeft(); ct.unsetLeft();
else else
pr.setVal(STBorder.Enum.forInt(border.getValue())); pr.setVal(STBorder.Enum.forInt(border.getValue()));
} }
/** /**
@ -411,13 +416,13 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public Borders getBorderLeft() { public Borders getBorderLeft() {
CTPBdr border = getCTPBrd(false); CTPBdr border = getCTPBrd(false);
CTBorder ct = null; CTBorder ct = null;
if (border != null) { if (border != null) {
ct = border.getLeft(); ct = border.getLeft();
} }
STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE;
return Borders.valueOf(ptrn.intValue()); return Borders.valueOf(ptrn.intValue());
} }
/** /**
@ -443,12 +448,12 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public void setBorderRight(Borders border) { public void setBorderRight(Borders border) {
CTPBdr ct = getCTPBrd(true); CTPBdr ct = getCTPBrd(true);
CTBorder pr = ct.isSetRight() ? ct.getRight() : ct.addNewRight(); CTBorder pr = ct.isSetRight() ? ct.getRight() : ct.addNewRight();
if (border.getValue() == Borders.NONE.getValue()) if (border.getValue() == Borders.NONE.getValue())
ct.unsetRight(); ct.unsetRight();
else else
pr.setVal(STBorder.Enum.forInt(border.getValue())); pr.setVal(STBorder.Enum.forInt(border.getValue()));
} }
/** /**
@ -460,13 +465,13 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public Borders getBorderRight() { public Borders getBorderRight() {
CTPBdr border = getCTPBrd(false); CTPBdr border = getCTPBrd(false);
CTBorder ct = null; CTBorder ct = null;
if (border != null) { if (border != null) {
ct = border.getRight(); ct = border.getRight();
} }
STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE;
return Borders.valueOf(ptrn.intValue()); return Borders.valueOf(ptrn.intValue());
} }
/** /**
@ -496,12 +501,12 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public void setBorderBetween(Borders border) { public void setBorderBetween(Borders border) {
CTPBdr ct = getCTPBrd(true); CTPBdr ct = getCTPBrd(true);
CTBorder pr = ct.isSetBetween() ? ct.getBetween() : ct.addNewBetween(); CTBorder pr = ct.isSetBetween() ? ct.getBetween() : ct.addNewBetween();
if (border.getValue() == Borders.NONE.getValue()) if (border.getValue() == Borders.NONE.getValue())
ct.unsetBetween(); ct.unsetBetween();
else else
pr.setVal(STBorder.Enum.forInt(border.getValue())); pr.setVal(STBorder.Enum.forInt(border.getValue()));
} }
/** /**
@ -513,13 +518,13 @@ public class XWPFParagraph {
* @see Borders for a list of all possible borders * @see Borders for a list of all possible borders
*/ */
public Borders getBorderBetween() { public Borders getBorderBetween() {
CTPBdr border = getCTPBrd(false); CTPBdr border = getCTPBrd(false);
CTBorder ct = null; CTBorder ct = null;
if (border != null) { if (border != null) {
ct = border.getBetween(); ct = border.getBetween();
} }
STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE; STBorder.Enum ptrn = ct != null ? ct.getVal() : STBorder.NONE;
return Borders.valueOf(ptrn.intValue()); return Borders.valueOf(ptrn.intValue());
} }
/** /**
@ -539,13 +544,13 @@ public class XWPFParagraph {
* boolean value * boolean value
*/ */
public void setPageBreak(boolean pageBreak) { public void setPageBreak(boolean pageBreak) {
CTPPr ppr = getCTPPr(); CTPPr ppr = getCTPPr();
CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr
.getPageBreakBefore() : ppr.addNewPageBreakBefore(); .getPageBreakBefore() : ppr.addNewPageBreakBefore();
if (pageBreak) if (pageBreak)
ct_pageBreak.setVal(STOnOff.TRUE); ct_pageBreak.setVal(STOnOff.TRUE);
else else
ct_pageBreak.setVal(STOnOff.FALSE); ct_pageBreak.setVal(STOnOff.FALSE);
} }
/** /**
@ -564,14 +569,14 @@ public class XWPFParagraph {
* @return boolean - if page break is set * @return boolean - if page break is set
*/ */
public boolean isPageBreak() { public boolean isPageBreak() {
CTPPr ppr = getCTPPr(); CTPPr ppr = getCTPPr();
CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr CTOnOff ct_pageBreak = ppr.isSetPageBreakBefore() ? ppr
.getPageBreakBefore() : null; .getPageBreakBefore() : null;
if (ct_pageBreak != null if (ct_pageBreak != null
&& ct_pageBreak.getVal().intValue() == STOnOff.INT_TRUE) && ct_pageBreak.getVal().intValue() == STOnOff.INT_TRUE)
return true; return true;
else else
return false; return false;
} }
/** /**
@ -586,21 +591,24 @@ public class XWPFParagraph {
* a positive whole number, whose contents consist of a * a positive whole number, whose contents consist of a
* measurement in twentieths of a point. * measurement in twentieths of a point.
*/ */
public void setSpacingAfter(BigInteger spaces) { public void setSpacingAfter(int spaces) {
CTSpacing spacing = getCTSpacing(true); CTSpacing spacing = getCTSpacing(true);
if (spacing != null) if (spacing != null) {
spacing.setAfter(spaces); BigInteger bi = new BigInteger("" + spaces);
spacing.setAfter(bi);
}
} }
/** /**
* Specifies the spacing that should be added after the last line in this * Specifies the spacing that should be added after the last line in this
* paragraph in the document in absolute units. * 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); 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 * a positive whole number, whose contents consist of a
* measurement in twentieths of a * measurement in twentieths of a
*/ */
public void setSpacingAfterLines(BigInteger spaces) { public void setSpacingAfterLines(int spaces) {
CTSpacing spacing = getCTSpacing(true); 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 * @return bigInteger - value representing the spacing after the paragraph
* @see #setSpacingAfterLines(BigInteger) * @see #setSpacingAfterLines(BigInteger)
*/ */
public BigInteger getSpacingAfterLines() { public int getSpacingAfterLines() {
CTSpacing spacing = getCTSpacing(false); 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 * Specifies the spacing that should be added above the first line in this
* paragraph in the document in absolute units. * paragraph in the document in absolute units.
@ -648,9 +658,10 @@ public class XWPFParagraph {
* *
* @param spaces * @param spaces
*/ */
public void setSpacingBefore(BigInteger spaces) { public void setSpacingBefore(int spaces) {
CTSpacing spacing = getCTSpacing(true); 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 * @return the spacing that should be added above the first line
* @see #setSpacingBefore(BigInteger) * @see #setSpacingBefore(BigInteger)
*/ */
public BigInteger getSpacingBefore() { public int getSpacingBefore() {
CTSpacing spacing = getCTSpacing(false); 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 * @param spaces
*/ */
public void setSpacingBeforeLines(BigInteger spaces) { public void setSpacingBeforeLines(int spaces) {
CTSpacing spacing = getCTSpacing(true); 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 * @return the spacing that should be added before the first line in this paragraph
* @see #setSpacingBeforeLines(BigInteger) * @see #setSpacingBeforeLines(BigInteger)
*/ */
public BigInteger getSpacingBeforeLines() { public int getSpacingBeforeLines() {
CTSpacing spacing = getCTSpacing(false); 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 * Specifies the indentation which shall be placed between the left text
* margin for this paragraph and the left edge of that paragraph's content * margin for this paragraph and the left edge of that paragraph's content
@ -708,9 +750,10 @@ public class XWPFParagraph {
* *
* @param indentation * @param indentation
*/ */
public void setIndentationLeft(BigInteger indentation) { public void setIndentationLeft(int indentation) {
CTInd indent = getCTInd(true); 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 * @return indentation or null if indentation is not set
*/ */
public BigInteger getIndentationLeft() { public int getIndentationLeft() {
CTInd indentation = getCTInd(false); CTInd indentation = getCTInd(false);
return indentation.isSetLeft() ? indentation.getLeft() return (indentation != null && indentation.isSetLeft()) ? indentation.getLeft().intValue()
: new BigInteger("0"); : -1;
} }
/** /**
@ -745,9 +788,10 @@ public class XWPFParagraph {
* *
* @param indentation * @param indentation
*/ */
public void setIndentationRight(BigInteger indentation) { public void setIndentationRight(int indentation) {
CTInd indent = getCTInd(true); 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 * @return indentation or null if indentation is not set
*/ */
public BigInteger getIndentationRight() { public int getIndentationRight() {
CTInd indentation = getCTInd(false); CTInd indentation = getCTInd(false);
return indentation.isSetRight() ? indentation.getRight() return (indentation != null && indentation.isSetRight()) ? indentation.getRight().intValue()
: new BigInteger("0"); : -1;
} }
/** /**
@ -784,9 +828,10 @@ public class XWPFParagraph {
* @param indentation * @param indentation
*/ */
public void setIndentationHanging(BigInteger indentation) { public void setIndentationHanging(int indentation) {
CTInd indent = getCTInd(true); 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 * @return indentation or null if indentation is not set
*/ */
public BigInteger getIndentationHanging() { public int getIndentationHanging() {
CTInd indentation = getCTInd(false); 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 * @param indentation
*/ */
public void setIndentationFirstLine(BigInteger indentation) { public void setIndentationFirstLine(int indentation) {
CTInd indent = getCTInd(true); 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 * @return indentation or null if indentation is not set
*/ */
public BigInteger getIndentationFirstLine() { public int getIndentationFirstLine() {
CTInd indentation = getCTInd(false); CTInd indentation = getCTInd(false);
return indentation.isSetFirstLine() ? indentation.getFirstLine() return (indentation != null && indentation.isSetFirstLine()) ? indentation.getFirstLine().intValue()
: new BigInteger("0"); : -1;
} }
/** /**
@ -856,12 +902,12 @@ public class XWPFParagraph {
* @param wrap - boolean * @param wrap - boolean
*/ */
public void setWordWrap(boolean wrap) { public void setWordWrap(boolean wrap) {
CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr()
.getWordWrap() : getCTPPr().addNewWordWrap(); .getWordWrap() : getCTPPr().addNewWordWrap();
if (wrap) if (wrap)
wordWrap.setVal(STOnOff.TRUE); wordWrap.setVal(STOnOff.TRUE);
else else
wordWrap.unsetVal(); wordWrap.unsetVal();
} }
/** /**
@ -873,14 +919,14 @@ public class XWPFParagraph {
* @return boolean * @return boolean
*/ */
public boolean isWordWrap() { public boolean isWordWrap() {
CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr() CTOnOff wordWrap = getCTPPr().isSetWordWrap() ? getCTPPr()
.getWordWrap() : null; .getWordWrap() : null;
if (wordWrap != null) { if (wordWrap != null) {
return (wordWrap.getVal() == STOnOff.ON return (wordWrap.getVal() == STOnOff.ON
|| wordWrap.getVal() == STOnOff.TRUE || wordWrap.getVal() == STOnOff.X_1) ? true || wordWrap.getVal() == STOnOff.TRUE || wordWrap.getVal() == STOnOff.X_1) ? true
: false; : false;
} else } else
return false; return false;
} }
/** /**
@ -889,13 +935,10 @@ public class XWPFParagraph {
*/ */
private CTPBdr getCTPBrd(boolean create) { private CTPBdr getCTPBrd(boolean create) {
CTPPr pr = getCTPPr(); CTPPr pr = getCTPPr();
if (pr != null) { CTPBdr ct = pr.isSetPBdr() ? pr.getPBdr() : null;
CTPBdr ct = pr.isSetPBdr() ? pr.getPBdr() : null; if (create && ct == null)
if (create && ct == null) ct = pr.addNewPBdr();
ct = pr.addNewPBdr(); return ct;
return ct;
}
return null;
} }
/** /**
@ -904,13 +947,10 @@ public class XWPFParagraph {
*/ */
private CTSpacing getCTSpacing(boolean create) { private CTSpacing getCTSpacing(boolean create) {
CTPPr pr = getCTPPr(); CTPPr pr = getCTPPr();
if (pr != null) { CTSpacing ct = pr.getSpacing() == null ? null : pr.getSpacing();
CTSpacing ct = pr.isSetSpacing() ? pr.getSpacing() : null; if (create && ct == null)
if (create && ct == null) ct = pr.addNewSpacing();
ct = pr.addNewSpacing(); return ct;
return ct;
}
return null;
} }
/** /**
@ -919,15 +959,16 @@ public class XWPFParagraph {
*/ */
private CTInd getCTInd(boolean create) { private CTInd getCTInd(boolean create) {
CTPPr pr = getCTPPr(); CTPPr pr = getCTPPr();
if (pr != null) { CTInd ct = pr.getInd() == null ? null : pr.getInd();
CTInd ct = pr.isSetInd() ? pr.getInd() : null; if (create && ct == null)
if (create && ct == null) ct = pr.addNewInd();
ct = pr.addNewInd(); return ct;
return ct;
}
return null;
} }
/**
* Get a <b>copy</b> of the currently used CTPPr, if none is used, return
* a new instance.
*/
private CTPPr getCTPPr() { private CTPPr getCTPPr() {
CTPPr pr = paragraph.getPPr() == null ? paragraph.addNewPPr() CTPPr pr = paragraph.getPPr() == null ? paragraph.addNewPPr()
: paragraph.getPPr(); : paragraph.getPPr();

View File

@ -18,6 +18,7 @@ package org.apache.poi.xwpf.usermodel;
import java.math.BigInteger; 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.CTFonts;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHpsMeasure;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; 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.CTText;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTUnderline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalAlignRun; 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.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun;
@ -49,10 +52,18 @@ public class XWPFRun {
this.paragraph = p; this.paragraph = p;
} }
/**
* Get the currently used CTR object
* @return ctr object
*/
public CTR getCTR() { public CTR getCTR() {
return run; return run;
} }
/**
* Get the currenty referenced paragraph object
* @return current paragraph
*/
public XWPFParagraph getParagraph() { public XWPFParagraph getParagraph() {
return paragraph; return paragraph;
} }
@ -70,9 +81,8 @@ public class XWPFRun {
/** /**
* Whether the bold property shall be applied to all non-complex script * 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.
* <p/> * <p>
* <p/>
* This formatting property is a toggle property, which specifies that its * This formatting property is a toggle property, which specifies that its
* behavior differs between its use within a style definition and its use as * 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 * 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 * direct formatting, setting this property to true or false shall set the
* absolute state of the resulting property. * absolute state of the resulting property.
* </p> * </p>
* <p/> * <p>
* If this element is not present, the default value is to leave the * If this element is not present, the default value is to leave the
* formatting applied at previous level in the style hierarchy. If this * formatting applied at previous level in the style hierarchy. If this
* element is never applied in the style hierarchy, then bold shall not be * 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 <code>null</code> if not set * @return the text of this text run or <code>null</code> if not set
*/ */
public String getText() { public String getText(int pos) {
return run.sizeOfTArray() == 0 ? null : run.getTArray(0) return run.sizeOfTArray() == 0 ? null : run.getTArray(pos)
.getStringValue(); .getStringValue();
} }
@ -115,10 +125,22 @@ public class XWPFRun {
* @param value the literal text which shall be displayed in the document * @param value the literal text which shall be displayed in the document
*/ */
public void setText(String value) { 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); t.setStringValue(value);
} }
/** /**
* Whether the italic property should be applied to all non-complex script * Whether the italic property should 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.
@ -171,7 +193,7 @@ public class XWPFRun {
public UnderlinePatterns getUnderline() { public UnderlinePatterns getUnderline() {
CTRPr pr = run.getRPr(); CTRPr pr = run.getRPr();
return (pr != null && pr.isSetU()) ? UnderlinePatterns.valueOf(pr 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) { public void setUnderline(UnderlinePatterns value) {
CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr(); 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())); underline.setVal(STUnderline.Enum.forInt(value.getValue()));
} }
@ -248,7 +270,7 @@ public class XWPFRun {
public VerticalAlign getSubscript() { public VerticalAlign getSubscript() {
CTRPr pr = run.getRPr(); CTRPr pr = run.getRPr();
return (pr != null && pr.isSetVertAlign()) ? VerticalAlign.valueOf(pr 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 * @return value representing the font size
*/ */
public BigInteger getFontSize() { public int getFontSize() {
CTRPr pr = run.getRPr(); 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 * @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(); CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr();
CTHpsMeasure ctSize = pr.isSetSz() ? pr.getSz() : pr.addNewSz(); 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" * @return a big integer representing the amount of text shall be "moved"
*/ */
public BigInteger getTextPosition() { public int getTextPosition() {
CTRPr pr = run.getRPr(); CTRPr pr = run.getRPr();
return (pr != null && pr.isSetPosition()) ? pr.getPosition().getVal() return (pr != null && pr.isSetPosition()) ? pr.getPosition().getVal().intValue()
: null; : -1;
} }
/** /**
@ -364,10 +387,87 @@ public class XWPFRun {
* *
* @param val * @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(); CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr();
CTSignedHpsMeasure position = pr.isSetPosition() ? pr.getPosition() : pr.addNewPosition(); 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.
* <p>
* The behavior of this break character (the
* location where text shall be restarted after this break) shall be
* determined by its type values.
* </p>
* @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.
* <p>
* 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.
* </p>
* @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
} }
} }

View File

@ -16,42 +16,188 @@
==================================================================== */ ==================================================================== */
package org.apache.poi.xwpf.usermodel; package org.apache.poi.xwpf.usermodel;
import org.apache.poi.xwpf.usermodel.XWPFParagraph; import java.math.BigInteger;
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 org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; 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. * Sketch of XWPFTable class. Only table's text is being hold.
* <p/>
* 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) * @author Yury Batrakov (batrakov at gmail.com)
*
*/ */
public class XWPFTable public class XWPFTable {
{
protected StringBuffer text=new StringBuffer();
public XWPFTable(CTTbl table) { protected StringBuffer text = new StringBuffer();
for(CTRow row : table.getTrArray()) { private CTTbl ctTbl;
StringBuffer rowText = new StringBuffer();
for(CTTc cell : row.getTcArray()) {
for(CTP ctp : cell.getPArray()) { public XWPFTable(CTTbl table, int row, int col) {
XWPFParagraph p = new XWPFParagraph(ctp, null); this(table);
if(rowText.length() > 0) { for (int i = 0; i < row; i++) {
rowText.append('\t'); XWPFTableRow tabRow = (getRow(i) == null) ? createRow() : getRow(i);
} for (int k = 0; k < col; k++) {
rowText.append(p.getText()); XWPFTableCell tabCell = (tabRow.getCell(k) == null) ? tabRow
} .createCell() : null;
}
if(rowText.length() > 0) {
this.text.append(rowText);
this.text.append('\n');
} }
} }
} }
public XWPFTable(CTTbl table) {
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');
}
rowText.append(p.getText());
}
}
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() { public String getText() {
return text.toString(); 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

View File

@ -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

View File

@ -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

View File

@ -21,7 +21,9 @@ import java.math.BigInteger;
import junit.framework.TestCase; 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.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTInd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; 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.CTTextAlignment;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; 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.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment;
import org.apache.poi.POIXMLDocument;
/** /**
* Tests for XWPF Paragraphs * Tests for XWPF Paragraphs
@ -44,7 +46,7 @@ public class TestXWPFParagraph extends TestCase {
*/ */
private XWPFDocument xml; private XWPFDocument xml;
private File file; private File file;
/*
protected void setUp() throws Exception { protected void setUp() throws Exception {
super.setUp(); super.setUp();
@ -55,10 +57,11 @@ public class TestXWPFParagraph extends TestCase {
assertTrue(file.exists()); assertTrue(file.exists());
xml = new XWPFDocument(POIXMLDocument.openPackage(file.toString())); xml = new XWPFDocument(POIXMLDocument.openPackage(file.toString()));
} }
*/
/** /**
* Check that we get the right paragraph from the header * Check that we get the right paragraph from the header
*/ */
/*
public void testHeaderParagraph() throws Exception { public void testHeaderParagraph() throws Exception {
XWPFHeader hdr = xml.getHeaderFooterPolicy().getDefaultHeader(); XWPFHeader hdr = xml.getHeaderFooterPolicy().getDefaultHeader();
assertNotNull(hdr); assertNotNull(hdr);
@ -71,10 +74,11 @@ public class TestXWPFParagraph extends TestCase {
assertEquals("First header column!\tMid header\tRight header!", p assertEquals("First header column!\tMid header\tRight header!", p
.getText()); .getText());
} }
*/
/** /**
* Check that we get the right paragraphs from the document * Check that we get the right paragraphs from the document
*/ */
/*
public void testDocumentParagraph() throws Exception { public void testDocumentParagraph() throws Exception {
XWPFParagraph[] ps = xml.getParagraphs(); XWPFParagraph[] ps = xml.getParagraphs();
assertEquals(10, ps.length); assertEquals(10, ps.length);
@ -96,20 +100,24 @@ public class TestXWPFParagraph extends TestCase {
assertFalse(ps[4].isEmpty()); assertFalse(ps[4].isEmpty());
assertEquals("More on page one", ps[4].getText()); assertEquals("More on page one", ps[4].getText());
} }
*/
public void testSetGetBorderTop() { public void testSetGetBorderTop() {
//new clean instance of paragraph //new clean instance of paragraph
XWPFDocument doc = new XWPFDocument(); XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
assertEquals(STBorder.NONE.intValue(), p.getBorderTop().getValue());
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
//bordi //bordi
CTPBdr bdr = ppr.addNewPBdr(); CTPBdr bdr = ppr.addNewPBdr();
CTBorder borderTop = bdr.addNewTop(); CTBorder borderTop = bdr.addNewTop();
borderTop.setVal(STBorder.APPLES); borderTop.setVal(STBorder.DOUBLE);
bdr.setTop(borderTop); bdr.setTop(borderTop);
assertEquals(Borders.APPLES, p.getBorderTop());
assertEquals(Borders.DOUBLE, p.getBorderTop());
p.setBorderTop(Borders.SINGLE); p.setBorderTop(Borders.SINGLE);
assertEquals(STBorder.SINGLE, borderTop.getVal()); assertEquals(STBorder.SINGLE, borderTop.getVal());
} }
@ -119,8 +127,10 @@ public class TestXWPFParagraph extends TestCase {
XWPFDocument doc = new XWPFDocument(); XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
assertEquals(STJc.LEFT.intValue(), p.getAlignment().getValue());
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
CTJc align = ppr.addNewJc(); CTJc align = ppr.addNewJc();
align.setVal(STJc.CENTER); align.setVal(STJc.CENTER);
@ -130,20 +140,58 @@ public class TestXWPFParagraph extends TestCase {
assertEquals(STJc.BOTH, ppr.getJc().getVal()); assertEquals(STJc.BOTH, ppr.getJc().getVal());
} }
public void testSetGetSpacing() { public void testSetGetSpacing() {
XWPFDocument doc = new XWPFDocument(); XWPFDocument doc = new XWPFDocument();
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
assertEquals(-1, p.getSpacingAfter());
//TEST ALL OTHERS POSSIBLE COMBINATIONS
CTSpacing spacing = ppr.addNewSpacing(); CTSpacing spacing = ppr.addNewSpacing();
spacing.setAfter(new BigInteger("10")); spacing.setAfter(new BigInteger("10"));
assertEquals(10, p.getSpacingAfter().longValue()); assertEquals(10, p.getSpacingAfter());
p.setSpacingAfter(new BigInteger("100")); p.setSpacingAfter(100);
assertEquals(100, spacing.getAfter().longValue()); 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() { public void testSetGetVerticalAlignment() {
@ -152,7 +200,7 @@ public class TestXWPFParagraph extends TestCase {
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
CTTextAlignment txtAlign = ppr.addNewTextAlignment(); CTTextAlignment txtAlign = ppr.addNewTextAlignment();
txtAlign.setVal(STTextAlignment.CENTER); txtAlign.setVal(STTextAlignment.CENTER);
@ -167,7 +215,7 @@ public class TestXWPFParagraph extends TestCase {
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
CTOnOff wordWrap = ppr.addNewWordWrap(); CTOnOff wordWrap = ppr.addNewWordWrap();
wordWrap.setVal(STOnOff.FALSE); wordWrap.setVal(STOnOff.FALSE);
@ -183,7 +231,7 @@ public class TestXWPFParagraph extends TestCase {
XWPFParagraph p = doc.createParagraph(); XWPFParagraph p = doc.createParagraph();
CTP ctp = p.getCTP(); CTP ctp = p.getCTP();
CTPPr ppr = ctp.addNewPPr(); CTPPr ppr = ctp.getPPr()== null? ctp.addNewPPr() : ctp.getPPr();
CTOnOff pageBreak = ppr.addNewPageBreakBefore(); CTOnOff pageBreak = ppr.addNewPageBreakBefore();
pageBreak.setVal(STOnOff.FALSE); pageBreak.setVal(STOnOff.FALSE);

View File

@ -20,8 +20,10 @@ import java.math.BigInteger;
import junit.framework.TestCase; 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.CTR;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; 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.STOnOff;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun;
@ -42,6 +44,23 @@ public class TestXWPFRun extends TestCase {
} }
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() { public void testSetGetBold() {
CTRPr rpr = ctRun.addNewRPr(); CTRPr rpr = ctRun.addNewRPr();
rpr.addNewB().setVal(STOnOff.TRUE); rpr.addNewB().setVal(STOnOff.TRUE);
@ -118,9 +137,9 @@ public class TestXWPFRun extends TestCase {
rpr.addNewSz().setVal(new BigInteger("14")); rpr.addNewSz().setVal(new BigInteger("14"));
XWPFRun run = new XWPFRun(ctRun, p); 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()); assertEquals(48, rpr.getSz().getVal().longValue());
} }
@ -130,11 +149,48 @@ public class TestXWPFRun extends TestCase {
rpr.addNewPosition().setVal(new BigInteger("4000")); rpr.addNewPosition().setVal(new BigInteger("4000"));
XWPFRun run = new XWPFRun(ctRun, p); 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()); 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());
}
} }

View File

@ -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());
}
}