aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/documentation/content/xdocs/index.xml4
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java308
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java9
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java20
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java69
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java7
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java4
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java10
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java157
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java290
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java86
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java13
-rwxr-xr-xsrc/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java23
-rw-r--r--src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java365
-rwxr-xr-xsrc/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java2
-rw-r--r--src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java102
-rwxr-xr-xsrc/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java1
-rwxr-xr-xsrc/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java9
-rw-r--r--src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java150
-rwxr-xr-xtest-data/slideshow/shapes.pptxbin64058 -> 67435 bytes
21 files changed, 1305 insertions, 325 deletions
diff --git a/src/documentation/content/xdocs/index.xml b/src/documentation/content/xdocs/index.xml
index 56e89aa2b4..61fc1de6f9 100644
--- a/src/documentation/content/xdocs/index.xml
+++ b/src/documentation/content/xdocs/index.xml
@@ -32,8 +32,8 @@
</header>
<body>
- <section><title>6 June 2011 - POI 3.8 beta 3 available</title>
- <p>The Apache POI team is pleased to announce the release of 3.8 beta 3.
+ <section><title>22 August 2011 - POI 3.8 beta 4 available</title>
+ <p>The Apache POI team is pleased to announce the release of 3.8 beta 4.
This includes a large number of bug fixes and enhancements.
</p>
<p>A full list of changes is available in the <link href="changes.html">change log</link>.
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml
index 96acff77ec..4c9f245e02 100644
--- a/src/documentation/content/xdocs/status.xml
+++ b/src/documentation/content/xdocs/status.xml
@@ -34,6 +34,7 @@
<changes>
<release version="3.8-beta4" date="2011-??-??">
+ <action dev="poi-developers" type="add">support for tables and hyperlinks</action>
<action dev="poi-developers" type="fix">51535 - correct signed vs unsigned short reading in NDocumentInputStream</action>
<action dev="poi-developers" type="add">51634 - support SXSSF streaming from templates</action>
<action dev="poi-developers" type="add">initial support for XSLF usermodel API</action>
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
index 1869749970..feb77a4041 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java
@@ -48,19 +48,10 @@ import java.util.List;
* @author Yegor Kozlov
*/
@Beta
-public class XSLFAutoShape extends XSLFSimpleShape {
- private final List<XSLFTextParagraph> _paragraphs;
+public class XSLFAutoShape extends XSLFTextShape {
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
super(shape, sheet);
-
- _paragraphs = new ArrayList<XSLFTextParagraph>();
- if (shape.isSetTxBody()) {
- CTTextBody txBody = shape.getTxBody();
- for (CTTextParagraph p : txBody.getPList()) {
- _paragraphs.add(new XSLFTextParagraph(p));
- }
- }
}
/*package*/
@@ -74,36 +65,6 @@ public class XSLFAutoShape extends XSLFSimpleShape {
}
}
- // textual properties
- public String getText() {
- StringBuilder out = new StringBuilder();
- for (XSLFTextParagraph p : _paragraphs) {
- if (out.length() > 0) out.append('\n');
- out.append(p.getText());
- }
- return out.toString();
- }
-
- public List<XSLFTextParagraph> getTextParagraphs() {
- return _paragraphs;
- }
-
- public XSLFTextParagraph addNewTextParagraph() {
- CTShape shape = (CTShape) getXmlObject();
- CTTextBody txBody;
- if (!shape.isSetTxBody()) {
- txBody = shape.addNewTxBody();
- txBody.addNewBodyPr();
- txBody.addNewLstStyle();
- } else {
- txBody = shape.getTxBody();
- }
- CTTextParagraph p = txBody.addNewP();
- XSLFTextParagraph paragraph = new XSLFTextParagraph(p);
- _paragraphs.add(paragraph);
- return paragraph;
- }
-
/**
* @param shapeId 1-based shapeId
*/
@@ -160,268 +121,15 @@ public class XSLFAutoShape extends XSLFSimpleShape {
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
}
- /**
- * Sets the type of vertical alignment for the text.
- * One of the <code>Anchor*</code> constants defined in this class.
- *
- * @param anchor - the type of alignment. Default is {@link VerticalAlignment#TOP}
- */
- public void setVerticalAlignment(VerticalAlignment anchor){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(anchor == null) {
- if(bodyPr.isSetAnchor()) bodyPr.unsetAnchor();
- } else {
- bodyPr.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
- }
- }
- }
-
- /**
- * Returns the type of vertical alignment for the text.
- *
- * @return the type of alignment
- */
- public VerticalAlignment getVerticalAlignment(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- STTextAnchoringType.Enum val = shape.getTxBody().getBodyPr().getAnchor();
- if(val != null){
- return VerticalAlignment.values()[val.intValue() - 1];
- }
- }
- return VerticalAlignment.TOP;
- }
-
- /**
- *
- * @param orientation vertical orientation of the text
- */
- public void setTextDirection(TextDirection orientation){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(orientation == null) {
- if(bodyPr.isSetVert()) bodyPr.unsetVert();
- } else {
- bodyPr.setVert(STTextVerticalType.Enum.forInt(orientation.ordinal() + 1));
- }
- }
- }
-
- /**
- * @return vertical orientation of the text
- */
- public TextDirection getTextDirection(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- STTextVerticalType.Enum val = shape.getTxBody().getBodyPr().getVert();
- if(val != null){
- return TextDirection.values()[val.intValue() - 1];
- }
- }
- return TextDirection.HORIZONTAL;
- }
- /**
- * Returns the distance (in points) between the bottom of the text frame
- * and the bottom of the inscribed rectangle of the shape that contains the text.
- *
- * @return the bottom margin or -1 if not set
- */
- public double getMarginBottom(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- return bodyPr.isSetBIns() ? Units.toPoints(bodyPr.getBIns()) : -1;
- }
- return -1;
- }
-
- /**
- * Returns the distance (in points) between the left edge of the text frame
- * and the left edge of the inscribed rectangle of the shape that contains
- * the text.
- *
- * @return the left margin
- */
- public double getMarginLeft(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- return bodyPr.isSetLIns() ? Units.toPoints(bodyPr.getLIns()) : -1;
- }
- return -1;
- }
-
- /**
- * Returns the distance (in points) between the right edge of the
- * text frame and the right edge of the inscribed rectangle of the shape
- * that contains the text.
- *
- * @return the right margin
- */
- public double getMarginRight(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- return bodyPr.isSetRIns() ? Units.toPoints(bodyPr.getRIns()) : -1;
- }
- return -1;
- }
-
- /**
- * Returns the distance (in points) between the top of the text frame
- * and the top of the inscribed rectangle of the shape that contains the text.
- *
- * @return the top margin
- */
- public double getMarginTop(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- return bodyPr.isSetTIns() ? Units.toPoints(bodyPr.getTIns()) : -1;
- }
- return -1;
- }
-
- /**
- * Sets the botom margin.
- * @see #getMarginBottom()
- *
- * @param margin the bottom margin
- */
- public void setMarginBottom(double margin){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(margin == -1) bodyPr.unsetBIns();
- else bodyPr.setBIns(Units.toEMU(margin));
- }
- }
-
- /**
- * Sets the left margin.
- * @see #getMarginLeft()
- *
- * @param margin the left margin
- */
- public void setMarginLeft(double margin){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(margin == -1) bodyPr.unsetLIns();
- else bodyPr.setLIns(Units.toEMU(margin));
- }
- }
-
- /**
- * Sets the right margin.
- * @see #getMarginRight()
- *
- * @param margin the right margin
- */
- public void setMarginRight(double margin){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(margin == -1) bodyPr.unsetRIns();
- else bodyPr.setRIns(Units.toEMU(margin));
- }
- }
-
- /**
- * Sets the top margin.
- * @see #getMarginTop()
- *
- * @param margin the top margin
- */
- public void setMarginTop(double margin){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(margin == -1) bodyPr.unsetTIns();
- else bodyPr.setTIns(Units.toEMU(margin));
- }
- }
-
-
- /**
- * Returns the value indicating word wrap.
- * One of the <code>Wrap*</code> constants defined in this class.
- *
- * @return the value indicating word wrap
- */
- public boolean getWordWrap(){
+ protected CTTextBody getTextBody(boolean create){
CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- return shape.getTxBody().getBodyPr().getWrap() == STTextWrappingType.SQUARE;
- }
- return false;
- }
-
- /**
- * Specifies how the text should be wrapped
- *
- * @param wrap the value indicating how the text should be wrapped
- */
- public void setWordWrap(boolean wrap){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- shape.getTxBody().getBodyPr().setWrap(wrap ? STTextWrappingType.SQUARE : STTextWrappingType.NONE);
- }
- }
-
- /**
- *
- * Specifies that a shape should be auto-fit to fully contain the text described within it.
- * Auto-fitting is when text within a shape is scaled in order to contain all the text inside
- *
- * @param value type of autofit
- */
- public void setTextAutofit(TextAutofit value){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(bodyPr.isSetSpAutoFit()) bodyPr.unsetSpAutoFit();
- if(bodyPr.isSetNoAutofit()) bodyPr.unsetNoAutofit();
- if(bodyPr.isSetNormAutofit()) bodyPr.unsetNormAutofit();
-
- switch(value){
- case NONE: bodyPr.addNewNoAutofit(); break;
- case NORMAL: bodyPr.addNewNormAutofit(); break;
- case SHAPE: bodyPr.addNewSpAutoFit(); break;
- }
- }
- }
-
- /**
- *
- * @return type of autofit
- */
- public TextAutofit getTextAutofit(){
- CTShape shape = (CTShape) getXmlObject();
- if (shape.isSetTxBody()) {
- CTTextBodyProperties bodyPr = shape.getTxBody().getBodyPr();
- if(bodyPr.isSetNoAutofit()) return TextAutofit.NONE;
- else if (bodyPr.isSetNormAutofit()) return TextAutofit.NORMAL;
- else if (bodyPr.isSetSpAutoFit()) return TextAutofit.SHAPE;
- }
- return TextAutofit.NORMAL;
- }
-
-
- @Override
- void onCopy(XSLFSheet srcSheet){
- CTShape shape = (CTShape) getXmlObject();
- if (!shape.isSetTxBody()) return;
-
- CTPlaceholder ph = shape.getNvSpPr().getNvPr().getPh();
- if(ph == null || !ph.isSetType()) return;
-
- if(ph.getType() == STPlaceholderType.TITLE){
-
+ CTTextBody txBody = shape.getTxBody();
+ if (txBody == null && create) {
+ txBody = shape.addNewTxBody();
+ txBody.addNewBodyPr();
+ txBody.addNewLstStyle();
}
+ return txBody;
}
} \ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java
index ab8c1658fe..e731a632d6 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java
@@ -24,6 +24,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
import java.awt.*;
@@ -97,4 +98,12 @@ public class XSLFDrawing {
shape.setAnchor(new Rectangle());
return shape;
}
+
+ public XSLFTable createTable(){
+ CTGraphicalObjectFrame obj = _spTree.addNewGraphicFrame();
+ obj.set(XSLFTable.prototype(_shapeId++));
+ XSLFTable shape = new XSLFTable(obj, _sheet);
+ shape.setAnchor(new Rectangle());
+ return shape;
+ }
}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
index 0abad44f30..7e0990331f 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java
@@ -44,6 +44,10 @@ public class XSLFGraphicFrame extends XSLFShape {
return _shape;
}
+ public XSLFSheet getSheet(){
+ return _sheet;
+ }
+
public int getShapeType(){
throw new RuntimeException("NotImplemented");
}
@@ -64,16 +68,14 @@ public class XSLFGraphicFrame extends XSLFShape {
throw new RuntimeException("NotImplemented");
}
- public ShapeGroup getParent(){
- throw new RuntimeException("NotImplemented");
- }
- public Shape[] getShapes(){
- throw new RuntimeException("NotImplemented");
+ static XSLFGraphicFrame create(CTGraphicalObjectFrame shape, XSLFSheet sheet){
+ String uri = shape.getGraphic().getGraphicData().getUri();
+ if(XSLFTable.TABLE_URI.equals(uri)){
+ return new XSLFTable(shape, sheet);
+ } else {
+ return new XSLFGraphicFrame(shape, sheet);
+ }
}
-
- public boolean removeShape(Shape shape){
- throw new RuntimeException("NotImplemented");
- }
} \ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
new file mode 100644
index 0000000000..5a25851b5c
--- /dev/null
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFHyperlink.java
@@ -0,0 +1,69 @@
+/* ====================================================================
+ 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.xslf.usermodel;
+
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.opc.TargetMode;
+import org.apache.poi.util.Internal;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink;
+
+import java.net.URI;
+
+/**
+ * @author Yegor Kozlov
+ */
+public class XSLFHyperlink {
+ final XSLFTextRun _r;
+ final CTHyperlink _link;
+
+ XSLFHyperlink(CTHyperlink link, XSLFTextRun r){
+ _r = r;
+ _link = link;
+ }
+
+ @Internal
+ public CTHyperlink getXmlObject(){
+ return _link;
+ }
+
+ public void setAddress(String address){
+ XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
+ PackageRelationship rel =
+ sheet.getPackagePart().
+ addExternalRelationship(address, XSLFRelation.HYPERLINK.getRelation());
+ _link.setId(rel.getId());
+
+ }
+
+ public void setAddress(XSLFSlide slide){
+ XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
+ PackageRelationship rel =
+ sheet.getPackagePart().
+ addRelationship(slide.getPackagePart().getPartName(),
+ TargetMode.INTERNAL,
+ XSLFRelation.SLIDE.getRelation());
+ _link.setId(rel.getId());
+ _link.setAction("ppaction://hlinksldjump");
+ }
+
+ @Internal
+ public URI getTargetURI(){
+ XSLFSheet sheet = _r.getParentParagraph().getParentShape().getSheet();
+ String id = _link.getId();
+ return sheet.getPackagePart().getRelationship(id).getTargetURI();
+ }
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java
index 10a35dfeee..15f91c6ec5 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFRelation.java
@@ -103,6 +103,13 @@ public class XSLFRelation extends POIXMLRelation {
null, null
);
+ public static final XSLFRelation HYPERLINK = new XSLFRelation(
+ null,
+ "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
+ null,
+ null
+ );
+
public static final XSLFRelation THEME = new XSLFRelation(
"application/vnd.openxmlformats-officedocument.theme+xml",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme",
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
index b1b65eac40..dfb659557f 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java
@@ -41,8 +41,4 @@ public abstract class XSLFShape {
public abstract String getShapeName();
public abstract int getShapeId();
-
- void onCopy(XSLFSheet srcSheet){
-
- }
} \ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
index 02ce9fdb7d..d97600d398 100644
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java
@@ -70,7 +70,8 @@ public abstract class XSLFSheet extends POIXMLDocumentPart {
} else if (ch instanceof CTPicture){
shapes.add(new XSLFPictureShape((CTPicture)ch, this));
} else if (ch instanceof CTGraphicalObjectFrame){
- shapes.add(new XSLFGraphicFrame((CTGraphicalObjectFrame)ch, this));
+ XSLFGraphicFrame shape = XSLFGraphicFrame.create((CTGraphicalObjectFrame)ch, this);
+ shapes.add(shape);
}
}
return shapes;
@@ -147,6 +148,13 @@ public abstract class XSLFSheet extends POIXMLDocumentPart {
return sh;
}
+ public XSLFTable createTable(){
+ List<XSLFShape> shapes = getShapeList();
+ XSLFTable sh = getDrawing().createTable();
+ shapes.add(sh);
+ return sh;
+ }
+
public XSLFShape[] getShapes(){
return getShapeList().toArray(new XSLFShape[_shapes.size()]);
}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
new file mode 100644
index 0000000000..dce9cc2389
--- /dev/null
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java
@@ -0,0 +1,157 @@
+/*
+ * ====================================================================
+ * 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.xslf.usermodel;
+
+import org.apache.poi.util.Internal;
+import org.apache.poi.util.Units;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrameNonVisual;
+
+import javax.xml.namespace.QName;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.awt.geom.Rectangle2D;
+
+/**
+ * Represents a table in a .pptx presentation
+ *
+ * @author Yegor Kozlov
+ */
+public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow> {
+ static String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";
+
+ private CTTable _table;
+ private List<XSLFTableRow> _rows;
+
+ /*package*/ XSLFTable(CTGraphicalObjectFrame shape, XSLFSheet sheet){
+ super(shape, sheet);
+
+ for(XmlObject obj : shape.getGraphic().getGraphicData().selectPath("*")){
+ if(obj instanceof CTTable){
+ _table = (CTTable)obj;
+ }
+ }
+ if(_table == null) throw new IllegalStateException("CTTable element was not found");
+
+ _rows = new ArrayList<XSLFTableRow>(_table.sizeOfTrArray());
+ for(CTTableRow row : _table.getTrList()) _rows.add(new XSLFTableRow(row, this));
+ }
+
+ @Internal
+ public CTTable getCTTable(){
+ return _table;
+ }
+
+ public int getNumberOfColumns() {
+ return _table.getTblGrid().sizeOfGridColArray();
+ }
+
+ public int getNumberOfRows() {
+ return _table.sizeOfTrArray();
+ }
+
+ public double getColumnWidth(int idx){
+ return Units.toPoints(
+ _table.getTblGrid().getGridColArray(idx).getW());
+ }
+
+ public void setColumnWidth(int idx, double width){
+ _table.getTblGrid().getGridColArray(idx).setW(Units.toEMU(width));
+ }
+
+ public Iterator<XSLFTableRow> iterator(){
+ return _rows.iterator();
+ }
+
+ public List<XSLFTableRow> getRows(){
+ return Collections.unmodifiableList(_rows);
+ }
+
+ public XSLFTableRow addRow(){
+ CTTableRow tr = _table.addNewTr();
+ XSLFTableRow row = new XSLFTableRow(tr, this);
+ row.setHeight(20.0); // default height is 20 points
+ _rows.add(row);
+ return row;
+ }
+
+ static CTGraphicalObjectFrame prototype(int shapeId){
+ CTGraphicalObjectFrame frame = CTGraphicalObjectFrame.Factory.newInstance();
+ CTGraphicalObjectFrameNonVisual nvGr = frame.addNewNvGraphicFramePr();
+
+ CTNonVisualDrawingProps cnv = nvGr.addNewCNvPr();
+ cnv.setName("Table " + shapeId);
+ cnv.setId(shapeId + 1);
+ nvGr.addNewCNvGraphicFramePr().addNewGraphicFrameLocks().setNoGrp(true);
+ nvGr.addNewNvPr();
+
+ frame.addNewXfrm();
+ CTGraphicalObjectData gr = frame.addNewGraphic().addNewGraphicData();
+ XmlCursor cursor = gr.newCursor();
+ cursor.toNextToken();
+ cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tbl"));
+ cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tblPr"));
+ cursor.toNextToken();
+ cursor.beginElement(new QName("http://schemas.openxmlformats.org/drawingml/2006/main", "tblGrid"));
+ cursor.dispose();
+ gr.setUri(TABLE_URI);
+ return frame;
+ }
+
+ public Rectangle2D getAnchor(){
+ CTTransform2D xfrm = getXmlObject().getXfrm();
+ CTPoint2D off = xfrm.getOff();
+ long x = off.getX();
+ long y = off.getY();
+ CTPositiveSize2D ext = xfrm.getExt();
+ long cx = ext.getCx();
+ long cy = ext.getCy();
+ return new Rectangle2D.Double(
+ Units.toPoints(x), Units.toPoints(y),
+ Units.toPoints(cx), Units.toPoints(cy));
+ }
+
+ public void setAnchor(Rectangle2D anchor){
+ CTTransform2D xfrm = getXmlObject().getXfrm();
+ CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
+ long x = Units.toEMU(anchor.getX());
+ long y = Units.toEMU(anchor.getY());
+ off.setX(x);
+ off.setY(y);
+ CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm.addNewExt();
+ long cx = Units.toEMU(anchor.getWidth());
+ long cy = Units.toEMU(anchor.getHeight());
+ ext.setCx(cx);
+ ext.setCy(cy);
+ }
+
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
new file mode 100644
index 0000000000..cc04a10ae4
--- /dev/null
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java
@@ -0,0 +1,290 @@
+/*
+ * ====================================================================
+ * 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.xslf.usermodel;
+
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;
+import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine;
+import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;
+import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;
+import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;
+import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;
+import org.apache.poi.util.Internal;
+import org.apache.poi.util.Units;
+
+import java.awt.*;
+
+/**
+ * Represents a cell of a table in a .pptx presentation
+ *
+ * @author Yegor Kozlov
+ */
+public class XSLFTableCell extends XSLFTextShape {
+ static double defaultBorderWidth = 1.0;
+
+ /*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){
+ super(cell, sheet);
+ }
+
+ @Override
+ public CTTableCell getXmlObject(){
+ return (CTTableCell)super.getXmlObject();
+ }
+
+ @Override
+ protected CTTextBody getTextBody(boolean create){
+ CTTableCell cell = getXmlObject();
+ CTTextBody txBody = cell.getTxBody();
+ if (txBody == null && create) {
+ txBody = cell.addNewTxBody();
+ txBody.addNewBodyPr();
+ txBody.addNewLstStyle();
+ }
+ return txBody;
+ }
+
+ static CTTableCell prototype() {
+ CTTableCell cell = CTTableCell.Factory.newInstance();
+ CTTableCellProperties pr = cell.addNewTcPr();
+ pr.addNewLnL().addNewNoFill();
+ pr.addNewLnR().addNewNoFill();
+ pr.addNewLnT().addNewNoFill();
+ pr.addNewLnB().addNewNoFill();
+ return cell;
+ }
+
+ @Override
+ public void setMarginLeft(double margin){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ if(pr == null) pr = getXmlObject().addNewTcPr();
+
+ pr.setMarL(Units.toEMU(margin));
+ }
+
+ @Override
+ public void setMarginRight(double margin){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ if(pr == null) pr = getXmlObject().addNewTcPr();
+
+ pr.setMarR(Units.toEMU(margin));
+ }
+
+ @Override
+ public void setMarginTop(double margin){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ if(pr == null) pr = getXmlObject().addNewTcPr();
+
+ pr.setMarT(Units.toEMU(margin));
+ }
+
+ @Override
+ public void setMarginBottom(double margin){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ if(pr == null) pr = getXmlObject().addNewTcPr();
+
+ pr.setMarB(Units.toEMU(margin));
+ }
+
+ public void setBorderLeft(double width){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
+ ln.setW(Units.toEMU(width));
+ }
+
+ public double getBorderLeft(){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.getLnL();
+ return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
+ }
+
+ public void setBorderLeftColor(Color color){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
+ setLineColor(ln, color);
+ }
+
+ public Color getBorderLeftColor(){
+ return getLineColor(getXmlObject().getTcPr().getLnL());
+ }
+
+ public void setBorderRight(double width){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
+ ln.setW(Units.toEMU(width));
+ }
+
+ public double getBorderRight(){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.getLnR();
+ return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
+ }
+
+ public void setBorderRightColor(Color color){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
+ setLineColor(ln, color);
+ }
+
+ public Color getBorderRightColor(){
+ return getLineColor(getXmlObject().getTcPr().getLnR());
+ }
+
+ public void setBorderTop(double width){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
+ ln.setW(Units.toEMU(width));
+ }
+
+ public double getBorderTop(){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.getLnT();
+ return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
+ }
+
+ public void setBorderTopColor(Color color){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
+ setLineColor(ln, color);
+ }
+
+ public Color getBorderTopColor(){
+ return getLineColor(getXmlObject().getTcPr().getLnT());
+ }
+
+ public void setBorderBottom(double width){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
+ ln.setW(Units.toEMU(width));
+ }
+
+ public double getBorderBottom(){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+
+ CTLineProperties ln = pr.getLnB();
+ return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
+ }
+
+ public void setBorderBottomColor(Color color){
+ CTTableCellProperties pr = getXmlObject().getTcPr();
+ CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
+ setLineColor(ln, color);
+ }
+
+ public Color getBorderBottomColor(){
+ return getLineColor(getXmlObject().getTcPr().getLnB());
+ }
+
+ private void setLineColor(CTLineProperties ln, Color color){
+ if(color == null){
+ ln.addNewNoFill();
+ if(ln.isSetSolidFill()) ln.unsetSolidFill();
+ } else {
+ if(ln.isSetNoFill()) ln.unsetNoFill();
+
+ if(!ln.isSetPrstDash()) ln.addNewPrstDash().setVal(STPresetLineDashVal.SOLID);
+ ln.setCmpd(STCompoundLine.SNG);
+ ln.setAlgn(STPenAlignment.CTR);
+ ln.setCap(STLineCap.FLAT);
+ ln.addNewRound();
+
+ CTLineEndProperties hd = ln.addNewHeadEnd();
+ hd.setType(STLineEndType.NONE);
+ hd.setW(STLineEndWidth.MED);
+ hd.setLen(STLineEndLength.MED);
+
+ CTLineEndProperties tl = ln.addNewTailEnd();
+ tl.setType(STLineEndType.NONE);
+ tl.setW(STLineEndWidth.MED);
+ tl.setLen(STLineEndLength.MED);
+
+ CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
+ rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
+ ln.addNewSolidFill().setSrgbClr(rgb);
+ }
+ }
+
+ private Color getLineColor(CTLineProperties ln){
+ if(ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;
+
+ CTSolidColorFillProperties fill = ln.getSolidFill();
+ if(!fill.isSetSrgbClr()) {
+ // TODO for now return null for all colors except explicit RGB
+ return null;
+ }
+ byte[] val = fill.getSrgbClr().getVal();
+ return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
+ }
+ /**
+ * Specifies a solid color fill. The shape is filled entirely with the specified color.
+ *
+ * @param color the solid color fill.
+ * The value of <code>null</code> unsets the solidFIll attribute from the underlying xml
+ */
+ @Override
+ public void setFillColor(Color color) {
+ CTTableCellProperties spPr = getXmlObject().getTcPr();
+ if (color == null) {
+ if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
+ }
+ else {
+ CTSolidColorFillProperties fill = spPr.isSetSolidFill() ? spPr.getSolidFill() : spPr.addNewSolidFill();
+
+ CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
+ rgb.setVal(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()});
+
+ fill.setSrgbClr(rgb);
+ }
+ }
+
+ /**
+ *
+ * @return solid fill color of null if not set
+ */
+ @Override
+ public Color getFillColor(){
+ CTTableCellProperties spPr = getXmlObject().getTcPr();
+ if(!spPr.isSetSolidFill() ) return null;
+
+ CTSolidColorFillProperties fill = spPr.getSolidFill();
+ if(!fill.isSetSrgbClr()) {
+ // TODO for now return null for all colors except explicit RGB
+ return null;
+ }
+ byte[] val = fill.getSrgbClr().getVal();
+ return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
+ }
+
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java
new file mode 100644
index 0000000000..328c76ae76
--- /dev/null
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableRow.java
@@ -0,0 +1,86 @@
+/*
+ * ====================================================================
+ * 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.xslf.usermodel;
+
+import org.apache.poi.util.Units;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTableRow;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Iterator;
+
+/**
+ * Represents a table in a .pptx presentation
+ *
+ * @author Yegor Kozlov
+ */
+public class XSLFTableRow implements Iterable<XSLFTableCell> {
+ private CTTableRow _row;
+ private List<XSLFTableCell> _cells;
+ private XSLFTable _table;
+
+ /*package*/ XSLFTableRow(CTTableRow row, XSLFTable table){
+ _row = row;
+ _table = table;
+ _cells = new ArrayList<XSLFTableCell>(_row.sizeOfTcArray());
+ for(CTTableCell cell : _row.getTcList()) {
+ _cells.add(new XSLFTableCell(cell, table.getSheet()));
+ }
+ }
+
+ public CTTableRow getXmlObject(){
+ return _row;
+ }
+
+ public Iterator<XSLFTableCell> iterator(){
+ return _cells.iterator();
+ }
+
+ public List<XSLFTableCell> getCells(){
+ return Collections.unmodifiableList(_cells);
+ }
+
+ public double getHeight(){
+ return Units.toPoints(_row.getH());
+ }
+
+ public void setHeight(double height){
+ _row.setH(Units.toEMU(height));
+ }
+
+ public XSLFTableCell addCell(){
+ CTTableCell c = _row.addNewTc();
+ c.set(XSLFTableCell.prototype());
+ XSLFTableCell cell = new XSLFTableCell(c, _table.getSheet());
+ _cells.add(cell);
+
+ if(_table.getNumberOfColumns() < _row.sizeOfTcArray()) {
+ _table.getCTTable().getTblGrid().addNewGridCol().setW(Units.toEMU(100.0));
+ }
+ return cell;
+ }
+
+
+}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
index 9317298ee3..e20be9b5c2 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
@@ -40,12 +40,14 @@ import java.util.List;
public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
private final CTTextParagraph _p;
private final List<XSLFTextRun> _runs;
+ private final XSLFTextShape _shape;
- XSLFTextParagraph(CTTextParagraph p){
+ XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){
_p = p;
_runs = new ArrayList<XSLFTextRun>();
+ _shape = shape;
for (CTRegularTextRun r : _p.getRList()) {
- _runs.add(new XSLFTextRun(r));
+ _runs.add(new XSLFTextRun(r, this));
}
}
@@ -62,6 +64,10 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
return _p;
}
+ XSLFTextShape getParentShape() {
+ return _shape;
+
+ }
public List<XSLFTextRun> getTextRuns(){
return _runs;
}
@@ -72,7 +78,8 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
public XSLFTextRun addNewTextRun(){
CTRegularTextRun r = _p.addNewR();
- XSLFTextRun run = new XSLFTextRun(r);
+ r.addNewRPr();
+ XSLFTextRun run = new XSLFTextRun(r, this);
_runs.add(run);
return run;
}
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
index 859649197b..c62775e086 100755
--- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
@@ -36,9 +36,15 @@ import java.awt.*;
@Beta
public class XSLFTextRun {
private final CTRegularTextRun _r;
+ private final XSLFTextParagraph _p;
- XSLFTextRun(CTRegularTextRun r){
+ XSLFTextRun(CTRegularTextRun r, XSLFTextParagraph p){
_r = r;
+ _p = p;
+ }
+
+ XSLFTextParagraph getParentParagraph(){
+ return _p;
}
public String getText(){
@@ -78,7 +84,7 @@ public class XSLFTextRun {
* @return font size in points or -1 if font size is not set.
*/
public double getFontSize(){
- if(!_r.isSetRPr()) return -1;
+ if(!_r.isSetRPr() || !_r.getRPr().isSetSz()) return -1;
return _r.getRPr().getSz()*0.01;
}
@@ -198,5 +204,16 @@ public class XSLFTextRun {
public String toString(){
return "[" + getClass() + "]" + getText();
}
-
+
+ public XSLFHyperlink createHyperlink(){
+ XSLFHyperlink link = new XSLFHyperlink(_r.getRPr().addNewHlinkClick(), this);
+ return link;
+ }
+
+ public XSLFHyperlink getHyperlink(){
+ if(!_r.getRPr().isSetHlinkClick()) return null;
+
+
+ return new XSLFHyperlink(_r.getRPr().getHlinkClick(), this);
+ }
} \ No newline at end of file
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
new file mode 100644
index 0000000000..5bb48b600b
--- /dev/null
+++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
@@ -0,0 +1,365 @@
+/*
+ * ====================================================================
+ * 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.xslf.usermodel;
+
+import org.apache.poi.util.Beta;
+import org.apache.poi.util.Units;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
+import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;
+import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType;
+import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;
+
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a shape that can hold text.
+ *
+ * @author Yegor Kozlov
+ */
+@Beta
+public abstract class XSLFTextShape extends XSLFSimpleShape {
+ private final List<XSLFTextParagraph> _paragraphs;
+
+ /*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) {
+ super(shape, sheet);
+
+ _paragraphs = new ArrayList<XSLFTextParagraph>();
+ CTTextBody txBody = getTextBody(false);
+ if (txBody != null) {
+ for (CTTextParagraph p : txBody.getPList()) {
+ _paragraphs.add(new XSLFTextParagraph(p, this));
+ }
+ }
+ }
+
+ // textual properties
+ public String getText() {
+ StringBuilder out = new StringBuilder();
+ for (XSLFTextParagraph p : _paragraphs) {
+ if (out.length() > 0) out.append('\n');
+ out.append(p.getText());
+ }
+ return out.toString();
+ }
+
+ public List<XSLFTextParagraph> getTextParagraphs() {
+ return _paragraphs;
+ }
+
+ public XSLFTextParagraph addNewTextParagraph() {
+ CTTextBody txBody = getTextBody(true);
+ CTTextParagraph p = txBody.addNewP();
+ XSLFTextParagraph paragraph = new XSLFTextParagraph(p, this);
+ _paragraphs.add(paragraph);
+ return paragraph;
+ }
+
+ /**
+ * Specifies a solid color fill. The shape is filled entirely with the specified color.
+ *
+ * @param color the solid color fill.
+ * The value of <code>null</code> unsets the solidFIll attribute from the underlying xml
+ */
+ public void setFillColor(Color color) {
+ CTShapeProperties spPr = getSpPr();
+ if (color == null) {
+ if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
+ }
+ else {
+ CTSolidColorFillProperties fill = spPr.isSetSolidFill() ? spPr.getSolidFill() : spPr.addNewSolidFill();
+
+ CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
+ rgb.setVal(new byte[]{(byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()});
+
+ fill.setSrgbClr(rgb);
+ }
+ }
+
+ /**
+ *
+ * @return solid fill color of null if not set
+ */
+ public Color getFillColor(){
+ CTShapeProperties spPr = getSpPr();
+ if(!spPr.isSetSolidFill() ) return null;
+
+ CTSolidColorFillProperties fill = spPr.getSolidFill();
+ if(!fill.isSetSrgbClr()) {
+ // TODO for now return null for all colors except explicit RGB
+ return null;
+ }
+ byte[] val = fill.getSrgbClr().getVal();
+ return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
+ }
+
+ /**
+ * Sets the type of vertical alignment for the text.
+ * One of the <code>Anchor*</code> constants defined in this class.
+ *
+ * @param anchor - the type of alignment. Default is {@link org.apache.poi.xslf.usermodel.VerticalAlignment#TOP}
+ */
+ public void setVerticalAlignment(VerticalAlignment anchor){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(anchor == null) {
+ if(bodyPr.isSetAnchor()) bodyPr.unsetAnchor();
+ } else {
+ bodyPr.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
+ }
+ }
+ }
+
+ /**
+ * Returns the type of vertical alignment for the text.
+ *
+ * @return the type of alignment
+ */
+ public VerticalAlignment getVerticalAlignment(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ STTextAnchoringType.Enum val = bodyPr.getAnchor();
+ if(val != null){
+ return VerticalAlignment.values()[val.intValue() - 1];
+ }
+ }
+ return VerticalAlignment.TOP;
+ }
+
+ /**
+ *
+ * @param orientation vertical orientation of the text
+ */
+ public void setTextDirection(TextDirection orientation){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(orientation == null) {
+ if(bodyPr.isSetVert()) bodyPr.unsetVert();
+ } else {
+ bodyPr.setVert(STTextVerticalType.Enum.forInt(orientation.ordinal() + 1));
+ }
+ }
+ }
+
+ /**
+ * @return vertical orientation of the text
+ */
+ public TextDirection getTextDirection(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ STTextVerticalType.Enum val = bodyPr.getVert();
+ if(val != null){
+ return TextDirection.values()[val.intValue() - 1];
+ }
+ }
+ return TextDirection.HORIZONTAL;
+ }
+ /**
+ * Returns the distance (in points) between the bottom of the text frame
+ * and the bottom of the inscribed rectangle of the shape that contains the text.
+ *
+ * @return the bottom margin or -1 if not set
+ */
+ public double getMarginBottom(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ return bodyPr.isSetBIns() ? Units.toPoints(bodyPr.getBIns()) : -1;
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the distance (in points) between the left edge of the text frame
+ * and the left edge of the inscribed rectangle of the shape that contains
+ * the text.
+ *
+ * @return the left margin
+ */
+ public double getMarginLeft(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ return bodyPr.isSetLIns() ? Units.toPoints(bodyPr.getLIns()) : -1;
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the distance (in points) between the right edge of the
+ * text frame and the right edge of the inscribed rectangle of the shape
+ * that contains the text.
+ *
+ * @return the right margin
+ */
+ public double getMarginRight(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ return bodyPr.isSetRIns() ? Units.toPoints(bodyPr.getRIns()) : -1;
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the distance (in points) between the top of the text frame
+ * and the top of the inscribed rectangle of the shape that contains the text.
+ *
+ * @return the top margin
+ */
+ public double getMarginTop(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ return bodyPr.isSetTIns() ? Units.toPoints(bodyPr.getTIns()) : -1;
+ }
+ return -1;
+ }
+
+ /**
+ * Sets the botom margin.
+ * @see #getMarginBottom()
+ *
+ * @param margin the bottom margin
+ */
+ public void setMarginBottom(double margin){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(margin == -1) bodyPr.unsetBIns();
+ else bodyPr.setBIns(Units.toEMU(margin));
+ }
+ }
+
+ /**
+ * Sets the left margin.
+ * @see #getMarginLeft()
+ *
+ * @param margin the left margin
+ */
+ public void setMarginLeft(double margin){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(margin == -1) bodyPr.unsetLIns();
+ else bodyPr.setLIns(Units.toEMU(margin));
+ }
+ }
+
+ /**
+ * Sets the right margin.
+ * @see #getMarginRight()
+ *
+ * @param margin the right margin
+ */
+ public void setMarginRight(double margin){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(margin == -1) bodyPr.unsetRIns();
+ else bodyPr.setRIns(Units.toEMU(margin));
+ }
+ }
+
+ /**
+ * Sets the top margin.
+ * @see #getMarginTop()
+ *
+ * @param margin the top margin
+ */
+ public void setMarginTop(double margin){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(margin == -1) bodyPr.unsetTIns();
+ else bodyPr.setTIns(Units.toEMU(margin));
+ }
+ }
+
+
+ /**
+ * Returns the value indicating word wrap.
+ * One of the <code>Wrap*</code> constants defined in this class.
+ *
+ * @return the value indicating word wrap
+ */
+ public boolean getWordWrap(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ return bodyPr.getWrap() == STTextWrappingType.SQUARE;
+ }
+ return false;
+ }
+
+ /**
+ * Specifies how the text should be wrapped
+ *
+ * @param wrap the value indicating how the text should be wrapped
+ */
+ public void setWordWrap(boolean wrap){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ bodyPr.setWrap(wrap ? STTextWrappingType.SQUARE : STTextWrappingType.NONE);
+ }
+ }
+
+ /**
+ *
+ * Specifies that a shape should be auto-fit to fully contain the text described within it.
+ * Auto-fitting is when text within a shape is scaled in order to contain all the text inside
+ *
+ * @param value type of autofit
+ */
+ public void setTextAutofit(TextAutofit value){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(bodyPr.isSetSpAutoFit()) bodyPr.unsetSpAutoFit();
+ if(bodyPr.isSetNoAutofit()) bodyPr.unsetNoAutofit();
+ if(bodyPr.isSetNormAutofit()) bodyPr.unsetNormAutofit();
+
+ switch(value){
+ case NONE: bodyPr.addNewNoAutofit(); break;
+ case NORMAL: bodyPr.addNewNormAutofit(); break;
+ case SHAPE: bodyPr.addNewSpAutoFit(); break;
+ }
+ }
+ }
+
+ /**
+ *
+ * @return type of autofit
+ */
+ public TextAutofit getTextAutofit(){
+ CTTextBodyProperties bodyPr = getTextBodyPr();
+ if (bodyPr != null) {
+ if(bodyPr.isSetNoAutofit()) return TextAutofit.NONE;
+ else if (bodyPr.isSetNormAutofit()) return TextAutofit.NORMAL;
+ else if (bodyPr.isSetSpAutoFit()) return TextAutofit.SHAPE;
+ }
+ return TextAutofit.NORMAL;
+ }
+
+ protected CTTextBodyProperties getTextBodyPr(){
+ CTTextBody textBody = getTextBody(false);
+ return textBody == null ? null : textBody.getBodyPr();
+ }
+
+
+ protected abstract CTTextBody getTextBody(boolean create);
+} \ No newline at end of file
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
index 69be4b7a6b..efed3ca034 100755
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java
@@ -210,7 +210,7 @@ public class TestXSLFAutoShape extends TestCase {
assertSame(r, p.getTextRuns().get(0));
assertEquals(-1.0, r.getFontSize());
- assertFalse(r.getXmlObject().isSetRPr());
+ assertFalse(r.getXmlObject().getRPr().isSetSz());
r.setFontSize(10.0);
assertTrue(r.getXmlObject().isSetRPr());
assertEquals(1000, r.getXmlObject().getRPr().getSz());
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java
new file mode 100644
index 0000000000..fe968b0b7f
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFHyperlink.java
@@ -0,0 +1,102 @@
+/* ====================================================================
+ 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.xslf.usermodel;
+
+import junit.framework.TestCase;
+
+import java.awt.*;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.GeneralPath;
+import java.util.*;
+import java.util.List;
+import java.net.URI;
+
+import org.apache.poi.xslf.XSLFTestDataSamples;
+import org.apache.poi.xssf.usermodel.XSSFTable;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.opc.TargetMode;
+
+/**
+ * @author Yegor Kozlov
+ */
+public class TestXSLFHyperlink extends TestCase {
+
+ public void testRead(){
+ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
+
+ XSLFSlide slide = ppt.getSlides()[4];
+ XSLFShape[] shapes = slide.getShapes();
+ XSLFTable tbl = (XSLFTable)shapes[0];
+ XSLFTableCell cell1 = tbl.getRows().get(1).getCells().get(0);
+ assertEquals("Web Page", cell1.getText());
+ XSLFHyperlink link1 = cell1.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
+ assertNotNull(link1);
+ assertEquals(URI.create("http://poi.apache.org/"), link1.getTargetURI());
+
+ XSLFTableCell cell2 = tbl.getRows().get(2).getCells().get(0);
+ assertEquals("Place in this document", cell2.getText());
+ XSLFHyperlink link2 = cell2.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
+ assertNotNull(link2);
+ assertEquals(URI.create("/ppt/slides/slide2.xml"), link2.getTargetURI());
+
+ XSLFTableCell cell3 = tbl.getRows().get(3).getCells().get(0);
+ assertEquals("Email", cell3.getText());
+ XSLFHyperlink link3 = cell3.getTextParagraphs().get(0).getTextRuns().get(0).getHyperlink();
+ assertNotNull(link3);
+ assertEquals(URI.create("mailto:dev@poi.apache.org?subject=Hi%20There"), link3.getTargetURI());
+ }
+
+ public void testCreate() throws Exception {
+ XMLSlideShow ppt = new XMLSlideShow();
+ XSLFSlide slide1 = ppt.createSlide();
+ XSLFSlide slide2 = ppt.createSlide();
+
+ int numRel = slide1.getPackagePart().getRelationships().size();
+ assertEquals(1, numRel);
+ XSLFTextBox sh1 = slide1.createTextBox();
+ XSLFTextRun r1 = sh1.addNewTextParagraph().addNewTextRun();
+ r1.setText("Web Page");
+ XSLFHyperlink link1 = r1.createHyperlink();
+ link1.setAddress("http://poi.apache.org/");
+ assertEquals(URI.create("http://poi.apache.org/"), link1.getTargetURI());
+ assertEquals(numRel + 1, slide1.getPackagePart().getRelationships().size());
+
+ String id1 = link1.getXmlObject().getId();
+ assertNotNull(id1);
+ PackageRelationship rel1 = slide1.getPackagePart().getRelationship(id1);
+ assertNotNull(rel1);
+ assertEquals(id1, rel1.getId());
+ assertEquals(TargetMode.EXTERNAL, rel1.getTargetMode());
+ assertEquals(XSLFRelation.HYPERLINK.getRelation(), rel1.getRelationshipType());
+
+ XSLFTextBox sh2 = slide1.createTextBox();
+ XSLFTextRun r2 = sh2.addNewTextParagraph().addNewTextRun();
+ r2.setText("Place in this document");
+ XSLFHyperlink link2 = r2.createHyperlink();
+ link2.setAddress(slide2);
+ assertEquals(URI.create("/ppt/slides/slide2.xml"), link2.getTargetURI());
+ assertEquals(numRel + 2, slide1.getPackagePart().getRelationships().size());
+
+ String id2 = link2.getXmlObject().getId();
+ assertNotNull(id2);
+ PackageRelationship rel2 = slide1.getPackagePart().getRelationship(id2);
+ assertNotNull(rel2);
+ assertEquals(id2, rel2.getId());
+ assertEquals(TargetMode.INTERNAL, rel2.getTargetMode());
+ assertEquals(XSLFRelation.SLIDE.getRelation(), rel2.getRelationshipType());
+ }
+} \ No newline at end of file
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
index ca3d82f975..ecdcdd032d 100755
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFShape.java
@@ -31,7 +31,6 @@ public class TestXSLFShape extends TestCase {
public void testReadTextShapes() {
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
XSLFSlide[] slides = ppt.getSlides();
- assertEquals(3, slides.length);
XSLFSlide slide1 = slides[0];
XSLFShape[] shapes1 = slide1.getShapes();
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
index 9c7d131d80..9ffe69fe98 100755
--- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSlide.java
@@ -30,7 +30,6 @@ public class TestXSLFSlide extends TestCase {
public void testReadShapes(){
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
XSLFSlide[] slides = ppt.getSlides();
- assertEquals(3, slides.length);
XSLFSlide slide1 = slides[0];
XSLFShape[] shapes1 = slide1.getShapes();
@@ -85,6 +84,14 @@ public class TestXSLFSlide extends TestCase {
assertTrue(groupShapes[2] instanceof XSLFAutoShape);
assertEquals("Right Arrow 3", groupShapes[2].getShapeName());
+
+ XSLFSlide slide4 = slides[3];
+ XSLFShape[] shapes4 = slide4.getShapes();
+ assertEquals(1, shapes4.length);
+ assertTrue(shapes4[0] instanceof XSLFTable);
+ XSLFTable tbl = (XSLFTable)shapes4[0];
+ assertEquals(3, tbl.getNumberOfColumns());
+ assertEquals(6, tbl.getNumberOfRows());
}
public void testCreateSlide(){
diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java
new file mode 100644
index 0000000000..a5cdb0d6ca
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java
@@ -0,0 +1,150 @@
+/* ====================================================================
+ 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.xslf.usermodel;
+
+import junit.framework.TestCase;
+
+import java.awt.*;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.GeneralPath;
+import java.util.*;
+import java.util.List;
+
+import org.apache.poi.xslf.XSLFTestDataSamples;
+import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
+
+/**
+ * @author Yegor Kozlov
+ */
+public class TestXSLFTable extends TestCase {
+
+ public void testRead(){
+ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
+
+ XSLFSlide slide = ppt.getSlides()[3];
+ XSLFShape[] shapes = slide.getShapes();
+ assertEquals(1, shapes.length);
+ assertTrue(shapes[0] instanceof XSLFTable);
+ XSLFTable tbl = (XSLFTable)shapes[0];
+ assertEquals(3, tbl.getNumberOfColumns());
+ assertEquals(6, tbl.getNumberOfRows());
+ assertNotNull(tbl.getCTTable());
+
+ List<XSLFTableRow> rows = tbl.getRows();
+ assertEquals(6, rows.size());
+
+ assertEquals(90.0, tbl.getColumnWidth(0));
+ assertEquals(240.0, tbl.getColumnWidth(1));
+ assertEquals(150.0, tbl.getColumnWidth(2));
+
+ for(XSLFTableRow row : tbl){
+ // all rows have the same height
+ assertEquals(29.2, row.getHeight());
+ }
+
+ XSLFTableRow row0 = rows.get(0);
+ List<XSLFTableCell> cells0 = row0.getCells();
+ assertEquals(3, cells0.size());
+ assertEquals("header1", cells0.get(0).getText());
+ assertEquals("header2", cells0.get(1).getText());
+ assertEquals("header3", cells0.get(2).getText());
+
+ XSLFTableRow row1 = rows.get(1);
+ List<XSLFTableCell> cells1 = row1.getCells();
+ assertEquals(3, cells1.size());
+ assertEquals("A1", cells1.get(0).getText());
+ assertEquals("B1", cells1.get(1).getText());
+ assertEquals("C1", cells1.get(2).getText());
+ }
+
+ public void testCreate() {
+ XMLSlideShow ppt = new XMLSlideShow();
+ XSLFSlide slide = ppt.createSlide();
+
+ XSLFTable tbl = slide.createTable();
+ assertNotNull(tbl.getCTTable());
+ assertNotNull(tbl.getCTTable().getTblGrid());
+ assertNotNull(tbl.getCTTable().getTblPr());
+ assertTrue(tbl.getXmlObject() instanceof CTGraphicalObjectFrame);
+ assertEquals("Table 1", tbl.getShapeName());
+ assertEquals(2, tbl.getShapeId());
+ assertEquals(0, tbl.getRows().size());
+ assertEquals(0, tbl.getCTTable().sizeOfTrArray());
+ assertEquals(0, tbl.getCTTable().getTblGrid().sizeOfGridColArray());
+
+ assertEquals(0, tbl.getNumberOfColumns());
+ assertEquals(0, tbl.getNumberOfRows());
+
+ XSLFTableRow row0 = tbl.addRow();
+ assertNotNull(row0.getXmlObject());
+ assertEquals(1, tbl.getNumberOfRows());
+ assertSame(row0, tbl.getRows().get(0));
+ assertEquals(20.0, row0.getHeight());
+ row0.setHeight(30.0);
+ assertEquals(30.0, row0.getHeight());
+
+ assertEquals(0, row0.getCells().size());
+ XSLFTableCell cell0 = row0.addCell();
+ assertNotNull(cell0.getXmlObject());
+ // by default table cell has no borders
+ assertTrue(cell0.getXmlObject().getTcPr().getLnB().isSetNoFill());
+ assertTrue(cell0.getXmlObject().getTcPr().getLnT().isSetNoFill());
+ assertTrue(cell0.getXmlObject().getTcPr().getLnL().isSetNoFill());
+ assertTrue(cell0.getXmlObject().getTcPr().getLnR().isSetNoFill());
+
+ assertSame(cell0, row0.getCells().get(0));
+ assertEquals(1, tbl.getNumberOfColumns());
+ assertEquals(100.0, tbl.getColumnWidth(0));
+ cell0.addNewTextParagraph().addNewTextRun().setText("POI");
+ assertEquals("POI", cell0.getText());
+
+ XSLFTableCell cell1 = row0.addCell();
+ assertSame(cell1, row0.getCells().get(1));
+ assertEquals(2, tbl.getNumberOfColumns());
+ assertEquals(100.0, tbl.getColumnWidth(1));
+ cell1.addNewTextParagraph().addNewTextRun().setText("Apache");
+ assertEquals("Apache", cell1.getText());
+
+ assertEquals(1.0, cell1.getBorderBottom());
+ cell1.setBorderBottom(2.0);
+ assertEquals(2.0, cell1.getBorderBottom());
+ assertNull(cell1.getBorderBottomColor());
+ cell1.setBorderBottomColor(Color.yellow);
+ assertEquals(Color.yellow, cell1.getBorderBottomColor());
+
+ assertEquals(1.0, cell1.getBorderTop());
+ cell1.setBorderTop(2.0);
+ assertEquals(2.0, cell1.getBorderTop());
+ assertNull(cell1.getBorderTopColor());
+ cell1.setBorderTopColor(Color.yellow);
+ assertEquals(Color.yellow, cell1.getBorderTopColor());
+
+ assertEquals(1.0, cell1.getBorderLeft());
+ cell1.setBorderLeft(2.0);
+ assertEquals(2.0, cell1.getBorderLeft());
+ assertNull(cell1.getBorderLeftColor());
+ cell1.setBorderLeftColor(Color.yellow);
+ assertEquals(Color.yellow, cell1.getBorderLeftColor());
+
+ assertEquals(1.0, cell1.getBorderRight());
+ cell1.setBorderRight(2.0);
+ assertEquals(2.0, cell1.getBorderRight());
+ assertNull(cell1.getBorderRightColor());
+ cell1.setBorderRightColor(Color.yellow);
+ assertEquals(Color.yellow, cell1.getBorderRightColor());
+ }
+} \ No newline at end of file
diff --git a/test-data/slideshow/shapes.pptx b/test-data/slideshow/shapes.pptx
index 0b3861228d..cf017a873a 100755
--- a/test-data/slideshow/shapes.pptx
+++ b/test-data/slideshow/shapes.pptx
Binary files differ