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-ffa450edef68tags/REL_3_14_BETA1
@@ -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); |
@@ -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(); | |||
} | |||
} |
@@ -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) {} |
@@ -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)); | |||
} | |||
} |
@@ -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) {} |
@@ -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<S,P>, | |||
@@ -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); | |||
} |
@@ -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<S,P>, | |||
@@ -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 |
@@ -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<S,P>, | |||
@@ -37,5 +37,5 @@ public interface Shape< | |||
* | |||
* @return the anchor of this shape | |||
*/ | |||
Rectangle getAnchor(); | |||
Rectangle2D getAnchor(); | |||
} |
@@ -27,6 +27,14 @@ public interface TableShape< | |||
TableCell<S,P> 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. | |||
* |
@@ -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) { |
@@ -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 |
@@ -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; | |||
} | |||
} |
@@ -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()); |
@@ -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<XSLFShape, XSLFTextParagraph> { | |||
/*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()); |
@@ -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<XSLFShape,XSLFTextParagraph> { | |||
} | |||
@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<XSLFShape,XSLFTextParagraph> { | |||
* 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<XSLFShape,XSLFTextParagraph> { | |||
* 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()); |
@@ -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 Shadow<XSLFShape,XSLFTextPa | |||
} | |||
@Override | |||
public Rectangle getAnchor(){ | |||
public Rectangle2D getAnchor(){ | |||
return _parent.getAnchor(); | |||
} | |||
public void setAnchor(Rectangle anchor){ | |||
public void setAnchor(Rectangle2D anchor){ | |||
throw new IllegalStateException("You can't set anchor of a shadow"); | |||
} | |||
@@ -20,7 +20,7 @@ | |||
package org.apache.poi.xslf.usermodel; | |||
import java.awt.Color; | |||
import java.awt.Rectangle; | |||
import java.awt.geom.Rectangle2D; | |||
import javax.xml.stream.XMLStreamException; | |||
import javax.xml.stream.XMLStreamReader; | |||
@@ -121,21 +121,21 @@ public abstract class XSLFSimpleShape extends XSLFShape | |||
} | |||
@Override | |||
public Rectangle getAnchor() { | |||
public Rectangle2D getAnchor() { | |||
CTTransform2D 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) { | |||
CTTransform2D xfrm = getSafeXfrm(); | |||
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff(); | |||
long x = Units.toEMU(anchor.getX()); |
@@ -100,6 +100,7 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow | |||
return _table.sizeOfTrArray(); | |||
} | |||
@Override | |||
public double getColumnWidth(int idx){ | |||
return Units.toPoints( | |||
_table.getTblGrid().getGridColArray(idx).getW()); | |||
@@ -110,6 +111,11 @@ public class XSLFTable extends XSLFGraphicFrame implements Iterable<XSLFTableRow | |||
_table.getTblGrid().getGridColArray(idx).setW(Units.toEMU(width)); | |||
} | |||
@Override | |||
public double getRowHeight(int row) { | |||
return Units.toPoints(_table.getTrArray(row).getH()); | |||
} | |||
@Override | |||
public void setRowHeight(int row, double height) { | |||
_table.getTrArray(row).setH(Units.toEMU(height)); |
@@ -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; | |||
@@ -518,8 +518,8 @@ public abstract class XSLFTextShape extends XSLFSimpleShape | |||
* | |||
* @return a <code>Rectangle2D</code> 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(); |
@@ -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<cols; i++) { | |||
assertEquals(ts.getColumnWidth(i), tsx.getColumnWidth(i), 0.2); | |||
} | |||
for (int i=0; i<rows; i++) { | |||
assertEquals(ts.getRowHeight(i), tsx.getRowHeight(i), 0.3); | |||
} | |||
pptx.close(); | |||
ppt.close(); | |||
} | |||
} |
@@ -22,7 +22,7 @@ import static org.junit.Assert.assertEquals; | |||
import static org.junit.Assert.assertNotNull; | |||
import java.awt.Dimension; | |||
import java.awt.Rectangle; | |||
import java.awt.geom.Rectangle2D; | |||
import org.apache.poi.POIDataSamples; | |||
import org.apache.poi.sl.usermodel.PictureData; | |||
@@ -32,6 +32,7 @@ import org.apache.poi.sl.usermodel.Shape; | |||
import org.apache.poi.sl.usermodel.Slide; | |||
import org.apache.poi.sl.usermodel.SlideShow; | |||
import org.apache.poi.sl.usermodel.SlideShowFactory; | |||
import org.apache.poi.util.Units; | |||
import org.junit.Test; | |||
public class TestDrawPictureShape { | |||
@@ -54,18 +55,32 @@ public class TestDrawPictureShape { | |||
PictureData pd = picShape.getPictureData(); | |||
Dimension dimPd = pd.getImageDimension(); | |||
new DrawPictureShape(picShape).resize(); | |||
Dimension dimShape = picShape.getAnchor().getSize(); | |||
Dimension dimShape = new Dimension( | |||
(int)picShape.getAnchor().getWidth(), | |||
(int)picShape.getAnchor().getHeight() | |||
); | |||
assertEquals(dimPd, dimShape); | |||
int newWidth = (int)(dimPd.getWidth()*(100d/dimPd.getHeight())); | |||
double newWidth = (dimPd.getWidth()*(100d/dimPd.getHeight())); | |||
// ... -1 is a rounding error | |||
Rectangle expRect = new Rectangle(50+300-newWidth-1, 50, newWidth, 100); | |||
Rectangle target = new Rectangle(50,50,300,100); | |||
Rectangle2D expRect = new Rectangle2D.Double(rbf(50+300-newWidth, picShape), 50, rbf(newWidth, picShape), 100); | |||
Rectangle2D target = new Rectangle2D.Double(50,50,300,100); | |||
new DrawPictureShape(picShape).resize(target, RectAlign.BOTTOM_RIGHT); | |||
Rectangle actRect = picShape.getAnchor(); | |||
assertEquals(expRect, actRect); | |||
Rectangle2D actRect = picShape.getAnchor(); | |||
assertEquals(expRect.getX(), actRect.getX(), .0001); | |||
assertEquals(expRect.getY(), actRect.getY(), .0001); | |||
assertEquals(expRect.getWidth(), actRect.getWidth(), .0001); | |||
assertEquals(expRect.getHeight(), actRect.getHeight(), .0001); | |||
ss.close(); | |||
} | |||
} | |||
// round back and forth - points -> master -> points | |||
static double rbf(double val, PictureShape<?,?> picShape) { | |||
if (picShape.getClass().getName().contains("HSLF")) { | |||
return Units.masterToPoints(Units.pointsToMaster(val)); | |||
} else { | |||
return val; | |||
} | |||
} | |||
} |
@@ -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); |
@@ -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); | |||
@@ -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()); | |||
@@ -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 |
@@ -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<byte[]> segInfo = new ArrayList<byte[]>(); |
@@ -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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
/** | |||
* Moves and scales this <code>ShapeGroup</code> 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<HSLFShape,HSLFTextParagraph> { | |||
* | |||
* @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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
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; | |||
} |
@@ -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<HS | |||
return _escherContainer; | |||
} | |||
@SuppressWarnings("resource") | |||
@Override | |||
public HSLFPictureData getPictureData(){ | |||
HSLFSlideShow ppt = getSheet().getSlideShow(); | |||
@@ -132,6 +133,7 @@ public class HSLFPictureShape extends HSLFSimpleShape implements PictureShape<HS | |||
return null; | |||
} | |||
@SuppressWarnings("resource") | |||
protected EscherBSERecord getEscherBSERecord(){ | |||
HSLFSlideShow ppt = getSheet().getSlideShow(); | |||
Document doc = ppt.getDocumentRecord(); | |||
@@ -184,7 +186,7 @@ public class HSLFPictureShape extends HSLFSimpleShape implements PictureShape<HS | |||
EscherBSERecord bse = getEscherBSERecord(); | |||
bse.setRef(bse.getRef() + 1); | |||
Rectangle anchor = getAnchor(); | |||
Rectangle2D anchor = getAnchor(); | |||
if (anchor.isEmpty()){ | |||
new DrawPictureShape(this).resize(); | |||
} |
@@ -19,7 +19,7 @@ package org.apache.poi.hslf.usermodel; | |||
import java.awt.Color; | |||
import java.awt.Graphics2D; | |||
import java.awt.Rectangle; | |||
import java.awt.geom.Rectangle2D; | |||
import java.util.Iterator; | |||
import org.apache.poi.ddf.AbstractEscherOptRecord; | |||
@@ -133,7 +133,7 @@ public abstract class HSLFShape implements Shape<HSLFShape,HSLFTextParagraph> { | |||
* | |||
* @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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
// 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<HSLFShape,HSLFTextParagraph> { | |||
* | |||
* @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<HSLFShape,HSLFTextParagraph> { | |||
* @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); | |||
} |
@@ -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<HSLFShape,H | |||
public HSLFTextBox createTextBox() { | |||
HSLFTextBox s = new HSLFTextBox(); | |||
s.setHorizontalCentered(true); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} | |||
@@ -411,7 +411,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
public HSLFAutoShape createAutoShape() { | |||
HSLFAutoShape s = new HSLFAutoShape(ShapeType.RECT); | |||
s.setHorizontalCentered(true); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} | |||
@@ -420,7 +420,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
public HSLFFreeformShape createFreeform() { | |||
HSLFFreeformShape s = new HSLFFreeformShape(); | |||
s.setHorizontalCentered(true); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} | |||
@@ -428,7 +428,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
@Override | |||
public HSLFConnectorShape createConnector() { | |||
HSLFConnectorShape s = new HSLFConnectorShape(); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} | |||
@@ -436,7 +436,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
@Override | |||
public HSLFGroupShape createGroup() { | |||
HSLFGroupShape s = new HSLFGroupShape(); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} | |||
@@ -447,7 +447,7 @@ public abstract class HSLFSheet implements HSLFShapeContainer, Sheet<HSLFShape,H | |||
throw new IllegalArgumentException("pictureData needs to be of type HSLFPictureData"); | |||
} | |||
HSLFPictureShape s = new HSLFPictureShape((HSLFPictureData)pictureData); | |||
s.setAnchor(new Rectangle(0, 0, 100, 100)); | |||
s.setAnchor(new Rectangle2D.Double(0, 0, 100, 100)); | |||
addShape(s); | |||
return s; | |||
} |
@@ -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.Collections; | |||
import java.util.Comparator; | |||
@@ -76,13 +76,13 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
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<HSLFShape,HSLFTextParagraph> { | |||
private static class TableCellComparator implements Comparator<HSLFShape> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
htc.add((HSLFTableCell)h); | |||
} | |||
} | |||
if (htc.isEmpty()) { | |||
throw new IllegalStateException("HSLFTable without HSLFTableCells"); | |||
} | |||
@@ -186,12 +191,12 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> { | |||
List<HSLFTableCell[]> lst = new ArrayList<HSLFTableCell[]>(); | |||
List<HSLFTableCell> row = new ArrayList<HSLFTableCell>(); | |||
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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
// 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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
} | |||
@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<HSLFShape,HSLFTextParagraph> { | |||
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<HSLFShape,HSLFTextParagraph> { | |||
} | |||
@Override | |||
protected void moveAndScale(Rectangle anchorDest){ | |||
protected void moveAndScale(Rectangle2D anchorDest){ | |||
super.moveAndScale(anchorDest); | |||
updateRowHeightsProperty(); | |||
} | |||
@@ -403,7 +432,7 @@ implements HSLFShapeContainer, TableShape<HSLFShape,HSLFTextParagraph> { | |||
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); | |||
} |
@@ -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<HSLFSh | |||
if (line == null) { | |||
return; | |||
} | |||
Rectangle cellAnchor = getAnchor(); | |||
Rectangle lineAnchor = new Rectangle(); | |||
Rectangle2D cellAnchor = getAnchor(); | |||
double x,y,w,h; | |||
switch(edge){ | |||
case top: | |||
lineAnchor.x = cellAnchor.x; | |||
lineAnchor.y = cellAnchor.y; | |||
lineAnchor.width = cellAnchor.width; | |||
lineAnchor.height = 0; | |||
x = cellAnchor.getX(); | |||
y = cellAnchor.getY(); | |||
w = cellAnchor.getWidth(); | |||
h = 0; | |||
break; | |||
case right: | |||
lineAnchor.x = cellAnchor.x + cellAnchor.width; | |||
lineAnchor.y = cellAnchor.y; | |||
lineAnchor.width = 0; | |||
lineAnchor.height = cellAnchor.height; | |||
x = cellAnchor.getX() + cellAnchor.getWidth(); | |||
y = cellAnchor.getY(); | |||
w = 0; | |||
h = cellAnchor.getHeight(); | |||
break; | |||
case bottom: | |||
lineAnchor.x = cellAnchor.x; | |||
lineAnchor.y = cellAnchor.y + cellAnchor.height; | |||
lineAnchor.width = cellAnchor.width; | |||
lineAnchor.height = 0; | |||
x = cellAnchor.getX(); | |||
y = cellAnchor.getY() + cellAnchor.getHeight(); | |||
w = cellAnchor.getWidth(); | |||
h = 0; | |||
break; | |||
case left: | |||
lineAnchor.x = cellAnchor.x; | |||
lineAnchor.y = cellAnchor.y; | |||
lineAnchor.width = 0; | |||
lineAnchor.height = cellAnchor.height; | |||
x = cellAnchor.getX(); | |||
y = cellAnchor.getY(); | |||
w = 0; | |||
h = cellAnchor.getHeight(); | |||
break; | |||
default: | |||
throw new IllegalArgumentException(); | |||
} | |||
line.setAnchor(lineAnchor); | |||
line.setAnchor(new Rectangle2D.Double(x,y,w,h)); | |||
} | |||
public void setAnchor(Rectangle anchor){ | |||
public void setAnchor(Rectangle2D anchor){ | |||
super.setAnchor(anchor); | |||
anchorBorder(BorderEdge.top, borderTop); |
@@ -20,7 +20,6 @@ package org.apache.poi.hslf.usermodel; | |||
import static org.apache.poi.hslf.record.RecordTypes.OEPlaceholderAtom; | |||
import static org.apache.poi.hslf.record.RecordTypes.RoundTripHFPlaceholder12; | |||
import java.awt.Rectangle; | |||
import java.awt.font.FontRenderContext; | |||
import java.awt.geom.Rectangle2D; | |||
import java.io.IOException; | |||
@@ -209,7 +208,11 @@ implements TextShape<HSLFShape,HSLFTextParagraph> { | |||
} 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<HSLFShape,HSLFTextParagraph> { | |||
* @return a <code>Rectangle2D</code> 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(); |
@@ -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()); |
@@ -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<HSLFPictureData> 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(); | |||
} | |||
} |
@@ -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<HSLFShape> 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<String> lst1 = new ArrayList<String>(); | |||
@@ -311,13 +314,14 @@ public final class TestShapes { | |||
assertTrue(lst1.containsAll(lst2)); | |||
assertTrue(lst2.containsAll(lst1)); | |||
} | |||
ss.close(); | |||
} | |||
/** | |||
* Test adding shapes to <code>ShapeGroup</code> | |||
*/ | |||
@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(); | |||
} | |||
} |
@@ -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 <code>Table</code> 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 <code>Table</code> | |||
*/ | |||
@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<HSLFShape> 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<? extends Slide<?,?>> slides = ppt.getSlides(); | |||
@@ -143,7 +145,8 @@ public final class TestTable { | |||
} | |||
assertNotNull(tbl); | |||
assertEquals(-1, tbl.getAnchor().getY(), 0); | |||
ppt.close(); | |||
} | |||
} |
@@ -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(); | |||
} |
@@ -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; | |||
} |