resolutionStrategy {
force "commons-io:commons-io:${commonsIoVersion}"
force 'org.slf4j:slf4j-api:1.7.32'
+ force 'com.fasterxml.woodstox:woodstox-core:6.2.6'
}
}
}
--- /dev/null
+/* ====================================================================
+ 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;
+
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+
+}
--- /dev/null
+/* ====================================================================
+ 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;
+ }
+
+}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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;
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+
+}
--- /dev/null
+/* ====================================================================
+ 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());
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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());
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+
+}
--- /dev/null
+/* ====================================================================
+ 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
--- /dev/null
+/* ====================================================================
+ 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) {
+
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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
+}
return bg.getBgPr();
}
+ @Override
public void setFillColor(Color color) {
CTBackgroundProperties bgPr = getBgPr(true);
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;
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
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;
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;
/**
* @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);
/**
*
- * @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")
/**
*
- * @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) {
}
/**
- * @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() {
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");
}
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;
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;
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);
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);
}
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;
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;
"-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",
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());
}
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;
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;
PaintModifier pm = null;
for (Outline o : elems) {
- Path path = o.getPath();
+ PathIf path = o.getPath();
if (path.isFilled()) {
PaintModifier pmOld = pm;
pm = path.getFill();
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()) {
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;
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;
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);
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) {
*/
// @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);
}
--- /dev/null
+/* ====================================================================
+ 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();
+}
/**
* 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);
- }
}
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+
+}
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;
*/
// @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;
// @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
--- /dev/null
+/*
+ * ====================================================================
+ * 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);
+ }
+
+
+}
*/
// @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){
--- /dev/null
+/*
+ * ====================================================================
+ * 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 {
+}
*/
// @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);
}
--- /dev/null
+/* ====================================================================
+ 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();
+
+}
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);
}
}
return _anchor;
}
- Guide getAdjustValue(String name){
+ GuideIf getAdjustValue(String name){
return _props.getAdjustValue(name);
}
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);
}
*/
// @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();
// @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;
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
* </complexType>
* </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);
}
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);
}
@Override
- public Iterator<Path> iterator() {
+ public Iterator<PathIf> iterator() {
return paths.iterator();
}
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.
*/
// @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)
// @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) {
--- /dev/null
+/*
+ * ====================================================================
+ * 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;
+ }
+ }
+}
* @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);
}
package org.apache.poi.sl.draw.geom;
-import java.awt.geom.Path2D;
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) {
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
package org.apache.poi.sl.draw.geom;
-import java.awt.geom.Path2D;
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;
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
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;
}
*/
// @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),
+ @Override
public void addCommand(PathCommand cmd){
commands.add(cmd);
}
/**
* 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) {
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;
}
--- /dev/null
+/* ====================================================================
+ 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
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{
try {
PresetParser p = new PresetParser(PresetParser.Mode.FILE);
p.parse(sr);
- p.getGeom().forEach(map::put);
+ map.putAll(p.getGeom());
} finally {
sr.close();
}
}
}
- /**
- * 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);
}
package org.apache.poi.sl.draw.geom;
-import java.awt.geom.Path2D;
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;
--- /dev/null
+/* ====================================================================
+ 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);
+ }
+}
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 {
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);
}
// 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);
- }
- }
}