]> source.dussan.org Git - poi.git/commitdiff
#65612 - XSLF CustomGeometry - replace XmlStreamReader access with XmlBeans delegate
authorAndreas Beeker <kiwiwings@apache.org>
Sun, 3 Oct 2021 21:05:19 +0000 (21:05 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Sun, 3 Oct 2021 21:05:19 +0000 (21:05 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1893859 13f79535-47bb-0310-9956-ffa450edef68

53 files changed:
build.gradle
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustPoint.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustValue.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFArcTo.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFConnectionSite.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCurveTo.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCustomGeometry.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFGuide.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFLineTo.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFMoveTo.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPath.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPolarAdjustHandle.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFQuadTo.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFXYAdjustHandle.java [new file with mode: 0644]
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFBackground.java
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java
poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTable.java
poi-ooxml/src/main/java/org/apache/poi/xslf/util/PPTX2PNG.java
poi-ooxml/src/main/java9/module-info.class
poi-ooxml/src/main/java9/module-info.java
poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java
poi-ooxml/src/test/java9/module-info.class
poi-ooxml/src/test/java9/module-info.java
poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java
poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java
poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java
poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java
poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java
poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java
poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java
poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java
poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java [new file with mode: 0644]
poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java
poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java
poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java [new file with mode: 0644]
poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java

index 70c22c2f157cec0c31cceb13e206fb215f44a512..81230377d46eabca1e559cc68ab6b5480f86b171 100644 (file)
@@ -136,6 +136,7 @@ subprojects {
             resolutionStrategy {
                 force "commons-io:commons-io:${commonsIoVersion}"
                 force 'org.slf4j:slf4j-api:1.7.32'
+                force 'com.fasterxml.woodstox:woodstox-core:6.2.6'
             }
         }
     }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustPoint.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustPoint.java
new file mode 100644 (file)
index 0000000..cd1a161
--- /dev/null
@@ -0,0 +1,66 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFAdjustPoint implements AdjustPointIf {
+
+    private final CTAdjPoint2D pnt;
+
+    public XSLFAdjustPoint(CTAdjPoint2D pnt) {
+        this.pnt = pnt;
+    }
+
+    @Override
+    public String getX() {
+        return pnt.xgetX().getStringValue();
+    }
+
+    @Override
+    public void setX(String value) {
+        pnt.setX(value);
+    }
+
+    @Override
+    public boolean isSetX() {
+        return pnt.xgetX() != null;
+    }
+
+    @Override
+    public String getY() {
+        return pnt.xgetY().getStringValue();
+    }
+
+    @Override
+    public void setY(String value) {
+        pnt.setY(value);
+    }
+
+    @Override
+    public boolean isSetY() {
+        return pnt.xgetY() != null;
+
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustValue.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFAdjustValue.java
new file mode 100644 (file)
index 0000000..a8d9f97
--- /dev/null
@@ -0,0 +1,32 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustValueIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFAdjustValue extends XSLFGuide implements AdjustValueIf {
+    public XSLFAdjustValue(CTGeomGuide guide) {
+        super(guide);
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFArcTo.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFArcTo.java
new file mode 100644 (file)
index 0000000..887ec63
--- /dev/null
@@ -0,0 +1,75 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.ArcToCommandIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFArcTo implements ArcToCommandIf {
+    private final CTPath2DArcTo arc;
+
+    public XSLFArcTo(CTPath2DArcTo arc) {
+        this.arc = arc;
+    }
+
+    @Override
+    public String getHR() {
+        return arc.xgetHR().getStringValue();
+    }
+
+    @Override
+    public void setHR(String hr) {
+        arc.setHR(hr);
+    }
+
+    @Override
+    public String getWR() {
+        return arc.xgetHR().getStringValue();
+    }
+
+    @Override
+    public void setWR(String wr) {
+        arc.setWR(wr);
+    }
+
+    @Override
+    public String getStAng() {
+        return arc.xgetStAng().getStringValue();
+    }
+
+    @Override
+    public void setStAng(String stAng) {
+        arc.setStAng(stAng);
+    }
+
+    @Override
+    public String getSwAng() {
+        return arc.xgetSwAng().getStringValue();
+    }
+
+    @Override
+    public void setSwAng(String swAng) {
+        arc.setSwAng(swAng);
+    }
+
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFConnectionSite.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFConnectionSite.java
new file mode 100644 (file)
index 0000000..e7a6274
--- /dev/null
@@ -0,0 +1,71 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.sl.draw.geom.ConnectionSiteIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFConnectionSite implements ConnectionSiteIf {
+
+    final CTConnectionSite cxn;
+
+    public XSLFConnectionSite(CTConnectionSite cxn) {
+        this.cxn = cxn;
+    }
+
+    @Override
+    public AdjustPointIf getPos() {
+        return new XSLFAdjustPoint(cxn.getPos());
+    }
+
+    @Override
+    public void setPos(AdjustPointIf pos) {
+        CTAdjPoint2D p = cxn.getPos();
+        if (p == null) {
+            p = cxn.addNewPos();
+        }
+        p.setX(pos.getX());
+        p.setY(pos.getY());
+    }
+
+    @Override
+    public String getAng() {
+        return cxn.xgetAng().getStringValue();
+    }
+
+    /**
+     * Sets the value of the ang property.
+     */
+    @Override
+    public void setAng(String value) {
+        cxn.setAng(value);
+    }
+
+    @Override
+    public boolean isSetAng() {
+        return cxn.xgetAng() == null;
+    }
+
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCurveTo.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCurveTo.java
new file mode 100644 (file)
index 0000000..0639be8
--- /dev/null
@@ -0,0 +1,79 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.sl.draw.geom.CurveToCommandIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFCurveTo implements CurveToCommandIf {
+    private final CTPath2DCubicBezierTo bezier;
+
+    public XSLFCurveTo(CTPath2DCubicBezierTo bezier) {
+        this.bezier = bezier;
+    }
+
+    @Override
+    public XSLFAdjustPoint getPt1() {
+        return new XSLFAdjustPoint(bezier.getPtArray(0));
+    }
+
+    @Override
+    public void setPt1(AdjustPointIf pt1) {
+        CTAdjPoint2D xpt = getOrCreate(0);
+        xpt.setX(pt1.getX());
+        xpt.setY(pt1.getY());
+    }
+
+    @Override
+    public XSLFAdjustPoint getPt2() {
+        return new XSLFAdjustPoint(bezier.getPtArray(1));
+    }
+
+    @Override
+    public void setPt2(AdjustPointIf pt2) {
+        CTAdjPoint2D xpt = getOrCreate(1);
+        xpt.setX(pt2.getX());
+        xpt.setY(pt2.getY());
+    }
+
+    @Override
+    public XSLFAdjustPoint getPt3() {
+        return new XSLFAdjustPoint(bezier.getPtArray(2));
+    }
+
+    @Override
+    public void setPt3(AdjustPointIf pt3) {
+        CTAdjPoint2D xpt = getOrCreate(2);
+        xpt.setX(pt3.getX());
+        xpt.setY(pt3.getY());
+    }
+
+    private CTAdjPoint2D getOrCreate(int idx) {
+        for (int i=(idx+1)-bezier.sizeOfPtArray(); i > 0; i--) {
+            bezier.addNewPt();
+        }
+        return bezier.getPtArray(idx);
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCustomGeometry.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFCustomGeometry.java
new file mode 100644 (file)
index 0000000..0755042
--- /dev/null
@@ -0,0 +1,89 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.CustomGeometry;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjustHandleList;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DList;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFCustomGeometry {
+    public static CustomGeometry convertCustomGeometry(CTCustomGeometry2D custGeom) {
+        CustomGeometry cg = new CustomGeometry();
+
+        if (custGeom.isSetAhLst()) {
+            CTAdjustHandleList ahLst = custGeom.getAhLst();
+            for (CTXYAdjustHandle xy : ahLst.getAhXYArray()) {
+                cg.addAdjustHandle(new XSLFXYAdjustHandle(xy));
+            }
+            for (CTPolarAdjustHandle pol : ahLst.getAhPolarArray()) {
+                cg.addAdjustHandle(new XSLFPolarAdjustHandle(pol));
+            }
+        }
+
+        if (custGeom.isSetAvLst()) {
+            CTGeomGuideList avLst = custGeom.getAvLst();
+            for (CTGeomGuide gg : avLst.getGdArray()) {
+                cg.addAdjustGuide(new XSLFAdjustValue(gg));
+            }
+        }
+
+        if (custGeom.isSetGdLst()) {
+            CTGeomGuideList gdLst = custGeom.getGdLst();
+            for (CTGeomGuide gg : gdLst.getGdArray()) {
+                cg.addGeomGuide(new XSLFGuide(gg));
+            }
+        }
+
+        if (custGeom.isSetRect()) {
+            CTGeomRect r = custGeom.getRect();
+            cg.setTextBounds(
+                r.xgetL().getStringValue(),
+                r.xgetT().getStringValue(),
+                r.xgetR().getStringValue(),
+                r.xgetB().getStringValue());
+        }
+
+        if (custGeom.isSetCxnLst()) {
+            for (CTConnectionSite cxn : custGeom.getCxnLst().getCxnArray()) {
+                cg.addConnectionSite(new XSLFConnectionSite((cxn)));
+            }
+        }
+
+        CTPath2DList pl = custGeom.getPathLst();
+        if (pl != null) {
+            for (CTPath2D p : pl.getPathArray()) {
+                cg.addPath(new XSLFPath(p));
+            }
+        }
+
+        return cg;
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFGuide.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFGuide.java
new file mode 100644 (file)
index 0000000..5f970c2
--- /dev/null
@@ -0,0 +1,55 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.GuideIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFGuide implements GuideIf {
+    final CTGeomGuide guide;
+
+    public XSLFGuide(CTGeomGuide guide) {
+        this.guide = guide;
+    }
+
+    @Override
+    public String getName() {
+        return guide.getName();
+    }
+
+    @Override
+    public void setName(String name) {
+        guide.setName(name);
+    }
+
+    @Override
+    public String getFmla() {
+        return guide.getFmla();
+    }
+
+    @Override
+    public void setFmla(String fmla) {
+        guide.setFmla(fmla);
+    }
+
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFLineTo.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFLineTo.java
new file mode 100644 (file)
index 0000000..595f991
--- /dev/null
@@ -0,0 +1,52 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.sl.draw.geom.LineToCommandIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFLineTo implements LineToCommandIf {
+
+    private final CTPath2DLineTo lineTo;
+
+    public XSLFLineTo(CTPath2DLineTo lineTo) {
+        this.lineTo = lineTo;
+    }
+
+    @Override
+    public AdjustPointIf getPt() {
+        return new XSLFAdjustPoint(lineTo.getPt());
+    }
+
+    @Override
+    public void setPt(AdjustPointIf pt) {
+        CTAdjPoint2D xpt = lineTo.getPt();
+        if (xpt == null) {
+            xpt = lineTo.addNewPt();
+        }
+        xpt.setX(pt.getX());
+        xpt.setY(pt.getY());
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFMoveTo.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFMoveTo.java
new file mode 100644 (file)
index 0000000..65d6c0c
--- /dev/null
@@ -0,0 +1,52 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.sl.draw.geom.MoveToCommandIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFMoveTo implements MoveToCommandIf {
+
+    private final CTPath2DMoveTo moveTo;
+
+    public XSLFMoveTo(CTPath2DMoveTo moveTo) {
+        this.moveTo = moveTo;
+    }
+
+    @Override
+    public XSLFAdjustPoint getPt() {
+        return new XSLFAdjustPoint(moveTo.getPt());
+    }
+
+    @Override
+    public void setPt(AdjustPointIf pt) {
+        CTAdjPoint2D xpt = moveTo.getPt();
+        if (xpt == null) {
+            xpt = moveTo.addNewPt();
+        }
+        xpt.setX(pt.getX());
+        xpt.setY(pt.getY());
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPath.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPath.java
new file mode 100644 (file)
index 0000000..984d37c
--- /dev/null
@@ -0,0 +1,178 @@
+/* ====================================================================
+   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.draw.geom;
+
+import java.awt.geom.Path2D;
+
+import org.apache.poi.sl.draw.geom.ClosePathCommand;
+import org.apache.poi.sl.draw.geom.Context;
+import org.apache.poi.sl.draw.geom.PathCommand;
+import org.apache.poi.sl.draw.geom.PathIf;
+import org.apache.poi.sl.usermodel.PaintStyle;
+import org.apache.poi.util.Beta;
+import org.apache.xmlbeans.XmlCursor;
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DClose;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo;
+import org.openxmlformats.schemas.drawingml.x2006.main.STPathFillMode;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFPath implements PathIf {
+
+    private final CTPath2D pathXml;
+
+    public XSLFPath(CTPath2D pathXml) {
+        this.pathXml = pathXml;
+    }
+
+    @Override
+    public void addCommand(PathCommand cmd) {
+        // not supported
+    }
+
+    @Override
+    public Path2D.Double getPath(Context ctx) {
+        Path2D.Double path2D = new Path2D.Double();
+        XmlCursor cur = pathXml.newCursor();
+        try {
+            for (boolean hasNext = cur.toFirstChild(); hasNext; hasNext = cur.toNextSibling()) {
+                XmlObject xo = cur.getObject();
+                PathCommand pc;
+                if (xo instanceof CTPath2DArcTo) {
+                    pc = new XSLFArcTo((CTPath2DArcTo) xo);
+                } else if (xo instanceof CTPath2DCubicBezierTo) {
+                    pc = new XSLFCurveTo((CTPath2DCubicBezierTo) xo);
+                } else if (xo instanceof CTPath2DMoveTo) {
+                    pc = new XSLFMoveTo((CTPath2DMoveTo) xo);
+                } else if (xo instanceof CTPath2DLineTo) {
+                    pc = new XSLFLineTo((CTPath2DLineTo) xo);
+                } else if (xo instanceof CTPath2DQuadBezierTo) {
+                    pc = new XSLFQuadTo((CTPath2DQuadBezierTo) xo);
+                } else if (xo instanceof CTPath2DClose) {
+                    pc = new ClosePathCommand();
+                } else {
+                    continue;
+                }
+                pc.execute(path2D, ctx);
+            }
+        } finally {
+            cur.dispose();
+        }
+        return path2D;
+    }
+
+    @Override
+    public boolean isStroked() {
+        return pathXml.getStroke();
+    }
+
+    @Override
+    public void setStroke(boolean stroke) {
+        pathXml.setStroke(stroke);
+    }
+
+    @Override
+    public boolean isFilled() {
+        return pathXml.getFill() != STPathFillMode.NONE;
+    }
+
+    @Override
+    public PaintStyle.PaintModifier getFill() {
+        switch (pathXml.getFill().intValue()) {
+            default:
+            case STPathFillMode.INT_NONE:
+                return PaintStyle.PaintModifier.NONE;
+            case STPathFillMode.INT_NORM:
+                return PaintStyle.PaintModifier.NORM;
+            case STPathFillMode.INT_LIGHTEN:
+                return PaintStyle.PaintModifier.LIGHTEN;
+            case STPathFillMode.INT_LIGHTEN_LESS:
+                return PaintStyle.PaintModifier.LIGHTEN_LESS;
+            case STPathFillMode.INT_DARKEN:
+                return PaintStyle.PaintModifier.DARKEN;
+            case STPathFillMode.INT_DARKEN_LESS:
+                return PaintStyle.PaintModifier.DARKEN_LESS;
+        }
+    }
+
+    @Override
+    public void setFill(PaintStyle.PaintModifier fill) {
+        STPathFillMode.Enum f;
+        switch (fill) {
+            default:
+            case NONE:
+                f = STPathFillMode.NONE;
+                break;
+            case NORM:
+                f = STPathFillMode.NORM;
+                break;
+            case LIGHTEN:
+                f = STPathFillMode.LIGHTEN;
+                break;
+            case LIGHTEN_LESS:
+                f = STPathFillMode.LIGHTEN_LESS;
+                break;
+            case DARKEN:
+                f = STPathFillMode.DARKEN;
+                break;
+            case DARKEN_LESS:
+                f = STPathFillMode.DARKEN_LESS;
+                break;
+        }
+        pathXml.setFill(f);
+    }
+
+    @Override
+    public long getW() {
+        return pathXml.getW();
+    }
+
+    @Override
+    public void setW(long w) {
+        pathXml.setW(w);
+    }
+
+    @Override
+    public long getH() {
+        return pathXml.getH();
+    }
+
+    @Override
+    public void setH(long h) {
+        pathXml.setH(h);
+    }
+
+    @Override
+    public boolean isExtrusionOk() {
+        return pathXml.getExtrusionOk();
+    }
+
+    @Override
+    public void setExtrusionOk(boolean extrusionOk) {
+        pathXml.setExtrusionOk(extrusionOk);
+    }
+
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPolarAdjustHandle.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFPolarAdjustHandle.java
new file mode 100644 (file)
index 0000000..ba08638
--- /dev/null
@@ -0,0 +1,36 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustHandle;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFPolarAdjustHandle implements AdjustHandle {
+    final CTPolarAdjustHandle xobj;
+
+    public XSLFPolarAdjustHandle(CTPolarAdjustHandle xobj) {
+        this.xobj = xobj;
+    }
+
+    // define more getter/setter when needed
+}
\ No newline at end of file
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFQuadTo.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFQuadTo.java
new file mode 100644 (file)
index 0000000..5a38aa4
--- /dev/null
@@ -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.xslf.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustPointIf;
+import org.apache.poi.sl.draw.geom.QuadToCommandIf;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFQuadTo implements QuadToCommandIf {
+
+    private final CTPath2DQuadBezierTo bezier;
+
+    public XSLFQuadTo(CTPath2DQuadBezierTo bezier) {
+        this.bezier = bezier;
+    }
+
+    @Override
+    public AdjustPointIf getPt1() {
+        return new XSLFAdjustPoint(bezier.getPtArray(0));
+    }
+
+    @Override
+    public void setPt1(AdjustPointIf pt1) {
+
+    }
+
+    @Override
+    public AdjustPointIf getPt2() {
+        return new XSLFAdjustPoint(bezier.getPtArray(1));
+    }
+
+    @Override
+    public void setPt2(AdjustPointIf pt2) {
+
+    }
+}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFXYAdjustHandle.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/draw/geom/XSLFXYAdjustHandle.java
new file mode 100644 (file)
index 0000000..56a2713
--- /dev/null
@@ -0,0 +1,35 @@
+/* ====================================================================
+   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.draw.geom;
+
+import org.apache.poi.sl.draw.geom.AdjustHandle;
+import org.apache.poi.util.Beta;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle;
+
+/**
+ * Wrapper / delegate for XmlBeans custom geometry
+ */
+@Beta
+public class XSLFXYAdjustHandle implements AdjustHandle {
+    final CTXYAdjustHandle xobj;
+    public XSLFXYAdjustHandle(CTXYAdjustHandle xobj) {
+        this.xobj = xobj;
+    }
+
+    // define more getter/setter when needed
+}
index add51e6566e8b84a37a8bb7c6fce3f36306a8c26..67397d6c50848c1c9be04a72c1ca5f7df554b695 100644 (file)
@@ -75,6 +75,7 @@ public class XSLFBackground extends XSLFSimpleShape
         return bg.getBgPr();
     }
 
+    @Override
     public void setFillColor(Color color) {
         CTBackgroundProperties bgPr = getBgPr(true);
 
index 593a4ee1caac0f8bb14d051b117fd91281a0649f..838430cc02c9075d9a9365094d637067c1727105 100644 (file)
@@ -24,21 +24,16 @@ import java.awt.geom.Path2D;
 import java.awt.geom.PathIterator;
 import java.awt.geom.Rectangle2D;
 
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.poi.ooxml.POIXMLTypeLoader;
 import org.apache.poi.ooxml.util.POIXMLUnits;
 import org.apache.poi.sl.draw.geom.CustomGeometry;
-import org.apache.poi.sl.draw.geom.PresetGeometries;
 import org.apache.poi.sl.usermodel.FreeformShape;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
+import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry;
 import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
-import org.apache.xmlbeans.XmlOptions;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
 import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect;
@@ -135,18 +130,7 @@ public class XSLFFreeformShape extends XSLFAutoShape
             return null;
         }
 
-        XmlOptions xop = new XmlOptions(POIXMLTypeLoader.DEFAULT_XML_OPTIONS);
-        xop.setSaveOuter();
-
-        XMLStreamReader staxReader = ((CTShapeProperties)xo).getCustGeom().newXMLStreamReader(xop);
-        CustomGeometry custGeo = PresetGeometries.convertCustomGeometry(staxReader);
-        try {
-            staxReader.close();
-        } catch (XMLStreamException e) {
-            LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage());
-        }
-
-        return custGeo;
+        return XSLFCustomGeometry.convertCustomGeometry(((CTShapeProperties)xo).getCustGeom());
     }
 
     @Override
index f7424d1807f7091a63fbeed825844f2ffbff8b92..269a0df884c7b0bbb6e23eaa75d41cc0b2231d3e 100644 (file)
@@ -22,9 +22,6 @@ package org.apache.poi.xslf.usermodel;
 import java.awt.Color;
 import java.awt.geom.Rectangle2D;
 
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamReader;
-
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import org.apache.poi.ooxml.util.POIXMLUnits;
@@ -47,6 +44,7 @@ import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
 import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
 import org.apache.poi.util.Beta;
 import org.apache.poi.util.Units;
+import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry;
 import org.apache.poi.xslf.model.PropertyFetcher;
 import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFEffectProperties;
 import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFFillProperties;
@@ -240,7 +238,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
 
     /**
     * @param color  the color to paint the shape outline.
-     * A <code>null</code> value turns off the shape outline.
+     * A {@code null} value turns off the shape outline.
      */
     public void setLineColor(Color color) {
         CTLineProperties ln = getLn(this, true);
@@ -273,7 +271,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
 
     /**
      *
-     * @return the color of the shape outline or <code>null</code>
+     * @return the color of the shape outline or {@code null}
      * if outline is turned off
      */
     @SuppressWarnings("WeakerAccess")
@@ -351,7 +349,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
 
     /**
      *
-     * @param width line width in points. <code>0</code> means no line
+     * @param width line width in points. {@code 0} means no line
      */
     @SuppressWarnings("WeakerAccess")
     public void setLineWidth(double width) {
@@ -386,7 +384,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
     }
 
     /**
-     * @return line width in points. <code>0</code> means no line.
+     * @return line width in points. {@code 0} means no line.
      */
     @SuppressWarnings("WeakerAccess")
     public double getLineWidth() {
@@ -709,14 +707,7 @@ public abstract class XSLFSimpleShape extends XSLFShape
                 throw new IllegalStateException("Unknown shape geometry: " + name + ", available geometries are: " + dict.keySet());
             }
         } else if (gp.isSetCustGeom()){
-            XMLStreamReader staxReader = gp.getCustGeom().newXMLStreamReader();
-            geom = PresetGeometries.convertCustomGeometry(staxReader);
-            try {
-                staxReader.close();
-            }
-            catch (XMLStreamException e) {
-                LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage());
-            }
+            geom = XSLFCustomGeometry.convertCustomGeometry(gp.getCustGeom());
         } else {
             geom = dict.get("rect");
         }
index d2adc919e1709ccb5e3c0d53255550f1d424755e..2974b46b59701376b7607c3f2604696e99096c3d 100644 (file)
@@ -27,6 +27,8 @@ import java.util.List;
 
 import javax.xml.namespace.QName;
 
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.poi.ooxml.util.POIXMLUnits;
 import org.apache.poi.sl.draw.DrawFactory;
 import org.apache.poi.sl.draw.DrawTableShape;
@@ -52,6 +54,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra
 public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow>,
     TableShape<XSLFShape,XSLFTextParagraph> {
     /* package */ static final String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";
+    private static final Logger LOG = LogManager.getLogger(XSLFTable.class);
 
     private final CTTable _table;
     private final List<XSLFTableRow> _rows;
@@ -425,13 +428,17 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow
                 for (int col2=col+1; col2<col+tc.getGridSpan(); col2++) {
                     assert(col2 < cols);
                     XSLFTableCell tc2 = getCell(row, col2);
-                    assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1);
+                    if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) {
+                        LOG.warn("invalid table span - rendering result is probably wrong");
+                    }
                     mergedBounds.add(tc2.getAnchor());
                 }
                 for (int row2=row+1; row2<row+tc.getRowSpan(); row2++) {
                     assert(row2 < rows);
                     XSLFTableCell tc2 = getCell(row2, col);
-                    assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1);
+                    if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) {
+                        LOG.warn("invalid table span - rendering result is probably wrong");
+                    }
                     mergedBounds.add(tc2.getAnchor());
                 }
                 tc.setAnchor(mergedBounds);
index 987c177f1f461f0d53b61c3d4ca4a4df2a4156d6..a52356dd6af40f5ef9008473d6976a6ab28143d3 100644 (file)
@@ -477,7 +477,13 @@ public final class PPTX2PNG {
         if (outfile != null) {
             return outfile;
         }
-        String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, file.getName());
+
+        String fileName = file.getName();
+        if ("stdin".equals(fileName)) {
+            fileName += ".ext";
+        }
+
+        String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, fileName);
         String outpat = (proxy.getSlideCount() > 1 && slideNo > 0 ? outPattern : outPattern.replaceAll("-?\\$\\{slideno}", ""));
         return INPUT_PATTERN.matcher(inname).replaceAll(outpat);
     }
index 6e355946d831ce4876d2fafb5c8470b24705e9a4..fd29b43f37a2f11a6243e50773ba0f7279e184f8 100644 (file)
Binary files a/poi-ooxml/src/main/java9/module-info.class and b/poi-ooxml/src/main/java9/module-info.class differ
index a81eba56044d26e9d84529bf658af1171993d1ae..b11e2a9ebed0713889ce4447e87024aeca6986c0 100644 (file)
@@ -72,6 +72,7 @@ module org.apache.poi.ooxml {
     exports org.apache.poi.xssf.streaming;
     exports org.apache.poi.xssf.util;
     exports org.apache.poi.xslf.draw;
+    exports org.apache.poi.xslf.draw.geom;
     exports org.apache.poi.xslf.usermodel;
     exports org.apache.poi.xslf.model;
     exports org.apache.poi.xslf.util;
index c94cf59580b16eb65fbea23c5a907c6d0a649850..a27719217235c436bfd6474840bcaba407eee627 100644 (file)
@@ -35,6 +35,7 @@ import java.util.zip.ZipFile;
 
 import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
 import org.apache.commons.compress.archivers.sevenz.SevenZFile;
+import org.apache.commons.io.FilenameUtils;
 import org.apache.poi.POIDataSamples;
 import org.apache.poi.poifs.filesystem.FileMagic;
 import org.apache.poi.xslf.util.PPTX2PNG;
@@ -126,7 +127,6 @@ class TestPPTX2PNG {
                 "-format", format, // png,gif,jpg,svg,pdf or null for test
                 "-slide", "-1", // -1 for all
                 "-outdir", tmpDir.getCanonicalPath(),
-                "-outpat", "${basename}-${slideno}-${ext}.${format}",
                 // "-dump", new File("build/tmp/", pptFile+".json").getCanonicalPath(),
                 "-dump", "null",
                 "-quiet",
@@ -157,17 +157,26 @@ class TestPPTX2PNG {
             args.add("GBK");
         }
 
+        final String basename = FilenameUtils.getBaseName(fileName);
+        final String ext = FilenameUtils.getExtension(fileName);
+
         if (fileObj instanceof ZipEntry) {
             ZipEntry ze = (ZipEntry)fileObj;
             ZipFile zf = (ZipFile)fileContainer;
             System.setIn(zf.getInputStream(ze));
+            args.add("-outpat");
+            args.add(basename+"-${slideno}-"+ext+".${format}");
             args.add("stdin");
         } else if (fileObj instanceof SevenZArchiveEntry) {
             SevenZArchiveEntry ze = (SevenZArchiveEntry)fileObj;
             SevenZFile zf = (SevenZFile)fileContainer;
             System.setIn(zf.getInputStream(ze));
+            args.add("-outpat");
+            args.add(basename+"-${slideno}-"+ext+".${format}");
             args.add("stdin");
         } else if (fileObj instanceof File) {
+            args.add("-outpat");
+            args.add("${basename}-${slideno}-${ext}.${format}");
             args.add(((File)fileObj).getAbsolutePath());
         }
 
index d5e072f647d1dad105c852a83d40017a43a2669c..012028ad0bb1c8f981a0d6149130a5c73cf4124e 100644 (file)
Binary files a/poi-ooxml/src/test/java9/module-info.class and b/poi-ooxml/src/test/java9/module-info.class differ
index 4d7612ba00a6f666940d06828be988d04c2038b6..3bb546f87fd4cf703c75641345f47ab67612efc2 100644 (file)
@@ -70,6 +70,7 @@ module org.apache.poi.ooxml {
     exports org.apache.poi.xssf.streaming;
     exports org.apache.poi.xssf.util;
     exports org.apache.poi.xslf.draw;
+    exports org.apache.poi.xslf.draw.geom;
     exports org.apache.poi.xslf.usermodel;
     exports org.apache.poi.xslf.model;
     exports org.apache.poi.xslf.util;
index 88b7eea935830637b558c9f83d471667148997ed..4ed23e03d9aa94d5514a3242b95b19d81ff3df31 100644 (file)
@@ -37,6 +37,7 @@ import org.apache.poi.sl.draw.geom.Context;
 import org.apache.poi.sl.draw.geom.CustomGeometry;
 import org.apache.poi.sl.draw.geom.Outline;
 import org.apache.poi.sl.draw.geom.Path;
+import org.apache.poi.sl.draw.geom.PathIf;
 import org.apache.poi.sl.usermodel.LineDecoration;
 import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape;
 import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
@@ -85,7 +86,7 @@ public class DrawSimpleShape extends DrawShape {
 
             PaintModifier pm = null;
             for (Outline o : elems) {
-                Path path = o.getPath();
+                PathIf path = o.getPath();
                 if (path.isFilled()) {
                     PaintModifier pmOld = pm;
                     pm = path.getFill();
@@ -169,7 +170,7 @@ public class DrawSimpleShape extends DrawShape {
 
         for(Outline o : lst){
             java.awt.Shape s = o.getOutline();
-            Path p = o.getPath();
+            PathIf p = o.getPath();
             graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
 
             if(p.isFilled()) {
@@ -197,10 +198,12 @@ public class DrawSimpleShape extends DrawShape {
         double lineWidth = Math.max(2.5, stroke.getLineWidth());
 
         Rectangle2D anchor = getAnchor(graphics, getShape());
-        double x2 = anchor.getX() + anchor.getWidth(),
-               y2 = anchor.getY() + anchor.getHeight();
-
-        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
+        double x2 = 0, y2 = 0, alpha = 0;
+        if (anchor != null) {
+            x2 = anchor.getX() + anchor.getWidth();
+            y2 = anchor.getY() + anchor.getHeight();
+            alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
+        }
 
         AffineTransform at = new AffineTransform();
         java.awt.Shape tailShape = null;
@@ -273,9 +276,12 @@ public class DrawSimpleShape extends DrawShape {
         double lineWidth = Math.max(2.5, stroke.getLineWidth());
 
         Rectangle2D anchor = getAnchor(graphics, getShape());
-        double x1 = anchor.getX(), y1 = anchor.getY();
-
-        double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
+        double x1 = 0, y1 = 0, alpha = 0;
+        if (anchor != null) {
+            x1 = anchor.getX();
+            y1 = anchor.getY();
+            alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
+        }
 
         AffineTransform at = new AffineTransform();
         java.awt.Shape headShape = null;
@@ -362,7 +368,7 @@ public class DrawSimpleShape extends DrawShape {
 
         for (Outline o : outlines) {
             java.awt.Shape s = o.getOutline();
-            Path p = o.getPath();
+            PathIf p = o.getPath();
             graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
             graphics.setPaint(shadowColor);
 
@@ -389,7 +395,7 @@ public class DrawSimpleShape extends DrawShape {
         if(anchor == null) {
             return lst;
         }
-        for (Path p : geom) {
+        for (PathIf p : geom) {
 
             double w = p.getW(), h = p.getH(), scaleX, scaleY;
             if (w == -1) {
index 27c5e09a7fbbe6be029f1df4f321ca2c1bd8e15d..4ceea4fbd2db09d613ee9e77d9c02b6f04de5fb7 100644 (file)
@@ -39,66 +39,39 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_AdjPoint2D")
-public class AdjustPoint {
+public class AdjustPoint implements AdjustPointIf {
 
     // @XmlAttribute(name = "x", required = true)
     private String x;
     // @XmlAttribute(name = "y", required = true)
     private String y;
 
-
-    /**
-     * Gets the value of the x property.
-     *
-     * @return
-     *     possible object is
-     *     {@link String }
-     *
-     */
+    @Override
     public String getX() {
         return x;
     }
 
-    /**
-     * Sets the value of the x property.
-     *
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *
-     */
+    @Override
     public void setX(String value) {
         this.x = value;
     }
 
+    @Override
     public boolean isSetX() {
         return (this.x!= null);
     }
 
-    /**
-     * Gets the value of the y property.
-     *
-     * @return
-     *     possible object is
-     *     {@link String }
-     *
-     */
+    @Override
     public String getY() {
         return y;
     }
 
-    /**
-     * Sets the value of the y property.
-     *
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *
-     */
+    @Override
     public void setY(String value) {
         this.y = value;
     }
 
+    @Override
     public boolean isSetY() {
         return (this.y!= null);
     }
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java
new file mode 100644 (file)
index 0000000..00625b5
--- /dev/null
@@ -0,0 +1,44 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+public interface AdjustPointIf {
+    /**
+     * Gets the value of the x property.
+     */
+    String getX();
+
+    /**
+     * Sets the value of the x property.
+     */
+    void setX(String value);
+
+    boolean isSetX();
+
+    /**
+     * Gets the value of the y property.
+     */
+    String getY();
+
+    /**
+     * Sets the value of the y property.
+     */
+    void setY(String value);
+
+    boolean isSetY();
+}
index 68570b1599f2866ad746fb21945409dd5e95a9b7..95fe6990227b9e0fc1b62aa43c325cc3f10ad31b 100644 (file)
@@ -22,12 +22,6 @@ package org.apache.poi.sl.draw.geom;
 /**
  * Represents a shape adjust values (see section 20.1.9.5 in the spec)
  */
-public class AdjustValue extends Guide {
+public class AdjustValue extends Guide implements AdjustValueIf {
 
-    @Override
-    public double evaluate(Context ctx){
-        String name = getName();
-        Guide adj = ctx.getAdjustValue(name);
-        return (adj != null) ? adj.evaluate(ctx) : super.evaluate(ctx);
-    }
 }
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java
new file mode 100644 (file)
index 0000000..24c69f4
--- /dev/null
@@ -0,0 +1,32 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+public interface AdjustValueIf extends GuideIf {
+    @Override
+    default double evaluate(Context ctx) {
+        return evaluateAdjustValue(ctx);
+    }
+
+    default double evaluateAdjustValue(Context ctx){
+        String name = getName();
+        GuideIf adj = ctx.getAdjustValue(name);
+        return (adj != null) ? adj.evaluate(ctx) : evaluateGuide(ctx);
+    }
+
+}
index 4ffddb86a0f0a3c4b0503d19e5dce09ce411934e..33e3c304a7f34d3518b28418ca9c16f968fa9bb4 100644 (file)
 
 package org.apache.poi.sl.draw.geom;
 
-import static org.apache.poi.sl.draw.geom.Formula.OOXML_DEGREE;
-
-import java.awt.geom.Arc2D;
-import java.awt.geom.Path2D;
-import java.awt.geom.Point2D;
 import java.util.Objects;
 
 import org.apache.poi.util.Internal;
@@ -57,7 +52,7 @@ import org.apache.poi.util.Internal;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DArcTo")
-public class ArcToCommand implements PathCommand {
+public class ArcToCommand implements ArcToCommandIf {
 
     // @XmlAttribute(name = "wR", required = true)
     private String wr;
@@ -68,51 +63,51 @@ public class ArcToCommand implements PathCommand {
     // @XmlAttribute(name = "swAng", required = true)
     private String swAng;
 
+    @Override
     public void setHR(String hr) {
         this.hr = hr;
     }
 
+    @Override
+    public String getHR() {
+        return hr;
+    }
+
+    @Override
+    public String getStAng() {
+        return stAng;
+    }
+
+    @Override
+    public String getWR() {
+        return wr;
+    }
+
+    @Override
     public void setWR(String wr) {
         this.wr = wr;
     }
 
+    @Override
     public void setStAng(String stAng) {
         this.stAng = stAng;
     }
 
-    public void setSwAng(String swAng) {
-        this.swAng = swAng;
+    @Override
+    public String getSwAng() {
+        return swAng;
     }
 
     @Override
-    public void execute(Path2D.Double path, Context ctx){
-        double rx = ctx.getValue(wr);
-        double ry = ctx.getValue(hr);
-        double ooStart = ctx.getValue(stAng) / OOXML_DEGREE;
-        double ooExtent = ctx.getValue(swAng) / OOXML_DEGREE;
-
-        // skew the angles for AWT output
-        double awtStart = convertOoxml2AwtAngle(ooStart, rx, ry);
-        double awtSweep = convertOoxml2AwtAngle(ooStart+ooExtent, rx, ry)-awtStart;
-
-        // calculate the inverse angle - taken from the (reversed) preset definition
-        double radStart = Math.toRadians(ooStart);
-        double invStart = Math.atan2(rx * Math.sin(radStart), ry * Math.cos(radStart));
-
-        Point2D pt = path.getCurrentPoint();
-        // calculate top/left corner
-        double x0 = pt.getX() - rx * Math.cos(invStart) - rx;
-        double y0 = pt.getY() - ry * Math.sin(invStart) - ry;
-
-        Arc2D arc = new Arc2D.Double(x0, y0, 2 * rx, 2 * ry, awtStart, awtSweep, Arc2D.OPEN);
-        path.append(arc, true);
+    public void setSwAng(String swAng) {
+        this.swAng = swAng;
     }
 
     /**
      * Arc2D angles are skewed, OOXML aren't ... so we need to unskew them<p>
      *
-     * Furthermore ooxml angle starts at the X-axis and increases clock-wise,
-     * where as Arc2D api states
+     * Furthermore, ooxml angle starts at the X-axis and increases clock-wise,
+     * whereas Arc2D api states
      * "45 degrees always falls on the line from the center of the ellipse to
      * the upper right corner of the framing rectangle"
      * so we need to reverse it
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java
new file mode 100644 (file)
index 0000000..6e5942e
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ *  ====================================================================
+ *    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.sl.draw.geom;
+
+import static org.apache.poi.sl.draw.geom.Formula.OOXML_DEGREE;
+
+import java.awt.geom.Arc2D;
+import java.awt.geom.Path2D;
+import java.awt.geom.Point2D;
+
+public interface ArcToCommandIf extends PathCommand {
+
+    void setHR(String hr);
+
+    void setWR(String wr);
+
+    void setStAng(String stAng);
+
+    void setSwAng(String swAng);
+
+    String getHR();
+
+    String getWR();
+
+    String getStAng();
+
+    String getSwAng();
+
+
+    @Override
+    default void execute(Path2D.Double path, Context ctx){
+        double rx = ctx.getValue(getWR());
+        double ry = ctx.getValue(getHR());
+        double ooStart = ctx.getValue(getStAng()) / OOXML_DEGREE;
+        double ooExtent = ctx.getValue(getSwAng()) / OOXML_DEGREE;
+
+        // skew the angles for AWT output
+        double awtStart = ArcToCommand.convertOoxml2AwtAngle(ooStart, rx, ry);
+        double awtSweep = ArcToCommand.convertOoxml2AwtAngle(ooStart+ooExtent, rx, ry)-awtStart;
+
+        // calculate the inverse angle - taken from the (reversed) preset definition
+        double radStart = Math.toRadians(ooStart);
+        double invStart = Math.atan2(rx * Math.sin(radStart), ry * Math.cos(radStart));
+
+        Point2D pt = path.getCurrentPoint();
+        // calculate top/left corner
+        double x0 = pt.getX() - rx * Math.cos(invStart) - rx;
+        double y0 = pt.getY() - ry * Math.sin(invStart) - ry;
+
+        Arc2D arc = new Arc2D.Double(x0, y0, 2 * rx, 2 * ry, awtStart, awtSweep, Arc2D.OPEN);
+        path.append(arc, true);
+    }
+
+
+}
index ab7a37a4441f50ed28fe2f026dee69d079db9d44..91d43323317db39b08da5e3dbab0a339af1f0998 100644 (file)
@@ -39,7 +39,7 @@ import java.awt.geom.Path2D;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DClose")
-public class ClosePathCommand implements PathCommand {
+public class ClosePathCommand implements ClosePathCommandIf {
 
     @Override
     public void execute(Path2D.Double path, Context ctx){
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java
new file mode 100644 (file)
index 0000000..b212c5d
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ *  ====================================================================
+ *    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.sl.draw.geom;
+
+public interface ClosePathCommandIf extends PathCommand {
+}
index 9f19ebccc64a580e53c4c297d861d0afc80dfee5..0ee7571ca4f3e7003e9b3b1a619aec1e591db87b 100644 (file)
@@ -41,64 +41,37 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_ConnectionSite", propOrder = {"pos"})
-public final class ConnectionSite {
+public final class ConnectionSite implements ConnectionSiteIf {
 
     // @XmlElement(required = true)
     private final AdjustPoint pos = new AdjustPoint();
     // @XmlAttribute(name = "ang", required = true)
     private String ang;
 
-    /**
-     * Gets the value of the pos property.
-     *
-     * @return
-     *     possible object is
-     *     {@link AdjustPoint }
-     *
-     */
+    @Override
     public AdjustPoint getPos() {
         return pos;
     }
 
-    /**
-     * Sets the value of the pos property.
-     *
-     * @param pos
-     *     allowed object is
-     *     {@link AdjustPoint }
-     *
-     */
-    public void setPos(AdjustPoint pos) {
+    @Override
+    public void setPos(AdjustPointIf pos) {
         if (pos != null) {
             this.pos.setX(pos.getX());
             this.pos.setY(pos.getY());
         }
     }
 
-    /**
-     * Gets the value of the ang property.
-     *
-     * @return
-     *     possible object is
-     *     {@link String }
-     *
-     */
+    @Override
     public String getAng() {
         return ang;
     }
 
-    /**
-     * Sets the value of the ang property.
-     *
-     * @param value
-     *     allowed object is
-     *     {@link String }
-     *
-     */
+    @Override
     public void setAng(String value) {
         this.ang = value;
     }
 
+    @Override
     public boolean isSetAng() {
         return (this.ang!= null);
     }
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java
new file mode 100644 (file)
index 0000000..68eccfc
--- /dev/null
@@ -0,0 +1,44 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+public interface ConnectionSiteIf {
+
+    /**
+     * Gets the value of the pos property.
+     */
+    AdjustPointIf getPos();
+
+    /**
+     * Sets the value of the pos property.
+     */
+    void setPos(AdjustPointIf pos);
+
+    /**
+     * Gets the value of the ang property.
+     */
+    String getAng();
+
+    /**
+     * Sets the value of the ang property.
+     */
+    void setAng(String value);
+
+    boolean isSetAng();
+
+}
index 3ac449592941dea0b7bf56f49c3f2dd1c0ed596f..2b7c571475e678108aae72fe43def3a2ba88162e 100644 (file)
@@ -34,14 +34,14 @@ public class Context {
     private final Map<String, Double> _ctx = new HashMap<>();
     private final IAdjustableShape _props;
     private final Rectangle2D _anchor;
-    
+
     public Context(CustomGeometry geom, Rectangle2D anchor, IAdjustableShape props){
         _props = props;
         _anchor = anchor;
-        for(Guide gd : geom.adjusts) {
+        for(GuideIf gd : geom.adjusts) {
             evaluate(gd);
         }
-        for(Guide gd : geom.guides) {
+        for(GuideIf gd : geom.guides) {
             evaluate(gd);
         }
     }
@@ -50,7 +50,7 @@ public class Context {
         return _anchor;
     }
 
-    Guide getAdjustValue(String name){
+    GuideIf getAdjustValue(String name){
         return _props.getAdjustValue(name);
     }
 
@@ -65,8 +65,8 @@ public class Context {
 
     public double evaluate(Formula fmla){
         double result = fmla.evaluate(this);
-        if (fmla instanceof Guide) {
-            String key = ((Guide)fmla).getName();
+        if (fmla instanceof GuideIf) {
+            String key = ((GuideIf)fmla).getName();
             if (key != null) {
                 _ctx.put(key, result);
             }
index 2e121c78934a31fd7fe4e943f9261486add118c1..01d3f726e5b19eb6ff9086c3eeed26afeafefe4e 100644 (file)
@@ -43,7 +43,7 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DCubicBezierTo", propOrder = {"pt"})
-public final class CurveToCommand implements PathCommand {
+public final class CurveToCommand implements CurveToCommandIf {
 
     // @XmlElement(required = true)
     private final AdjustPoint pt1 = new AdjustPoint();
@@ -52,38 +52,45 @@ public final class CurveToCommand implements PathCommand {
     // @XmlElement(required = true)
     private final AdjustPoint pt3 = new AdjustPoint();
 
-    public void setPt1(AdjustPoint pt1) {
+    @Override
+    public AdjustPoint getPt1() {
+        return pt1;
+    }
+
+    @Override
+    public void setPt1(AdjustPointIf pt1) {
         if (pt1 != null) {
             this.pt1.setX(pt1.getX());
             this.pt1.setY(pt1.getY());
         }
     }
 
-    public void setPt2(AdjustPoint pt2) {
+    @Override
+    public AdjustPoint getPt2() {
+        return pt2;
+    }
+
+    @Override
+    public void setPt2(AdjustPointIf pt2) {
         if (pt2 != null) {
             this.pt2.setX(pt2.getX());
             this.pt2.setY(pt2.getY());
         }
     }
 
-    public void setPt3(AdjustPoint pt3) {
+    @Override
+    public AdjustPoint getPt3() {
+        return pt3;
+    }
+
+    @Override
+    public void setPt3(AdjustPointIf pt3) {
         if (pt3 != null) {
             this.pt3.setX(pt3.getX());
             this.pt3.setY(pt3.getY());
         }
     }
 
-    @Override
-    public void execute(Path2D.Double path, Context ctx){
-        double x1 = ctx.getValue(pt1.getX());
-        double y1 = ctx.getValue(pt1.getY());
-        double x2 = ctx.getValue(pt2.getX());
-        double y2 = ctx.getValue(pt2.getY());
-        double x3 = ctx.getValue(pt3.getX());
-        double y3 = ctx.getValue(pt3.getY());
-        path.curveTo(x1, y1, x2, y2, x3, y3);
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java
new file mode 100644 (file)
index 0000000..2ea8030
--- /dev/null
@@ -0,0 +1,50 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+import java.awt.geom.Path2D;
+
+public interface CurveToCommandIf extends PathCommand {
+
+    AdjustPointIf getPt1();
+
+    void setPt1(AdjustPointIf pt1);
+
+    AdjustPointIf getPt2();
+
+    void setPt2(AdjustPointIf pt2);
+
+    AdjustPointIf getPt3();
+
+    void setPt3(AdjustPointIf pt3);
+
+
+    @Override
+    default void execute(Path2D.Double path, Context ctx){
+        AdjustPointIf pt1 = getPt1();
+        double x1 = ctx.getValue(pt1.getX());
+        double y1 = ctx.getValue(pt1.getY());
+        AdjustPointIf pt2 = getPt2();
+        double x2 = ctx.getValue(pt2.getX());
+        double y2 = ctx.getValue(pt2.getY());
+        AdjustPointIf pt3 = getPt3();
+        double x3 = ctx.getValue(pt3.getX());
+        double y3 = ctx.getValue(pt3.getY());
+        path.curveTo(x1, y1, x2, y2, x3, y3);
+    }
+}
index ff7a1c2f5f3bd008a0dafc90ea835841362647d8..84ef46357fcc5dfdd7a07a0e246d5a169cb51fa6 100644 (file)
@@ -49,19 +49,19 @@ import java.util.Objects;
  * &lt;/complexType&gt;
  * </pre>
  */
-public final class CustomGeometry implements Iterable<Path>{
-    final List<AdjustValue> adjusts = new ArrayList<>();
-    final List<Guide> guides = new ArrayList<>();
-    final List<Path> paths = new ArrayList<>();
+public final class CustomGeometry implements Iterable<PathIf>{
+    final List<AdjustValueIf> adjusts = new ArrayList<>();
+    final List<GuideIf> guides = new ArrayList<>();
+    final List<PathIf> paths = new ArrayList<>();
     final List<AdjustHandle> handles = new ArrayList<>();
-    final List<ConnectionSite> connections = new ArrayList<>();
+    final List<ConnectionSiteIf> connections = new ArrayList<>();
     Path textBounds;
 
-    public void addAdjustGuide(AdjustValue guide) {
+    public void addAdjustGuide(AdjustValueIf guide) {
         adjusts.add(guide);
     }
 
-    public void addGeomGuide(Guide guide) {
+    public void addGeomGuide(GuideIf guide) {
         guides.add(guide);
     }
 
@@ -69,11 +69,11 @@ public final class CustomGeometry implements Iterable<Path>{
         handles.add(handle);
     }
 
-    public void addConnectionSite(ConnectionSite connection) {
+    public void addConnectionSite(ConnectionSiteIf connection) {
         connections.add(connection);
     }
 
-    public void addPath(Path path) {
+    public void addPath(PathIf path) {
         paths.add(path);
     }
 
@@ -106,7 +106,7 @@ public final class CustomGeometry implements Iterable<Path>{
 
 
     @Override
-    public Iterator<Path> iterator() {
+    public Iterator<PathIf> iterator() {
         return paths.iterator();
     }
 
index 77da3920586fbb490314116e97d1f508f0c9a1b4..0a6af0730b095485c19d3ff30bff7046a05ffdb9 100644 (file)
 
 package org.apache.poi.sl.draw.geom;
 
-import static java.lang.Math.*;
-
 import java.util.Objects;
-import java.util.regex.Pattern;
 
 /**
  * <p>Java class for CT_GeomGuide complex type.
@@ -44,12 +41,7 @@ import java.util.regex.Pattern;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_GeomGuide")
-public class Guide implements Formula {
-    enum Op {
-        muldiv,addsub,adddiv,ifelse,val,abs,sqrt,max,min,at2,sin,cos,tan,cat2,sat2,pin,mod
-    }
-
-    private static final Pattern WHITESPACE = Pattern.compile("\\s+");
+public class Guide implements GuideIf {
 
     // @XmlAttribute(name = "name", required = true)
     // @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@@ -57,97 +49,27 @@ public class Guide implements Formula {
     // @XmlAttribute(name = "fmla", required = true)
     private String fmla;
 
-    private Op op;
-    private String[] operands;
 
+    @Override
     public String getName(){
         return name;
     }
 
+    @Override
     public void setName(String name) {
         this.name = name;
     }
 
+    @Override
     public String getFmla() {
         return fmla;
     }
 
+    @Override
     public void setFmla(String fmla) {
         this.fmla = fmla;
-        operands = WHITESPACE.split(fmla);
-        switch (operands[0]) {
-            case "*/": op = Op.muldiv; break;
-            case "+-": op = Op.addsub; break;
-            case "+/": op = Op.adddiv; break;
-            case "?:": op = Op.ifelse; break;
-            default: op = Op.valueOf(operands[0]); break;
-        }
     }
 
-    @Override
-    public double evaluate(Context ctx) {
-        double x = (operands.length > 1) ? ctx.getValue(operands[1]) : 0;
-        double y = (operands.length > 2) ? ctx.getValue(operands[2]) : 0;
-        double z = (operands.length > 3) ? ctx.getValue(operands[3]) : 0;
-        switch (op) {
-            case abs:
-                // Absolute Value Formula
-                return abs(x);
-            case adddiv:
-                // Add Divide Formula
-                return (z == 0) ? 0 : (x + y) / z;
-            case addsub:
-                // Add Subtract Formula
-                return (x + y) - z;
-            case at2:
-                // ArcTan Formula: "at2 x y" = arctan( y / z ) = value of this guide
-                return toDegrees(atan2(y, x)) * OOXML_DEGREE;
-            case cos:
-                // Cosine Formula: "cos x y" = (x * cos( y )) = value of this guide
-                return x * cos(toRadians(y / OOXML_DEGREE));
-            case cat2:
-                // Cosine ArcTan Formula: "cat2 x y z" = (x * cos(arctan(z / y) )) = value of this guide
-                return x * cos(atan2(z, y));
-            case ifelse:
-                // If Else Formula: "?: x y z" = if (x > 0), then y = value of this guide,
-                // else z = value of this guide
-                return x > 0 ? y : z;
-            case val:
-                // Literal Value Expression
-                return x;
-            case max:
-                // Maximum Value Formula
-                return max(x, y);
-            case min:
-                // Minimum Value Formula
-                return min(x, y);
-            case mod:
-                // Modulo Formula: "mod x y z" = sqrt(x^2 + b^2 + c^2) = value of this guide
-                return sqrt(x*x + y*y + z*z);
-            case muldiv:
-                // Multiply Divide Formula
-                return (z == 0) ? 0 : (x * y) / z;
-            case pin:
-                // Pin To Formula: "pin x y z" = if (y < x), then x = value of this guide
-                // else if (y > z), then z = value of this guide
-                // else y = value of this guide
-                return max(x, min(y, z));
-            case sat2:
-                // Sine ArcTan Formula: "sat2 x y z" = (x*sin(arctan(z / y))) = value of this guide
-                return x * sin(atan2(z, y));
-            case sin:
-                // Sine Formula: "sin x y" = (x * sin( y )) = value of this guide
-                return x * sin(toRadians(y / OOXML_DEGREE));
-            case sqrt:
-                // Square Root Formula: "sqrt x" = sqrt(x) = value of this guide
-                return sqrt(x);
-            case tan:
-                // Tangent Formula: "tan x y" = (x * tan( y )) = value of this guide
-                return x * tan(toRadians(y / OOXML_DEGREE));
-            default:
-                return 0;
-        }
-    }
 
     @Override
     public boolean equals(Object o) {
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java
new file mode 100644 (file)
index 0000000..cd6e26d
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ *  ====================================================================
+ *    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.sl.draw.geom;
+
+import static java.lang.Math.*;
+import static java.lang.Math.toRadians;
+
+import java.util.regex.Pattern;
+
+public interface GuideIf extends Formula {
+    enum Op {
+        muldiv,addsub,adddiv,ifelse,val,abs,sqrt,max,min,at2,sin,cos,tan,cat2,sat2,pin,mod
+    }
+
+    Pattern WHITESPACE = Pattern.compile("\\s+");
+
+    String getName();
+
+    void setName(String name);
+
+    String getFmla();
+
+    void setFmla(String fmla);
+
+    @Override
+    default double evaluate(Context ctx) {
+        return evaluateGuide(ctx);
+    }
+
+    default double evaluateGuide(Context ctx) {
+        Guide.Op op;
+        String[] operands = WHITESPACE.split(getFmla());
+        switch (operands[0]) {
+            case "*/": op = Guide.Op.muldiv; break;
+            case "+-": op = Guide.Op.addsub; break;
+            case "+/": op = Guide.Op.adddiv; break;
+            case "?:": op = Guide.Op.ifelse; break;
+            default: op = Guide.Op.valueOf(operands[0]); break;
+        }
+
+        double x = (operands.length > 1) ? ctx.getValue(operands[1]) : 0;
+        double y = (operands.length > 2) ? ctx.getValue(operands[2]) : 0;
+        double z = (operands.length > 3) ? ctx.getValue(operands[3]) : 0;
+        switch (op) {
+            case abs:
+                // Absolute Value Formula
+                return abs(x);
+            case adddiv:
+                // Add Divide Formula
+                return (z == 0) ? 0 : (x + y) / z;
+            case addsub:
+                // Add Subtract Formula
+                return (x + y) - z;
+            case at2:
+                // ArcTan Formula: "at2 x y" = arctan( y / z ) = value of this guide
+                return toDegrees(atan2(y, x)) * OOXML_DEGREE;
+            case cos:
+                // Cosine Formula: "cos x y" = (x * cos( y )) = value of this guide
+                return x * cos(toRadians(y / OOXML_DEGREE));
+            case cat2:
+                // Cosine ArcTan Formula: "cat2 x y z" = (x * cos(arctan(z / y) )) = value of this guide
+                return x * cos(atan2(z, y));
+            case ifelse:
+                // If Else Formula: "?: x y z" = if (x > 0), then y = value of this guide,
+                // else z = value of this guide
+                return x > 0 ? y : z;
+            case val:
+                // Literal Value Expression
+                return x;
+            case max:
+                // Maximum Value Formula
+                return max(x, y);
+            case min:
+                // Minimum Value Formula
+                return min(x, y);
+            case mod:
+                // Modulo Formula: "mod x y z" = sqrt(x^2 + b^2 + c^2) = value of this guide
+                return sqrt(x*x + y*y + z*z);
+            case muldiv:
+                // Multiply Divide Formula
+                return (z == 0) ? 0 : (x * y) / z;
+            case pin:
+                // Pin To Formula: "pin x y z" = if (y < x), then x = value of this guide
+                // else if (y > z), then z = value of this guide
+                // else y = value of this guide
+                return max(x, min(y, z));
+            case sat2:
+                // Sine ArcTan Formula: "sat2 x y z" = (x*sin(arctan(z / y))) = value of this guide
+                return x * sin(atan2(z, y));
+            case sin:
+                // Sine Formula: "sin x y" = (x * sin( y )) = value of this guide
+                return x * sin(toRadians(y / OOXML_DEGREE));
+            case sqrt:
+                // Square Root Formula: "sqrt x" = sqrt(x) = value of this guide
+                return sqrt(x);
+            case tan:
+                // Tangent Formula: "tan x y" = (x * tan( y )) = value of this guide
+                return x * tan(toRadians(y / OOXML_DEGREE));
+            default:
+                return 0;
+        }
+    }
+}
index 3145507dca1fc889dd284fa7acdedecb9a6ed95e..7d6a2d110248e98c07fd44bde66150f1c2b834a5 100644 (file)
@@ -31,5 +31,5 @@ public interface IAdjustableShape {
      * @param  name name of a adjust value, e.g. adj1
      * @return adjust guide defined in the shape or null
      */
-    Guide getAdjustValue(String name);
+    GuideIf getAdjustValue(String name);
 }
index b1965fab879ab96608228a219327ea56accc053f..b0ca664187e26555afb59042406fae5520a96e5f 100644 (file)
@@ -19,7 +19,6 @@
 
 package org.apache.poi.sl.draw.geom;
 
-import java.awt.geom.Path2D;
 import java.util.Objects;
 
 /**
@@ -43,29 +42,24 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DLineTo", propOrder = {"pt"})
-public final class LineToCommand implements PathCommand {
+public final class LineToCommand implements LineToCommandIf {
 
     // @XmlElement(required = true)
     private final AdjustPoint pt = new AdjustPoint();
 
+    @Override
     public AdjustPoint getPt() {
         return pt;
     }
 
-    public void setPt(AdjustPoint pt) {
+    @Override
+    public void setPt(AdjustPointIf pt) {
         if (pt != null) {
             this.pt.setX(pt.getX());
             this.pt.setY(pt.getY());
         }
     }
 
-    @Override
-    public void execute(Path2D.Double path, Context ctx){
-        double x = ctx.getValue(pt.getX());
-        double y = ctx.getValue(pt.getY());
-        path.lineTo(x, y);
-    }
-
 
     @Override
     public boolean equals(Object o) {
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java
new file mode 100644 (file)
index 0000000..d013e80
--- /dev/null
@@ -0,0 +1,35 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+import java.awt.geom.Path2D;
+
+public interface LineToCommandIf extends PathCommand {
+
+    AdjustPointIf getPt();
+
+    void setPt(AdjustPointIf pt);
+
+    @Override
+    default void execute(Path2D.Double path, Context ctx){
+        AdjustPointIf pt = getPt();
+        double x = ctx.getValue(pt.getX());
+        double y = ctx.getValue(pt.getY());
+        path.lineTo(x, y);
+    }
+}
index 6ebaa206b301d7b289df7861f93d97d758d8c482..a328c15bf641931ff8567e7891fb085dff6c9f71 100644 (file)
@@ -19,7 +19,6 @@
 
 package org.apache.poi.sl.draw.geom;
 
-import java.awt.geom.Path2D;
 import java.util.Objects;
 
 /**
@@ -43,30 +42,24 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DMoveTo", propOrder = {"pt"})
-public final class MoveToCommand implements PathCommand {
+public final class MoveToCommand implements MoveToCommandIf {
 
     // @XmlElement(required = true)
     private final AdjustPoint pt = new AdjustPoint();
 
+    @Override
     public AdjustPoint getPt() {
         return pt;
     }
 
-    public void setPt(AdjustPoint pt) {
+    @Override
+    public void setPt(AdjustPointIf pt) {
         if (pt != null) {
             this.pt.setX(pt.getX());
             this.pt.setY(pt.getY());
         }
     }
 
-    @Override
-    public void execute(Path2D.Double path, Context ctx){
-        double x = ctx.getValue(pt.getX());
-        double y = ctx.getValue(pt.getY());
-        path.moveTo(x, y);
-    }
-
-
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java
new file mode 100644 (file)
index 0000000..a4232e1
--- /dev/null
@@ -0,0 +1,35 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+import java.awt.geom.Path2D;
+
+public interface MoveToCommandIf extends PathCommand {
+
+    AdjustPointIf getPt();
+
+    void setPt(AdjustPointIf pt);
+
+    @Override
+    default void execute(Path2D.Double path, Context ctx){
+        AdjustPointIf pt = getPt();
+        double x = ctx.getValue(pt.getX());
+        double y = ctx.getValue(pt.getY());
+        path.moveTo(x, y);
+    }
+}
index 11e643dad2371903667b60f0c2cf3ee4a0373e90..59a9241b01dda94dae41dcd52506983e47cc3c0e 100644 (file)
@@ -22,15 +22,15 @@ package org.apache.poi.sl.draw.geom;
 import java.awt.Shape;
 
 public class Outline {
-    private Shape shape;
-    private Path path;
+    private final Shape shape;
+    private final PathIf path;
 
-    public Outline(Shape shape, Path path){
+    public Outline(Shape shape, PathIf path){
         this.shape = shape;
         this.path = path;
     }
 
-    public Path getPath(){
+    public PathIf getPath(){
         return path;
     }
 
index d9b209c4dedd46240f1217ef16d1d9b7a79dfa28..5a06e7216e3a70068e35437af855b32fa4e36269 100644 (file)
@@ -58,7 +58,7 @@ import org.apache.poi.sl.usermodel.PaintStyle.PaintModifier;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2D", propOrder = {"closeOrMoveToOrLnTo"})
-public final class Path {
+public final class Path implements PathIf {
 
     // @XmlElements({
     //     @XmlElement(name = "close", type = CTPath2DClose.class),
@@ -82,6 +82,7 @@ public final class Path {
 
 
 
+    @Override
     public void addCommand(PathCommand cmd){
         commands.add(cmd);
     }
@@ -89,6 +90,7 @@ public final class Path {
     /**
      * Convert the internal represenation to java.awt.geom.Path2D
      */
+    @Override
     public Path2D.Double getPath(Context ctx) {
         Path2D.Double path = new Path2D.Double();
         for(PathCommand cmd : commands) {
@@ -97,46 +99,57 @@ public final class Path {
         return path;
     }
 
+    @Override
     public boolean isStroked(){
         return stroke;
     }
 
+    @Override
     public void setStroke(boolean stroke) {
         this.stroke = stroke;
     }
 
+    @Override
     public boolean isFilled(){
         return fill != PaintModifier.NONE;
     }
 
+    @Override
     public PaintModifier getFill() {
         return fill;
     }
 
+    @Override
     public void setFill(PaintModifier fill) {
         this.fill = fill;
     }
 
+    @Override
     public long getW(){
         return w;
     }
 
+    @Override
     public void setW(long w) {
         this.w = w;
     }
 
+    @Override
     public long getH(){
         return h;
     }
 
+    @Override
     public void setH(long h) {
         this.h = h;
     }
 
+    @Override
     public boolean isExtrusionOk() {
         return extrusionOk;
     }
 
+    @Override
     public void setExtrusionOk(boolean extrusionOk) {
         this.extrusionOk = extrusionOk;
     }
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java
new file mode 100644 (file)
index 0000000..a02551e
--- /dev/null
@@ -0,0 +1,55 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+import java.awt.geom.Path2D;
+
+import org.apache.poi.sl.usermodel.PaintStyle;
+
+public interface PathIf {
+
+    void addCommand(PathCommand cmd);
+
+    /**
+     * Convert the internal represenation to java.awt.geom.Path2D
+     */
+    Path2D.Double getPath(Context ctx);
+
+    boolean isStroked();
+
+    void setStroke(boolean stroke);
+
+    boolean isFilled();
+
+    PaintStyle.PaintModifier getFill();
+
+    void setFill(PaintStyle.PaintModifier fill);
+
+    long getW();
+
+    void setW(long w);
+
+    long getH();
+
+    void setH(long h);
+
+    boolean isExtrusionOk();
+
+    void setExtrusionOk(boolean extrusionOk);
+
+}
\ No newline at end of file
index acde02c9454e2217a5c7a2e5bffb53762345d126..0f5a4902747ea8c21b42286e1cfff79c62e71e59 100644 (file)
@@ -31,13 +31,9 @@ import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.stream.StreamSource;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 import org.apache.poi.util.XMLHelper;
 
 public final class PresetGeometries {
-    private static final Logger LOG = LogManager.getLogger(PresetGeometries.class);
-
     private final Map<String, CustomGeometry> map = new TreeMap<>();
 
     private static class SingletonHelper{
@@ -57,7 +53,7 @@ public final class PresetGeometries {
                 try {
                     PresetParser p = new PresetParser(PresetParser.Mode.FILE);
                     p.parse(sr);
-                    p.getGeom().forEach(map::put);
+                    map.putAll(p.getGeom());
                 } finally {
                     sr.close();
                 }
@@ -67,20 +63,6 @@ public final class PresetGeometries {
         }
     }
 
-    /**
-     * Convert a single CustomGeometry object, i.e. from xmlbeans
-     */
-    public static CustomGeometry convertCustomGeometry(XMLStreamReader staxReader) {
-        try {
-            PresetParser p = new PresetParser(PresetParser.Mode.SHAPE);
-            p.parse(staxReader);
-            return p.getGeom().values().stream().findFirst().orElse(null);
-        } catch (XMLStreamException e) {
-            LOG.atError().withThrowable(e).log("Unable to parse single custom geometry");
-            return null;
-        }
-    }
-
     public CustomGeometry get(String name) {
         return name == null ? null : map.get(name);
     }
index 4278a0027403af750b1f480f7791bed217b9d566..1ec2a1dc8668ad0666fb2e848fece74e36001b96 100644 (file)
@@ -19,7 +19,6 @@
 
 package org.apache.poi.sl.draw.geom;
 
-import java.awt.geom.Path2D;
 import java.util.Objects;
 
 /**
@@ -43,36 +42,39 @@ import java.util.Objects;
  */
 // @XmlAccessorType(XmlAccessType.FIELD)
 // @XmlType(name = "CT_Path2DQuadBezierTo", propOrder = {"pt"})
-public final class QuadToCommand implements PathCommand {
+public final class QuadToCommand implements QuadToCommandIf {
 
     // @XmlElement(required = true)
     private final AdjustPoint pt1 = new AdjustPoint();
     // @XmlElement(required = true)
     private final AdjustPoint pt2 = new AdjustPoint();
 
-    public void setPt1(AdjustPoint pt1) {
+    @Override
+    public AdjustPoint getPt1() {
+        return pt1;
+    }
+
+    @Override
+    public void setPt1(AdjustPointIf pt1) {
         if (pt1 != null) {
             this.pt1.setX(pt1.getX());
             this.pt1.setY(pt1.getY());
         }
     }
 
-    public void setPt2(AdjustPoint pt2) {
+    @Override
+    public AdjustPoint getPt2() {
+        return pt2;
+    }
+
+    @Override
+    public void setPt2(AdjustPointIf pt2) {
         if (pt2 != null) {
             this.pt2.setX(pt2.getX());
             this.pt2.setY(pt2.getY());
         }
     }
 
-    @Override
-    public void execute(Path2D.Double path, Context ctx){
-        double x1 = ctx.getValue(pt1.getX());
-        double y1 = ctx.getValue(pt1.getY());
-        double x2 = ctx.getValue(pt2.getX());
-        double y2 = ctx.getValue(pt2.getY());
-        path.quadTo(x1, y1, x2, y2);
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java
new file mode 100644 (file)
index 0000000..db060c2
--- /dev/null
@@ -0,0 +1,42 @@
+/* ====================================================================
+   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.sl.draw.geom;
+
+import java.awt.geom.Path2D;
+
+public interface QuadToCommandIf extends PathCommand {
+
+    AdjustPointIf getPt1();
+
+    void setPt1(AdjustPointIf pt1);
+
+    AdjustPointIf getPt2();
+
+    void setPt2(AdjustPointIf pt2);
+
+    @Override
+    default void execute(Path2D.Double path, Context ctx){
+        AdjustPointIf pt1 = getPt1();
+        double x1 = ctx.getValue(pt1.getX());
+        double y1 = ctx.getValue(pt1.getY());
+        AdjustPointIf pt2 = getPt2();
+        double x2 = ctx.getValue(pt2.getX());
+        double y2 = ctx.getValue(pt2.getY());
+        path.quadTo(x1, y1, x2, y2);
+    }
+}
index 28849f77e9e1719c593e4b7b995e2baaf1ed6013..6cb3360b68ab646dbca2c6b64e73822835cbb7d9 100644 (file)
@@ -24,10 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertSame;
 
 import java.awt.geom.Path2D;
 import java.awt.geom.Rectangle2D;
-import java.net.URL;
-import java.util.Enumeration;
 
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 class TestPresetGeometries {
@@ -40,7 +37,7 @@ class TestPresetGeometries {
         for(String name : shapes.keySet()) {
             CustomGeometry geom = shapes.get(name);
             Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), presetName -> null);
-            for(Path p : geom){
+            for(PathIf p : geom){
                 Path2D path = p.getPath(ctx);
                 assertNotNull(path);
             }
@@ -49,24 +46,4 @@ class TestPresetGeometries {
         // we get the same instance on further calls
         assertSame(shapes, PresetGeometries.getInstance());
     }
-
-    @Disabled("problem solved? Turn back on if this debugging is still in process.")
-    void testCheckXMLParser() throws Exception{
-        // Gump reports a strange error because of an unavailable XML Parser, let's try to find out where
-        // this comes from
-        //
-        Enumeration<URL> resources = this.getClass().getClassLoader().getResources("META-INF/services/javax.xml.stream.XMLEventFactory");
-        printURLs(resources);
-        resources = ClassLoader.getSystemResources("META-INF/services/javax.xml.stream.XMLEventFactory");
-        printURLs(resources);
-        resources = ClassLoader.getSystemResources("org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml");
-        printURLs(resources);
-    }
-
-    private void printURLs(Enumeration<URL> resources) {
-        while(resources.hasMoreElements()) {
-            URL url = resources.nextElement();
-            System.out.println("URL: " + url);
-        }
-    }
 }