Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TableCell.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TableCell.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TableCell.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TableCell.java Thu Oct 29 01:05:27 2015 @@ -17,9 +17,70 @@ package org.apache.poi.sl.usermodel; +import java.awt.Color; + +import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; + public interface TableCell< S extends Shape<S,P>, P extends TextParagraph<S,P,?> > extends TextShape<S,P> { + enum BorderEdge { bottom, left, top, right }; + + /** + * Return line style of given edge or {@code null} if border is not defined + * + * @param edge the border edge + * @return line style of given edge or {@code null} if border is not defined + */ + StrokeStyle getBorderStyle(BorderEdge edge); + + /** + * Sets the {@link StrokeStyle} of the given border edge. + * A {@code null} property of the style is ignored. + * + * @param edge border edge + * @param style the new stroke style + */ + void setBorderStyle(BorderEdge edge, StrokeStyle style); + + /** + * Convenience method for setting the border width. + * + * @param edge border edge + * @param width the new border width + */ + void setBorderWidth(BorderEdge edge, double width); + + /** + * Convenience method for setting the border color. + * + * @param edge border edge + * @param color the new border color + */ + void setBorderColor(BorderEdge edge, Color color); + + /** + * Convenience method for setting the border line compound. + * + * @param edge border edge + * @param compound the new border line compound + */ + void setBorderCompound(BorderEdge edge, LineCompound compound); + /** + * Convenience method for setting the border line dash. + * + * @param edge border edge + * @param dash the new border line dash + */ + void setBorderDash(BorderEdge edge, LineDash dash); + + /** + * Remove all line attributes of the given border edge + * + * @param edge the border edge to be cleared + */ + void removeBorder(BorderEdge edge); }
Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TableShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TableShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TableShape.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TableShape.java Thu Oct 29 01:05:27 2015 @@ -21,5 +21,25 @@ public interface TableShape< S extends Shape<S,P>, P extends TextParagraph<S,P,?> > extends Shape<S,P>, PlaceableShape<S,P> { - // to be defined ... + int getNumberOfColumns(); + + int getNumberOfRows(); + + TableCell<S,P> getCell(int row, int col); + + /** + * Sets the width (in points) of the n-th column + * + * @param idx the column index (0-based) + * @param width the width (in points) + */ + void setColumnWidth(int idx, double width); + + /** + * Sets the row height. + * + * @param row the row index (0-based) + * @param height the height to set (in points) + */ + void setRowHeight(int row, double height); } Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TextBox.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TextBox.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TextBox.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TextBox.java Thu Oct 29 01:05:27 2015 @@ -17,6 +17,13 @@ package org.apache.poi.sl.usermodel; +/** + * Represents a TextFrame shape in PowerPoint. + * <p> + * Contains the text in a text frame as well as the properties and methods + * that control alignment and anchoring of the text. + * </p> + */ public interface TextBox< S extends Shape<S,P>, P extends TextParagraph<S,P,?> Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TextParagraph.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TextParagraph.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TextParagraph.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TextParagraph.java Thu Oct 29 01:05:27 2015 @@ -18,6 +18,7 @@ package org.apache.poi.sl.usermodel; import java.awt.Color; +import java.util.List; @@ -339,4 +340,9 @@ public interface TextParagraph< TextShape<S,P> getParentShape(); + + /** + * Fetch the text runs that are contained within this block of text + */ + List<T> getTextRuns(); } Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TextRun.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TextRun.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TextRun.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TextRun.java Thu Oct 29 01:05:27 2015 @@ -30,23 +30,23 @@ public interface TextRun { SMALL, ALL } - + String getRawText(); - void setText(String text); + void setText(String text); - TextCap getTextCap(); - - /** - * Returns the font color. - * This usually returns a {@link SolidPaint}, but but also other classes are possible - * - * @return the font color/paint - * + TextCap getTextCap(); + + /** + * Returns the font color. + * This usually returns a {@link SolidPaint}, but but also other classes are possible + * + * @return the font color/paint + * * @see org.apache.poi.sl.draw.DrawPaint#getPaint(java.awt.Graphics2D, PaintStyle) * @see SolidPaint#getSolidColor() - * @see org.apache.poi.sl.draw.DrawPaint#applyColorTransform(ColorStyle) - */ - PaintStyle getFontColor(); + * @see org.apache.poi.sl.draw.DrawPaint#applyColorTransform(ColorStyle) + */ + PaintStyle getFontColor(); /** * Sets the (solid) font color - convenience function @@ -56,41 +56,104 @@ public interface TextRun { void setFontColor(Color color); /** - * Sets the font color - * - * @param color the color - * - * @see org.apache.poi.sl.draw.DrawPaint#createSolidPaint(Color) - */ - void setFontColor(PaintStyle color); - - + * Sets the font color + * + * @param color the color + * + * @see org.apache.poi.sl.draw.DrawPaint#createSolidPaint(Color) + */ + void setFontColor(PaintStyle color); + + /** * Returns the font size which is either set directly on this text run or * given from the slide layout - * + * * @return font size in points or null if font size is not set. */ - Double getFontSize(); + Double getFontSize(); /** * Sets the font size directly on this text run, if null is given, the * font size defaults to the values given from the slide layout - * + * * @param fontSize font size in points, if null the underlying fontsize will be unset */ - void setFontSize(Double fontSize); - String getFontFamily(); - - boolean isBold(); - boolean isItalic(); - boolean isUnderlined(); - boolean isStrikethrough(); - boolean isSubscript(); - boolean isSuperscript(); - - /** - * @return the pitch and family id or -1 if not applicable - */ - byte getPitchAndFamily(); + void setFontSize(Double fontSize); + + /** + * @return font family or null if not set + */ + String getFontFamily(); + + /** + * Specifies the typeface, or name of the font that is to be used for this text run. + * + * @param typeface the font to apply to this text run. + * The value of <code>null</code> unsets the Typeface attrubute from the underlying xml. + */ + void setFontFamily(String typeface); + + /** + * @return true, if text is bold + */ + boolean isBold(); + + /** + * Sets the bold state + * + * @param bold set to true for bold text, false for normal weight + */ + void setBold(boolean bold); + + /** + * @return true, if text is italic + */ + boolean isItalic(); + + /** + * Sets the italic state + * + * @param italic set to true for italic text, false for non-italics + */ + void setItalic(boolean italic); + + /** + * @return true, if text is underlined + */ + boolean isUnderlined(); + + /** + * Sets the underlined state + * + * @param underlined set to true for underlined text, false for no underlining + */ + void setUnderlined(boolean underlined); + + /** + * @return true, if text is stroked + */ + boolean isStrikethrough(); + + /** + * Sets the strikethrough state + * + * @param stroked set to true for stroked text, false for no stroking + */ + void setStrikethrough(boolean stroked); + + /** + * @return true, if text is sub scripted + */ + boolean isSubscript(); + + /** + * @return true, if text is super scripted + */ + boolean isSuperscript(); + + /** + * @return the pitch and family id or -1 if not applicable + */ + byte getPitchAndFamily(); } Modified: poi/trunk/src/java/org/apache/poi/sl/usermodel/TextShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/sl/usermodel/TextShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/java/org/apache/poi/sl/usermodel/TextShape.java (original) +++ poi/trunk/src/java/org/apache/poi/sl/usermodel/TextShape.java Thu Oct 29 01:05:27 2015 @@ -26,7 +26,7 @@ public interface TextShape< /** * Vertical Text Types */ - public enum TextDirection { + enum TextDirection { /** * Horizontal text. This should be default. */ @@ -59,7 +59,7 @@ public interface TextShape< * Auto-fitting is when text within a shape is scaled in order to contain all the text inside * </p> */ - public enum TextAutofit { + enum TextAutofit { /** * Specifies that text within the text body should not be auto-fit to the bounding box. * Auto-fitting is when text within a text box is scaled in order to remain inside @@ -89,6 +89,46 @@ public interface TextShape< */ SHAPE } + + /** + * This enum represents a compromise for the handling of + * HSLF run types (see org.apache.poi.hslf.record.TextHeaderAtom) and + * XSLF placeholders (see org.apache.poi.xslf.usermodel.Placeholder). + * When a shape is considered a placeholder by the generating application + * it can have special properties to alert the user that they may enter content into the shape. + * + * This enum and the handling around it may change significantly in future releases + */ + enum TextPlaceholder { + /** Title placeholder shape text */ + TITLE, + /** Body placeholder shape text */ + BODY, + /** Center title placeholder shape text */ + CENTER_TITLE, + /** Center body placeholder shape text */ + CENTER_BODY, + /** Half-sized body placeholder shape text */ + HALF_BODY, + /** Quarter-sized body placeholder shape text */ + QUARTER_BODY, + /** Notes placeholder shape text */ + NOTES, + /** Any other text */ + OTHER + } + + /** + * Sets (overwrites) the current text. + * Uses the properties of the first paragraph / textrun. + * Text paragraphs are split by \\r or \\n. + * New lines within text run are split by \\u000b + * + * @param text the text string used by this object. + * + * @return the last text run of the - potential split - text + */ + TextRun setText(String text); /** * @return the TextParagraphs for this text box @@ -99,6 +139,13 @@ public interface TextShape< * @return text shape margin */ Insets2D getInsets(); + + /** + * Sets the shape margins + * + * @param insets the new shape margins + */ + void setInsets(Insets2D insets); /** * Compute the cumulative height occupied by the text @@ -113,6 +160,14 @@ public interface TextShape< VerticalAlignment getVerticalAlignment(); /** + * Sets the type of vertical alignment for the text. + * + * @param vAlign - the type of alignment. + * A {@code null} values unsets this property. + */ + void setVerticalAlignment(VerticalAlignment vAlign); + + /** * Returns if the text is centered. * If true and if the individual paragraph settings allow it, * the whole text block will be displayed centered, i.e. its left and right @@ -123,12 +178,35 @@ public interface TextShape< boolean isHorizontalCentered(); /** + * Sets if the paragraphs are horizontal centered + * + * @param isCentered true, if the paragraphs are horizontal centered + * A {@code null} values unsets this property. + */ + void setHorizontalCentered(Boolean isCentered); + + /** * @return whether to wrap words within the bounding rectangle */ boolean getWordWrap(); /** + * @param wrap whether to wrap words within the bounding rectangle + */ + void setWordWrap(boolean wrap); + + /** * @return vertical orientation of the text */ TextDirection getTextDirection(); + + /** + * Sets the text placeholder + */ + void setTextPlaceholder(TextPlaceholder placeholder); + + /** + * @return the text placeholder + */ + TextPlaceholder getTextPlaceholder(); } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java Thu Oct 29 01:05:27 2015 @@ -41,7 +41,6 @@ import org.apache.poi.sl.usermodel.Pictu import org.apache.poi.sl.usermodel.Resources; import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.Beta; -import org.apache.poi.util.DocumentHelper; import org.apache.poi.util.IOUtils; import org.apache.poi.util.Internal; import org.apache.poi.util.LittleEndian; @@ -404,11 +403,7 @@ implements SlideShow<XSLFShape,XSLFTextP return slide; } - /** - * Returns the current page size - * - * @return the page size - */ + @Override public Dimension getPageSize(){ CTSlideSize sz = _presentation.getSldSz(); int cx = sz.getCx(); @@ -416,11 +411,7 @@ implements SlideShow<XSLFShape,XSLFTextP return new Dimension((int)Units.toPoints(cx), (int)Units.toPoints(cy)); } - /** - * Sets the page size to the given <code>Dimension</code> object. - * - * @param pgSize page size - */ + @Override public void setPageSize(Dimension pgSize){ CTSlideSize sz = CTSlideSize.Factory.newInstance(); sz.setCx(Units.toEMU(pgSize.getWidth())); Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFAutoShape.java Thu Oct 29 01:05:27 2015 @@ -25,7 +25,12 @@ import org.openxmlformats.schemas.drawin import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D; import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual; @@ -71,14 +76,26 @@ public class XSLFAutoShape extends XSLFT prst.addNewAvLst(); return ct; } + + protected static void initTextBody(CTTextBody txBody) { + CTTextBodyProperties bodypr = txBody.addNewBodyPr(); + bodypr.setAnchor(STTextAnchoringType.T); + bodypr.setRtlCol(false); + CTTextParagraph p = txBody.addNewP(); + p.addNewPPr().setAlgn(STTextAlignType.L); + CTTextCharacterProperties endPr = p.addNewEndParaRPr(); + endPr.setLang("en-US"); + endPr.setSz(1100); + p.addNewR().setT(""); + txBody.addNewLstStyle(); + } protected CTTextBody getTextBody(boolean create){ CTShape shape = (CTShape)getXmlObject(); CTTextBody txBody = shape.getTxBody(); if (txBody == null && create) { txBody = shape.addNewTxBody(); - txBody.addNewBodyPr(); - txBody.addNewLstStyle(); + initTextBody(txBody); } return txBody; } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShape.java Thu Oct 29 01:05:27 2015 @@ -33,6 +33,7 @@ import org.apache.poi.sl.usermodel.Paint import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint; import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint; import org.apache.poi.sl.usermodel.PlaceableShape; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.Shape; import org.apache.poi.util.Beta; import org.apache.poi.util.Internal; Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java Thu Oct 29 01:05:27 2015 @@ -39,6 +39,7 @@ import org.apache.poi.sl.draw.DrawFactor import org.apache.poi.sl.draw.DrawPictureShape; import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.PictureData; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.Sheet; import org.apache.poi.util.Beta; import org.apache.poi.util.IOUtils; Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSimpleShape.java Thu Oct 29 01:05:27 2015 @@ -88,25 +88,23 @@ public abstract class XSLFSimpleShape ex super(shape,sheet); } - /** - * - * @param type - */ - public void setShapeType(ShapeType type){ + @Override + public void setShapeType(ShapeType type) { STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId); getSpPr().getPrstGeom().setPrst(geom); } + @Override public ShapeType getShapeType(){ STShapeType.Enum geom = getSpPr().getPrstGeom().getPrst(); return ShapeType.forId(geom.intValue(), true); } - + protected CTTransform2D getSafeXfrm() { CTTransform2D xfrm = getXfrm(); return (xfrm == null ? getSpPr().addNewXfrm() : xfrm); } - + protected CTTransform2D getXfrm() { PropertyFetcher<CTTransform2D> fetcher = new PropertyFetcher<CTTransform2D>() { public boolean fetch(XSLFShape shape) { @@ -151,7 +149,7 @@ public abstract class XSLFSimpleShape ex ext.setCx(cx); ext.setCy(cy); } - + @Override public void setRotation(double theta) { getSafeXfrm().setRot((int) (theta * 60000)); @@ -185,7 +183,7 @@ public abstract class XSLFSimpleShape ex return (xfrm == null || !xfrm.isSetFlipV()) ? false : getXfrm().getFlipV(); } - + /** * Get default line properties defined in the theme (if any). * Used internally to resolve shape properties. @@ -199,7 +197,7 @@ public abstract class XSLFSimpleShape ex if (lnRef == null) return null; // 1-based index of a line style within the style matrix int idx = (int)lnRef.getIdx(); - + XSLFTheme theme = getSheet().getTheme(); if (theme == null) return null; CTBaseStyles styles = theme.getXmlObject().getThemeElements(); @@ -208,7 +206,7 @@ public abstract class XSLFSimpleShape ex if (styleMatrix == null) return null; CTLineStyleList lineStyles = styleMatrix.getLnStyleLst(); if (lineStyles == null || lineStyles.sizeOfLnArray() < idx) return null; - + return lineStyles.getLnArray(idx - 1); } @@ -262,7 +260,7 @@ public abstract class XSLFSimpleShape ex setValue(null); // use it as 'nofill' value return true; } - + PaintStyle paint = null; PackagePart pp = getSheet().getPackagePart(); for (XmlObject obj : spPr.selectPath("*")) { @@ -290,11 +288,11 @@ public abstract class XSLFSimpleShape ex PaintStyle paint = fetcher.getValue(); if (paint != null) return paint; - + // line color was not found, check if it is defined in the theme CTShapeStyle style = getSpStyle(); if (style == null) return null; - + // get a reference to a line style within the style matrix. CTStyleMatrixReference lnRef = style.getLnRef(); int idx = (int)lnRef.getIdx(); @@ -308,7 +306,7 @@ public abstract class XSLFSimpleShape ex return paint; } - + /** * * @param width line width in points. <code>0</code> means no line @@ -362,6 +360,40 @@ public abstract class XSLFSimpleShape ex return lineWidth; } + + /** + * @param compound set the line compound style + */ + public void setLineCompound(LineCompound compound) { + CTShapeProperties spPr = getSpPr(); + if (compound == null) { + if (spPr.isSetLn() && spPr.getLn().isSetCmpd()) + spPr.getLn().unsetCmpd(); + } else { + CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr.addNewLn(); + STCompoundLine.Enum xCmpd; + switch (compound) { + default: + case SINGLE: + xCmpd = STCompoundLine.SNG; + break; + case DOUBLE: + xCmpd = STCompoundLine.DBL; + break; + case THICK_THIN: + xCmpd = STCompoundLine.THICK_THIN; + break; + case THIN_THICK: + xCmpd = STCompoundLine.THIN_THICK; + break; + case TRIPLE: + xCmpd = STCompoundLine.TRI; + break; + } + ln.setCmpd(xCmpd); + } + } + /** * @return the line compound */ @@ -392,7 +424,7 @@ public abstract class XSLFSimpleShape ex } } } - + if (cmpd == null) return null; switch (cmpd) { @@ -417,15 +449,12 @@ public abstract class XSLFSimpleShape ex public void setLineDash(LineDash dash) { CTShapeProperties spPr = getSpPr(); if (dash == null) { - if (spPr.isSetLn() && spPr.getLn().isSetPrstDash()) + if (spPr.isSetLn() && spPr.getLn().isSetPrstDash()) spPr.getLn().unsetPrstDash(); } else { - CTPresetLineDashProperties val = CTPresetLineDashProperties.Factory - .newInstance(); - val.setVal(STPresetLineDashVal.Enum.forInt(dash.ooxmlId)); - CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr - .addNewLn(); - ln.setPrstDash(val); + CTLineProperties ln = spPr.isSetLn() ? spPr.getLn() : spPr.addNewLn(); + CTPresetLineDashProperties ldp = ln.isSetPrstDash() ? ln.getPrstDash() : ln.addNewPrstDash(); + ldp.setVal(STPresetLineDashVal.Enum.forInt(dash.ooxmlId)); } } @@ -513,13 +542,7 @@ public abstract class XSLFSimpleShape ex return cap; } - /** - * Specifies a solid color fill. The shape is filled entirely with the - * specified color. - * - * @param color the solid color fill. The value of <code>null</code> unsets - * the solidFIll attribute from the underlying xml - */ + @Override public void setFillColor(Color color) { CTShapeProperties spPr = getSpPr(); if (color == null) { @@ -545,10 +568,7 @@ public abstract class XSLFSimpleShape ex } } - /** - * @return solid fill color of null if not set or fill color - * is not solid (pattern or gradient) - */ + @Override public Color getFillColor() { PaintStyle ps = getFillPaint(); if (ps instanceof SolidPaint) { @@ -615,7 +635,7 @@ public abstract class XSLFSimpleShape ex } return geom; } - + @Override void copy(XSLFShape sh){ super.copy(sh); @@ -635,7 +655,7 @@ public abstract class XSLFSimpleShape ex String relId = getSheet().importBlip(blipId, s.getSheet().getPackagePart()); blip.setEmbed(relId); } - + Color srcLineColor = s.getLineColor(); Color tgtLineColor = getLineColor(); if(srcLineColor != null && !srcLineColor.equals(tgtLineColor)) { @@ -871,7 +891,31 @@ public abstract class XSLFSimpleShape ex public LineCompound getLineCompound() { return XSLFSimpleShape.this.getLineCompound(); } - + }; } + + @Override + public void setStrokeStyle(Object... styles) { + if (styles.length == 0) { + // remove stroke + setLineColor(null); + return; + } + + // TODO: handle PaintStyle + for (Object st : styles) { + if (st instanceof Number) { + setLineWidth(((Number)st).doubleValue()); + } else if (st instanceof LineCap) { + setLineCap((LineCap)st); + } else if (st instanceof LineDash) { + setLineDash((LineDash)st); + } else if (st instanceof LineCompound) { + setLineCompound((LineCompound)st); + } else if (st instanceof Color) { + setLineColor((Color)st); + } + } + } } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java Thu Oct 29 01:05:27 2015 @@ -25,9 +25,9 @@ import org.apache.poi.openxml4j.opc.Pack import org.apache.poi.sl.draw.DrawFactory; import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.usermodel.Notes; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.util.Beta; -import org.apache.poi.util.DocumentHelper; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties; Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java Thu Oct 29 01:05:27 2015 @@ -22,8 +22,8 @@ import org.apache.poi.POIXMLDocumentPart import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.util.Beta; -import org.apache.poi.util.DocumentHelper; import org.apache.poi.util.Internal; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java Thu Oct 29 01:05:27 2015 @@ -25,8 +25,8 @@ import org.apache.poi.POIXMLDocumentPart import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.sl.usermodel.MasterSheet; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.util.Beta; -import org.apache.poi.util.DocumentHelper; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle; Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTable.java Thu Oct 29 01:05:27 2015 @@ -80,15 +80,22 @@ public class XSLFTable extends XSLFGraph for(CTTableRow row : trArray) _rows.add(new XSLFTableRow(row, this)); } + @Override + public XSLFTableCell getCell(int row, int col) { + return getRows().get(row).getCells().get(col); + } + @Internal public CTTable getCTTable(){ return _table; } + @Override public int getNumberOfColumns() { return _table.getTblGrid().sizeOfGridColArray(); } + @Override public int getNumberOfRows() { return _table.sizeOfTrArray(); } @@ -98,10 +105,16 @@ public class XSLFTable extends XSLFGraph _table.getTblGrid().getGridColArray(idx).getW()); } - public void setColumnWidth(int idx, double width){ + @Override + public void setColumnWidth(int idx, double width) { _table.getTblGrid().getGridColArray(idx).setW(Units.toEMU(width)); } + @Override + public void setRowHeight(int row, double height) { + _table.getTrArray(row).setH(Units.toEMU(height)); + } + public Iterator<XSLFTableRow> iterator(){ return _rows.iterator(); } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTableCell.java Thu Oct 29 01:05:27 2015 @@ -21,6 +21,12 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; +import org.apache.poi.sl.draw.DrawPaint; +import org.apache.poi.sl.usermodel.PaintStyle; +import org.apache.poi.sl.usermodel.StrokeStyle; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; +import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound; +import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.sl.usermodel.TableCell; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.util.Units; @@ -44,7 +50,6 @@ import org.openxmlformats.schemas.drawin * Represents a cell of a table in a .pptx presentation */ public class XSLFTableCell extends XSLFTextShape implements TableCell<XSLFShape,XSLFTextParagraph> { - static double defaultBorderWidth = 1.0; private CTTableCellProperties _tcPr = null; /*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){ @@ -57,8 +62,7 @@ public class XSLFTableCell extends XSLFT CTTextBody txBody = cell.getTxBody(); if (txBody == null && create) { txBody = cell.addNewTxBody(); - txBody.addNewBodyPr(); - txBody.addNewLstStyle(); + XSLFAutoShape.initTextBody(txBody); } return txBody; } @@ -83,7 +87,7 @@ public class XSLFTableCell extends XSLFT } return _tcPr; } - + @Override public void setLeftInset(double margin){ CTTableCellProperties pr = getCellProperties(true); @@ -108,67 +112,174 @@ public class XSLFTableCell extends XSLFT pr.setMarB(Units.toEMU(margin)); } - private CTLineProperties getCTLine(char bltr, boolean create) { + private CTLineProperties getCTLine(BorderEdge edge, boolean create) { + if (edge == null) { + throw new IllegalArgumentException("BorderEdge needs to be specified."); + } + CTTableCellProperties pr = getCellProperties(create); if (pr == null) return null; - - switch (bltr) { - case 'b': + + switch (edge) { + case bottom: return (pr.isSetLnB()) ? pr.getLnB() : (create ? pr.addNewLnB() : null); - case 'l': + case left: return (pr.isSetLnL()) ? pr.getLnL() : (create ? pr.addNewLnL() : null); - case 't': + case top: return (pr.isSetLnT()) ? pr.getLnT() : (create ? pr.addNewLnT() : null); - case 'r': + case right: return (pr.isSetLnR()) ? pr.getLnR() : (create ? pr.addNewLnR() : null); default: return null; } } + + @Override + public void removeBorder(BorderEdge edge) { + CTTableCellProperties pr = getCellProperties(false); + if (pr == null) return; + switch (edge) { + case bottom: + if (pr.isSetLnB()) { + pr.unsetLnB(); + } + break; + case left: + if (pr.isSetLnL()) { + pr.unsetLnL(); + } + break; + case top: + if (pr.isSetLnT()) { + pr.unsetLnT(); + } + break; + case right: + if (pr.isSetLnR()) { + pr.unsetLnB(); + } + break; + default: + throw new IllegalArgumentException(); + } + } + + @Override + public StrokeStyle getBorderStyle(final BorderEdge edge) { + final Double width = getBorderWidth(edge); + return (width == null) ? null : new StrokeStyle() { + public PaintStyle getPaint() { + return DrawPaint.createSolidPaint(getBorderColor(edge)); + } + + public LineCap getLineCap() { + return getBorderCap(edge); + } + + public LineDash getLineDash() { + return getBorderDash(edge); + } + + public LineCompound getLineCompound() { + return getBorderCompound(edge); + } + + public double getLineWidth() { + return width; + } + }; + } - private void setBorderWidth(char bltr, double width) { - CTLineProperties ln = getCTLine(bltr, true); - ln.setW(Units.toEMU(width)); + @Override + public void setBorderStyle(BorderEdge edge, StrokeStyle style) { + if (style == null) { + throw new IllegalArgumentException("StrokeStyle needs to be specified."); + } + + LineCap cap = style.getLineCap(); + if (cap != null) { + setBorderCap(edge, cap); + } + + LineCompound compound = style.getLineCompound(); + if (compound != null) { + setBorderCompound(edge, compound); + } + + LineDash dash = style.getLineDash(); + if (dash != null) { + setBorderDash(edge, dash); + } + + double width = style.getLineWidth(); + setBorderWidth(edge, width); } - private double getBorderWidth(char bltr) { - CTLineProperties ln = getCTLine(bltr, false); - return (ln == null || !ln.isSetW()) ? defaultBorderWidth : Units.toPoints(ln.getW()); + public Double getBorderWidth(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, false); + return (ln == null || !ln.isSetW()) ? null : Units.toPoints(ln.getW()); } - private void setBorderColor(char bltr, Color color) { - CTLineProperties ln = getCTLine(bltr, true); + @Override + public void setBorderWidth(BorderEdge edge, double width) { + CTLineProperties ln = getCTLine(edge, true); + ln.setW(Units.toEMU(width)); + } - if(color == null){ - ln.addNewNoFill(); - if(ln.isSetSolidFill()) ln.unsetSolidFill(); - } else { - if(ln.isSetNoFill()) ln.unsetNoFill(); + private CTLineProperties setBorderDefaults(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, true); + if (ln.isSetNoFill()) { + ln.unsetNoFill(); + } - if(!ln.isSetPrstDash()) ln.addNewPrstDash().setVal(STPresetLineDashVal.SOLID); + if(!ln.isSetPrstDash()) { + ln.addNewPrstDash().setVal(STPresetLineDashVal.SOLID); + } + if (!ln.isSetCmpd()) { ln.setCmpd(STCompoundLine.SNG); + } + if (!ln.isSetAlgn()) { ln.setAlgn(STPenAlignment.CTR); + } + if (!ln.isSetCap()) { ln.setCap(STLineCap.FLAT); + } + if (!ln.isSetRound()) { ln.addNewRound(); + } + if (!ln.isSetHeadEnd()) { CTLineEndProperties hd = ln.addNewHeadEnd(); hd.setType(STLineEndType.NONE); hd.setW(STLineEndWidth.MED); hd.setLen(STLineEndLength.MED); + } + if (!ln.isSetTailEnd()) { CTLineEndProperties tl = ln.addNewTailEnd(); tl.setType(STLineEndType.NONE); tl.setW(STLineEndWidth.MED); tl.setLen(STLineEndLength.MED); + } - CTSRgbColor rgb = CTSRgbColor.Factory.newInstance(); - rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()}); - ln.addNewSolidFill().setSrgbClr(rgb); + return ln; + } + + @Override + public void setBorderColor(BorderEdge edge, Color color) { + if (color == null) { + throw new IllegalArgumentException("Colors need to be specified."); } - } - - private Color getBorderColor(char bltr) { - CTLineProperties ln = getCTLine(bltr,false); + + CTLineProperties ln = setBorderDefaults(edge); + + CTSRgbColor rgb = CTSRgbColor.Factory.newInstance(); + rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()}); + ln.addNewSolidFill().setSrgbClr(rgb); + } + + public Color getBorderColor(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, false); if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null; CTSolidColorFillProperties fill = ln.getSolidFill(); @@ -178,71 +289,65 @@ public class XSLFTableCell extends XSLFT } byte[] val = fill.getSrgbClr().getVal(); return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]); - } - - public void setBorderLeft(double width) { - setBorderWidth('l', width); } - public double getBorderLeft() { - return getBorderWidth('l'); - } - - public void setBorderLeftColor(Color color) { - setBorderColor('l', color); - } - - public Color getBorderLeftColor() { - return getBorderColor('l'); - } + public LineCompound getBorderCompound(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, false); + if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill() || !ln.isSetCmpd()) { + return null; + } - public void setBorderRight(double width) { - setBorderWidth('r', width); + return LineCompound.fromOoxmlId(ln.getCmpd().intValue()); } - public double getBorderRight() { - return getBorderWidth('r'); - } + @Override + public void setBorderCompound(BorderEdge edge, LineCompound compound) { + if (compound == null) { + throw new IllegalArgumentException("LineCompound need to be specified."); + } - public void setBorderRightColor(Color color) { - setBorderColor('r', color); + CTLineProperties ln = setBorderDefaults(edge); + ln.setCmpd(STCompoundLine.Enum.forInt(compound.ooxmlId)); } - public Color getBorderRightColor() { - return getBorderColor('r'); - } + public LineDash getBorderDash(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, false); + if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill() || !ln.isSetPrstDash()) { + return null; + } - public void setBorderTop(double width) { - setBorderWidth('t', width); + return LineDash.fromOoxmlId(ln.getPrstDash().getVal().intValue()); } - public double getBorderTop() { - return getBorderWidth('t'); - } + @Override + public void setBorderDash(BorderEdge edge, LineDash dash) { + if (dash == null) { + throw new IllegalArgumentException("LineDash need to be specified."); + } - public void setBorderTopColor(Color color) { - setBorderColor('t', color); + CTLineProperties ln = setBorderDefaults(edge); + ln.getPrstDash().setVal(STPresetLineDashVal.Enum.forInt(dash.ooxmlId)); } - public Color getBorderTopColor() { - return getBorderColor('t'); + public LineCap getBorderCap(BorderEdge edge) { + CTLineProperties ln = getCTLine(edge, false); + if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill() || !ln.isSetCap()) { + return null; + } + + return LineCap.fromOoxmlId(ln.getCap().intValue()); } - public void setBorderBottom(double width) { - setBorderWidth('b', width); - } + public void setBorderCap(BorderEdge edge, LineCap cap) { + if (cap == null) { + throw new IllegalArgumentException("LineCap need to be specified."); + } - public double getBorderBottom() { - return getBorderWidth('b'); + CTLineProperties ln = setBorderDefaults(edge); + ln.setCap(STLineCap.Enum.forInt(cap.ooxmlId)); } - public void setBorderBottomColor(Color color) { - setBorderColor('b', color); - } - public Color getBorderBottomColor(){ - return getBorderColor('b'); - } /** * Specifies a solid color fill. The shape is filled entirely with the specified color. @@ -299,7 +404,7 @@ public class XSLFTableCell extends XSLFT void setVMerge(boolean merge_) { ((CTTableCell)getXmlObject()).setVMerge(merge_); } - + @Override public void setVerticalAlignment(VerticalAlignment anchor){ CTTableCellProperties cellProps = getCellProperties(true); Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextBox.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextBox.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextBox.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextBox.java Thu Oct 29 01:05:27 2015 @@ -54,8 +54,7 @@ public class XSLFTextBox extends XSLFAut prst.setPrst(STShapeType.RECT); prst.addNewAvLst(); CTTextBody txBody = ct.addNewTxBody(); - txBody.addNewBodyPr(); - txBody.addNewLstStyle(); + XSLFAutoShape.initTextBody(txBody); return ct; } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java Thu Oct 29 01:05:27 2015 @@ -32,7 +32,26 @@ import org.apache.poi.util.Units; import org.apache.poi.xslf.model.ParagraphPropertyFetcher; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; -import org.openxmlformats.schemas.drawingml.x2006.main.*; +import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; +import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; +import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextAutonumberBullet; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePercent; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePoint; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharBullet; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStop; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStopList; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextAutonumberScheme; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextFontAlignType; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; @@ -100,6 +119,7 @@ public class XSLFTextParagraph implement } + @Override public List<XSLFTextRun> getTextRuns(){ return _runs; } Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java Thu Oct 29 01:05:27 2015 @@ -206,12 +206,7 @@ public class XSLFTextRun implements Text } } - /** - * Specifies the typeface, or name of the font that is to be used for this text run. - * - * @param typeface the font to apply to this text run. - * The value of <code>null</code> unsets the Typeface attrubute from the underlying xml. - */ + @Override public void setFontFamily(String typeface){ setFontFamily(typeface, (byte)-1, (byte)-1, false); } @@ -236,9 +231,7 @@ public class XSLFTextRun implements Text } } - /** - * @return font family or null if not set - */ + @Override public String getFontFamily(){ final XSLFTheme theme = _p.getParentShape().getSheet().getTheme(); @@ -281,18 +274,12 @@ public class XSLFTextRun implements Text return visitor.getValue() == null ? 0 : visitor.getValue(); } - /** - * Specifies whether a run of text will be formatted as strikethrough text. - * - * @param strike whether a run of text will be formatted as strikethrough text. - */ + @Override public void setStrikethrough(boolean strike) { getRPr().setStrike(strike ? STTextStrikeType.SNG_STRIKE : STTextStrikeType.NO_STRIKE); } - /** - * @return whether a run of text will be formatted as strikethrough text. Default is false. - */ + @Override public boolean isStrikethrough() { CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -307,9 +294,7 @@ public class XSLFTextRun implements Text return fetcher.getValue() == null ? false : fetcher.getValue(); } - /** - * @return whether a run of text will be formatted as a superscript text. Default is false. - */ + @Override public boolean isSuperscript() { CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -357,9 +342,7 @@ public class XSLFTextRun implements Text setBaselineOffset(flag ? -25.0 : 0.); } - /** - * @return whether a run of text will be formatted as a superscript text. Default is false. - */ + @Override public boolean isSubscript() { CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -392,18 +375,12 @@ public class XSLFTextRun implements Text return fetcher.getValue() == null ? TextCap.NONE : fetcher.getValue(); } - /** - * Specifies whether this run of text will be formatted as bold text - * - * @param bold whether this run of text will be formatted as bold text - */ + @Override public void setBold(boolean bold){ getRPr().setB(bold); } - /** - * @return whether this run of text is formatted as bold text - */ + @Override public boolean isBold(){ CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -418,16 +395,12 @@ public class XSLFTextRun implements Text return fetcher.getValue() == null ? false : fetcher.getValue(); } - /** - * @param italic whether this run of text is formatted as italic text - */ + @Override public void setItalic(boolean italic){ getRPr().setI(italic); } - /** - * @return whether this run of text is formatted as italic text - */ + @Override public boolean isItalic(){ CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -442,16 +415,12 @@ public class XSLFTextRun implements Text return fetcher.getValue() == null ? false : fetcher.getValue(); } - /** - * @param underline whether this run of text is formatted as underlined text - */ - public void setUnderline(boolean underline) { + @Override + public void setUnderlined(boolean underline) { getRPr().setU(underline ? STTextUnderlineType.SNG : STTextUnderlineType.NONE); } - /** - * @return whether this run of text is formatted as underlined text - */ + @Override public boolean isUnderlined(){ CharacterPropertyFetcher<Boolean> fetcher = new CharacterPropertyFetcher<Boolean>(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ @@ -501,6 +470,7 @@ public class XSLFTextRun implements Text CTPlaceholder ph = shape.getCTPlaceholder(); if (ph == null){ // if it is a plain text box then take defaults from presentation.xml + @SuppressWarnings("resource") XMLSlideShow ppt = sheet.getSlideShow(); CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getIndentLevel()); if (themeProps != null) { @@ -543,7 +513,7 @@ public class XSLFTextRun implements Text if(italic != isItalic()) setItalic(italic); boolean underline = r.isUnderlined(); - if(underline != isUnderlined()) setUnderline(underline); + if(underline != isUnderlined()) setUnderlined(underline); boolean strike = r.isStrikethrough(); if(strike != isStrikethrough()) setStrikethrough(strike); Modified: poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java (original) +++ poi/trunk/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java Thu Oct 29 01:05:27 2015 @@ -37,8 +37,10 @@ import org.apache.poi.xslf.model.TextBod import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType; import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType; import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType; @@ -91,10 +93,52 @@ public abstract class XSLFTextShape exte txBody.setPArray(null); // remove any existing paragraphs } - public void setText(String text){ - clearText(); + @Override + public XSLFTextRun setText(String text) { + // copy properties from first paragraph / textrun + CTTextParagraphProperties pPr = null; + CTTextCharacterProperties rPr = null; + if (!_paragraphs.isEmpty()) { + XSLFTextParagraph p0 = _paragraphs.get(0); + pPr = p0.getXmlObject().getPPr(); + if (!p0.getTextRuns().isEmpty()) { + XSLFTextRun r0 = p0.getTextRuns().get(0); + rPr = r0.getXmlObject().getRPr(); + } + } - addNewTextParagraph().addNewTextRun().setText(text); + // can't call clearText otherwise we receive a XmlValueDisconnectedException + _paragraphs.clear(); + CTTextBody txBody = getTextBody(true); + int cntPs = txBody.sizeOfPArray(); + + // split text by paragraph and new line char + XSLFTextRun r = null; + for (String paraText : text.split("\\r\\n?|\\n")) { + XSLFTextParagraph para = addNewTextParagraph(); + if (pPr != null) { + para.getXmlObject().setPPr(pPr); + } + boolean first = true; + for (String runText : paraText.split("[\u000b]")) { + if (!first) { + para.addLineBreak(); + } + r = para.addNewTextRun(); + r.setText(runText); + if (rPr != null) { + r.getXmlObject().setRPr(rPr); + } + first = false; + } + } + + // simply setting a new pArray leads to XmlValueDisconnectedException + for (int i = cntPs-1; i >= 0; i--) { + txBody.removeP(i); + } + + return r; } @Override @@ -115,13 +159,7 @@ public abstract class XSLFTextShape exte return paragraph; } - - /** - * Sets the type of vertical alignment for the text. - * - * @param anchor - the type of alignment. - * A {@code null} values unsets this property. - */ + @Override public void setVerticalAlignment(VerticalAlignment anchor){ CTTextBodyProperties bodyPr = getTextBodyPr(); if (bodyPr != null) { @@ -133,11 +171,7 @@ public abstract class XSLFTextShape exte } } - /** - * Returns the type of vertical alignment for the text. - * - * @return the type of vertical alignment - */ + @Override public VerticalAlignment getVerticalAlignment(){ PropertyFetcher<VerticalAlignment> fetcher = new TextBodyPropertyFetcher<VerticalAlignment>(){ public boolean fetch(CTTextBodyProperties props){ @@ -153,14 +187,7 @@ public abstract class XSLFTextShape exte return fetcher.getValue() == null ? VerticalAlignment.TOP : fetcher.getValue(); } - /** - * Sets if the paragraphs are horizontal centered - * - * @param isCentered true, if the paragraphs are horizontal centered - * A {@code null} values unsets this property. - * - * @see TextShape#isHorizontalCentered() - */ + @Override public void setHorizontalCentered(Boolean isCentered){ CTTextBodyProperties bodyPr = getTextBodyPr(); if (bodyPr != null) { @@ -369,10 +396,15 @@ public abstract class XSLFTextShape exte return insets; } - - /** - * @return whether to wrap words within the bounding rectangle - */ + @Override + public void setInsets(Insets2D insets) { + setTopInset(insets.top); + setLeftInset(insets.left); + setBottomInset(insets.bottom); + setRightInset(insets.right); + } + + @Override public boolean getWordWrap(){ PropertyFetcher<Boolean> fetcher = new TextBodyPropertyFetcher<Boolean>(){ public boolean fetch(CTTextBodyProperties props){ @@ -387,10 +419,7 @@ public abstract class XSLFTextShape exte return fetcher.getValue() == null ? true : fetcher.getValue(); } - /** - * - * @param wrap whether to wrap words within the bounding rectangle - */ + @Override public void setWordWrap(boolean wrap){ CTTextBodyProperties bodyPr = getTextBodyPr(); if (bodyPr != null) { @@ -532,4 +561,45 @@ public abstract class XSLFTextShape exte tgtP.copy(srcP); } } + + @Override + public void setTextPlaceholder(TextPlaceholder placeholder) { + switch (placeholder) { + default: + case NOTES: + case HALF_BODY: + case QUARTER_BODY: + case BODY: + setPlaceholder(Placeholder.BODY); + break; + case TITLE: + setPlaceholder(Placeholder.TITLE); + break; + case CENTER_BODY: + setPlaceholder(Placeholder.BODY); + setHorizontalCentered(true); + break; + case CENTER_TITLE: + setPlaceholder(Placeholder.CENTERED_TITLE); + break; + case OTHER: + setPlaceholder(Placeholder.CONTENT); + break; + } + } + + @Override + public TextPlaceholder getTextPlaceholder() { + Placeholder ph = getTextType(); + if (ph == null) return TextPlaceholder.BODY; + switch (ph) { + case BODY: return TextPlaceholder.BODY; + case TITLE: return TextPlaceholder.TITLE; + case CENTERED_TITLE: return TextPlaceholder.CENTER_TITLE; + default: + case CONTENT: return TextPlaceholder.OTHER; + } + } + + } \ No newline at end of file Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java Thu Oct 29 01:05:27 2015 @@ -268,7 +268,7 @@ public class TestXSLFAutoShape { assertFalse(r.isUnderlined()); assertFalse(r.getXmlObject().getRPr().isSetU()); - r.setUnderline(true); + r.setUnderlined(true); assertTrue(r.isUnderlined()); assertEquals(STTextUnderlineType.SNG, r.getXmlObject().getRPr().getU()); Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFNotes.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFNotes.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFNotes.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFNotes.java Thu Oct 29 01:05:27 2015 @@ -20,13 +20,16 @@ import static org.junit.Assert.assertEqu import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import java.io.IOException; + +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.xslf.XSLFTestDataSamples; import org.junit.Test; public class TestXSLFNotes { @Test - public void createNewNote() { + public void createNewNote() throws IOException { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide1 = ppt.createSlide(); @@ -48,10 +51,12 @@ public class TestXSLFNotes { } assertNotNull(note); assertEquals("New Note", note); + + ppt.close(); } @Test - public void addNote() { + public void addNote() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("sample.pptx"); @@ -69,10 +74,12 @@ public class TestXSLFNotes { } assertNotNull(note); assertEquals("New Note", note); + + ppt.close(); } @Test - public void replaceNotes() { + public void replaceNotes() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("sample.pptx"); @@ -93,5 +100,7 @@ public class TestXSLFNotes { assertNotNull(note); assertEquals("New Note", note); } + + ppt.close(); } } Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFSimpleShape.java Thu Oct 29 01:05:27 2015 @@ -28,6 +28,7 @@ import java.io.IOException; import java.util.List; import org.apache.poi.sl.draw.geom.TestPresetGeometries; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.StrokeStyle.LineCap; import org.apache.poi.sl.usermodel.StrokeStyle.LineDash; import org.apache.poi.util.Units; @@ -168,7 +169,7 @@ public class TestXSLFSimpleShape { } @Test - public void testDefaultProperties() { + public void testDefaultProperties() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); XSLFSlide slide6 = ppt.getSlides().get(5); @@ -234,10 +235,12 @@ public class TestXSLFSimpleShape { assertEquals(50000, ref5.getLumModArray(0).getVal()); assertEquals("accent1", ref5.getVal().toString()); assertEquals(new Color(79, 129, 189), s5.getFillColor()); + + ppt.close(); } @Test - public void testAnchor(){ + public void testAnchor() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); List<XSLFSlide> slide = ppt.getSlides(); @@ -267,6 +270,7 @@ public class TestXSLFSimpleShape { assertNotNull(layout5.getSlideMaster().getTextShapeByType(Placeholder.TITLE).getSpPr().getXfrm()); assertEquals(shTitle.getAnchor(), layout5.getSlideMaster().getTextShapeByType(Placeholder.TITLE).getAnchor()); + ppt.close(); } @SuppressWarnings({ "deprecation", "unused" }) Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java Thu Oct 29 01:05:27 2015 @@ -16,23 +16,29 @@ ==================================================================== */ package org.apache.poi.xslf.usermodel; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import java.awt.Color; +import java.io.IOException; +import java.util.List; + +import org.apache.poi.sl.usermodel.TableCell.BorderEdge; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; -import java.awt.Color; -import java.util.List; - /** * @author Yegor Kozlov */ public class TestXSLFTable { @Test - public void testRead(){ + public void testRead() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx"); XSLFSlide slide = ppt.getSlides().get(3); @@ -69,10 +75,12 @@ public class TestXSLFTable { assertEquals("A1", cells1.get(0).getText()); assertEquals("B1", cells1.get(1).getText()); assertEquals("C1", cells1.get(2).getText()); + + ppt.close(); } @Test - public void testCreate() { + public void testCreate() throws IOException { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -121,38 +129,21 @@ public class TestXSLFTable { cell1.addNewTextParagraph().addNewTextRun().setText("Apache"); assertEquals("Apache", cell1.getText()); - assertEquals(1.0, cell1.getBorderBottom(), 0); - cell1.setBorderBottom(2.0); - assertEquals(2.0, cell1.getBorderBottom(), 0); - assertNull(cell1.getBorderBottomColor()); - cell1.setBorderBottomColor(Color.yellow); - assertEquals(Color.yellow, cell1.getBorderBottomColor()); - - assertEquals(1.0, cell1.getBorderTop(), 0); - cell1.setBorderTop(2.0); - assertEquals(2.0, cell1.getBorderTop(), 0); - assertNull(cell1.getBorderTopColor()); - cell1.setBorderTopColor(Color.yellow); - assertEquals(Color.yellow, cell1.getBorderTopColor()); - - assertEquals(1.0, cell1.getBorderLeft(), 0); - cell1.setBorderLeft(2.0); - assertEquals(2.0, cell1.getBorderLeft(), 0); - assertNull(cell1.getBorderLeftColor()); - cell1.setBorderLeftColor(Color.yellow); - assertEquals(Color.yellow, cell1.getBorderLeftColor()); - - assertEquals(1.0, cell1.getBorderRight(), 0); - cell1.setBorderRight(2.0); - assertEquals(2.0, cell1.getBorderRight(), 0); - assertNull(cell1.getBorderRightColor()); - cell1.setBorderRightColor(Color.yellow); - assertEquals(Color.yellow, cell1.getBorderRightColor()); + for (BorderEdge edge : BorderEdge.values()) { + assertNull(cell1.getBorderWidth(edge)); + cell1.setBorderWidth(edge, 2.0); + assertEquals(2.0, cell1.getBorderWidth(edge), 0); + assertNull(cell1.getBorderColor(edge)); + cell1.setBorderColor(edge, Color.yellow); + assertEquals(Color.yellow, cell1.getBorderColor(edge)); + } assertEquals(VerticalAlignment.TOP, cell1.getVerticalAlignment()); cell1.setVerticalAlignment(VerticalAlignment.MIDDLE); assertEquals(VerticalAlignment.MIDDLE, cell1.getVerticalAlignment()); cell1.setVerticalAlignment(null); assertEquals(VerticalAlignment.TOP, cell1.getVerticalAlignment()); + + ppt.close(); } } \ No newline at end of file Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java Thu Oct 29 01:05:27 2015 @@ -19,6 +19,9 @@ package org.apache.poi.xslf.usermodel; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import java.io.IOException; + +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; @@ -28,7 +31,7 @@ import org.openxmlformats.schemas.drawin public class TestXSLFTextBox { @Test - public void testPlaceholder() { + public void testPlaceholder() throws IOException { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -39,13 +42,15 @@ public class TestXSLFTextBox { shape.setPlaceholder(null); assertNull(shape.getTextType()); shape.setText("Apache POI"); + + ppt.close(); } /** * text box inherits default text proeprties from presentation.xml */ @Test - public void testDefaultTextStyle() { + public void testDefaultTextStyle() throws IOException { XMLSlideShow ppt = new XMLSlideShow(); XSLFSlide slide = ppt.createSlide(); @@ -79,5 +84,7 @@ public class TestXSLFTextBox { pPr.unsetSz(); // Should never be assertNull(r.getFontSize()); + + ppt.close(); } } \ No newline at end of file Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java (original) +++ poi/trunk/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java Thu Oct 29 01:05:27 2015 @@ -28,6 +28,7 @@ import java.awt.Color; import java.io.IOException; import java.util.List; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.XSLFTestDataSamples; @@ -45,7 +46,7 @@ import org.openxmlformats.schemas.presen public class TestXSLFTextShape { @Test - public void testLayouts(){ + public void testLayouts() throws IOException { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx"); List<XSLFSlide> slide = ppt.getSlides(); @@ -57,6 +58,8 @@ public class TestXSLFTextShape { verifySlide7(slide.get(6)); verifySlide8(slide.get(7)); verifySlide10(slide.get(9)); + + ppt.close(); } void verifySlide1(XSLFSlide slide){ Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java (original) +++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/PPGraphics2D.java Thu Oct 29 01:05:27 2015 @@ -297,7 +297,7 @@ public final class PPGraphics2D extends txt.setTopInset(0); txt.setLeftInset(0); txt.setRightInset(0); - txt.setWordWrap(HSLFTextBox.WrapNone); + txt.setWordWrap(false); txt.setHorizontalCentered(false); txt.setVerticalAlignment(VerticalAlignment.MIDDLE); @@ -1826,7 +1826,7 @@ public final class PPGraphics2D extends float[] dash = bs.getDashArray(); if (dash != null) { //TODO: implement more dashing styles - shape.setLineDashing(StrokeStyle.LineDash.DASH); + shape.setLineDash(StrokeStyle.LineDash.DASH); } } } Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java (original) +++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFAutoShape.java Thu Oct 29 01:05:27 2015 @@ -67,7 +67,7 @@ public class HSLFAutoShape extends HSLFT protected void setDefaultTextProperties(HSLFTextParagraph _txtrun){ setVerticalAlignment(VerticalAlignment.MIDDLE); setHorizontalCentered(true); - setWordWrap(HSLFTextBox.WrapNone); + setWordWrap(false); } /** Modified: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java?rev=1711171&r1=1711170&r2=1711171&view=diff ============================================================================== --- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java (original) +++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFGroupShape.java Thu Oct 29 01:05:27 2015 @@ -43,7 +43,6 @@ import org.apache.poi.util.Units; */ public class HSLFGroupShape extends HSLFShape implements HSLFShapeContainer, GroupShape<HSLFShape,HSLFTextParagraph> { - /** * Create a new ShapeGroup. This constructor is used when a new shape is created. * @@ -73,34 +72,16 @@ implements HSLFShapeContainer, GroupShap super(escherRecord, parent); } - /** - * Sets the anchor (the bounding box rectangle) of this shape. - * All coordinates should be expressed in Master units (576 dpi). - * - * @param anchor new anchor - */ - public void setAnchor(java.awt.Rectangle anchor){ - + @Override + public void setAnchor(Rectangle anchor) { EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID); - //hack. internal variable EscherClientAnchorRecord.shortRecord can be - //initialized only in fillFields(). We need to set shortRecord=false; - byte[] header = new byte[16]; - LittleEndian.putUShort(header, 0, 0); - LittleEndian.putUShort(header, 2, 0); - LittleEndian.putInt(header, 4, 8); - clientAnchor.fillFields(header, 0, null); - - 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)); - - EscherSpgrRecord spgr = getEscherChild(EscherSpgrRecord.RECORD_ID); - - spgr.setRectX1(Units.pointsToMaster(anchor.x)); - spgr.setRectY1(Units.pointsToMaster(anchor.y)); - spgr.setRectX2(Units.pointsToMaster(anchor.x + anchor.width)); - spgr.setRectY2(Units.pointsToMaster(anchor.y + anchor.height)); + boolean isInitialized = !(clientAnchor.getDx1() == 0 && clientAnchor.getRow1() == 0); + + if (isInitialized) { + moveAndScale(anchor); + } else { + setExteriorAnchor(anchor); + } } @Override @@ -116,7 +97,6 @@ implements HSLFShapeContainer, GroupShap spgr.setRectY1(y1); spgr.setRectX2(x2); spgr.setRectY2(y2); - } @Override @@ -129,6 +109,27 @@ implements HSLFShapeContainer, GroupShap return new Rectangle(x1,y1,x2-x1,y2-y1); } + protected void setExteriorAnchor(Rectangle anchor) { + EscherClientAnchorRecord clientAnchor = getEscherChild(EscherClientAnchorRecord.RECORD_ID); + + //hack. internal variable EscherClientAnchorRecord.shortRecord can be + //initialized only in fillFields(). We need to set shortRecord=false; + byte[] header = new byte[16]; + LittleEndian.putUShort(header, 0, 0); + LittleEndian.putUShort(header, 2, 0); + LittleEndian.putInt(header, 4, 8); + 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)); + + // TODO: does this make sense? + setInteriorAnchor(anchor); + } + /** * Create a new ShapeGroup and create an instance of <code>EscherSpgrContainer</code> which represents a group of shapes */ @@ -174,23 +175,22 @@ implements HSLFShapeContainer, GroupShap } /** - * Moves this <code>ShapeGroup</code> to the specified location. - * <p> - * @param x the x coordinate of the top left corner of the shape in new location - * @param y the y coordinate of the top left corner of the shape in new location - */ - public void moveTo(int x, int y){ - Rectangle anchor = getAnchor(); - int dx = x - anchor.x; - int dy = y - anchor.y; - anchor.translate(dx, dy); - setAnchor(anchor); + * 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; + setExteriorAnchor(anchorDest); for (HSLFShape shape : getShapes()) { Rectangle chanchor = shape.getAnchor(); - chanchor.translate(dx, dy); - shape.setAnchor(chanchor); + 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)); } } @@ -262,9 +262,6 @@ implements HSLFShapeContainer, GroupShap throw new UnsupportedOperationException(); } - /** - * @return the shapes contained in this group container - */ @Override public List<HSLFShape> getShapes() { // Out escher container record should contain several Copied: poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPlaceholder.java (from r1707403, poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java) URL: http://svn.apache.org/viewvc/poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPlaceholder.java?p2=poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPlaceholder.java&p1=poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java&r1=1707403&r2=1711171&rev=1711171&view=diff ============================================================================== --- poi/trunk/src/scratchpad/src/org/apache/poi/hslf/model/Placeholder.java (original) +++ poi/trunk/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFPlaceholder.java Thu Oct 29 01:05:27 2015 @@ -15,34 +15,28 @@ limitations under the License. ==================================================================== */ -package org.apache.poi.hslf.model; +package org.apache.poi.hslf.usermodel; -import org.apache.poi.ddf.*; -import org.apache.poi.hslf.record.OEPlaceholderAtom; -import org.apache.poi.hslf.usermodel.HSLFShape; -import org.apache.poi.hslf.usermodel.HSLFTextBox; -import org.apache.poi.hslf.usermodel.HSLFTextParagraph; -import org.apache.poi.hslf.exceptions.HSLFException; +import org.apache.poi.ddf.EscherContainerRecord; +import org.apache.poi.sl.usermodel.SimpleShape.Placeholder; import org.apache.poi.sl.usermodel.ShapeContainer; -import java.io.ByteArrayOutputStream; - /** * Represents a Placeholder in PowerPoint. * * @author Yegor Kozlov */ -public final class Placeholder extends HSLFTextBox { +public final class HSLFPlaceholder extends HSLFTextBox { - protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape,HSLFTextParagraph> parent){ + protected HSLFPlaceholder(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape,HSLFTextParagraph> parent){ super(escherRecord, parent); } - public Placeholder(ShapeContainer<HSLFShape,HSLFTextParagraph> parent){ + public HSLFPlaceholder(ShapeContainer<HSLFShape,HSLFTextParagraph> parent){ super(parent); } - public Placeholder(){ + public HSLFPlaceholder(){ super(); } @@ -53,43 +47,8 @@ public final class Placeholder extends H */ protected EscherContainerRecord createSpContainer(boolean isChild){ _escherContainer = super.createSpContainer(isChild); - - EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID); - spRecord.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HAVEMASTER); - - EscherClientDataRecord cldata = new EscherClientDataRecord(); - cldata.setOptions((short)15); - - AbstractEscherOptRecord opt = getEscherOptRecord(); - - //Placeholders can't be grouped - setEscherProperty(opt, EscherProperties.PROTECTION__LOCKAGAINSTGROUPING, 262144); - - //OEPlaceholderAtom tells powerpoint that this shape is a placeholder - // - OEPlaceholderAtom oep = new OEPlaceholderAtom(); - /** - * Extarct from MSDN: - * - * There is a special case when the placeholder does not have a position in the layout. - * This occurs when the user has moved the placeholder from its original position. - * In this case the placeholder ID is -1. - */ - oep.setPlacementId(-1); - - oep.setPlaceholderId(OEPlaceholderAtom.Body); - - //convert hslf into ddf record - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - oep.writeOut(out); - } catch(Exception e){ - throw new HSLFException(e); - } - cldata.setRemainingData(out.toByteArray()); - - //append placeholder container before EscherTextboxRecord - _escherContainer.addChildBefore(cldata, EscherTextboxRecord.RECORD_ID); + + setPlaceholder(Placeholder.BODY); return _escherContainer; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
