From: Andreas Beeker Date: Sat, 21 Nov 2015 15:54:01 +0000 (+0000) Subject: In preparation for table rendering, added table row heights and column widths to... X-Git-Tag: REL_3_14_BETA1~118 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=74d58c8bde9a00b9b3695665c3b7b12fe2a262f1;p=poi.git In preparation for table rendering, added table row heights and column widths to common sl. To have better results in rendering switch anchor from java.awt.Rectangle to Rectangle2D. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1715540 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java index 8101c71f63..32a6c7d1c8 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java +++ b/src/examples/src/org/apache/poi/hslf/examples/ApacheconEU08.java @@ -22,6 +22,7 @@ import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.io.FileOutputStream; import java.io.IOException; import java.util.List; @@ -183,8 +184,8 @@ public final class ApacheconEU08 { table1.setRowHeight(1, 80); Dimension dim = ppt.getPageSize(); - Rectangle oldAnchor = table1.getAnchor(); - table1.setAnchor(new Rectangle((dim.width-450)/2, 100, oldAnchor.width, oldAnchor.height)); + Rectangle2D oldAnchor = table1.getAnchor(); + table1.setAnchor(new Rectangle2D.Double((dim.width-450)/2, 100, oldAnchor.getWidth(), oldAnchor.getHeight())); TextBox box1 = slide.createTextBox(); box1.setHorizontalCentered(true); diff --git a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java index c8a1395902..817541ee85 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/TableDemo.java @@ -78,7 +78,7 @@ public final class TableDemo { table1.setColumnWidth(1, 150); int pgWidth = ppt.getPageSize().width; - table1.moveTo((pgWidth - table1.getAnchor().width)/2, 100); + table1.moveTo((pgWidth - table1.getAnchor().getWidth())/2., 100.); //test data for the second taable String[][] txt2 = { @@ -125,5 +125,6 @@ public final class TableDemo { ppt.write(out); out.close(); + ppt.close(); } } diff --git a/src/java/org/apache/poi/sl/draw/DrawBackground.java b/src/java/org/apache/poi/sl/draw/DrawBackground.java index a06c2da23f..b09bc98589 100644 --- a/src/java/org/apache/poi/sl/draw/DrawBackground.java +++ b/src/java/org/apache/poi/sl/draw/DrawBackground.java @@ -20,7 +20,6 @@ package org.apache.poi.sl.draw; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Paint; -import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import org.apache.poi.sl.usermodel.Background; @@ -36,12 +35,12 @@ public class DrawBackground extends DrawShape { @SuppressWarnings("rawtypes") public void draw(Graphics2D graphics) { Dimension pg = shape.getSheet().getSlideShow().getPageSize(); - final Rectangle anchor = new Rectangle(0, 0, (int)pg.getWidth(), (int)pg.getHeight()); + final Rectangle2D anchor = new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight()); PlaceableShape ps = new PlaceableShape(){ public ShapeContainer getParent() { return null; } - public Rectangle getAnchor() { return anchor; } - public void setAnchor(Rectangle newAnchor) {} + public Rectangle2D getAnchor() { return anchor; } + public void setAnchor(Rectangle2D newAnchor) {} public double getRotation() { return 0; } public void setRotation(double theta) {} public void setFlipHorizontal(boolean flip) {} diff --git a/src/java/org/apache/poi/sl/draw/DrawPictureShape.java b/src/java/org/apache/poi/sl/draw/DrawPictureShape.java index 534d246adc..5976dbeaef 100644 --- a/src/java/org/apache/poi/sl/draw/DrawPictureShape.java +++ b/src/java/org/apache/poi/sl/draw/DrawPictureShape.java @@ -20,7 +20,6 @@ package org.apache.poi.sl.draw; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Insets; -import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import java.io.IOException; @@ -70,12 +69,12 @@ public class DrawPictureShape extends DrawSimpleShape { PictureShape ps = getShape(); Dimension dim = ps.getPictureData().getImageDimension(); - Rectangle origRect = ps.getAnchor(); - int x = (int)origRect.getX(); - int y = (int)origRect.getY(); - int w = (int)dim.getWidth(); - int h = (int)dim.getHeight(); - ps.setAnchor(new Rectangle(x, y, w, h)); + Rectangle2D origRect = ps.getAnchor(); + double x = origRect.getX(); + double y = origRect.getY(); + double w = dim.getWidth(); + double h = dim.getHeight(); + ps.setAnchor(new Rectangle2D.Double(x, y, w, h)); } @@ -85,7 +84,7 @@ public class DrawPictureShape extends DrawSimpleShape { * * @param target The target rectangle */ - public void resize(Rectangle target) { + public void resize(Rectangle2D target) { resize(target, RectAlign.CENTER); } @@ -100,7 +99,7 @@ public class DrawPictureShape extends DrawSimpleShape { * The alignment within the target rectangle when resizing. * A null value corresponds to RectAlign.CENTER */ - public void resize(Rectangle target, RectAlign align) { + public void resize(Rectangle2D target, RectAlign align) { PictureShape ps = getShape(); Dimension dim = ps.getPictureData().getImageDimension(); if (dim.width <= 0 || dim.height <= 0) { @@ -170,6 +169,6 @@ public class DrawPictureShape extends DrawSimpleShape { break; } - ps.setAnchor(new Rectangle((int)x, (int)y, (int)w, (int)h)); + ps.setAnchor(new Rectangle2D.Double(x, y, w, h)); } } diff --git a/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java index 0bd364b9e9..65233fe0ba 100644 --- a/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/java/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -19,7 +19,6 @@ package org.apache.poi.sl.draw; import java.awt.Graphics2D; import java.awt.Paint; -import java.awt.Rectangle; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; @@ -427,8 +426,8 @@ public class DrawTextParagraph implements Drawable { private PlaceableShape getParagraphShape() { PlaceableShape ps = new PlaceableShape(){ public ShapeContainer getParent() { return null; } - public Rectangle getAnchor() { return paragraph.getParentShape().getAnchor(); } - public void setAnchor(Rectangle anchor) {} + public Rectangle2D getAnchor() { return paragraph.getParentShape().getAnchor(); } + public void setAnchor(Rectangle2D anchor) {} public double getRotation() { return 0; } public void setRotation(double theta) {} public void setFlipHorizontal(boolean flip) {} diff --git a/src/java/org/apache/poi/sl/usermodel/GroupShape.java b/src/java/org/apache/poi/sl/usermodel/GroupShape.java index 87396b5873..a7545a4d4d 100644 --- a/src/java/org/apache/poi/sl/usermodel/GroupShape.java +++ b/src/java/org/apache/poi/sl/usermodel/GroupShape.java @@ -17,7 +17,7 @@ package org.apache.poi.sl.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; public interface GroupShape< S extends Shape, @@ -30,7 +30,7 @@ public interface GroupShape< * * @return the coordinate space of this group */ - Rectangle getInteriorAnchor(); + Rectangle2D getInteriorAnchor(); /** * Sets the coordinate space of this group. All children are constrained @@ -38,5 +38,5 @@ public interface GroupShape< * * @param anchor the coordinate space of this group */ - void setInteriorAnchor(Rectangle anchor); + void setInteriorAnchor(Rectangle2D anchor); } diff --git a/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java b/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java index bcba7401c2..191bad65f6 100644 --- a/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java +++ b/src/java/org/apache/poi/sl/usermodel/PlaceableShape.java @@ -17,7 +17,7 @@ package org.apache.poi.sl.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; public interface PlaceableShape< S extends Shape, @@ -29,13 +29,13 @@ public interface PlaceableShape< * @return the position of this shape within the drawing canvas. * The coordinates are expressed in points */ - Rectangle getAnchor(); + Rectangle2D getAnchor(); /** * @param anchor the position of this shape within the drawing canvas. * The coordinates are expressed in points */ - void setAnchor(Rectangle anchor); + void setAnchor(Rectangle2D anchor); /** * Rotation angle in degrees diff --git a/src/java/org/apache/poi/sl/usermodel/Shape.java b/src/java/org/apache/poi/sl/usermodel/Shape.java index a05e3bf45d..36f8379c58 100644 --- a/src/java/org/apache/poi/sl/usermodel/Shape.java +++ b/src/java/org/apache/poi/sl/usermodel/Shape.java @@ -17,7 +17,7 @@ package org.apache.poi.sl.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; public interface Shape< S extends Shape, @@ -37,5 +37,5 @@ public interface Shape< * * @return the anchor of this shape */ - Rectangle getAnchor(); + Rectangle2D getAnchor(); } diff --git a/src/java/org/apache/poi/sl/usermodel/TableShape.java b/src/java/org/apache/poi/sl/usermodel/TableShape.java index 5614484467..5070cf4052 100644 --- a/src/java/org/apache/poi/sl/usermodel/TableShape.java +++ b/src/java/org/apache/poi/sl/usermodel/TableShape.java @@ -27,6 +27,14 @@ public interface TableShape< TableCell getCell(int row, int col); + /** + * Gets the width (in points) of the n-th column + * + * @param idx the column index (0-based) + * @return the width (in points) + */ + double getColumnWidth(int idx); + /** * Sets the width (in points) of the n-th column * @@ -35,6 +43,14 @@ public interface TableShape< */ void setColumnWidth(int idx, double width); + /** + * Gets the row height + * + * @param row the row index (0-based) + * @return the height (in points) + */ + double getRowHeight(int row); + /** * Sets the row height. * diff --git a/src/java/org/apache/poi/util/Units.java b/src/java/org/apache/poi/util/Units.java index c871fc0a31..55b6d40f0c 100644 --- a/src/java/org/apache/poi/util/Units.java +++ b/src/java/org/apache/poi/util/Units.java @@ -51,7 +51,7 @@ public class Units { * @return emus */ public static int toEMU(double points){ - return (int)Math.round(EMU_PER_POINT*points); + return (int)Math.rint(EMU_PER_POINT*points); } /** @@ -103,13 +103,13 @@ public class Units { public static int pointsToMaster(double points) { points *= MASTER_DPI; points /= POINT_DPI; - return (int)points; + return (int)Math.rint(points); } public static int pointsToPixel(double points) { points *= PIXEL_DPI; points /= POINT_DPI; - return (int)points; + return (int)Math.rint(points); } public static double pixelToPoints(int pixel) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java index 817d2edccd..6dbdf2d4f1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java @@ -19,7 +19,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; import java.awt.Dimension; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.usermodel.Background; @@ -43,9 +43,9 @@ public class XSLFBackground extends XSLFSimpleShape } @Override - public Rectangle getAnchor(){ + public Rectangle2D getAnchor(){ Dimension pg = getSheet().getSlideShow().getPageSize(); - return new Rectangle(0, 0, (int)pg.getWidth(), (int)pg.getHeight()); + return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight()); } @Override diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java index f312145b9b..ccf0c7b301 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFDrawing.java @@ -16,6 +16,9 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; +import java.awt.Color; +import java.awt.geom.Rectangle2D; + import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; @@ -25,9 +28,6 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import java.awt.Color; -import java.awt.Rectangle; - /** * @author Yegor Kozlov @@ -57,7 +57,7 @@ public class XSLFDrawing { CTShape sp = _spTree.addNewSp(); sp.set(XSLFAutoShape.prototype(_shapeId++)); XSLFAutoShape shape = new XSLFAutoShape(sp, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } @@ -65,7 +65,7 @@ public class XSLFDrawing { CTShape sp = _spTree.addNewSp(); sp.set(XSLFFreeformShape.prototype(_shapeId++)); XSLFFreeformShape shape = new XSLFFreeformShape(sp, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } @@ -73,7 +73,7 @@ public class XSLFDrawing { CTShape sp = _spTree.addNewSp(); sp.set(XSLFTextBox.prototype(_shapeId++)); XSLFTextBox shape = new XSLFTextBox(sp, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } @@ -81,7 +81,7 @@ public class XSLFDrawing { CTConnector sp = _spTree.addNewCxnSp(); sp.set(XSLFConnectorShape.prototype(_shapeId++)); XSLFConnectorShape shape = new XSLFConnectorShape(sp, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); shape.setLineColor(Color.black); shape.setLineWidth(0.75); return shape; @@ -91,7 +91,7 @@ public class XSLFDrawing { CTGroupShape obj = _spTree.addNewGrpSp(); obj.set(XSLFGroupShape.prototype(_shapeId++)); XSLFGroupShape shape = new XSLFGroupShape(obj, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } @@ -99,7 +99,7 @@ public class XSLFDrawing { CTPicture obj = _spTree.addNewPic(); obj.set(XSLFPictureShape.prototype(_shapeId++, rel)); XSLFPictureShape shape = new XSLFPictureShape(obj, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } @@ -107,7 +107,7 @@ public class XSLFDrawing { CTGraphicalObjectFrame obj = _spTree.addNewGraphicFrame(); obj.set(XSLFTable.prototype(_shapeId++)); XSLFTable shape = new XSLFTable(obj, _sheet); - shape.setAnchor(new Rectangle()); + shape.setAnchor(new Rectangle2D.Double()); return shape; } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java index 4f14fc1a8a..1f23523938 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFFreeformShape.java @@ -19,7 +19,6 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.PathIterator; @@ -61,7 +60,7 @@ public class XSLFFreeformShape extends XSLFAutoShape public int setPath(GeneralPath path) { CTPath2D ctPath = CTPath2D.Factory.newInstance(); - Rectangle bounds = path.getBounds(); + Rectangle2D bounds = path.getBounds2D(); int x0 = Units.toEMU(bounds.getX()); int y0 = Units.toEMU(bounds.getY()); PathIterator it = path.getPathIterator(new AffineTransform()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java index 930acd402b..8e4977e7d8 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java @@ -19,7 +19,7 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import javax.xml.namespace.QName; @@ -28,6 +28,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.sl.draw.DrawNotImplemented; +import org.apache.poi.sl.usermodel.PlaceableShape; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.util.Beta; import org.apache.poi.util.Units; @@ -44,7 +45,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFra */ @Beta @DrawNotImplemented -public class XSLFGraphicFrame extends XSLFShape { +public class XSLFGraphicFrame extends XSLFShape implements PlaceableShape { /*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){ super(shape,sheet); } @@ -54,18 +55,19 @@ public class XSLFGraphicFrame extends XSLFShape { } @Override - public Rectangle getAnchor(){ + public Rectangle2D getAnchor(){ CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm(); CTPoint2D off = xfrm.getOff(); - int x = (int)Units.toPoints(off.getX()); - int y = (int)Units.toPoints(off.getY()); + double x = Units.toPoints(off.getX()); + double y = Units.toPoints(off.getY()); CTPositiveSize2D ext = xfrm.getExt(); - int cx = (int)Units.toPoints(ext.getCx()); - int cy = (int)Units.toPoints(ext.getCy()); - return new Rectangle(x, y, cx, cy); + double cx = Units.toPoints(ext.getCx()); + double cy = Units.toPoints(ext.getCy()); + return new Rectangle2D.Double(x, y, cx, cy); } - public void setAnchor(Rectangle anchor){ + @Override + public void setAnchor(Rectangle2D anchor){ CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm(); CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); long x = Units.toEMU(anchor.getX()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java index 5f66e9fca1..b3aba60ddb 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGroupShape.java @@ -19,7 +19,7 @@ package org.apache.poi.xslf.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -79,19 +79,19 @@ implements XSLFShapeContainer, GroupShape { } @Override - public Rectangle getAnchor(){ + public Rectangle2D getAnchor(){ CTGroupTransform2D xfrm = getXfrm(); CTPoint2D off = xfrm.getOff(); - int x = (int)Units.toPoints(off.getX()); - int y = (int)Units.toPoints(off.getY()); + double x = Units.toPoints(off.getX()); + double y = Units.toPoints(off.getY()); CTPositiveSize2D ext = xfrm.getExt(); - int cx = (int)Units.toPoints(ext.getCx()); - int cy = (int)Units.toPoints(ext.getCy()); - return new Rectangle(x,y,cx,cy); + double cx = Units.toPoints(ext.getCx()); + double cy = Units.toPoints(ext.getCy()); + return new Rectangle2D.Double(x,y,cx,cy); } @Override - public void setAnchor(Rectangle anchor){ + public void setAnchor(Rectangle2D anchor){ CTGroupTransform2D xfrm = getSafeXfrm(); CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); long x = Units.toEMU(anchor.getX()); @@ -111,15 +111,16 @@ implements XSLFShapeContainer, GroupShape { * used for calculations of grouping, scaling, and rotation * behavior of shapes placed within a group. */ - public Rectangle getInteriorAnchor(){ + @Override + public Rectangle2D getInteriorAnchor(){ CTGroupTransform2D xfrm = getXfrm(); CTPoint2D off = xfrm.getChOff(); - int x = (int)Units.toPoints(off.getX()); - int y = (int)Units.toPoints(off.getY()); + double x = Units.toPoints(off.getX()); + double y = Units.toPoints(off.getY()); CTPositiveSize2D ext = xfrm.getChExt(); - int cx = (int)Units.toPoints(ext.getCx()); - int cy = (int)Units.toPoints(ext.getCy()); - return new Rectangle(x, y, cx, cy); + double cx = Units.toPoints(ext.getCx()); + double cy = Units.toPoints(ext.getCy()); + return new Rectangle2D.Double(x, y, cx, cy); } /** @@ -128,7 +129,8 @@ implements XSLFShapeContainer, GroupShape { * used for calculations of grouping, scaling, and rotation * behavior of shapes placed within a group. */ - public void setInteriorAnchor(Rectangle anchor) { + @Override + public void setInteriorAnchor(Rectangle2D anchor) { CTGroupTransform2D xfrm = getSafeXfrm(); CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff(); long x = Units.toEMU(anchor.getX()); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java index f5d41c2937..4adeba302b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java @@ -18,7 +18,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import org.apache.poi.sl.draw.DrawPaint; import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint; @@ -48,11 +48,11 @@ public class XSLFShadow extends XSLFShape implements ShadowRectangle2D that is the bounds of this shape. */ - public Rectangle resizeToFitText(){ - Rectangle anchor = getAnchor(); + public Rectangle2D resizeToFitText(){ + Rectangle2D anchor = getAnchor(); if(anchor.getWidth() == 0.) throw new POIXMLException( "Anchor of the shape was not set."); double height = getTextHeight(); diff --git a/src/ooxml/testcases/org/apache/poi/sl/TestTable.java b/src/ooxml/testcases/org/apache/poi/sl/TestTable.java new file mode 100644 index 0000000000..d9a3717be8 --- /dev/null +++ b/src/ooxml/testcases/org/apache/poi/sl/TestTable.java @@ -0,0 +1,64 @@ +/* + * ==================================================================== + * 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; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.apache.poi.POIDataSamples; +import org.apache.poi.sl.usermodel.SlideShow; +import org.apache.poi.sl.usermodel.SlideShowFactory; +import org.apache.poi.sl.usermodel.TableShape; +import org.junit.Test; + +public class TestTable { + private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); + + @Test + public void testColWidthRowHeight() throws IOException { + // Test of table dimensions of same slideshow saved as ppt/x + // to check if both return similar (points) value + SlideShow ppt = SlideShowFactory.create(_slTests.getFile("table_test.ppt")); + TableShape ts = (TableShape)ppt.getSlides().get(0).getShapes().get(0); + int cols = ts.getNumberOfColumns(); + int rows = ts.getNumberOfRows(); + + SlideShow pptx = SlideShowFactory.create(_slTests.getFile("table_test.pptx")); + TableShape tsx = (TableShape)pptx.getSlides().get(0).getShapes().get(0); + int colsx = tsx.getNumberOfColumns(); + int rowsx = tsx.getNumberOfRows(); + + assertEquals(cols, colsx); + assertEquals(rows, rowsx); + + for (int i=0; i master -> points + static double rbf(double val, PictureShape picShape) { + if (picShape.getClass().getName().contains("HSLF")) { + return Units.masterToPoints(Units.pointsToMaster(val)); + } else { + return val; + } + } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java index beed20719f..fb86c1926c 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFConnectorShape.java @@ -20,13 +20,18 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.awt.Color; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape; import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize; -import org.apache.poi.sl.usermodel.*; +import org.apache.poi.sl.usermodel.ShapeType; import org.junit.Test; -import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.drawingml.x2006.main.CTConnection; +import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualConnectorProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength; +import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType; +import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth; +import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType; import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector; /** @@ -122,17 +127,17 @@ public class TestXSLFConnectorShape { XSLFAutoShape rect1 = slide.createAutoShape(); rect1.setShapeType(ShapeType.RECT); - rect1.setAnchor(new Rectangle(100, 100, 100, 100)); + rect1.setAnchor(new Rectangle2D.Double(100, 100, 100, 100)); rect1.setFillColor(Color.blue); XSLFAutoShape rect2 = slide.createAutoShape(); rect2.setShapeType(ShapeType.RECT); - rect2.setAnchor(new Rectangle(300, 300, 100, 100)); + rect2.setAnchor(new Rectangle2D.Double(300, 300, 100, 100)); rect2.setFillColor(Color.red); XSLFConnectorShape connector1 = slide.createConnector(); - connector1.setAnchor(new Rectangle(200, 150, 100, 200)); + connector1.setAnchor(new Rectangle2D.Double(200, 150, 100, 200)); CTConnector ctConnector = (CTConnector)connector1.getXmlObject(); ctConnector.getSpPr().getPrstGeom().setPrst(STShapeType.BENT_CONNECTOR_3); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java index 92eb9a7988..720c5f6e00 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFFreeformShape.java @@ -16,11 +16,11 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; -import java.awt.Rectangle; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; +import java.awt.geom.Rectangle2D; import org.junit.Test; @@ -35,7 +35,7 @@ public class TestXSLFFreeformShape { XSLFSlide slide = ppt.createSlide(); XSLFFreeformShape shape1 = slide.createFreeform(); // comples path consisting of a rectangle and an ellipse inside it - GeneralPath path1 = new GeneralPath(new Rectangle(150, 150, 300, 300)); + GeneralPath path1 = new GeneralPath(new Rectangle2D.Double(150, 150, 300, 300)); path1.append(new Ellipse2D.Double(200, 200, 100, 50), false); shape1.setPath(path1); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java index f5d180121a..ff06d51079 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFGroupShape.java @@ -21,7 +21,7 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.awt.Dimension; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import org.junit.Test; @@ -40,11 +40,11 @@ public class TestXSLFGroupShape { XSLFGroupShape group = slide.createGroup(); assertEquals(1, slide.getShapes().size()); - Rectangle interior = new Rectangle(-10, -10, 20, 20); + Rectangle2D interior = new Rectangle2D.Double(-10, -10, 20, 20); group.setInteriorAnchor(interior); assertEquals(interior, group.getInteriorAnchor()); - Rectangle anchor = new Rectangle(0, 0, 792, 612); + Rectangle2D anchor = new Rectangle2D.Double(0, 0, 792, 612); group.setAnchor(anchor); assertEquals(anchor, group.getAnchor()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index a57771080d..7824616a7f 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -24,7 +24,7 @@ import static org.junit.Assert.assertTrue; import java.awt.Color; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.List; @@ -74,7 +74,7 @@ public class TestXSLFTextParagraph { "of text within a shape. Properties here apply to all text " + "residing within the corresponding paragraph."); - Rectangle anchor = new Rectangle(50, 50, 300, 200); + Rectangle2D anchor = new Rectangle2D.Double(50, 50, 300, 200); sh.setAnchor(anchor); DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p); @@ -172,7 +172,7 @@ public class TestXSLFTextParagraph { "of text within a shape. Properties here apply to all text " + "residing within the corresponding paragraph."); - sh.setAnchor(new Rectangle(50, 50, 300, 200)); + sh.setAnchor(new Rectangle2D.Double(50, 50, 300, 200)); DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p); BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); @@ -184,13 +184,13 @@ public class TestXSLFTextParagraph { assertEquals(4, lines.size()); // decrease the shape width from 300 pt to 100 pt - sh.setAnchor(new Rectangle(50, 50, 100, 200)); + sh.setAnchor(new Rectangle2D.Double(50, 50, 100, 200)); dtp.breakText(graphics); lines = dtp.getLines(); assertEquals(12, lines.size()); // decrease the shape width from 300 pt to 100 pt - sh.setAnchor(new Rectangle(50, 50, 600, 200)); + sh.setAnchor(new Rectangle2D.Double(50, 50, 600, 200)); dtp.breakText(graphics); lines = dtp.getLines(); assertEquals(2, lines.size()); @@ -224,7 +224,7 @@ public class TestXSLFTextParagraph { assertEquals("POI", lines.get(1).getString()); XSLFAutoShape sh2 = slide.createAutoShape(); - sh2.setAnchor(new Rectangle(50, 50, 300, 200)); + sh2.setAnchor(new Rectangle2D.Double(50, 50, 300, 200)); XSLFTextParagraph p2 = sh2.addNewTextParagraph(); XSLFTextRun r2 = p2.addNewTextRun(); r2.setFontFamily("serif"); // this should always be available diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java index 0c21c7e8b8..dde778ffcc 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFFreeformShape.java @@ -17,7 +17,6 @@ package org.apache.poi.hslf.usermodel; -import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.PathIterator; @@ -90,7 +89,7 @@ public final class HSLFFreeformShape extends HSLFAutoShape implements FreeformSh @Override public int setPath(GeneralPath path) { - Rectangle bounds = path.getBounds(); + Rectangle2D bounds = path.getBounds2D(); PathIterator it = path.getPathIterator(new AffineTransform()); List segInfo = new ArrayList(); diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java index bbfe93f97c..bae325a0f9 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java @@ -17,7 +17,7 @@ package org.apache.poi.hslf.usermodel; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -73,7 +73,7 @@ implements HSLFShapeContainer, GroupShape { } @Override - public void setAnchor(Rectangle anchor) { + public void setAnchor(Rectangle2D anchor) { EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID); boolean isInitialized = !(clientAnchor.getDx1() == 0 && clientAnchor.getRow1() == 0); @@ -85,7 +85,7 @@ implements HSLFShapeContainer, GroupShape { } @Override - public void setInteriorAnchor(Rectangle anchor){ + public void setInteriorAnchor(Rectangle2D anchor){ EscherSpgrRecord spgr = getEscherChild(EscherSpgrRecord.RECORD_ID); int x1 = Units.pointsToMaster(anchor.getX()); @@ -100,16 +100,16 @@ implements HSLFShapeContainer, GroupShape { } @Override - public Rectangle getInteriorAnchor(){ + public Rectangle2D getInteriorAnchor(){ EscherSpgrRecord rec = getEscherChild(EscherSpgrRecord.RECORD_ID); - int x1 = (int)Units.masterToPoints(rec.getRectX1()); - int y1 = (int)Units.masterToPoints(rec.getRectY1()); - int x2 = (int)Units.masterToPoints(rec.getRectX2()); - int y2 = (int)Units.masterToPoints(rec.getRectY2()); - return new Rectangle(x1,y1,x2-x1,y2-y1); + double x1 = Units.masterToPoints(rec.getRectX1()); + double y1 = Units.masterToPoints(rec.getRectY1()); + double x2 = Units.masterToPoints(rec.getRectX2()); + double y2 = Units.masterToPoints(rec.getRectY2()); + return new Rectangle2D.Double(x1,y1,x2-x1,y2-y1); } - protected void setExteriorAnchor(Rectangle anchor) { + protected void setExteriorAnchor(Rectangle2D anchor) { EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID); //hack. internal variable EscherClientAnchorRecord.shortRecord can be @@ -121,10 +121,10 @@ implements HSLFShapeContainer, GroupShape { clientAnchor.fillFields(header, 0, null); // All coordinates need to be converted to Master units (576 dpi) - clientAnchor.setFlag((short)Units.pointsToMaster(anchor.y)); - clientAnchor.setCol1((short)Units.pointsToMaster(anchor.x)); - clientAnchor.setDx1((short)Units.pointsToMaster(anchor.width + anchor.x)); - clientAnchor.setRow1((short)Units.pointsToMaster(anchor.height + anchor.y)); + clientAnchor.setFlag((short)Units.pointsToMaster(anchor.getY())); + clientAnchor.setCol1((short)Units.pointsToMaster(anchor.getX())); + clientAnchor.setDx1((short)Units.pointsToMaster(anchor.getWidth() + anchor.getX())); + clientAnchor.setRow1((short)Units.pointsToMaster(anchor.getHeight() + anchor.getY())); // TODO: does this make sense? setInteriorAnchor(anchor); @@ -177,20 +177,20 @@ implements HSLFShapeContainer, GroupShape { /** * Moves and scales this ShapeGroup to the specified anchor. */ - protected void moveAndScale(Rectangle anchorDest){ - Rectangle anchorSrc = getAnchor(); - double scaleX = (anchorSrc.width == 0) ? 0 : anchorDest.width / (double)anchorSrc.width; - double scaleY = (anchorSrc.height == 0) ? 0 : anchorDest.height / (double)anchorSrc.height; + protected void moveAndScale(Rectangle2D anchorDest){ + Rectangle2D anchorSrc = getAnchor(); + double scaleX = (anchorSrc.getWidth() == 0) ? 0 : anchorDest.getWidth() / anchorSrc.getWidth(); + double scaleY = (anchorSrc.getHeight() == 0) ? 0 : anchorDest.getHeight() / anchorSrc.getHeight(); setExteriorAnchor(anchorDest); for (HSLFShape shape : getShapes()) { - Rectangle chanchor = shape.getAnchor(); - int x = (int)Math.rint(anchorDest.x+(chanchor.x-anchorSrc.x)*scaleX); - int y = (int)Math.rint(anchorDest.y+(chanchor.y-anchorSrc.y)*scaleY); - int width = (int)Math.rint(chanchor.width*scaleX); - int height = (int)Math.rint(chanchor.height*scaleY); - shape.setAnchor(new Rectangle(x, y, width, height)); + Rectangle2D chanchor = shape.getAnchor(); + double x = anchorDest.getX()+(chanchor.getX()-anchorSrc.getX())*scaleX; + double y = anchorDest.getY()+(chanchor.getY()-anchorSrc.getY())*scaleY; + double width = chanchor.getWidth()*scaleX; + double height = chanchor.getHeight()*scaleY; + shape.setAnchor(new Rectangle2D.Double(x, y, width, height)); } } @@ -200,7 +200,7 @@ implements HSLFShapeContainer, GroupShape { * * @return the anchor of this shape group */ - public Rectangle getAnchor(){ + public Rectangle2D getAnchor(){ EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID); int x1,y1,x2,y2; if(clientAnchor == null){ @@ -216,11 +216,11 @@ implements HSLFShapeContainer, GroupShape { x2 = clientAnchor.getDx1(); y2 = clientAnchor.getRow1(); } - Rectangle anchor= new Rectangle( - (int)(x1 == -1 ? -1 : Units.masterToPoints(x1)), - (int)(y1 == -1 ? -1 : Units.masterToPoints(y1)), - (int)(x2 == -1 ? -1 : Units.masterToPoints(x2-x1)), - (int)(y2 == -1 ? -1 : Units.masterToPoints(y2-y1)) + Rectangle2D anchor= new Rectangle2D.Double( + (x1 == -1 ? -1 : Units.masterToPoints(x1)), + (y1 == -1 ? -1 : Units.masterToPoints(y1)), + (x2 == -1 ? -1 : Units.masterToPoints(x2-x1)), + (y2 == -1 ? -1 : Units.masterToPoints(y2-y1)) ); return anchor; @@ -295,7 +295,7 @@ implements HSLFShapeContainer, GroupShape { public HSLFTextBox createTextBox() { HSLFTextBox s = new HSLFTextBox(this); s.setHorizontalCentered(true); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -304,7 +304,7 @@ implements HSLFShapeContainer, GroupShape { public HSLFAutoShape createAutoShape() { HSLFAutoShape s = new HSLFAutoShape(ShapeType.RECT, this); s.setHorizontalCentered(true); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -313,7 +313,7 @@ implements HSLFShapeContainer, GroupShape { public HSLFFreeformShape createFreeform() { HSLFFreeformShape s = new HSLFFreeformShape(this); s.setHorizontalCentered(true); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -321,7 +321,7 @@ implements HSLFShapeContainer, GroupShape { @Override public HSLFConnectorShape createConnector() { HSLFConnectorShape s = new HSLFConnectorShape(this); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -329,7 +329,7 @@ implements HSLFShapeContainer, GroupShape { @Override public HSLFGroupShape createGroup() { HSLFGroupShape s = new HSLFGroupShape(this); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -340,7 +340,7 @@ implements HSLFShapeContainer, GroupShape { throw new IllegalArgumentException("pictureData needs to be of type HSLFPictureData"); } HSLFPictureShape s = new HSLFPictureShape((HSLFPictureData)pictureData, this); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } @@ -351,7 +351,7 @@ implements HSLFShapeContainer, GroupShape { throw new IllegalArgumentException("numRows and numCols must be greater than 0"); } HSLFTable s = new HSLFTable(numRows,numCols,this); - s.setAnchor(new Rectangle(0, 0, 100, 100)); + s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); addShape(s); return s; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java index 713ecad705..81acffa25e 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPictureShape.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.usermodel; import java.awt.Insets; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.util.List; import org.apache.poi.ddf.AbstractEscherOptRecord; @@ -113,6 +113,7 @@ public class HSLFPictureShape extends HSLFSimpleShape implements PictureShape { * * @return the anchor of this shape */ - public Rectangle getAnchor() { + public Rectangle2D getAnchor() { EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID); int flags = spRecord.getFlags(); int x1,y1,x2,y2; @@ -156,11 +156,11 @@ public abstract class HSLFShape implements Shape { } // TODO: find out where this -1 value comes from at #57820 (link to ms docs?) - Rectangle anchor = new Rectangle( - (int)(x1 == -1 ? -1 : Units.masterToPoints(x1)), - (int)(y1 == -1 ? -1 : Units.masterToPoints(y1)), - (int)(x2 == -1 ? -1 : Units.masterToPoints(x2-x1)), - (int)(y2 == -1 ? -1 : Units.masterToPoints(y2-y1)) + Rectangle2D anchor = new Rectangle2D.Double( + (x1 == -1 ? -1 : Units.masterToPoints(x1)), + (y1 == -1 ? -1 : Units.masterToPoints(y1)), + (x2 == -1 ? -1 : Units.masterToPoints(x2-x1)), + (y2 == -1 ? -1 : Units.masterToPoints(y2-y1)) ); return anchor; @@ -172,7 +172,7 @@ public abstract class HSLFShape implements Shape { * * @param anchor new anchor */ - public void setAnchor(Rectangle anchor){ + public void setAnchor(Rectangle2D anchor){ int x = Units.pointsToMaster(anchor.getX()); int y = Units.pointsToMaster(anchor.getY()); int w = Units.pointsToMaster(anchor.getWidth() + anchor.getX()); @@ -201,10 +201,10 @@ public abstract class HSLFShape implements Shape { * @param x the x coordinate of the top left corner of the shape * @param y the y coordinate of the top left corner of the shape */ - public final void moveTo(float x, float y) { + public final void moveTo(double x, double y) { // This convenience method should be implemented via setAnchor in subclasses // see HSLFGroupShape.setAnchor() for a reference - Rectangle anchor = getAnchor(); + Rectangle2D anchor = getAnchor(); anchor.setRect(x, y, anchor.getWidth(), anchor.getHeight()); setAnchor(anchor); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java index 1a46a5e175..35ab5f2043 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSheet.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.usermodel; import java.awt.Graphics2D; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -402,7 +402,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet { if(numRows < 1) throw new IllegalArgumentException("The number of rows must be greater than 1"); if(numCols < 1) throw new IllegalArgumentException("The number of columns must be greater than 1"); - int x=0, y=0, tblWidth=0, tblHeight=0; + double x=0, y=0, tblWidth=0, tblHeight=0; cells = new HSLFTableCell[numRows][numCols]; for (int i = 0; i < cells.length; i++) { x = 0; for (int j = 0; j < cells[i].length; j++) { cells[i][j] = new HSLFTableCell(this); - Rectangle anchor = new Rectangle(x, y, HSLFTableCell.DEFAULT_WIDTH, HSLFTableCell.DEFAULT_HEIGHT); + Rectangle2D anchor = new Rectangle2D.Double(x, y, HSLFTableCell.DEFAULT_WIDTH, HSLFTableCell.DEFAULT_HEIGHT); cells[i][j].setAnchor(anchor); x += HSLFTableCell.DEFAULT_WIDTH; } @@ -90,7 +90,7 @@ implements HSLFShapeContainer, TableShape { } tblWidth = x; tblHeight = y; - setExteriorAnchor(new Rectangle(0, 0, tblWidth, tblHeight)); + setExteriorAnchor(new Rectangle2D.Double(0, 0, tblWidth, tblHeight)); EscherContainerRecord spCont = (EscherContainerRecord) getSpContainer().getChild(0); AbstractEscherOptRecord opt = new EscherOptRecord(); @@ -159,13 +159,18 @@ implements HSLFShapeContainer, TableShape { private static class TableCellComparator implements Comparator { public int compare( HSLFShape o1, HSLFShape o2 ) { - Rectangle anchor1 = o1.getAnchor(); - Rectangle anchor2 = o2.getAnchor(); - int delta = anchor1.y - anchor2.y; - if (delta == 0) delta = anchor1.x - anchor2.x; + Rectangle2D anchor1 = o1.getAnchor(); + Rectangle2D anchor2 = o2.getAnchor(); + double delta = anchor1.getY() - anchor2.getY(); + if (delta == 0) { + delta = anchor1.getX() - anchor2.getX(); + } // descending size - if (delta == 0) delta = (anchor2.width*anchor2.height)-(anchor1.width*anchor1.height); - return delta; + if (delta == 0) { + delta = (anchor2.getWidth()*anchor2.getHeight())-(anchor1.getWidth()*anchor1.getHeight()); + } + + return (int)Math.signum(delta); } } @@ -176,7 +181,7 @@ implements HSLFShapeContainer, TableShape { htc.add((HSLFTableCell)h); } } - + if (htc.isEmpty()) { throw new IllegalStateException("HSLFTable without HSLFTableCells"); } @@ -186,12 +191,12 @@ implements HSLFShapeContainer, TableShape { List lst = new ArrayList(); List row = new ArrayList(); - int y0 = htc.get(0).getAnchor().y; + double y0 = htc.get(0).getAnchor().getY(); for (HSLFTableCell sh : htc) { - Rectangle anchor = sh.getAnchor(); - boolean isNextRow = (anchor.y > y0); + Rectangle2D anchor = sh.getAnchor(); + boolean isNextRow = (anchor.getY() > y0); if (isNextRow) { - y0 = anchor.y; + y0 = anchor.getY(); lst.add(row.toArray(new HSLFTableCell[row.size()])); row.clear(); } @@ -207,7 +212,7 @@ implements HSLFShapeContainer, TableShape { final double lx1, lx2, ly1, ly2; LineRect(HSLFLine l) { this.l = l; - Rectangle r = l.getAnchor(); + Rectangle2D r = l.getAnchor(); lx1 = r.getMinX(); lx2 = r.getMaxX(); ly1 = r.getMinY(); @@ -240,7 +245,7 @@ implements HSLFShapeContainer, TableShape { // TODO: this only works for non-rotated tables for (HSLFTableCell[] tca : cells) { for (HSLFTableCell tc : tca) { - final Rectangle cellAnchor = tc.getAnchor(); + final Rectangle2D cellAnchor = tc.getAnchor(); /** * x1/y1 --------+ @@ -321,29 +326,53 @@ implements HSLFShapeContainer, TableShape { } } + @Override + public double getRowHeight(int row) { + if (row < 0 || row >= cells.length) { + throw new IllegalArgumentException("Row index '"+row+"' is not within range [0-"+(cells.length-1)+"]"); + } + + return cells[row][0].getAnchor().getHeight(); + } + @Override public void setRowHeight(int row, double height) { + if (row < 0 || row >= cells.length) { + throw new IllegalArgumentException("Row index '"+row+"' is not within range [0-"+(cells.length-1)+"]"); + } + int pxHeight = Units.pointsToPixel(height); - int currentHeight = cells[row][0].getAnchor().height; - int dy = pxHeight - currentHeight; + double currentHeight = cells[row][0].getAnchor().getHeight(); + double dy = pxHeight - currentHeight; for (int i = row; i < cells.length; i++) { for (int j = 0; j < cells[i].length; j++) { - Rectangle anchor = cells[i][j].getAnchor(); + Rectangle2D anchor = cells[i][j].getAnchor(); if(i == row) { - anchor.height = pxHeight; + anchor.setRect(anchor.getX(), anchor.getY(), anchor.getWidth(), pxHeight); } else { - anchor.y += dy; + anchor.setRect(anchor.getX(), anchor.getY()+dy, anchor.getWidth(), pxHeight); } cells[i][j].setAnchor(anchor); } } - Rectangle tblanchor = getAnchor(); - tblanchor.height += dy; + Rectangle2D tblanchor = getAnchor(); + tblanchor.setRect(tblanchor.getX(), tblanchor.getY(), tblanchor.getWidth(), tblanchor.getHeight() + dy); setExteriorAnchor(tblanchor); } + @Override + public double getColumnWidth(int col) { + if (col < 0 || col >= cells[0].length) { + throw new IllegalArgumentException("Column index '"+col+"' is not within range [0-"+(cells[0].length-1)+"]"); + } + + // TODO: check for merged cols + double width = cells[0][col].getAnchor().getWidth(); + return width; + } + @Override public void setColumnWidth(int col, final double width){ if (col < 0 || col >= cells[0].length) { @@ -352,20 +381,20 @@ implements HSLFShapeContainer, TableShape { double currentWidth = cells[0][col].getAnchor().getWidth(); double dx = width - currentWidth; for (HSLFTableCell cols[] : cells) { - Rectangle anchor = cols[col].getAnchor(); - anchor.width = (int)Math.rint(width); + Rectangle2D anchor = cols[col].getAnchor(); + anchor.setRect(anchor.getX(), anchor.getY(), width, anchor.getHeight()); cols[col].setAnchor(anchor); if (col < cols.length - 1) { for (int j = col+1; j < cols.length; j++) { anchor = cols[j].getAnchor(); - anchor.x += dx; + anchor.setRect(anchor.getX()+dx, anchor.getY(), anchor.getWidth(), anchor.getHeight()); cols[j].setAnchor(anchor); } } } - Rectangle tblanchor = getAnchor(); - tblanchor.width += dx; + Rectangle2D tblanchor = getAnchor(); + tblanchor.setRect(tblanchor.getX(), tblanchor.getY(), tblanchor.getWidth() + dx, tblanchor.getHeight()); setExteriorAnchor(tblanchor); } @@ -393,7 +422,7 @@ implements HSLFShapeContainer, TableShape { } @Override - protected void moveAndScale(Rectangle anchorDest){ + protected void moveAndScale(Rectangle2D anchorDest){ super.moveAndScale(anchorDest); updateRowHeightsProperty(); } @@ -403,7 +432,7 @@ implements HSLFShapeContainer, TableShape { EscherArrayProperty p = opt.lookup(EscherProperties.GROUPSHAPE__TABLEROWPROPERTIES); byte[] val = new byte[4]; for (int rowIdx = 0; rowIdx < cells.length; rowIdx++) { - int rowHeight = Units.pointsToMaster(cells[rowIdx][0].getAnchor().height); + int rowHeight = Units.pointsToMaster(cells[rowIdx][0].getAnchor().getHeight()); LittleEndian.putInt(val, 0, rowHeight); p.setElement(rowIdx, val); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java index 80341aa354..aee8994832 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTableCell.java @@ -18,7 +18,7 @@ package org.apache.poi.hslf.usermodel; import java.awt.Color; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import org.apache.poi.ddf.AbstractEscherOptRecord; import org.apache.poi.ddf.EscherContainerRecord; @@ -85,40 +85,40 @@ public final class HSLFTableCell extends HSLFTextBox implements TableCell { } catch (IOException e){ throw new HSLFException(e); } - if(getAnchor().equals(new Rectangle()) && !"".equals(getText())) resizeToFitText(); + boolean isInitialAnchor = getAnchor().equals(new Rectangle2D.Double()); + boolean isFilledTxt = !"".equals(getText()); + if (isInitialAnchor && isFilledTxt) { + resizeToFitText(); + } } for (HSLFTextParagraph htp : _paragraphs) { htp.setShapeId(getShapeId()); @@ -250,10 +253,10 @@ implements TextShape { * @return a Rectangle2D that is the bounds of this shape. */ public Rectangle2D resizeToFitText(){ - Rectangle anchor = getAnchor(); + Rectangle2D anchor = getAnchor(); if(anchor.getWidth() == 0.) { logger.log(POILogger.WARN, "Width of shape wasn't set. Defaulting to 200px"); - anchor.setSize(200, (int)anchor.getHeight()); + anchor.setRect(anchor.getX(), anchor.getY(), 200., anchor.getHeight()); setAnchor(anchor); } double height = getTextHeight(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java index 7b6e762cf6..7e96707d1b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestMovieShape.java @@ -21,7 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -50,7 +50,7 @@ public final class TestMovieShape { HSLFPictureData thumbnailData = ppt.addPicture(_slTests.readFile("tomcat.png"), PictureType.PNG); MovieShape shape = new MovieShape(movieIdx, thumbnailData); - shape.setAnchor(new Rectangle(300,225,120,90)); + shape.setAnchor(new Rectangle2D.Double(300,225,120,90)); slide.addShape(shape); assertEquals(path, shape.getPath()); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java index 5babd1bf89..e3c739001b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestOleEmbedding.java @@ -20,10 +20,11 @@ package org.apache.poi.hslf.model; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -50,23 +51,36 @@ public final class TestOleEmbedding { * @throws Exception if an error occurs. */ @Test - public void testOleEmbedding2003() throws Exception { + public void testOleEmbedding2003() throws IOException { HSLFSlideShowImpl slideShow = new HSLFSlideShowImpl(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); // Placeholder EMFs for clients that don't support the OLE components. List pictures = slideShow.getPictureData(); assertEquals("Should be two pictures", 2, pictures.size()); - //assertDigestEquals("Wrong data for picture 1", "8d1fbadf4814f321bb1ccdd056e3c788", pictures[0].getData()); - //assertDigestEquals("Wrong data for picture 2", "987a698e83559cf3d38a0deeba1cc63b", pictures[1].getData()); + + long checkSums[] = { 0xD37A4204l, 0x26A62F68l, 0x82853169l, 0xE0E45D2Bl }; + int checkId = 0; + + // check for checksum to be uptodate + for (HSLFPictureData pd : pictures) { + long checkEMF = IOUtils.calculateChecksum(pd.getData()); + assertEquals(checkSums[checkId++], checkEMF); + } // Actual embedded objects. HSLFObjectData[] objects = slideShow.getEmbeddedObjects(); assertEquals("Should be two objects", 2, objects.length); - //assertDigestEquals("Wrong data for objecs 1", "0d1fcc61a83de5c4894dc0c88e9a019d", objects[0].getData()); - //assertDigestEquals("Wrong data for object 2", "b323604b2003a7299c77c2693b641495", objects[1].getData()); + for (HSLFObjectData od : objects) { + long checkEMF = IOUtils.calculateChecksum(od.getData()); + assertEquals(checkSums[checkId++], checkEMF); + } + + slideShow.close(); } + + @Test - public void testOLEShape() throws Exception { + public void testOLEShape() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("ole2-embedding-2003.ppt")); HSLFSlide slide = ppt.getSlides().get(0); @@ -97,12 +111,12 @@ public final class TestOleEmbedding { } assertEquals("Expected 2 OLE shapes", 2, cnt); + ppt.close(); } @Test - public void testEmbedding() throws Exception { - HSLFSlideShowImpl _hslfSlideShow = HSLFSlideShowImpl.create(); - HSLFSlideShow ppt = new HSLFSlideShow(_hslfSlideShow); + public void testEmbedding() throws IOException { + HSLFSlideShow ppt = new HSLFSlideShow(); File pict = POIDataSamples.getSlideShowInstance().getFile("clock.jpg"); HSLFPictureData pictData = ppt.addPicture(pict, PictureType.JPEG); @@ -117,7 +131,7 @@ public final class TestOleEmbedding { OLEShape oleShape1 = new OLEShape(pictData); oleShape1.setObjectID(oleObjectId1); slide1.addShape(oleShape1); - oleShape1.setAnchor(new Rectangle(100,100,100,100)); + oleShape1.setAnchor(new Rectangle2D.Double(100,100,100,100)); // add second slide with different order in object creation HSLFSlide slide2 = ppt.createSlide(); @@ -131,7 +145,7 @@ public final class TestOleEmbedding { oleShape2.setObjectID(oleObjectId2); slide2.addShape(oleShape2); - oleShape2.setAnchor(new Rectangle(100,100,100,100)); + oleShape2.setAnchor(new Rectangle2D.Double(100,100,100,100)); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ppt.write(bos); @@ -148,6 +162,8 @@ public final class TestOleEmbedding { poiData1.close(); poiData2.close(); - + ppt.close(); } + + } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java index 3ce7a71b99..bf23bd403c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestShapes.java @@ -26,7 +26,7 @@ import static org.junit.Assert.assertTrue; import java.awt.Color; import java.awt.Dimension; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -49,7 +49,6 @@ import org.apache.poi.hslf.usermodel.HSLFShape; import org.apache.poi.hslf.usermodel.HSLFSimpleShape; import org.apache.poi.hslf.usermodel.HSLFSlide; import org.apache.poi.hslf.usermodel.HSLFSlideShow; -import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl; import org.apache.poi.hslf.usermodel.HSLFTextBox; import org.apache.poi.hslf.usermodel.HSLFTextParagraph; import org.apache.poi.hslf.usermodel.HSLFTextRun; @@ -84,7 +83,7 @@ public final class TestShapes { } @Test - public void graphics() throws Exception { + public void graphics() throws IOException { HSLFSlide slide = ppt.createSlide(); HSLFLine line = new HSLFLine(); @@ -96,7 +95,7 @@ public final class TestShapes { slide.addShape(line); HSLFAutoShape ellipse = new HSLFAutoShape(ShapeType.ELLIPSE); - java.awt.Rectangle ellipseAnchor = new Rectangle(320, 154, 55, 111); + Rectangle2D ellipseAnchor = new Rectangle2D.Double(320, 154, 55, 111); ellipse.setAnchor(ellipseAnchor); ellipse.setLineWidth(2); ellipse.setLineDash(LineDash.SOLID); @@ -110,10 +109,10 @@ public final class TestShapes { //read ppt from byte array - ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - assertEquals(1, ppt.getSlides().size()); + HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); + assertEquals(1, ppt2.getSlides().size()); - slide = ppt.getSlides().get(0); + slide = ppt2.getSlides().get(0); List shape = slide.getShapes(); assertEquals(2, shape.size()); @@ -122,6 +121,8 @@ public final class TestShapes { assertTrue(shape.get(1) instanceof HSLFAutoShape); //group shape assertEquals(ellipseAnchor, shape.get(1).getAnchor()); //group shape + + ppt2.close(); } /** @@ -129,7 +130,7 @@ public final class TestShapes { * @throws Exception */ @Test - public void textBoxRead() throws Exception { + public void textBoxRead() throws IOException { ppt = new HSLFSlideShow(_slTests.openResourceAsStream("with_textbox.ppt")); HSLFSlide sl = ppt.getSlides().get(0); for (HSLFShape sh : sl.getShapes()) { @@ -161,7 +162,7 @@ public final class TestShapes { @SuppressWarnings("unused") @Test - public void testParagraphs() throws Exception { + public void testParagraphs() throws IOException { HSLFSlideShow ss = new HSLFSlideShow(); HSLFSlide slide = ss.createSlide(); HSLFTextBox shape = new HSLFTextBox(); @@ -175,7 +176,7 @@ public final class TestShapes { p2r2.setStrikethrough(true); // run 3 has same text properties as run 2 and will be merged when saving HSLFTextRun p2r3 = shape.appendText("para 2 run 3.", false); - shape.setAnchor(new Rectangle(100,100,100,10)); + shape.setAnchor(new Rectangle2D.Double(100,100,100,10)); slide.addShape(shape); shape.resizeToFitText(); @@ -207,7 +208,7 @@ public final class TestShapes { * and set some of the style attributes */ @Test - public void textBoxWriteBytes() throws Exception { + public void textBoxWriteBytes() throws IOException { ppt = new HSLFSlideShow(); HSLFSlide sl = ppt.createSlide(); HSLFTextRun rt; @@ -241,8 +242,8 @@ public final class TestShapes { ppt.write(out); out.close(); - ppt = new HSLFSlideShow(new HSLFSlideShowImpl(new ByteArrayInputStream(out.toByteArray()))); - sl = ppt.getSlides().get(0); + HSLFSlideShow ppt2 = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); + sl = ppt2.getSlides().get(0); txtbox = (HSLFTextBox)sl.getShapes().get(0); rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0); @@ -255,6 +256,8 @@ public final class TestShapes { assertFalse(rt.isUnderlined()); assertEquals("Arial", rt.getFontFamily()); assertTrue(sameColor(Color.red, rt.getFontColor())); + + ppt2.close(); } /** @@ -276,7 +279,7 @@ public final class TestShapes { * it must be the same as returned by Slide.getTextRuns(). */ @Test - public void textBoxSet() throws Exception { + public void textBoxSet() throws IOException { textBoxSet("with_textbox.ppt"); textBoxSet("basic_test_ppt_file.ppt"); textBoxSet("next_test_ppt_file.ppt"); @@ -285,7 +288,7 @@ public final class TestShapes { textBoxSet("incorrect_slide_order.ppt"); } - private void textBoxSet(String filename) throws Exception { + private void textBoxSet(String filename) throws IOException { HSLFSlideShow ss = new HSLFSlideShow(_slTests.openResourceAsStream(filename)); for (HSLFSlide sld : ss.getSlides()) { ArrayList lst1 = new ArrayList(); @@ -311,13 +314,14 @@ public final class TestShapes { assertTrue(lst1.containsAll(lst2)); assertTrue(lst2.containsAll(lst1)); } + ss.close(); } /** * Test adding shapes to ShapeGroup */ @Test - public void shapeGroup() throws Exception { + public void shapeGroup() throws IOException { HSLFSlideShow ss = new HSLFSlideShow(); HSLFSlide slide = ss.createSlide(); @@ -325,22 +329,23 @@ public final class TestShapes { HSLFGroupShape group = new HSLFGroupShape(); - group.setAnchor(new Rectangle(0, 0, (int)pgsize.getWidth(), (int)pgsize.getHeight())); + group.setAnchor(new Rectangle2D.Double(0, 0, pgsize.getWidth(), pgsize.getHeight())); slide.addShape(group); HSLFPictureData data = ss.addPicture(_slTests.readFile("clock.jpg"), PictureType.JPEG); HSLFPictureShape pict = new HSLFPictureShape(data, group); - pict.setAnchor(new Rectangle(0, 0, 200, 200)); + pict.setAnchor(new Rectangle2D.Double(0, 0, 200, 200)); group.addShape(pict); HSLFLine line = new HSLFLine(group); - line.setAnchor(new Rectangle(300, 300, 500, 0)); + line.setAnchor(new Rectangle2D.Double(300, 300, 500, 0)); group.addShape(line); //serialize and read again. ByteArrayOutputStream out = new ByteArrayOutputStream(); ss.write(out); out.close(); + ss.close(); ByteArrayInputStream is = new ByteArrayInputStream(out.toByteArray()); ss = new HSLFSlideShow(is); @@ -359,10 +364,12 @@ public final class TestShapes { assertTrue(grshape.get(1) instanceof HSLFLine); pict = (HSLFPictureShape)grshape.get(0); - assertEquals(new Rectangle(0, 0, 200, 200), pict.getAnchor()); + assertEquals(new Rectangle2D.Double(0, 0, 200, 200), pict.getAnchor()); line = (HSLFLine)grshape.get(1); - assertEquals(new Rectangle(300, 300, 500, 0), line.getAnchor()); + assertEquals(new Rectangle2D.Double(300, 300, 500, 0), line.getAnchor()); + + ss.close(); } /** @@ -387,10 +394,12 @@ public final class TestShapes { ByteArrayOutputStream out = new ByteArrayOutputStream(); ss.write(out); out.close(); + ss.close(); ss = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); sl = ss.getSlides().get(0); assertEquals("expected 0 shaped in " + file, 0, sl.getShapes().size()); + ss.close(); } @Test @@ -409,7 +418,7 @@ public final class TestShapes { } @Test - public void shapeId() { + public void shapeId() throws IOException { HSLFSlideShow ss = new HSLFSlideShow(); HSLFSlide slide = ss.createSlide(); HSLFShape shape = null; @@ -456,6 +465,7 @@ public final class TestShapes { slide.addShape(shape); } assertEquals(numClusters + 1, dgg.getNumIdClusters()); + ss.close(); } @Test @@ -482,5 +492,7 @@ public final class TestShapes { assertEquals("Border width is 5 pt", sh4.getText()); assertEquals(Color.black, sh4.getLineColor()); assertEquals(5.0, sh4.getLineWidth(), 0); + + ss.close(); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java index 9b11555b1a..3c7bc9c9a5 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/model/TestTable.java @@ -25,6 +25,7 @@ import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.List; import org.apache.poi.POIDataSamples; @@ -42,8 +43,6 @@ import org.junit.Test; /** * Test Table object. - * - * @author Yegor Kozlov */ public final class TestTable { private static POIDataSamples _slTests = POIDataSamples.getSlideShowInstance(); @@ -52,7 +51,7 @@ public final class TestTable { * Test that ShapeFactory works properly and returns Table */ @Test - public void testShapeFactory() throws Exception { + public void testShapeFactory() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); @@ -72,20 +71,22 @@ public final class TestTable { ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); out.close(); - + ppt.close(); + ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); slide = ppt.getSlides().get(0); assertTrue(slide.getShapes().get(0) instanceof HSLFTable); HSLFTable tbl3 = (HSLFTable)slide.getShapes().get(0); assertEquals(tbl.getNumberOfColumns(), tbl3.getNumberOfColumns()); assertEquals(tbl.getNumberOfRows(), tbl3.getNumberOfRows()); + ppt.close(); } /** * Error constructing Table when rownum=1 */ @Test - public void test45889(){ + public void test45889() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); List shapes; @@ -101,24 +102,25 @@ public final class TestTable { assertEquals(tbl1.getNumberOfColumns(), tbl2.getNumberOfColumns()); assertEquals(tbl1.getNumberOfRows(), tbl2.getNumberOfRows()); + ppt.close(); } - @Test - public void testIllegalCOnstruction(){ + @Test(expected=IllegalArgumentException.class) + public void testIllegalRowCnstruction() throws IOException { HSLFSlideShow ppt = new HSLFSlideShow(); HSLFSlide slide = ppt.createSlide(); - try { - slide.createTable(0, 5); - fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1"); - } catch (IllegalArgumentException e){ - - } - try { - slide.createTable(5, 0); - fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1"); - } catch (IllegalArgumentException e){ + slide.createTable(0, 5); + fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1"); + ppt.close(); + } - } + @Test(expected=IllegalArgumentException.class) + public void testIllegalColConstruction() throws IOException { + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + slide.createTable(5, 0); + fail("Table(rownum, colnum) must throw IllegalArgumentException if any of tghe arguments is less than 1"); + ppt.close(); } /** @@ -126,7 +128,7 @@ public final class TestTable { * when the table is positioned with its top at -1 */ @Test - public void test57820() throws Exception { + public void test57820() throws IOException { SlideShow ppt = new HSLFSlideShow(_slTests.openResourceAsStream("bug57820-initTableNullRefrenceException.ppt")); List> slides = ppt.getSlides(); @@ -143,7 +145,8 @@ public final class TestTable { } assertNotNull(tbl); - assertEquals(-1, tbl.getAnchor().getY(), 0); + + ppt.close(); } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java index 7a917fafd5..a151db2ba7 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTable.java @@ -25,7 +25,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.awt.Color; -import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -58,10 +58,10 @@ public class TestTable { new DrawTableShape(table).setAllBorders(1.0, Color.black, StrokeStyle.LineDash.DASH_DOT); - table.setAnchor(new Rectangle(100, 100, 400, 400)); + table.setAnchor(new Rectangle2D.Double(100, 100, 400, 400)); - Rectangle rectExp = new Rectangle(420,367,80,133); - Rectangle rectAct = table.getCell(rows-1, cols-1).getAnchor(); + Rectangle2D rectExp = new Rectangle2D.Double(420,366.625,80,133.375); + Rectangle2D rectAct = table.getCell(rows-1, cols-1).getAnchor(); assertEquals(rectExp, rectAct); ppt.close(); } diff --git a/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java b/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java index 59dd694da7..49338e0b68 100644 --- a/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java +++ b/src/testcases/org/apache/poi/sl/draw/geom/TestPresetGeometries.java @@ -22,8 +22,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import java.awt.Rectangle; import java.awt.geom.GeneralPath; +import java.awt.geom.Rectangle2D; import java.net.URL; import java.util.Enumeration; import java.util.Map; @@ -38,7 +38,7 @@ public class TestPresetGeometries { for(String name : shapes.keySet()) { CustomGeometry geom = shapes.get(name); - Context ctx = new Context(geom, new Rectangle(0, 0, 100, 100), new IAdjustableShape() { + Context ctx = new Context(geom, new Rectangle2D.Double(0, 0, 100, 100), new IAdjustableShape() { public Guide getAdjustValue(String presetName) { return null; } diff --git a/test-data/slideshow/table_test.ppt b/test-data/slideshow/table_test.ppt new file mode 100644 index 0000000000..d1c688a3ac Binary files /dev/null and b/test-data/slideshow/table_test.ppt differ diff --git a/test-data/slideshow/table_test.pptx b/test-data/slideshow/table_test.pptx new file mode 100644 index 0000000000..451a6dce78 Binary files /dev/null and b/test-data/slideshow/table_test.pptx differ