git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1893859 13f79535-47bb-0310-9956-ffa450edef68tags/REL_5_2_0
@@ -136,6 +136,7 @@ subprojects { | |||
resolutionStrategy { | |||
force "commons-io:commons-io:${commonsIoVersion}" | |||
force 'org.slf4j:slf4j-api:1.7.32' | |||
force 'com.fasterxml.woodstox:woodstox-core:6.2.6' | |||
} | |||
} | |||
} |
@@ -0,0 +1,66 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFAdjustPoint implements AdjustPointIf { | |||
private final CTAdjPoint2D pnt; | |||
public XSLFAdjustPoint(CTAdjPoint2D pnt) { | |||
this.pnt = pnt; | |||
} | |||
@Override | |||
public String getX() { | |||
return pnt.xgetX().getStringValue(); | |||
} | |||
@Override | |||
public void setX(String value) { | |||
pnt.setX(value); | |||
} | |||
@Override | |||
public boolean isSetX() { | |||
return pnt.xgetX() != null; | |||
} | |||
@Override | |||
public String getY() { | |||
return pnt.xgetY().getStringValue(); | |||
} | |||
@Override | |||
public void setY(String value) { | |||
pnt.setY(value); | |||
} | |||
@Override | |||
public boolean isSetY() { | |||
return pnt.xgetY() != null; | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustValueIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFAdjustValue extends XSLFGuide implements AdjustValueIf { | |||
public XSLFAdjustValue(CTGeomGuide guide) { | |||
super(guide); | |||
} | |||
} |
@@ -0,0 +1,75 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.ArcToCommandIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFArcTo implements ArcToCommandIf { | |||
private final CTPath2DArcTo arc; | |||
public XSLFArcTo(CTPath2DArcTo arc) { | |||
this.arc = arc; | |||
} | |||
@Override | |||
public String getHR() { | |||
return arc.xgetHR().getStringValue(); | |||
} | |||
@Override | |||
public void setHR(String hr) { | |||
arc.setHR(hr); | |||
} | |||
@Override | |||
public String getWR() { | |||
return arc.xgetHR().getStringValue(); | |||
} | |||
@Override | |||
public void setWR(String wr) { | |||
arc.setWR(wr); | |||
} | |||
@Override | |||
public String getStAng() { | |||
return arc.xgetStAng().getStringValue(); | |||
} | |||
@Override | |||
public void setStAng(String stAng) { | |||
arc.setStAng(stAng); | |||
} | |||
@Override | |||
public String getSwAng() { | |||
return arc.xgetSwAng().getStringValue(); | |||
} | |||
@Override | |||
public void setSwAng(String swAng) { | |||
arc.setSwAng(swAng); | |||
} | |||
} |
@@ -0,0 +1,71 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.sl.draw.geom.ConnectionSiteIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFConnectionSite implements ConnectionSiteIf { | |||
final CTConnectionSite cxn; | |||
public XSLFConnectionSite(CTConnectionSite cxn) { | |||
this.cxn = cxn; | |||
} | |||
@Override | |||
public AdjustPointIf getPos() { | |||
return new XSLFAdjustPoint(cxn.getPos()); | |||
} | |||
@Override | |||
public void setPos(AdjustPointIf pos) { | |||
CTAdjPoint2D p = cxn.getPos(); | |||
if (p == null) { | |||
p = cxn.addNewPos(); | |||
} | |||
p.setX(pos.getX()); | |||
p.setY(pos.getY()); | |||
} | |||
@Override | |||
public String getAng() { | |||
return cxn.xgetAng().getStringValue(); | |||
} | |||
/** | |||
* Sets the value of the ang property. | |||
*/ | |||
@Override | |||
public void setAng(String value) { | |||
cxn.setAng(value); | |||
} | |||
@Override | |||
public boolean isSetAng() { | |||
return cxn.xgetAng() == null; | |||
} | |||
} |
@@ -0,0 +1,79 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.sl.draw.geom.CurveToCommandIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFCurveTo implements CurveToCommandIf { | |||
private final CTPath2DCubicBezierTo bezier; | |||
public XSLFCurveTo(CTPath2DCubicBezierTo bezier) { | |||
this.bezier = bezier; | |||
} | |||
@Override | |||
public XSLFAdjustPoint getPt1() { | |||
return new XSLFAdjustPoint(bezier.getPtArray(0)); | |||
} | |||
@Override | |||
public void setPt1(AdjustPointIf pt1) { | |||
CTAdjPoint2D xpt = getOrCreate(0); | |||
xpt.setX(pt1.getX()); | |||
xpt.setY(pt1.getY()); | |||
} | |||
@Override | |||
public XSLFAdjustPoint getPt2() { | |||
return new XSLFAdjustPoint(bezier.getPtArray(1)); | |||
} | |||
@Override | |||
public void setPt2(AdjustPointIf pt2) { | |||
CTAdjPoint2D xpt = getOrCreate(1); | |||
xpt.setX(pt2.getX()); | |||
xpt.setY(pt2.getY()); | |||
} | |||
@Override | |||
public XSLFAdjustPoint getPt3() { | |||
return new XSLFAdjustPoint(bezier.getPtArray(2)); | |||
} | |||
@Override | |||
public void setPt3(AdjustPointIf pt3) { | |||
CTAdjPoint2D xpt = getOrCreate(2); | |||
xpt.setX(pt3.getX()); | |||
xpt.setY(pt3.getY()); | |||
} | |||
private CTAdjPoint2D getOrCreate(int idx) { | |||
for (int i=(idx+1)-bezier.sizeOfPtArray(); i > 0; i--) { | |||
bezier.addNewPt(); | |||
} | |||
return bezier.getPtArray(idx); | |||
} | |||
} |
@@ -0,0 +1,89 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.CustomGeometry; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjustHandleList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTConnectionSite; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFCustomGeometry { | |||
public static CustomGeometry convertCustomGeometry(CTCustomGeometry2D custGeom) { | |||
CustomGeometry cg = new CustomGeometry(); | |||
if (custGeom.isSetAhLst()) { | |||
CTAdjustHandleList ahLst = custGeom.getAhLst(); | |||
for (CTXYAdjustHandle xy : ahLst.getAhXYArray()) { | |||
cg.addAdjustHandle(new XSLFXYAdjustHandle(xy)); | |||
} | |||
for (CTPolarAdjustHandle pol : ahLst.getAhPolarArray()) { | |||
cg.addAdjustHandle(new XSLFPolarAdjustHandle(pol)); | |||
} | |||
} | |||
if (custGeom.isSetAvLst()) { | |||
CTGeomGuideList avLst = custGeom.getAvLst(); | |||
for (CTGeomGuide gg : avLst.getGdArray()) { | |||
cg.addAdjustGuide(new XSLFAdjustValue(gg)); | |||
} | |||
} | |||
if (custGeom.isSetGdLst()) { | |||
CTGeomGuideList gdLst = custGeom.getGdLst(); | |||
for (CTGeomGuide gg : gdLst.getGdArray()) { | |||
cg.addGeomGuide(new XSLFGuide(gg)); | |||
} | |||
} | |||
if (custGeom.isSetRect()) { | |||
CTGeomRect r = custGeom.getRect(); | |||
cg.setTextBounds( | |||
r.xgetL().getStringValue(), | |||
r.xgetT().getStringValue(), | |||
r.xgetR().getStringValue(), | |||
r.xgetB().getStringValue()); | |||
} | |||
if (custGeom.isSetCxnLst()) { | |||
for (CTConnectionSite cxn : custGeom.getCxnLst().getCxnArray()) { | |||
cg.addConnectionSite(new XSLFConnectionSite((cxn))); | |||
} | |||
} | |||
CTPath2DList pl = custGeom.getPathLst(); | |||
if (pl != null) { | |||
for (CTPath2D p : pl.getPathArray()) { | |||
cg.addPath(new XSLFPath(p)); | |||
} | |||
} | |||
return cg; | |||
} | |||
} |
@@ -0,0 +1,55 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.GuideIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFGuide implements GuideIf { | |||
final CTGeomGuide guide; | |||
public XSLFGuide(CTGeomGuide guide) { | |||
this.guide = guide; | |||
} | |||
@Override | |||
public String getName() { | |||
return guide.getName(); | |||
} | |||
@Override | |||
public void setName(String name) { | |||
guide.setName(name); | |||
} | |||
@Override | |||
public String getFmla() { | |||
return guide.getFmla(); | |||
} | |||
@Override | |||
public void setFmla(String fmla) { | |||
guide.setFmla(fmla); | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.sl.draw.geom.LineToCommandIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFLineTo implements LineToCommandIf { | |||
private final CTPath2DLineTo lineTo; | |||
public XSLFLineTo(CTPath2DLineTo lineTo) { | |||
this.lineTo = lineTo; | |||
} | |||
@Override | |||
public AdjustPointIf getPt() { | |||
return new XSLFAdjustPoint(lineTo.getPt()); | |||
} | |||
@Override | |||
public void setPt(AdjustPointIf pt) { | |||
CTAdjPoint2D xpt = lineTo.getPt(); | |||
if (xpt == null) { | |||
xpt = lineTo.addNewPt(); | |||
} | |||
xpt.setX(pt.getX()); | |||
xpt.setY(pt.getY()); | |||
} | |||
} |
@@ -0,0 +1,52 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.sl.draw.geom.MoveToCommandIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFMoveTo implements MoveToCommandIf { | |||
private final CTPath2DMoveTo moveTo; | |||
public XSLFMoveTo(CTPath2DMoveTo moveTo) { | |||
this.moveTo = moveTo; | |||
} | |||
@Override | |||
public XSLFAdjustPoint getPt() { | |||
return new XSLFAdjustPoint(moveTo.getPt()); | |||
} | |||
@Override | |||
public void setPt(AdjustPointIf pt) { | |||
CTAdjPoint2D xpt = moveTo.getPt(); | |||
if (xpt == null) { | |||
xpt = moveTo.addNewPt(); | |||
} | |||
xpt.setX(pt.getX()); | |||
xpt.setY(pt.getY()); | |||
} | |||
} |
@@ -0,0 +1,178 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import java.awt.geom.Path2D; | |||
import org.apache.poi.sl.draw.geom.ClosePathCommand; | |||
import org.apache.poi.sl.draw.geom.Context; | |||
import org.apache.poi.sl.draw.geom.PathCommand; | |||
import org.apache.poi.sl.draw.geom.PathIf; | |||
import org.apache.poi.sl.usermodel.PaintStyle; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.xmlbeans.XmlCursor; | |||
import org.apache.xmlbeans.XmlObject; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DArcTo; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DClose; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DCubicBezierTo; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DLineTo; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DMoveTo; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STPathFillMode; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFPath implements PathIf { | |||
private final CTPath2D pathXml; | |||
public XSLFPath(CTPath2D pathXml) { | |||
this.pathXml = pathXml; | |||
} | |||
@Override | |||
public void addCommand(PathCommand cmd) { | |||
// not supported | |||
} | |||
@Override | |||
public Path2D.Double getPath(Context ctx) { | |||
Path2D.Double path2D = new Path2D.Double(); | |||
XmlCursor cur = pathXml.newCursor(); | |||
try { | |||
for (boolean hasNext = cur.toFirstChild(); hasNext; hasNext = cur.toNextSibling()) { | |||
XmlObject xo = cur.getObject(); | |||
PathCommand pc; | |||
if (xo instanceof CTPath2DArcTo) { | |||
pc = new XSLFArcTo((CTPath2DArcTo) xo); | |||
} else if (xo instanceof CTPath2DCubicBezierTo) { | |||
pc = new XSLFCurveTo((CTPath2DCubicBezierTo) xo); | |||
} else if (xo instanceof CTPath2DMoveTo) { | |||
pc = new XSLFMoveTo((CTPath2DMoveTo) xo); | |||
} else if (xo instanceof CTPath2DLineTo) { | |||
pc = new XSLFLineTo((CTPath2DLineTo) xo); | |||
} else if (xo instanceof CTPath2DQuadBezierTo) { | |||
pc = new XSLFQuadTo((CTPath2DQuadBezierTo) xo); | |||
} else if (xo instanceof CTPath2DClose) { | |||
pc = new ClosePathCommand(); | |||
} else { | |||
continue; | |||
} | |||
pc.execute(path2D, ctx); | |||
} | |||
} finally { | |||
cur.dispose(); | |||
} | |||
return path2D; | |||
} | |||
@Override | |||
public boolean isStroked() { | |||
return pathXml.getStroke(); | |||
} | |||
@Override | |||
public void setStroke(boolean stroke) { | |||
pathXml.setStroke(stroke); | |||
} | |||
@Override | |||
public boolean isFilled() { | |||
return pathXml.getFill() != STPathFillMode.NONE; | |||
} | |||
@Override | |||
public PaintStyle.PaintModifier getFill() { | |||
switch (pathXml.getFill().intValue()) { | |||
default: | |||
case STPathFillMode.INT_NONE: | |||
return PaintStyle.PaintModifier.NONE; | |||
case STPathFillMode.INT_NORM: | |||
return PaintStyle.PaintModifier.NORM; | |||
case STPathFillMode.INT_LIGHTEN: | |||
return PaintStyle.PaintModifier.LIGHTEN; | |||
case STPathFillMode.INT_LIGHTEN_LESS: | |||
return PaintStyle.PaintModifier.LIGHTEN_LESS; | |||
case STPathFillMode.INT_DARKEN: | |||
return PaintStyle.PaintModifier.DARKEN; | |||
case STPathFillMode.INT_DARKEN_LESS: | |||
return PaintStyle.PaintModifier.DARKEN_LESS; | |||
} | |||
} | |||
@Override | |||
public void setFill(PaintStyle.PaintModifier fill) { | |||
STPathFillMode.Enum f; | |||
switch (fill) { | |||
default: | |||
case NONE: | |||
f = STPathFillMode.NONE; | |||
break; | |||
case NORM: | |||
f = STPathFillMode.NORM; | |||
break; | |||
case LIGHTEN: | |||
f = STPathFillMode.LIGHTEN; | |||
break; | |||
case LIGHTEN_LESS: | |||
f = STPathFillMode.LIGHTEN_LESS; | |||
break; | |||
case DARKEN: | |||
f = STPathFillMode.DARKEN; | |||
break; | |||
case DARKEN_LESS: | |||
f = STPathFillMode.DARKEN_LESS; | |||
break; | |||
} | |||
pathXml.setFill(f); | |||
} | |||
@Override | |||
public long getW() { | |||
return pathXml.getW(); | |||
} | |||
@Override | |||
public void setW(long w) { | |||
pathXml.setW(w); | |||
} | |||
@Override | |||
public long getH() { | |||
return pathXml.getH(); | |||
} | |||
@Override | |||
public void setH(long h) { | |||
pathXml.setH(h); | |||
} | |||
@Override | |||
public boolean isExtrusionOk() { | |||
return pathXml.getExtrusionOk(); | |||
} | |||
@Override | |||
public void setExtrusionOk(boolean extrusionOk) { | |||
pathXml.setExtrusionOk(extrusionOk); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustHandle; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPolarAdjustHandle; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFPolarAdjustHandle implements AdjustHandle { | |||
final CTPolarAdjustHandle xobj; | |||
public XSLFPolarAdjustHandle(CTPolarAdjustHandle xobj) { | |||
this.xobj = xobj; | |||
} | |||
// define more getter/setter when needed | |||
} |
@@ -0,0 +1,56 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustPointIf; | |||
import org.apache.poi.sl.draw.geom.QuadToCommandIf; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPath2DQuadBezierTo; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFQuadTo implements QuadToCommandIf { | |||
private final CTPath2DQuadBezierTo bezier; | |||
public XSLFQuadTo(CTPath2DQuadBezierTo bezier) { | |||
this.bezier = bezier; | |||
} | |||
@Override | |||
public AdjustPointIf getPt1() { | |||
return new XSLFAdjustPoint(bezier.getPtArray(0)); | |||
} | |||
@Override | |||
public void setPt1(AdjustPointIf pt1) { | |||
} | |||
@Override | |||
public AdjustPointIf getPt2() { | |||
return new XSLFAdjustPoint(bezier.getPtArray(1)); | |||
} | |||
@Override | |||
public void setPt2(AdjustPointIf pt2) { | |||
} | |||
} |
@@ -0,0 +1,35 @@ | |||
/* ==================================================================== | |||
Licensed to the Apache Software Foundation (ASF) under one or more | |||
contributor license agreements. See the NOTICE file distributed with | |||
this work for additional information regarding copyright ownership. | |||
The ASF licenses this file to You under the Apache License, Version 2.0 | |||
(the "License"); you may not use this file except in compliance with | |||
the License. You may obtain a copy of the License at | |||
http://www.apache.org/licenses/LICENSE-2.0 | |||
Unless required by applicable law or agreed to in writing, software | |||
distributed under the License is distributed on an "AS IS" BASIS, | |||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
See the License for the specific language governing permissions and | |||
limitations under the License. | |||
==================================================================== */ | |||
package org.apache.poi.xslf.draw.geom; | |||
import org.apache.poi.sl.draw.geom.AdjustHandle; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTXYAdjustHandle; | |||
/** | |||
* Wrapper / delegate for XmlBeans custom geometry | |||
*/ | |||
@Beta | |||
public class XSLFXYAdjustHandle implements AdjustHandle { | |||
final CTXYAdjustHandle xobj; | |||
public XSLFXYAdjustHandle(CTXYAdjustHandle xobj) { | |||
this.xobj = xobj; | |||
} | |||
// define more getter/setter when needed | |||
} |
@@ -75,6 +75,7 @@ public class XSLFBackground extends XSLFSimpleShape | |||
return bg.getBgPr(); | |||
} | |||
@Override | |||
public void setFillColor(Color color) { | |||
CTBackgroundProperties bgPr = getBgPr(true); | |||
@@ -24,21 +24,16 @@ import java.awt.geom.Path2D; | |||
import java.awt.geom.PathIterator; | |||
import java.awt.geom.Rectangle2D; | |||
import javax.xml.stream.XMLStreamException; | |||
import javax.xml.stream.XMLStreamReader; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
import org.apache.poi.ooxml.POIXMLTypeLoader; | |||
import org.apache.poi.ooxml.util.POIXMLUnits; | |||
import org.apache.poi.sl.draw.geom.CustomGeometry; | |||
import org.apache.poi.sl.draw.geom.PresetGeometries; | |||
import org.apache.poi.sl.usermodel.FreeformShape; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Units; | |||
import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry; | |||
import org.apache.xmlbeans.XmlCursor; | |||
import org.apache.xmlbeans.XmlObject; | |||
import org.apache.xmlbeans.XmlOptions; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTAdjPoint2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomRect; | |||
@@ -135,18 +130,7 @@ public class XSLFFreeformShape extends XSLFAutoShape | |||
return null; | |||
} | |||
XmlOptions xop = new XmlOptions(POIXMLTypeLoader.DEFAULT_XML_OPTIONS); | |||
xop.setSaveOuter(); | |||
XMLStreamReader staxReader = ((CTShapeProperties)xo).getCustGeom().newXMLStreamReader(xop); | |||
CustomGeometry custGeo = PresetGeometries.convertCustomGeometry(staxReader); | |||
try { | |||
staxReader.close(); | |||
} catch (XMLStreamException e) { | |||
LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage()); | |||
} | |||
return custGeo; | |||
return XSLFCustomGeometry.convertCustomGeometry(((CTShapeProperties)xo).getCustGeom()); | |||
} | |||
@Override |
@@ -22,9 +22,6 @@ package org.apache.poi.xslf.usermodel; | |||
import java.awt.Color; | |||
import java.awt.geom.Rectangle2D; | |||
import javax.xml.stream.XMLStreamException; | |||
import javax.xml.stream.XMLStreamReader; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
import org.apache.poi.ooxml.util.POIXMLUnits; | |||
@@ -47,6 +44,7 @@ import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; | |||
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Units; | |||
import org.apache.poi.xslf.draw.geom.XSLFCustomGeometry; | |||
import org.apache.poi.xslf.model.PropertyFetcher; | |||
import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFEffectProperties; | |||
import org.apache.poi.xslf.usermodel.XSLFPropertiesDelegate.XSLFFillProperties; | |||
@@ -240,7 +238,7 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
/** | |||
* @param color the color to paint the shape outline. | |||
* A <code>null</code> value turns off the shape outline. | |||
* A {@code null} value turns off the shape outline. | |||
*/ | |||
public void setLineColor(Color color) { | |||
CTLineProperties ln = getLn(this, true); | |||
@@ -273,7 +271,7 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
/** | |||
* | |||
* @return the color of the shape outline or <code>null</code> | |||
* @return the color of the shape outline or {@code null} | |||
* if outline is turned off | |||
*/ | |||
@SuppressWarnings("WeakerAccess") | |||
@@ -351,7 +349,7 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
/** | |||
* | |||
* @param width line width in points. <code>0</code> means no line | |||
* @param width line width in points. {@code 0} means no line | |||
*/ | |||
@SuppressWarnings("WeakerAccess") | |||
public void setLineWidth(double width) { | |||
@@ -386,7 +384,7 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
} | |||
/** | |||
* @return line width in points. <code>0</code> means no line. | |||
* @return line width in points. {@code 0} means no line. | |||
*/ | |||
@SuppressWarnings("WeakerAccess") | |||
public double getLineWidth() { | |||
@@ -709,14 +707,7 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
throw new IllegalStateException("Unknown shape geometry: " + name + ", available geometries are: " + dict.keySet()); | |||
} | |||
} else if (gp.isSetCustGeom()){ | |||
XMLStreamReader staxReader = gp.getCustGeom().newXMLStreamReader(); | |||
geom = PresetGeometries.convertCustomGeometry(staxReader); | |||
try { | |||
staxReader.close(); | |||
} | |||
catch (XMLStreamException e) { | |||
LOG.atWarn().log("An error occurred while closing a Custom Geometry XML Stream Reader: {}", e.getMessage()); | |||
} | |||
geom = XSLFCustomGeometry.convertCustomGeometry(gp.getCustGeom()); | |||
} else { | |||
geom = dict.get("rect"); | |||
} |
@@ -27,6 +27,8 @@ import java.util.List; | |||
import javax.xml.namespace.QName; | |||
import org.apache.logging.log4j.LogManager; | |||
import org.apache.logging.log4j.Logger; | |||
import org.apache.poi.ooxml.util.POIXMLUnits; | |||
import org.apache.poi.sl.draw.DrawFactory; | |||
import org.apache.poi.sl.draw.DrawTableShape; | |||
@@ -52,6 +54,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra | |||
public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow>, | |||
TableShape<XSLFShape,XSLFTextParagraph> { | |||
/* package */ static final String TABLE_URI = "http://schemas.openxmlformats.org/drawingml/2006/table"; | |||
private static final Logger LOG = LogManager.getLogger(XSLFTable.class); | |||
private final CTTable _table; | |||
private final List<XSLFTableRow> _rows; | |||
@@ -425,13 +428,17 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow | |||
for (int col2=col+1; col2<col+tc.getGridSpan(); col2++) { | |||
assert(col2 < cols); | |||
XSLFTableCell tc2 = getCell(row, col2); | |||
assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1); | |||
if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) { | |||
LOG.warn("invalid table span - rendering result is probably wrong"); | |||
} | |||
mergedBounds.add(tc2.getAnchor()); | |||
} | |||
for (int row2=row+1; row2<row+tc.getRowSpan(); row2++) { | |||
assert(row2 < rows); | |||
XSLFTableCell tc2 = getCell(row2, col); | |||
assert(tc2.getGridSpan() == 1 && tc2.getRowSpan() == 1); | |||
if (tc2.getGridSpan() != 1 || tc2.getRowSpan() != 1) { | |||
LOG.warn("invalid table span - rendering result is probably wrong"); | |||
} | |||
mergedBounds.add(tc2.getAnchor()); | |||
} | |||
tc.setAnchor(mergedBounds); |
@@ -477,7 +477,13 @@ public final class PPTX2PNG { | |||
if (outfile != null) { | |||
return outfile; | |||
} | |||
String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, file.getName()); | |||
String fileName = file.getName(); | |||
if ("stdin".equals(fileName)) { | |||
fileName += ".ext"; | |||
} | |||
String inname = String.format(Locale.ROOT, "%04d|%s|%s", slideNo, format, fileName); | |||
String outpat = (proxy.getSlideCount() > 1 && slideNo > 0 ? outPattern : outPattern.replaceAll("-?\\$\\{slideno}", "")); | |||
return INPUT_PATTERN.matcher(inname).replaceAll(outpat); | |||
} |
@@ -72,6 +72,7 @@ module org.apache.poi.ooxml { | |||
exports org.apache.poi.xssf.streaming; | |||
exports org.apache.poi.xssf.util; | |||
exports org.apache.poi.xslf.draw; | |||
exports org.apache.poi.xslf.draw.geom; | |||
exports org.apache.poi.xslf.usermodel; | |||
exports org.apache.poi.xslf.model; | |||
exports org.apache.poi.xslf.util; |
@@ -35,6 +35,7 @@ import java.util.zip.ZipFile; | |||
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry; | |||
import org.apache.commons.compress.archivers.sevenz.SevenZFile; | |||
import org.apache.commons.io.FilenameUtils; | |||
import org.apache.poi.POIDataSamples; | |||
import org.apache.poi.poifs.filesystem.FileMagic; | |||
import org.apache.poi.xslf.util.PPTX2PNG; | |||
@@ -126,7 +127,6 @@ class TestPPTX2PNG { | |||
"-format", format, // png,gif,jpg,svg,pdf or null for test | |||
"-slide", "-1", // -1 for all | |||
"-outdir", tmpDir.getCanonicalPath(), | |||
"-outpat", "${basename}-${slideno}-${ext}.${format}", | |||
// "-dump", new File("build/tmp/", pptFile+".json").getCanonicalPath(), | |||
"-dump", "null", | |||
"-quiet", | |||
@@ -157,17 +157,26 @@ class TestPPTX2PNG { | |||
args.add("GBK"); | |||
} | |||
final String basename = FilenameUtils.getBaseName(fileName); | |||
final String ext = FilenameUtils.getExtension(fileName); | |||
if (fileObj instanceof ZipEntry) { | |||
ZipEntry ze = (ZipEntry)fileObj; | |||
ZipFile zf = (ZipFile)fileContainer; | |||
System.setIn(zf.getInputStream(ze)); | |||
args.add("-outpat"); | |||
args.add(basename+"-${slideno}-"+ext+".${format}"); | |||
args.add("stdin"); | |||
} else if (fileObj instanceof SevenZArchiveEntry) { | |||
SevenZArchiveEntry ze = (SevenZArchiveEntry)fileObj; | |||
SevenZFile zf = (SevenZFile)fileContainer; | |||
System.setIn(zf.getInputStream(ze)); | |||
args.add("-outpat"); | |||
args.add(basename+"-${slideno}-"+ext+".${format}"); | |||
args.add("stdin"); | |||
} else if (fileObj instanceof File) { | |||
args.add("-outpat"); | |||
args.add("${basename}-${slideno}-${ext}.${format}"); | |||
args.add(((File)fileObj).getAbsolutePath()); | |||
} | |||
@@ -70,6 +70,7 @@ module org.apache.poi.ooxml { | |||
exports org.apache.poi.xssf.streaming; | |||
exports org.apache.poi.xssf.util; | |||
exports org.apache.poi.xslf.draw; | |||
exports org.apache.poi.xslf.draw.geom; | |||
exports org.apache.poi.xslf.usermodel; | |||
exports org.apache.poi.xslf.model; | |||
exports org.apache.poi.xslf.util; |
@@ -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) { |
@@ -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); | |||
} |
@@ -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(); | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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); | |||
} | |||
} |
@@ -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 |
@@ -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); | |||
} | |||
} |
@@ -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){ |
@@ -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 { | |||
} |
@@ -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); | |||
} |
@@ -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(); | |||
} |
@@ -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); | |||
} |
@@ -43,7 +43,7 @@ import java.util.Objects; | |||
*/ | |||
// @XmlAccessorType(XmlAccessType.FIELD) | |||
// @XmlType(name = "CT_Path2DCubicBezierTo", propOrder = {"pt"}) | |||
public final class CurveToCommand implements PathCommand { | |||
public final class CurveToCommand implements CurveToCommandIf { | |||
// @XmlElement(required = true) | |||
private final AdjustPoint pt1 = new AdjustPoint(); | |||
@@ -52,38 +52,45 @@ public final class CurveToCommand implements PathCommand { | |||
// @XmlElement(required = true) | |||
private final AdjustPoint pt3 = new AdjustPoint(); | |||
public void setPt1(AdjustPoint pt1) { | |||
@Override | |||
public AdjustPoint getPt1() { | |||
return pt1; | |||
} | |||
@Override | |||
public void setPt1(AdjustPointIf pt1) { | |||
if (pt1 != null) { | |||
this.pt1.setX(pt1.getX()); | |||
this.pt1.setY(pt1.getY()); | |||
} | |||
} | |||
public void setPt2(AdjustPoint pt2) { | |||
@Override | |||
public AdjustPoint getPt2() { | |||
return pt2; | |||
} | |||
@Override | |||
public void setPt2(AdjustPointIf pt2) { | |||
if (pt2 != null) { | |||
this.pt2.setX(pt2.getX()); | |||
this.pt2.setY(pt2.getY()); | |||
} | |||
} | |||
public void setPt3(AdjustPoint pt3) { | |||
@Override | |||
public AdjustPoint getPt3() { | |||
return pt3; | |||
} | |||
@Override | |||
public void setPt3(AdjustPointIf pt3) { | |||
if (pt3 != null) { | |||
this.pt3.setX(pt3.getX()); | |||
this.pt3.setY(pt3.getY()); | |||
} | |||
} | |||
@Override | |||
public void execute(Path2D.Double path, Context ctx){ | |||
double x1 = ctx.getValue(pt1.getX()); | |||
double y1 = ctx.getValue(pt1.getY()); | |||
double x2 = ctx.getValue(pt2.getX()); | |||
double y2 = ctx.getValue(pt2.getY()); | |||
double x3 = ctx.getValue(pt3.getX()); | |||
double y3 = ctx.getValue(pt3.getY()); | |||
path.curveTo(x1, y1, x2, y2, x3, y3); | |||
} | |||
@Override | |||
public boolean equals(Object o) { | |||
if (this == o) return true; |
@@ -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); | |||
} | |||
} |
@@ -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(); | |||
} | |||
@@ -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) { |
@@ -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; | |||
} | |||
} | |||
} |
@@ -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); | |||
} |
@@ -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) { |
@@ -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); | |||
} | |||
} |
@@ -19,7 +19,6 @@ | |||
package org.apache.poi.sl.draw.geom; | |||
import java.awt.geom.Path2D; | |||
import java.util.Objects; | |||
/** | |||
@@ -43,30 +42,24 @@ import java.util.Objects; | |||
*/ | |||
// @XmlAccessorType(XmlAccessType.FIELD) | |||
// @XmlType(name = "CT_Path2DMoveTo", propOrder = {"pt"}) | |||
public final class MoveToCommand implements PathCommand { | |||
public final class MoveToCommand implements MoveToCommandIf { | |||
// @XmlElement(required = true) | |||
private final AdjustPoint pt = new AdjustPoint(); | |||
@Override | |||
public AdjustPoint getPt() { | |||
return pt; | |||
} | |||
public void setPt(AdjustPoint pt) { | |||
@Override | |||
public void setPt(AdjustPointIf pt) { | |||
if (pt != null) { | |||
this.pt.setX(pt.getX()); | |||
this.pt.setY(pt.getY()); | |||
} | |||
} | |||
@Override | |||
public void execute(Path2D.Double path, Context ctx){ | |||
double x = ctx.getValue(pt.getX()); | |||
double y = ctx.getValue(pt.getY()); | |||
path.moveTo(x, y); | |||
} | |||
@Override | |||
public boolean equals(Object o) { | |||
if (this == o) return true; |
@@ -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); | |||
} | |||
} |
@@ -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; | |||
} | |||
@@ -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; | |||
} |
@@ -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); | |||
} |
@@ -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); | |||
} |
@@ -19,7 +19,6 @@ | |||
package org.apache.poi.sl.draw.geom; | |||
import java.awt.geom.Path2D; | |||
import java.util.Objects; | |||
/** | |||
@@ -43,36 +42,39 @@ import java.util.Objects; | |||
*/ | |||
// @XmlAccessorType(XmlAccessType.FIELD) | |||
// @XmlType(name = "CT_Path2DQuadBezierTo", propOrder = {"pt"}) | |||
public final class QuadToCommand implements PathCommand { | |||
public final class QuadToCommand implements QuadToCommandIf { | |||
// @XmlElement(required = true) | |||
private final AdjustPoint pt1 = new AdjustPoint(); | |||
// @XmlElement(required = true) | |||
private final AdjustPoint pt2 = new AdjustPoint(); | |||
public void setPt1(AdjustPoint pt1) { | |||
@Override | |||
public AdjustPoint getPt1() { | |||
return pt1; | |||
} | |||
@Override | |||
public void setPt1(AdjustPointIf pt1) { | |||
if (pt1 != null) { | |||
this.pt1.setX(pt1.getX()); | |||
this.pt1.setY(pt1.getY()); | |||
} | |||
} | |||
public void setPt2(AdjustPoint pt2) { | |||
@Override | |||
public AdjustPoint getPt2() { | |||
return pt2; | |||
} | |||
@Override | |||
public void setPt2(AdjustPointIf pt2) { | |||
if (pt2 != null) { | |||
this.pt2.setX(pt2.getX()); | |||
this.pt2.setY(pt2.getY()); | |||
} | |||
} | |||
@Override | |||
public void execute(Path2D.Double path, Context ctx){ | |||
double x1 = ctx.getValue(pt1.getX()); | |||
double y1 = ctx.getValue(pt1.getY()); | |||
double x2 = ctx.getValue(pt2.getX()); | |||
double y2 = ctx.getValue(pt2.getY()); | |||
path.quadTo(x1, y1, x2, y2); | |||
} | |||
@Override | |||
public boolean equals(Object o) { | |||
if (this == o) return true; |
@@ -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); | |||
} | |||
} |
@@ -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); | |||
} | |||
} | |||
} |