diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2021-10-03 21:05:19 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2021-10-03 21:05:19 +0000 |
commit | 9f7085a281871ec65e638c2ac497f5981e40823c (patch) | |
tree | f7382f03d7ac66fb47ac3162ff77b1ff8d2fbf89 /poi/src | |
parent | 99fe7a9635d1edf8678c9ff21f439ce4856da344 (diff) | |
download | poi-9f7085a281871ec65e638c2ac497f5981e40823c.tar.gz poi-9f7085a281871ec65e638c2ac497f5981e40823c.zip |
#65612 - XSLF CustomGeometry - replace XmlStreamReader access with XmlBeans delegate
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1893859 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi/src')
29 files changed, 698 insertions, 315 deletions
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java b/poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java index 88b7eea935..4ed23e03d9 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/DrawSimpleShape.java @@ -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) { diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java index 27c5e09a7f..4ceea4fbd2 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPoint.java @@ -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 index 0000000000..00625b5839 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustPointIf.java @@ -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(); +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java index 68570b1599..95fe699022 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValue.java @@ -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 index 0000000000..24c69f48a1 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/AdjustValueIf.java @@ -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); + } + +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java index 4ffddb86a0..33e3c304a7 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommand.java @@ -19,11 +19,6 @@ 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 index 0000000000..6e5942ea89 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ArcToCommandIf.java @@ -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); + } + + +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java index ab7a37a444..91d4332331 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommand.java @@ -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 index 0000000000..b212c5db8c --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ClosePathCommandIf.java @@ -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 { +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java index 9f19ebccc6..0ee7571ca4 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSite.java @@ -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 index 0000000000..68eccfc9a1 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/ConnectionSiteIf.java @@ -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(); + +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java index 3ac4495929..2b7c571475 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/Context.java @@ -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); } diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java index 2e121c7893..01d3f726e5 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommand.java @@ -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,21 +52,39 @@ 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()); @@ -74,17 +92,6 @@ public final class CurveToCommand implements PathCommand { } @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; if (!(o instanceof CurveToCommand)) return false; 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 index 0000000000..2ea80301c6 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/CurveToCommandIf.java @@ -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); + } +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java index ff7a1c2f5f..84ef46357f 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/CustomGeometry.java @@ -49,19 +49,19 @@ import java.util.Objects; * </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); } @@ -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(); } diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java index 77da392058..0a6af0730b 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/Guide.java @@ -19,10 +19,7 @@ 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 index 0000000000..cd6e26d457 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/GuideIf.java @@ -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; + } + } +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java index 3145507dca..7d6a2d1102 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/IAdjustableShape.java @@ -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); } diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java index b1965fab87..b0ca664187 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommand.java @@ -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 index 0000000000..d013e80373 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/LineToCommandIf.java @@ -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); + } +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java index 6ebaa206b3..a328c15bf6 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommand.java @@ -19,7 +19,6 @@ package org.apache.poi.sl.draw.geom; -import java.awt.geom.Path2D; import java.util.Objects; /** @@ -43,16 +42,18 @@ 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()); @@ -60,14 +61,6 @@ public final class MoveToCommand implements PathCommand { } @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; if (!(o instanceof MoveToCommand)) return false; 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 index 0000000000..a4232e117b --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/MoveToCommandIf.java @@ -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); + } +} diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java index 11e643dad2..59a9241b01 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/Outline.java @@ -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; } diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java index d9b209c4de..5a06e7216e 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/Path.java @@ -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 index 0000000000..a02551e21d --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/PathIf.java @@ -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 diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java index acde02c945..0f5a490274 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/PresetGeometries.java @@ -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); } diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java index 4278a00274..1ec2a1dc86 100644 --- a/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommand.java @@ -19,7 +19,6 @@ package org.apache.poi.sl.draw.geom; -import java.awt.geom.Path2D; import java.util.Objects; /** @@ -43,21 +42,33 @@ 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()); @@ -65,15 +76,6 @@ public final class QuadToCommand implements PathCommand { } @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; if (!(o instanceof QuadToCommand)) return false; 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 index 0000000000..db060c27e3 --- /dev/null +++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/QuadToCommandIf.java @@ -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); + } +} diff --git a/poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java b/poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java index 28849f77e9..6cb3360b68 100644 --- a/poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java +++ b/poi/src/test/java/org/apache/poi/sl/draw/geom/TestPresetGeometries.java @@ -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); - } - } } |