From 40aae2250bdbb93fa2ebbe50961b01211ea5c61a Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Wed, 17 Jun 2015 22:21:13 +0000 Subject: [PATCH] Rendering fixes git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1686117 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hslf/examples/BulletsDemo.java | 4 +- .../apache/poi/xslf/usermodel/Tutorial2.java | 8 +- .../apache/poi/xslf/usermodel/Tutorial7.java | 4 +- src/java/org/apache/poi/util/Units.java | 31 + .../poi/xslf/usermodel/XSLFTextParagraph.java | 286 ++- .../poi/xslf/usermodel/XSLFTextRun.java | 48 +- .../poi/xslf/usermodel/TestXSLFAutoShape.java | 26 +- .../xslf/usermodel/TestXSLFTextParagraph.java | 2 +- .../textproperties/FontAlignmentProp.java | 3 +- .../textproperties/TextPropCollection.java | 71 +- .../poi/hslf/record/FontCollection.java | 5 +- .../poi/hslf/usermodel/HSLFSlideMaster.java | 58 +- .../poi/hslf/usermodel/HSLFTextParagraph.java | 1550 ++++++++--------- .../poi/hslf/usermodel/HSLFTextRun.java | 57 +- .../apache/poi/sl/draw/DrawTextParagraph.java | 89 +- .../org/apache/poi/sl/draw/DrawTextShape.java | 6 +- .../poi/sl/usermodel/TextParagraph.java | 115 +- .../org/apache/poi/sl/usermodel/TextRun.java | 8 +- .../poi/hslf/usermodel/TestPicture.java | 62 +- .../poi/hslf/usermodel/TestRichTextRun.java | 14 +- .../poi/hslf/usermodel/TestTextRun.java | 2 +- test-data/slideshow/alterman_security2.pptx | Bin 0 -> 425540 bytes 22 files changed, 1222 insertions(+), 1227 deletions(-) create mode 100644 test-data/slideshow/alterman_security2.pptx diff --git a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java index d95f970ce7..0032bc8097 100644 --- a/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java +++ b/src/examples/src/org/apache/poi/hslf/examples/BulletsDemo.java @@ -39,8 +39,8 @@ public final class BulletsDemo { HSLFTextParagraph rt = shape.getTextParagraphs().get(0); rt.getTextRuns().get(0).setFontSize(42); rt.setBullet(true); - rt.setIndent(0); //bullet offset - rt.setLeftMargin(50); //text offset (should be greater than bullet offset) + rt.setIndent(0d); //bullet offset + rt.setLeftMargin(50d); //text offset (should be greater than bullet offset) rt.setBulletChar('\u263A'); //bullet character shape.setText( "January\r" + diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java index 373f01f33f..91366b9d06 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial2.java @@ -48,8 +48,8 @@ public class Tutorial2 { XSLFTextParagraph p2 = shape1.addNewTextParagraph(); // If spaceBefore >= 0, then space is a percentage of normal line height. // If spaceBefore < 0, the absolute value of linespacing is the spacing in points - p2.setSpaceBefore(-20); // 20 pt from the previous paragraph - p2.setSpaceAfter(300); // 3 lines after the paragraph + p2.setSpaceBefore(-20d); // 20 pt from the previous paragraph + p2.setSpaceAfter(300d); // 3 lines after the paragraph XSLFTextRun r2 = p2.addNewTextRun(); r2.setText("Paragraph properties apply to all text residing within the corresponding paragraph."); r2.setFontSize(16); @@ -62,8 +62,8 @@ public class Tutorial2 { r3.setFontColor(new Color(85, 142, 213)); XSLFTextParagraph p4 = shape1.addNewTextParagraph(); - p4.setSpaceBefore(-20); // 20 pt from the previous paragraph - p4.setSpaceAfter(300); // 3 lines after the paragraph + p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph + p4.setSpaceAfter(300d); // 3 lines after the paragraph XSLFTextRun r4 = p4.addNewTextRun(); r4.setFontSize(16); r4.setText( diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java index a80f23cad7..95252d72f5 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/Tutorial7.java @@ -45,9 +45,9 @@ public class Tutorial7 { XSLFTextParagraph p2 = shape.addNewTextParagraph(); // indentation before text - p2.setLeftMargin(60); + p2.setLeftMargin(60d); // the bullet is set 40 pt before the text - p2.setIndent(-40); + p2.setIndent(-40d); p2.setBullet(true); // customize bullets p2.setBulletFontColor(Color.red); diff --git a/src/java/org/apache/poi/util/Units.java b/src/java/org/apache/poi/util/Units.java index bc643fd97b..107a9b583e 100644 --- a/src/java/org/apache/poi/util/Units.java +++ b/src/java/org/apache/poi/util/Units.java @@ -16,6 +16,8 @@ ==================================================================== */ package org.apache.poi.util; +import org.apache.poi.hslf.usermodel.HSLFShape; + /** * @author Yegor Kozlov */ @@ -23,6 +25,22 @@ public class Units { public static final int EMU_PER_PIXEL = 9525; public static final int EMU_PER_POINT = 12700; + /** + * Master DPI (576 pixels per inch). + * Used by the reference coordinate system in PowerPoint (HSLF) + */ + public static final int MASTER_DPI = 576; + + /** + * Pixels DPI (96 pixels per inch) + */ + public static final int PIXEL_DPI = 96; + + /** + * Points DPI (72 pixels per inch) + */ + public static final int POINT_DPI = 72; + /** * Converts points to EMUs * @param points points @@ -70,4 +88,17 @@ public class Units { int fixedPoint = (i << 16) | (f & 0xFFFF); return fixedPoint; } + + public static double masterToPoints(int masterDPI) { + double points = masterDPI; + points *= HSLFShape.POINT_DPI; + points /= HSLFShape.MASTER_DPI; + return points; + } + + public static int pointsToMaster(double points) { + points *= HSLFShape.MASTER_DPI; + points /= HSLFShape.POINT_DPI; + return (int)points; + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index aef03197dd..f0cf3a78a9 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -137,8 +137,10 @@ public class XSLFTextParagraph implements TextParagraph { /** * Returns the alignment that is applied to the paragraph. * - * If this attribute is omitted, then a value of left is implied. - * @return ??? alignment that is applied to the paragraph + * If this attribute is omitted, then null is returned. + * User code can imply the value {@link TextAlign#LEFT} then. + * + * @return alignment that is applied to the paragraph */ public TextAlign getTextAlign(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ @@ -152,7 +154,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? TextAlign.LEFT : fetcher.getValue(); + return fetcher.getValue(); } /** @@ -184,7 +186,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? FontAlign.AUTO : fetcher.getValue(); + return fetcher.getValue(); } /** @@ -294,7 +296,7 @@ public class XSLFTextParagraph implements TextParagraph { * * @return the bullet size */ - public double getBulletFontSize(){ + public Double getBulletFontSize(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetBuSzPct()){ @@ -309,7 +311,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? 100 : fetcher.getValue(); + return fetcher.getValue(); } /** @@ -334,27 +336,19 @@ public class XSLFTextParagraph implements TextParagraph { } } - /** - * Specifies the indent size that will be applied to the first line of text in the paragraph. - * - * @param value the indent in points. - */ @Override - public void setIndent(double value){ + public void setIndent(Double indent){ + if (indent == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(value == -1) { + if(indent == -1) { if(pr.isSetIndent()) pr.unsetIndent(); } else { - pr.setIndent(Units.toEMU(value)); + pr.setIndent(Units.toEMU(indent)); } } - /** - * - * @return the indent applied to the first line of text in the paragraph. - */ @Override - public double getIndent(){ + public Double getIndent() { ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ @@ -367,32 +361,26 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } - /** - * Specifies the left margin of the paragraph. This is specified in addition to the text body - * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin - * attributes are additive with respect to the text position. - * - * @param value the left margin (in points) of the paragraph - */ @Override - public void setLeftMargin(double value){ + public void setLeftMargin(Double leftMargin){ + if (leftMargin == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(value == -1) { + if (leftMargin == null) { if(pr.isSetMarL()) pr.unsetMarL(); } else { - pr.setMarL(Units.toEMU(value)); + pr.setMarL(Units.toEMU(leftMargin)); } } /** - * @return the left margin (in points) of the paragraph + * @return the left margin (in points) of the paragraph, null if unset */ @Override - public double getLeftMargin(){ + public Double getLeftMargin(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetMarL()){ @@ -405,32 +393,26 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); // if the marL attribute is omitted, then a value of 347663 is implied - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } - /** - * Specifies the right margin of the paragraph. This is specified in addition to the text body - * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin - * attributes are additive with respect to the text position. - * - * @param value the right margin (in points) of the paragraph - */ @Override - public void setRightMargin(double value){ + public void setRightMargin(Double rightMargin){ + if (rightMargin == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - if(value == -1) { + if(rightMargin == -1) { if(pr.isSetMarR()) pr.unsetMarR(); } else { - pr.setMarR(Units.toEMU(value)); + pr.setMarR(Units.toEMU(rightMargin)); } } /** * - * @return the right margin of the paragraph + * @return the right margin of the paragraph, null if unset */ @Override - public double getRightMargin(){ + public Double getRightMargin(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetMarR()){ @@ -443,14 +425,11 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); // if the marL attribute is omitted, then a value of 347663 is implied - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } - /** - * - * @return the default size for a tab character within this paragraph in points - */ - public double getDefaultTabSize(){ + @Override + public Double getDefaultTabSize(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetDefTabSz()){ @@ -462,7 +441,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } public double getTabStop(final int idx){ @@ -491,16 +470,25 @@ public class XSLFTextParagraph implements TextParagraph { } @Override - public void setLineSpacing(double linespacing){ + public void setLineSpacing(Double lineSpacing){ + if (lineSpacing == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); - if(linespacing >= 0) spc.addNewSpcPct().setVal((int)(linespacing*1000)); - else spc.addNewSpcPts().setVal((int)(-linespacing*100)); - pr.setLnSpc(spc); + if(lineSpacing == null) { + if (pr.isSetLnSpc()) pr.unsetLnSpc(); + } else { + CTTextSpacing spc = (pr.isSetLnSpc()) ? pr.getLnSpc() : pr.addNewLnSpc(); + if (lineSpacing >= 0) { + (spc.isSetSpcPct() ? spc.getSpcPct() : spc.addNewSpcPct()).setVal((int)(lineSpacing*1000)); + if (spc.isSetSpcPts()) spc.unsetSpcPts(); + } else { + (spc.isSetSpcPts() ? spc.getSpcPts() : spc.addNewSpcPts()).setVal((int)(-lineSpacing*100)); + if (spc.isSetSpcPct()) spc.unsetSpcPct(); + } + } } @Override - public double getLineSpacing(){ + public Double getLineSpacing(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetLnSpc()){ @@ -515,8 +503,8 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); - double lnSpc = fetcher.getValue() == null ? 100 : fetcher.getValue(); - if(lnSpc > 0) { + Double lnSpc = fetcher.getValue(); + if (lnSpc != null && lnSpc > 0) { // check if the percentage value is scaled CTTextNormalAutofit normAutofit = getParentShape().getTextBodyPr().getNormAutofit(); if(normAutofit != null) { @@ -528,26 +516,9 @@ public class XSLFTextParagraph implements TextParagraph { return lnSpc; } - /** - * Set the amount of vertical white space that will be present before the paragraph. - * This space is specified in either percentage or points: - *

- * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

- * Examples: - *

-     *      // The paragraph will be formatted to have a spacing before the paragraph text.
-     *      // The spacing will be 200% of the size of the largest text on each line
-     *      paragraph.setSpaceBefore(200);
-     *
-     *      // The spacing will be a size of 48 points
-     *      paragraph.setSpaceBefore(-48.0);
-     * 
- * - * @param spaceBefore the vertical white space before the paragraph. - */ - public void setSpaceBefore(double spaceBefore){ + @Override + public void setSpaceBefore(Double spaceBefore){ + if (spaceBefore == null && !_p.isSetPPr()) return; CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); if(spaceBefore >= 0) spc.addNewSpcPct().setVal((int)(spaceBefore*1000)); @@ -555,17 +526,8 @@ public class XSLFTextParagraph implements TextParagraph { pr.setSpcBef(spc); } - /** - * The amount of vertical white space before the paragraph - * This may be specified in two different ways, percentage spacing and font point spacing: - *

- * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

- * - * @return the vertical white space before the paragraph - */ - public double getSpaceBefore(){ + @Override + public Double getSpaceBefore(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcBef()){ @@ -580,30 +542,11 @@ public class XSLFTextParagraph implements TextParagraph { }; fetchParagraphProperty(fetcher); - double spcBef = fetcher.getValue() == null ? 0 : fetcher.getValue(); - return spcBef; + return fetcher.getValue(); } - /** - * Set the amount of vertical white space that will be present after the paragraph. - * This space is specified in either percentage or points: - *

- * If spaceAfter >= 0, then space is a percentage of normal line height. - * If spaceAfter < 0, the absolute value of linespacing is the spacing in points - *

- * Examples: - *

-     *      // The paragraph will be formatted to have a spacing after the paragraph text.
-     *      // The spacing will be 200% of the size of the largest text on each line
-     *      paragraph.setSpaceAfter(200);
-     *
-     *      // The spacing will be a size of 48 points
-     *      paragraph.setSpaceAfter(-48.0);
-     * 
- * - * @param spaceAfter the vertical white space after the paragraph. - */ - public void setSpaceAfter(double spaceAfter){ + @Override + public void setSpaceAfter(Double spaceAfter){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); CTTextSpacing spc = CTTextSpacing.Factory.newInstance(); if(spaceAfter >= 0) spc.addNewSpcPct().setVal((int)(spaceAfter*1000)); @@ -611,17 +554,8 @@ public class XSLFTextParagraph implements TextParagraph { pr.setSpcAft(spc); } - /** - * The amount of vertical white space after the paragraph - * This may be specified in two different ways, percentage spacing and font point spacing: - *

- * If spaceBefore >= 0, then space is a percentage of normal line height. - * If spaceBefore < 0, the absolute value of linespacing is the spacing in points - *

- * - * @return the vertical white space after the paragraph - */ - public double getSpaceAfter(){ + @Override + public Double getSpaceAfter(){ ParagraphPropertyFetcher fetcher = new ParagraphPropertyFetcher(getLevel()){ public boolean fetch(CTTextParagraphProperties props){ if(props.isSetSpcAft()){ @@ -635,7 +569,7 @@ public class XSLFTextParagraph implements TextParagraph { } }; fetchParagraphProperty(fetcher); - return fetcher.getValue() == null ? 0 : fetcher.getValue(); + return fetcher.getValue(); } /** @@ -647,7 +581,6 @@ public class XSLFTextParagraph implements TextParagraph { */ public void setLevel(int level){ CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr(); - pr.setLvl(level); } @@ -657,10 +590,7 @@ public class XSLFTextParagraph implements TextParagraph { */ public int getLevel(){ CTTextParagraphProperties pr = _p.getPPr(); - if(pr == null) return 0; - - return pr.getLvl(); - + return (pr == null || !pr.isSetLvl()) ? 0 : pr.getLvl(); } /** @@ -721,53 +651,70 @@ public class XSLFTextParagraph implements TextParagraph { } - CTTextParagraphProperties getDefaultMasterStyle(){ + /* package */ CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); - String defaultStyleSelector; - if(ph == null) defaultStyleSelector = "otherStyle"; // no placeholder means plain text box - else { - switch(ph.getType().intValue()){ - case STPlaceholderType.INT_TITLE: - case STPlaceholderType.INT_CTR_TITLE: - defaultStyleSelector = "titleStyle"; - break; - case STPlaceholderType.INT_FTR: - case STPlaceholderType.INT_SLD_NUM: - case STPlaceholderType.INT_DT: - defaultStyleSelector = "otherStyle"; - break; - default: - defaultStyleSelector = "bodyStyle"; - break; - } + String defaultStyleSelector; + switch(ph == null ? -1 : ph.getType().intValue()) { + case STPlaceholderType.INT_TITLE: + case STPlaceholderType.INT_CTR_TITLE: + defaultStyleSelector = "titleStyle"; + break; + case -1: // no placeholder means plain text box + case STPlaceholderType.INT_FTR: + case STPlaceholderType.INT_SLD_NUM: + case STPlaceholderType.INT_DT: + defaultStyleSelector = "otherStyle"; + break; + default: + defaultStyleSelector = "bodyStyle"; + break; } int level = getLevel(); // wind up and find the root master sheet which must be slide master XSLFSheet masterSheet = _shape.getSheet(); - while (masterSheet.getMasterSheet() != null){ - masterSheet = (XSLFSheet)masterSheet.getMasterSheet(); + for (XSLFSheet m = masterSheet; m != null; m = (XSLFSheet)m.getMasterSheet()) { + masterSheet = m; } - XmlObject[] o = masterSheet.getXmlObject().selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + - "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + - ".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr"); - if (o.length == 1){ - return (CTTextParagraphProperties)o[0]; - } else { - o = masterSheet.getXmlObject().selectPath( - "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + - "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + - ".//p:notesStyle/a:lvl" +(level+1)+ "pPr"); - - if (o.length == 1){ + String nsDecl = + "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' "; + String xpaths[] = { + nsDecl+".//p:txStyles/p:" + defaultStyleSelector +"/a:lvl" +(level+1)+ "pPr", + nsDecl+".//p:notesStyle/a:lvl" +(level+1)+ "pPr" + }; + XmlObject xo = masterSheet.getXmlObject(); + for (String xpath : xpaths) { + XmlObject[] o = xo.selectPath(xpath); + if (o.length == 1) { return (CTTextParagraphProperties)o[0]; } - - throw new IllegalArgumentException("Failed to fetch default style for " + - defaultStyleSelector + " and level=" + level); } + +// for (CTTextBody txBody : (CTTextBody[])xo.selectPath(nsDecl+".//p:txBody")) { +// CTTextParagraphProperties defaultPr = null, lastPr = null; +// boolean hasLvl = false; +// for (CTTextParagraph p : txBody.getPArray()) { +// CTTextParagraphProperties pr = p.getPPr(); +// if (pr.isSetLvl()) { +// hasLvl |= true; +// lastPr = pr; +// if (pr.getLvl() == level) return pr; +// } else { +// defaultPr = pr; +// } +// } +// if (!hasLvl) continue; +// if (level == 0 && defaultPr != null) return defaultPr; +// if (lastPr != null) return lastPr; +// break; +// } +// +// String err = "Failed to fetch default style for " + defaultStyleSelector + " and level=" + level; +// throw new IllegalArgumentException(err); + + return null; } private boolean fetchParagraphProperty(ParagraphPropertyFetcher visitor){ @@ -860,9 +807,9 @@ public class XSLFTextParagraph implements TextParagraph { } @Override - public double getDefaultFontSize() { + public Double getDefaultFontSize() { CTTextCharacterProperties endPr = _p.getEndParaRPr(); - return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100); + return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100.); } @Override @@ -871,6 +818,7 @@ public class XSLFTextParagraph implements TextParagraph { } public BulletStyle getBulletStyle() { + if (!isBullet()) return null; return new BulletStyle(){ public String getBulletCharacter() { return XSLFTextParagraph.this.getBulletCharacter(); @@ -880,7 +828,7 @@ public class XSLFTextParagraph implements TextParagraph { return XSLFTextParagraph.this.getBulletFont(); } - public double getBulletFontSize() { + public Double getBulletFontSize() { return XSLFTextParagraph.this.getBulletFontSize(); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index 2b63a58099..d99df7e79a 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -17,26 +17,11 @@ package org.apache.poi.xslf.usermodel; import java.awt.Color; -import java.awt.font.FontRenderContext; -import java.awt.font.TextAttribute; -import java.awt.font.TextLayout; -import java.text.AttributedString; import org.apache.poi.sl.usermodel.TextRun; import org.apache.poi.util.Beta; import org.apache.poi.xslf.model.CharacterPropertyFetcher; -import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; -import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle; -import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit; -import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; -import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; -import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; +import org.openxmlformats.schemas.drawingml.x2006.main.*; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; /** @@ -89,28 +74,6 @@ public class XSLFTextRun implements TextRun { return buf.toString(); } - /** - * Replace a tab with the effective number of white spaces. - */ - private String tab2space(){ - AttributedString string = new AttributedString(" "); - // user can pass an object to convert fonts via a rendering hint - string.addAttribute(TextAttribute.FAMILY, getFontFamily()); - - string.addAttribute(TextAttribute.SIZE, (float)getFontSize()); - TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true)); - double wspace = l.getAdvance(); - - double tabSz = _p.getDefaultTabSize(); - - int numSpaces = (int)Math.ceil(tabSz / wspace); - StringBuffer buf = new StringBuffer(); - for(int i = 0; i < numSpaces; i++) { - buf.append(' '); - } - return buf.toString(); - } - public void setText(String text){ _r.setT(text); } @@ -175,9 +138,10 @@ public class XSLFTextRun implements TextRun { } /** - * @return font size in points or -1 if font size is not set. + * @return font size in points or null if font size is not set. */ - public double getFontSize(){ + @Override + public Double getFontSize(){ double scale = 1; CTTextNormalAutofit afit = getParentParagraph().getParentShape().getTextBodyPr().getNormAutofit(); if(afit != null) scale = (double)afit.getFontScale() / 100000; @@ -192,7 +156,7 @@ public class XSLFTextRun implements TextRun { } }; fetchCharacterProperty(fetcher); - return fetcher.getValue() == null ? -1 : fetcher.getValue()*scale; + return fetcher.getValue() == null ? null : fetcher.getValue()*scale; } /** @@ -514,7 +478,7 @@ public class XSLFTextRun implements TextRun { return new XSLFHyperlink(_r.getRPr().getHlinkClick(), this); } - private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){ + private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){ boolean ok = false; if(_r.isSetRPr()) ok = fetcher.fetch(getRPr()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java index 6fc5690cca..b3c44f84a7 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFAutoShape.java @@ -125,7 +125,7 @@ public class TestXSLFAutoShape { p.setIndent(2.0); assertEquals(2.0, p.getIndent(), 0); assertTrue(p.getXmlObject().getPPr().isSetIndent()); - p.setIndent(-1); + p.setIndent(-1d); assertEquals(0.0, p.getIndent(), 0); assertFalse(p.getXmlObject().getPPr().isSetIndent()); p.setIndent(10.0); @@ -149,44 +149,44 @@ public class TestXSLFAutoShape { assertFalse(p.getXmlObject().getPPr().isSetSpcAft()); - p.setSpaceAfter(200); + p.setSpaceAfter(200d); assertEquals(200000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts()); - p.setSpaceAfter(100); + p.setSpaceAfter(100d); assertEquals(100000, p.getXmlObject().getPPr().getSpcAft().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPts()); - p.setSpaceAfter(-20); + p.setSpaceAfter(-20d); assertEquals(2000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct()); - p.setSpaceAfter(-10); + p.setSpaceAfter(-10d); assertEquals(1000, p.getXmlObject().getPPr().getSpcAft().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcAft().isSetSpcPct()); assertFalse(p.getXmlObject().getPPr().isSetSpcBef()); - p.setSpaceBefore(200); + p.setSpaceBefore(200d); assertEquals(200000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts()); - p.setSpaceBefore(100); + p.setSpaceBefore(100d); assertEquals(100000, p.getXmlObject().getPPr().getSpcBef().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPts()); - p.setSpaceBefore(-20); + p.setSpaceBefore(-20d); assertEquals(2000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct()); - p.setSpaceBefore(-10); + p.setSpaceBefore(-10d); assertEquals(1000, p.getXmlObject().getPPr().getSpcBef().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getSpcBef().isSetSpcPct()); assertFalse(p.getXmlObject().getPPr().isSetLnSpc()); - p.setLineSpacing(200); + p.setLineSpacing(200d); assertEquals(200000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts()); - p.setLineSpacing(100); + p.setLineSpacing(100d); assertEquals(100000, p.getXmlObject().getPPr().getLnSpc().getSpcPct().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPts()); - p.setLineSpacing(-20); + p.setLineSpacing(-20d); assertEquals(2000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct()); - p.setLineSpacing(-10); + p.setLineSpacing(-10d); assertEquals(1000, p.getXmlObject().getPPr().getLnSpc().getSpcPts().getVal()); assertFalse(p.getXmlObject().getPPr().getLnSpc().isSetSpcPct()); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 0998ee8e72..37a01a73ae 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -92,7 +92,7 @@ public class TestXSLFTextParagraph { assertEquals(expectedWidth, dtp.getWrappingWidth(true, null), 0); assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0); - p.setLeftMargin(36); // 0.5" + p.setLeftMargin(36d); // 0.5" leftMargin = p.getLeftMargin(); assertEquals(36.0, leftMargin, 0); expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin; diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java index c9c911ccf9..904feeedf8 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/FontAlignmentProp.java @@ -21,12 +21,13 @@ package org.apache.poi.hslf.model.textproperties; * Definition for the font alignment property. */ public class FontAlignmentProp extends TextProp { + public static final String NAME = "fontAlign"; public static final int BASELINE = 0; public static final int TOP = 1; public static final int CENTER = 2; public static final int BOTTOM = 3; public FontAlignmentProp() { - super(2, 0x10000, "fontAlign"); + super(2, 0x10000, NAME); } } \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java index 17d0c1d2c5..84cfe9940f 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/textproperties/TextPropCollection.java @@ -31,47 +31,10 @@ import org.apache.poi.util.LittleEndian; * properties, and the indent level if required. */ public class TextPropCollection { - /* - private static TextProp paragraphSpecialPropTypes[] = { - new ParagraphFlagsTextProp(), - new TextProp(2, 0x80, "bullet.char"), - new TextProp(2, 0x10, "bullet.font"), - new TextProp(2, 0x40, "bullet.size"), - new TextProp(4, 0x20, "bullet.color"), - new TextProp(2, 0xD00, "alignment"), - new TextProp(2, 0x1000, "linespacing"), - new TextProp(2, 0x2000, "spacebefore"), - new TextProp(2, 0x4000, "spaceafter"), - new TextProp(2, 0x8000, "text.offset"), - new TextProp(2, 0x10000, "bullet.offset"), - new TextProp(2, 0x20000, "defaulttab"), - new TextProp(2, 0x40000, "para_unknown_2"), - new TextProp(2, 0x80000, "para_unknown_3"), - new TextProp(2, 0x100000, "para_unknown_4"), - new TextProp(2, 0x200000, "para_unknown_5") - }; - - private static TextProp characterSpecialPropTypes[] = { - new CharFlagsTextProp(), - new TextProp(2, 0x10000, "font.index"), - new TextProp(2, 0x20000, "char_unknown_1"), - new TextProp(4, 0x40000, "char_unknown_2"), - new TextProp(2, 0x80000, "font.size"), - new TextProp(2, 0x100000, "char_unknown_3"), - new TextProp(4, 0x200000, "font.color"), - new TextProp(2, 0x800000, "char_unknown_4") - }; -*/ - - /** All the different kinds of paragraph properties we might handle */ public static final TextProp[] paragraphTextPropTypes = { // TextProp order is according to 2.9.20 TextPFException, // bitmask order can be different -// new TextProp(0, 0x1, "hasBullet"), -// new TextProp(0, 0x2, "hasBulletFont"), -// new TextProp(0, 0x4, "hasBulletColor"), -// new TextProp(0, 0x8, "hasBulletSize"), new ParagraphFlagsTextProp(), new TextProp(2, 0x80, "bullet.char"), new TextProp(2, 0x10, "bullet.font"), @@ -95,24 +58,9 @@ public class TextPropCollection { new TextProp(0, 0x2000000, "hasBulletScheme"), // TODO: check size // 0xFC000000 MUST be zero and MUST be ignored }; + /** All the different kinds of character properties we might handle */ public static final TextProp[] characterTextPropTypes = new TextProp[] { -// new TextProp(0, 0x1, "bold"), -// new TextProp(0, 0x2, "italic"), -// new TextProp(0, 0x4, "underline"), -// new TextProp(0, 0x8, "unused1"), -// new TextProp(0, 0x10, "shadow"), -// new TextProp(0, 0x20, "fehint"), -// new TextProp(0, 0x40, "unused2"), -// new TextProp(0, 0x80, "kumi"), -// new TextProp(0, 0x100, "strikethrough"), -// new TextProp(0, 0x200, "emboss"), -// new TextProp(0, 0x400, "nibble1"), -// new TextProp(0, 0x800, "nibble2"), -// new TextProp(0, 0x1000, "nibble3"), -// new TextProp(0, 0x2000, "nibble4"), -// new TextProp(0, 0x4000, "unused4"), -// new TextProp(0, 0x8000, "unused5"), new TextProp(0, 0x100000, "pp10ext"), new TextProp(0, 0x1000000, "newAsian.font.index"), // A bit that specifies whether the newEAFontRef field of the TextCFException10 structure that contains this CFMasks exists. new TextProp(0, 0x2000000, "cs.font.index"), // A bit that specifies whether the csFontRef field of the TextCFException10 structure that contains this CFMasks exists. @@ -166,6 +114,19 @@ public class TextPropCollection { } return null; } + + public TextProp removeByName(String name) { + Iterator iter = textPropList.iterator(); + TextProp tp = null; + while (iter.hasNext()) { + tp = iter.next(); + if (tp.getName().equals(name)){ + iter.remove(); + break; + } + } + return tp; + } /** Add the TextProp with this name to the list */ public TextProp addWithName(String name) { @@ -192,6 +153,10 @@ public class TextPropCollection { return textProp; } + public TextPropType getTextPropType() { + return textPropType; + } + private TextProp[] getPotentialProperties() { return (textPropType == TextPropType.paragraph) ? paragraphTextPropTypes : characterTextPropTypes; } diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java index 0f7f05148b..b90c698dd6 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/FontCollection.java @@ -17,6 +17,7 @@ package org.apache.poi.hslf.record; +import org.apache.poi.hslf.model.PPFont; import org.apache.poi.util.POILogger; import java.io.*; @@ -75,9 +76,9 @@ public final class FontCollection extends RecordContainer { */ public int addFont(String name) { int idx = getFontIndex(name); - if(idx != -1) return idx; + if (idx != -1) return idx; - return addFont(name, 0, 0, 4, 34); + return addFont(name, 0, 0, 4, PPFont.FF_SWISS | PPFont.VARIABLE_PITCH); } public int addFont(String name, int charset, int flags, int type, int pitch) { diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java index a6dfedf073..346dab7450 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlideMaster.java @@ -76,45 +76,31 @@ public final class HSLFSlideMaster extends HSLFMasterSheet { * This is the "workhorse" which returns the default style attrubutes. */ public TextProp getStyleAttribute(int txtype, int level, String name, boolean isCharacter) { - + if (_txmaster.length <= txtype) return null; + TxMasterStyleAtom t = _txmaster[txtype]; + List styles = isCharacter ? t.getCharacterStyles() : t.getParagraphStyles(); + TextProp prop = null; - for (int i = level; i >= 0; i--) { - List styles = - isCharacter ? _txmaster[txtype].getCharacterStyles() : _txmaster[txtype].getParagraphStyles(); - if (i < styles.size()) prop = styles.get(i).findByName(name); - if (prop != null) break; + for (int i = Math.min(level, styles.size()-1); prop == null && i >= 0; i--) { + prop = styles.get(i).findByName(name); } - if (prop == null) { - if(isCharacter) { - switch (txtype) { - case TextHeaderAtom.CENTRE_BODY_TYPE: - case TextHeaderAtom.HALF_BODY_TYPE: - case TextHeaderAtom.QUARTER_BODY_TYPE: - txtype = TextHeaderAtom.BODY_TYPE; - break; - case TextHeaderAtom.CENTER_TITLE_TYPE: - txtype = TextHeaderAtom.TITLE_TYPE; - break; - default: - return null; - } - } else { - switch (txtype) { - case TextHeaderAtom.CENTRE_BODY_TYPE: - case TextHeaderAtom.HALF_BODY_TYPE: - case TextHeaderAtom.QUARTER_BODY_TYPE: - txtype = TextHeaderAtom.BODY_TYPE; - break; - case TextHeaderAtom.CENTER_TITLE_TYPE: - txtype = TextHeaderAtom.TITLE_TYPE; - break; - default: - return null; - } - } - prop = getStyleAttribute(txtype, level, name, isCharacter); + + if (prop != null) return prop; + + switch (txtype) { + case TextHeaderAtom.CENTRE_BODY_TYPE: + case TextHeaderAtom.HALF_BODY_TYPE: + case TextHeaderAtom.QUARTER_BODY_TYPE: + txtype = TextHeaderAtom.BODY_TYPE; + break; + case TextHeaderAtom.CENTER_TITLE_TYPE: + txtype = TextHeaderAtom.TITLE_TYPE; + break; + default: + return null; } - return prop; + + return getStyleAttribute(txtype, level, name, isCharacter); } /** diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java index c0d381e912..ee99745b5a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextParagraph.java @@ -34,7 +34,7 @@ import org.apache.poi.util.*; * This class represents a run of text in a powerpoint document. That * run could be text on a sheet, or text in a note. * It is only a very basic class for now - * + * * @author Nick Burch */ @@ -44,50 +44,49 @@ public final class HSLFTextParagraph implements TextParagraph { /** * How to align the text */ - /* package */ static final int AlignLeft = 0; - /* package */ static final int AlignCenter = 1; - /* package */ static final int AlignRight = 2; - /* package */ static final int AlignJustify = 3; - + /* package */static final int AlignLeft = 0; + /* package */static final int AlignCenter = 1; + /* package */static final int AlignRight = 2; + /* package */static final int AlignJustify = 3; // Note: These fields are protected to help with unit testing - // Other classes shouldn't really go playing with them! - private final TextHeaderAtom _headerAtom; - private TextBytesAtom _byteAtom; - private TextCharsAtom _charAtom; - private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); + // Other classes shouldn't really go playing with them! + private final TextHeaderAtom _headerAtom; + private TextBytesAtom _byteAtom; + private TextCharsAtom _charAtom; + private final TextPropCollection _paragraphStyle = new TextPropCollection(1, TextPropType.paragraph); protected TextRulerAtom _ruler; - protected List _runs = new ArrayList(); - protected HSLFTextShape _parentShape; + protected final List _runs = new ArrayList(); + protected HSLFTextShape _parentShape; private HSLFSheet _sheet; private int shapeId; - // private StyleTextPropAtom styleTextPropAtom; - private StyleTextProp9Atom styleTextProp9Atom; + // private StyleTextPropAtom styleTextPropAtom; + private StyleTextProp9Atom styleTextProp9Atom; - /** + /** * Constructs a Text Run from a Unicode text block. * Either a {@link TextCharsAtom} or a {@link TextBytesAtom} needs to be provided. - * + * * @param tha the TextHeaderAtom that defines what's what * @param tba the TextBytesAtom containing the text or null if {@link TextCharsAtom} is provided * @param tca the TextCharsAtom containing the text or null if {@link TextBytesAtom} is provided - */ + */ /* package */ HSLFTextParagraph( TextHeaderAtom tha, TextBytesAtom tba, TextCharsAtom tca ) { - if (tha == null) { - throw new IllegalArgumentException("TextHeaderAtom must be set."); - } - _headerAtom = tha; + if (tha == null) { + throw new IllegalArgumentException("TextHeaderAtom must be set."); + } + _headerAtom = tha; _byteAtom = tba; _charAtom = tca; - } + } - /* package */ HSLFTextParagraph(HSLFTextParagraph other) { + /* package */HSLFTextParagraph(HSLFTextParagraph other) { _headerAtom = other._headerAtom; _byteAtom = other._byteAtom; _charAtom = other._charAtom; @@ -98,67 +97,67 @@ public final class HSLFTextParagraph implements TextParagraph { _paragraphStyle.copy(other._paragraphStyle); } - public void addTextRun(HSLFTextRun run) { - _runs.add(run); - } + public void addTextRun(HSLFTextRun run) { + _runs.add(run); + } - /** + /** * Fetch the rich text runs (runs of text with the same styling) that * are contained within this block of text - */ - public List getTextRuns() { - return _runs; - } + */ + public List getTextRuns() { + return _runs; + } - public TextPropCollection getParagraphStyle() { - return _paragraphStyle; - } + public TextPropCollection getParagraphStyle() { + return _paragraphStyle; + } - public void setParagraphStyle(TextPropCollection paragraphStyle) { - _paragraphStyle.copy(paragraphStyle); - } + public void setParagraphStyle(TextPropCollection paragraphStyle) { + _paragraphStyle.copy(paragraphStyle); + } - /** + /** * Supply the Sheet we belong to, which might have an assigned SlideShow * Also passes it on to our child RichTextRuns */ - public void supplySheet(HSLFSheet sheet){ + public void supplySheet(HSLFSheet sheet) { this._sheet = sheet; if (_runs == null) return; - for(HSLFTextRun rt : _runs) { + for (HSLFTextRun rt : _runs) { rt.updateSheet(); } - } + } - public HSLFSheet getSheet(){ + public HSLFSheet getSheet() { return this._sheet; } /** - * @return Shape ID + * @return Shape ID */ - protected int getShapeId(){ + protected int getShapeId() { return shapeId; } /** - * @param id Shape ID + * @param id Shape ID */ - protected void setShapeId(int id){ + protected void setShapeId(int id) { shapeId = id; } /** - * @return 0-based index of the text run in the SLWT container + * @return 0-based index of the text run in the SLWT container */ - protected int getIndex(){ + protected int getIndex() { return (_headerAtom != null) ? _headerAtom.getIndex() : -1; } /** * Sets the index of the paragraph in the SLWT container - * + * * @param index */ protected void setIndex(int index) { @@ -166,10 +165,10 @@ public final class HSLFTextParagraph implements TextParagraph { } /** - * Returns the type of the text, from the TextHeaderAtom. - * Possible values can be seen from TextHeaderAtom - * @see org.apache.poi.hslf.record.TextHeaderAtom - */ + * Returns the type of the text, from the TextHeaderAtom. + * Possible values can be seen from TextHeaderAtom + * @see org.apache.poi.hslf.record.TextHeaderAtom + */ public int getRunType() { return (_headerAtom != null) ? _headerAtom.getTextType() : -1; } @@ -177,8 +176,7 @@ public final class HSLFTextParagraph implements TextParagraph { public void setRunType(int runType) { if (_headerAtom != null) _headerAtom.setTextType(runType); } - - + /** * Is this Text Run one from a {@link PPDrawing}, or is it * one from the {@link SlideListWithText}? @@ -187,12 +185,12 @@ public final class HSLFTextParagraph implements TextParagraph { return (getIndex() == -1); } - public TextRulerAtom getTextRuler(){ + public TextRulerAtom getTextRuler() { return _ruler; } - public TextRulerAtom createTextRuler(){ + public TextRulerAtom createTextRuler() { _ruler = getTextRuler(); if (_ruler == null) { _ruler = TextRulerAtom.getParagraphInstance(); @@ -207,19 +205,19 @@ public final class HSLFTextParagraph implements TextParagraph { /** * Returns records that make up the list of text paragraphs * (there can be misc InteractiveInfo, TxInteractiveInfo and other records) - * + * * @return text run records */ - public Record[] getRecords(){ + public Record[] getRecords() { Record r[] = _headerAtom.getParentRecord().getChildRecords(); - return getRecords(r, new int[]{0}, _headerAtom); + return getRecords(r, new int[] { 0 }, _headerAtom); } private static Record[] getRecords(Record[] records, int[] startIdx, TextHeaderAtom headerAtom) { if (records == null) { throw new NullPointerException("records need to be set."); } - + for (; startIdx[0] < records.length; startIdx[0]++) { Record r = records[startIdx[0]]; if (r instanceof TextHeaderAtom && (headerAtom == null || r == headerAtom)) break; @@ -229,135 +227,113 @@ public final class HSLFTextParagraph implements TextParagraph { logger.log(POILogger.INFO, "header atom wasn't found - container might contain only an OutlineTextRefAtom"); return new Record[0]; } - + int length; - for (length = 1; startIdx[0]+length < records.length; length++) { + for (length = 1; startIdx[0] + length < records.length; length++) { if (records[startIdx[0]+length] instanceof TextHeaderAtom) break; } - + Record result[] = new Record[length]; System.arraycopy(records, startIdx[0], result, 0, length); startIdx[0] += length; - + return result; } - - /** Numbered List info */ - public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { - this.styleTextProp9Atom = styleTextProp9Atom; - } /** Numbered List info */ - public StyleTextProp9Atom getStyleTextProp9Atom() { - return this.styleTextProp9Atom; - } - - /** - * Fetch the value of the given Paragraph related TextProp. - * Returns -1 if that TextProp isn't present. - * If the TextProp isn't present, the value from the appropriate - * Master Sheet will apply. - */ - private int getParaTextPropVal(String propName) { - TextProp prop = _paragraphStyle.findByName(propName); - BitMaskTextProp maskProp = (BitMaskTextProp)_paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); - boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0); - if (prop == null && !hardAttribute){ - HSLFSheet sheet = getSheet(); - int txtype = getRunType(); - HSLFMasterSheet master = sheet.getMasterSheet(); - if (master != null) - prop = master.getStyleAttribute(txtype, getIndentLevel(), propName, false); - } - - return prop == null ? -1 : prop.getValue(); + public void setStyleTextProp9Atom(final StyleTextProp9Atom styleTextProp9Atom) { + this.styleTextProp9Atom = styleTextProp9Atom; } - /** - * Sets the value of the given Character TextProp, add if required - * @param propName The name of the Character TextProp - * @param val The value to set for the TextProp - */ - public void setParaTextPropVal(String propName, int val) { - // Ensure we have the StyleTextProp atom we're going to need - assert(_paragraphStyle!=null); - TextProp tp = fetchOrAddTextProp(_paragraphStyle, propName); - tp.setValue(val); + /** Numbered List info */ + public StyleTextProp9Atom getStyleTextProp9Atom() { + return this.styleTextProp9Atom; } - + @Override public Iterator iterator() { return _runs.iterator(); } @Override - public double getLeftMargin() { - int val = getParaTextPropVal("text.offset"); - return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + public Double getLeftMargin() { + TextProp val = getPropVal(_paragraphStyle, "text.offset", this); + return (val == null) ? null : Units.masterToPoints(val.getValue()); } @Override - public void setLeftMargin(double leftMargin) { - int val = (int)(leftMargin*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - setParaTextPropVal("text.offset", val); + public void setLeftMargin(Double leftMargin) { + Integer val = (leftMargin == null) ? null : Units.pointsToMaster(leftMargin); + setPropVal(_paragraphStyle, "text.offset", val); } @Override - public double getRightMargin() { + public Double getRightMargin() { // TODO: find out, how to determine this value - return 0; + return null; } @Override - public void setRightMargin(double rightMargin) { + public void setRightMargin(Double rightMargin) { // TODO: find out, how to set this value } @Override - public double getIndent() { - int val = getParaTextPropVal("bullet.offset"); - return val*HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); + public Double getIndent() { + TextProp val = getPropVal(_paragraphStyle, "bullet.offset", this); + return (val == null) ? null : Units.masterToPoints(val.getValue()); } @Override - public void setIndent(double intent) { - int val = (int)(intent*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - setParaTextPropVal("bullet.offset", val); + public void setIndent(Double indent) { + Integer val = (indent == null) ? null : Units.pointsToMaster(indent); + setPropVal(_paragraphStyle, "bullet.offset", val); } @Override public String getDefaultFontFamily() { - return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily()); + String typeface = null; + if (!_runs.isEmpty()) { + typeface = _runs.get(0).getFontFamily(); + } + return (typeface != null) ? typeface : "Arial"; } @Override - public double getDefaultFontSize() { - return (_runs.isEmpty() ? 12 : _runs.get(0).getFontSize()); + public Double getDefaultFontSize() { + Double d = null; + if (!_runs.isEmpty()) { + d = _runs.get(0).getFontSize(); + } + + return (d != null) ? d : 12d; } /** * Sets the type of horizontal alignment for the paragraph. - * + * * @param align - the type of alignment */ public void setAlignment(org.apache.poi.sl.usermodel.TextParagraph.TextAlign align) { - int alignInt; - switch (align) { - default: - case LEFT: alignInt = TextAlignmentProp.LEFT; break; - case CENTER: alignInt = TextAlignmentProp.CENTER; break; - case RIGHT: alignInt = TextAlignmentProp.RIGHT; break; - case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break; - case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break; - case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; - case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; + Integer alignInt = null; + if (align != null) switch (align) { + default: + case LEFT: alignInt = TextAlignmentProp.LEFT;break; + case CENTER: alignInt = TextAlignmentProp.CENTER; break; + case RIGHT: alignInt = TextAlignmentProp.RIGHT; break; + case DIST: alignInt = TextAlignmentProp.DISTRIBUTED; break; + case JUSTIFY: alignInt = TextAlignmentProp.JUSTIFY; break; + case JUSTIFY_LOW: alignInt = TextAlignmentProp.JUSTIFYLOW; break; + case THAI_DIST: alignInt = TextAlignmentProp.THAIDISTRIBUTED; break; } - setParaTextPropVal("alignment", alignInt); + setPropVal(_paragraphStyle, "alignment", alignInt); } @Override public org.apache.poi.sl.usermodel.TextParagraph.TextAlign getTextAlign() { - switch (getParaTextPropVal("alignment")) { + TextProp tp = getPropVal(_paragraphStyle, "alignment", this); + if (tp == null) return null; + switch (tp.getValue()) { default: case TextAlignmentProp.LEFT: return TextAlign.LEFT; case TextAlignmentProp.CENTER: return TextAlign.CENTER; @@ -371,34 +347,33 @@ public final class HSLFTextParagraph implements TextParagraph { @Override public FontAlign getFontAlign() { - switch(getParaTextPropVal("fontAlign")) { - default: - case -1: return FontAlign.AUTO; + TextProp tp = getPropVal(_paragraphStyle, FontAlignmentProp.NAME, this); + if (tp == null) return null; + + switch (tp.getValue()) { case FontAlignmentProp.BASELINE: return FontAlign.BASELINE; case FontAlignmentProp.TOP: return FontAlign.TOP; case FontAlignmentProp.CENTER: return FontAlign.CENTER; case FontAlignmentProp.BOTTOM: return FontAlign.BOTTOM; + default: return FontAlign.AUTO; } } @Override public BulletStyle getBulletStyle() { - if (getBulletChar() == 0) return null; + if (!isBullet()) return null; return new BulletStyle() { public String getBulletCharacter() { - char chr = HSLFTextParagraph.this.getBulletChar(); - return (chr == 0 ? "" : ""+chr); + Character chr = HSLFTextParagraph.this.getBulletChar(); + return (chr == null || chr == 0) ? "" : "" + chr; } public String getBulletFont() { - int fontIdx = HSLFTextParagraph.this.getBulletFont(); - if (fontIdx == -1) return getDefaultFontFamily(); - PPFont ppFont = getSheet().getSlideShow().getFont(fontIdx); - return ppFont.getFontName(); + return HSLFTextParagraph.this.getBulletFont(); } - public double getBulletFontSize() { + public Double getBulletFontSize() { return HSLFTextParagraph.this.getBulletSize(); } @@ -417,666 +392,669 @@ public final class HSLFTextParagraph implements TextParagraph { _parentShape = parentShape; } + /** + * + * @return indentation level + */ + public int getIndentLevel() { + return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); + } /** - * - * @return indentation level - */ - public int getIndentLevel() { - return _paragraphStyle == null ? 0 : _paragraphStyle.getIndentLevel(); - } - - /** - * Sets indentation level - * + * Sets indentation level + * * @param level indentation level. Must be in the range [0, 4] - */ - public void setIndentLevel(int level) { + */ + public void setIndentLevel(int level) { if( _paragraphStyle != null ) _paragraphStyle.setIndentLevel((short)level); - } - - /** - * Sets whether this rich text run has bullets - */ - public void setBullet(boolean flag) { - setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag); - } - - /** - * Returns whether this rich text run has bullets - */ - public boolean isBullet() { - return getFlag(ParagraphFlagsTextProp.BULLET_IDX); - } - - /** - * Returns whether this rich text run has bullets - */ - public boolean isBulletHard() { - return getFlag(ParagraphFlagsTextProp.BULLET_IDX); - } - - /** - * Sets the bullet character - */ - public void setBulletChar(char c) { - setParaTextPropVal("bullet.char", c); - } - - /** - * Returns the bullet character - */ - public char getBulletChar() { - int val = getParaTextPropVal("bullet.char"); - return (char)(val == -1 ? 0 : val); - } - - /** - * Sets the bullet size - */ - public void setBulletSize(int size) { - setParaTextPropVal("bullet.size", size); - } - - /** - * Returns the bullet size - */ - public int getBulletSize() { - return getParaTextPropVal("bullet.size"); - } - - /** - * Sets the bullet color - */ - public void setBulletColor(Color color) { - int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); - setParaTextPropVal("bullet.color", rgb); - } - - /** - * Returns the bullet color - */ - public Color getBulletColor() { - int rgb = getParaTextPropVal("bullet.color"); - if (rgb == -1) { - // if bullet color is undefined, return color of first run - if (_runs.isEmpty()) return null; - return _runs.get(0).getFontColor(); - } - - int cidx = rgb >> 24; - if (rgb % 0x1000000 == 0){ - if (_sheet == null) return null; - ColorSchemeAtom ca = _sheet.getColorScheme(); - if(cidx >= 0 && cidx <= 7) rgb = ca.getColor(cidx); - } - Color tmp = new Color(rgb, true); - return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); - } - - /** - * Sets the bullet font - */ - public void setBulletFont(int idx) { - setParaTextPropVal("bullet.font", idx); - setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); - } - - /** - * Returns the bullet font - */ - public int getBulletFont() { - return getParaTextPropVal("bullet.font"); - } - - @Override - public void setLineSpacing(double lineSpacing) { - // if lineSpacing < 0, we need to convert points (common interface) to master units (hslf) - if (lineSpacing < 0) { - lineSpacing = (lineSpacing*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI); - } - setParaTextPropVal("linespacing", (int)lineSpacing); - } - - @Override - public double getLineSpacing() { - double val = getParaTextPropVal("linespacing"); - // if lineSpacing < 0, we need to convert master units (hslf) to points (common interface) - if (val == -1) return 0; - if (val < -1) val *= HSLFShape.POINT_DPI/((double)HSLFShape.MASTER_DPI); - return val; - } - - /** - * Sets spacing before a paragraph. - *

- * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

- */ - public void setSpaceBefore(int val) { - setParaTextPropVal("spacebefore", val); - } - - /** - * Returns spacing before a paragraph - *

- * If spacebefore >= 0, then spacebefore is a percentage of normal line height. - * If spacebefore < 0, the absolute value of spacebefore is the spacing in master coordinates. - *

- * - * @return the spacing before a paragraph - */ - @Override - public double getSpaceBefore() { - int val = getParaTextPropVal("spacebefore"); - return val == -1 ? 0 : val; - } - - /** - * Sets spacing after a paragraph. - *

- * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

- */ - public void setSpaceAfter(int val) { - setParaTextPropVal("spaceafter", val); - } - - /** - * Returns spacing after a paragraph - *

- * If spaceafter >= 0, then spaceafter is a percentage of normal line height. - * If spaceafter < 0, the absolute value of spaceafter is the spacing in master coordinates. - *

- * - * @return the spacing before a paragraph - */ - @Override - public double getSpaceAfter() { - int val = getParaTextPropVal("spaceafter"); - return val == -1 ? 0 : val; - } - - /** - * Returns the named TextProp, either by fetching it (if it exists) or adding it - * (if it didn't) - * @param textPropCol The TextPropCollection to fetch from / add into - * @param textPropName The name of the TextProp to fetch/add - */ - protected static TextProp fetchOrAddTextProp(TextPropCollection textPropCol, String textPropName) { + } + + /** + * Sets whether this rich text run has bullets + */ + public void setBullet(boolean flag) { + setFlag(ParagraphFlagsTextProp.BULLET_IDX, flag); + } + + /** + * Returns whether this rich text run has bullets + */ + public boolean isBullet() { + return getFlag(ParagraphFlagsTextProp.BULLET_IDX); + } + + /** + * Sets the bullet character + */ + public void setBulletChar(Character c) { + Integer val = (c == null) ? null : (int)c.charValue(); + setPropVal(_paragraphStyle, "bullet.char", val); + } + + /** + * Returns the bullet character + */ + public Character getBulletChar() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.char", this); + return (tp == null) ? null : (char)tp.getValue(); + } + + /** + * Sets the bullet size + */ + public void setBulletSize(Double size) { + setPctOrPoints("bullet.size", size); + } + + /** + * Returns the bullet size, null if unset + */ + public Double getBulletSize() { + return getPctOrPoints("bullet.size"); + } + + /** + * Sets the bullet color + */ + public void setBulletColor(Color color) { + Integer val = (color == null) ? null : new Color(color.getBlue(), color.getGreen(), color.getRed(), 254).getRGB(); + setPropVal(_paragraphStyle, "bullet.color", val); + } + + /** + * Returns the bullet color + */ + public Color getBulletColor() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.color", this); + if (tp == null) { + // if bullet color is undefined, return color of first run + return (_runs.isEmpty()) ? null : _runs.get(0).getFontColor(); + } + + int rgb = tp.getValue(); + int cidx = rgb >> 24; + if (rgb % 0x1000000 == 0) { + if (_sheet == null) + return null; + ColorSchemeAtom ca = _sheet.getColorScheme(); + if (cidx >= 0 && cidx <= 7) + rgb = ca.getColor(cidx); + } + Color tmp = new Color(rgb, true); + return new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed()); + } + + /** + * Sets the bullet font + */ + public void setBulletFont(String typeface) { + if (typeface == null) { + setPropVal(_paragraphStyle, "bullet.font", null); + setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, false); + } + + FontCollection fc = getSheet().getSlideShow().getFontCollection(); + int idx = fc.addFont(typeface); + + setPropVal(_paragraphStyle, "bullet.font", idx); + setFlag(ParagraphFlagsTextProp.BULLET_HARDFONT_IDX, true); + } + + /** + * Returns the bullet font + */ + public String getBulletFont() { + TextProp tp = getPropVal(_paragraphStyle, "bullet.font", this); + if (tp == null) return getDefaultFontFamily(); + PPFont ppFont = getSheet().getSlideShow().getFont(tp.getValue()); + assert(ppFont != null); + return ppFont.getFontName(); + } + + @Override + public void setLineSpacing(Double lineSpacing) { + setPctOrPoints("linespacing", lineSpacing); + } + + @Override + public Double getLineSpacing() { + return getPctOrPoints("linespacing"); + } + + @Override + public void setSpaceBefore(Double spaceBefore) { + setPctOrPoints("spacebefore", spaceBefore); + } + + @Override + public Double getSpaceBefore() { + return getPctOrPoints("spacebefore"); + } + + @Override + public void setSpaceAfter(Double spaceAfter) { + setPctOrPoints("spaceafter", spaceAfter); + } + + @Override + public Double getSpaceAfter() { + return getPctOrPoints("spaceafter"); + } + + @Override + public Double getDefaultTabSize() { + // TODO: implement + return null; + } + + private Double getPctOrPoints(String propName) { + TextProp tp = getPropVal(_paragraphStyle, propName, this); + if (tp == null) return null; + int val = tp.getValue(); + return (val < 0) ? Units.masterToPoints(val) : val; + } + + private void setPctOrPoints(String propName, Double dval) { + Integer ival = null; + if (dval != null) { + ival = (dval < 0) ? Units.pointsToMaster(dval) : dval.intValue(); + } + setPropVal(_paragraphStyle, propName, ival); + } + + private boolean getFlag(int index) { + BitMaskTextProp tp = (BitMaskTextProp)getPropVal(_paragraphStyle, ParagraphFlagsTextProp.NAME, this); + return (tp == null) ? false : tp.getSubValue(index); + } + + private void setFlag(int index, boolean value) { + BitMaskTextProp tp = (BitMaskTextProp)_paragraphStyle.addWithName(ParagraphFlagsTextProp.NAME); + tp.setSubValue(value, index); + } + + /** + * Fetch the value of the given Paragraph related TextProp. Returns null if + * that TextProp isn't present. If the TextProp isn't present, the value + * from the appropriate Master Sheet will apply. + */ + protected static TextProp getPropVal(TextPropCollection props, String propName, HSLFTextParagraph paragraph) { + TextProp prop = props.findByName(propName); + if (prop != null) return prop; + + BitMaskTextProp maskProp = (BitMaskTextProp) props.findByName(ParagraphFlagsTextProp.NAME); + boolean hardAttribute = (maskProp != null && maskProp.getValue() == 0); + if (hardAttribute) return null; + + HSLFSheet sheet = paragraph.getSheet(); + int txtype = paragraph.getRunType(); + HSLFMasterSheet master = sheet.getMasterSheet(); + if (master == null) { + logger.log(POILogger.WARN, "MasterSheet is not available"); + return null; + } + + boolean isChar = props.getTextPropType() == TextPropType.character; + return master.getStyleAttribute(txtype, paragraph.getIndentLevel(), propName, isChar); + } + + /** + * Returns the named TextProp, either by fetching it (if it exists) or + * adding it (if it didn't) + * + * @param props the TextPropCollection to fetch from / add into + * @param name the name of the TextProp to fetch/add + * @param val the value, null if unset + */ + protected static void setPropVal(TextPropCollection props, String name, Integer val) { + if (val == null) { + props.removeByName(name); + return; + } + // Fetch / Add the TextProp - return textPropCol.addWithName(textPropName); + TextProp tp = props.addWithName(name); + tp.setValue(val); + } + + /** + * Check and add linebreaks to text runs leading other paragraphs + * + * @param paragraphs + */ + protected static void fixLineEndings(List paragraphs) { + HSLFTextRun lastRun = null; + for (HSLFTextParagraph p : paragraphs) { + if (lastRun != null && !lastRun.getRawText().endsWith("\r")) { + lastRun.setText(lastRun.getRawText() + "\r"); + } + List ltr = p.getTextRuns(); + if (ltr.isEmpty()) { + throw new RuntimeException("paragraph without textruns found"); + } + lastRun = ltr.get(ltr.size() - 1); + assert (lastRun.getRawText() != null); + } } - protected boolean getFlag(int index) { - if (_paragraphStyle == null) return false; + /** + * Search for a StyleTextPropAtom is for this text header (list of paragraphs) + * + * @param header the header + * @param textLen the length of the rawtext, or -1 if the length is not known + */ + private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) { + boolean afterHeader = false; + StyleTextPropAtom style = null; + for (Record record : header.getParentRecord().getChildRecords()) { + long rt = record.getRecordType(); + if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) { + // already on the next header, quit searching + break; + } + afterHeader |= (header == record); + if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) { + // found it + style = (StyleTextPropAtom) record; + } + } + + if (style == null) { + logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving."); + style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen); + } else { + if (textLen >= 0) { + style.setParentTextSize(textLen); + } + } - BitMaskTextProp prop = (BitMaskTextProp) _paragraphStyle.findByName(ParagraphFlagsTextProp.NAME); + return style; + } - if (prop == null) { - if (_sheet != null) { - int txtype = getRunType(); - HSLFMasterSheet master = _sheet.getMasterSheet(); - if (master != null) { - prop = (BitMaskTextProp) master.getStyleAttribute(txtype, getIndentLevel(), ParagraphFlagsTextProp.NAME, false); - } + /** + * Saves the modified paragraphs/textrun to the records. + * Also updates the styles to the correct text length. + */ + protected static void storeText(List paragraphs) { + fixLineEndings(paragraphs); + + String rawText = toInternalString(getRawText(paragraphs)); + + // Will it fit in a 8 bit atom? + boolean isUnicode = StringUtil.hasMultibyte(rawText); + // isUnicode = true; + + TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; + TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; + TextCharsAtom charAtom = paragraphs.get(0)._charAtom; + StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length()); + + // Store in the appropriate record + Record oldRecord = null, newRecord = null; + if (isUnicode) { + if (byteAtom != null || charAtom == null) { + oldRecord = byteAtom; + charAtom = new TextCharsAtom(); + } + newRecord = charAtom; + charAtom.setText(rawText); + } else { + if (charAtom != null || byteAtom == null) { + oldRecord = charAtom; + byteAtom = new TextBytesAtom(); + } + newRecord = byteAtom; + byte[] byteText = new byte[rawText.length()]; + StringUtil.putCompressedUnicode(rawText, byteText, 0); + byteAtom.setText(byteText); + } + assert (newRecord != null); + + RecordContainer _txtbox = headerAtom.getParentRecord(); + Record[] cr = _txtbox.getChildRecords(); + int headerIdx = -1, textIdx = -1, styleIdx = -1; + for (int i = 0; i < cr.length; i++) { + Record r = cr[i]; + if (r == headerAtom) headerIdx = i; + else if (r == oldRecord || r == newRecord) textIdx = i; + else if (r == styleAtom) styleIdx = i; + } + + if (textIdx == -1) { + // the old record was never registered, ignore it + _txtbox.addChildAfter(newRecord, headerAtom); + textIdx = headerIdx + 1; + } else { + // swap not appropriated records - noop if unchanged + cr[textIdx] = newRecord; + } + + if (styleIdx == -1) { + // Add the new StyleTextPropAtom after the TextCharsAtom / TextBytesAtom + _txtbox.addChildAfter(styleAtom, newRecord); + } + + for (HSLFTextParagraph p : paragraphs) { + if (newRecord == byteAtom) { + p._byteAtom = byteAtom; + p._charAtom = null; } else { - logger.log(POILogger.WARN, "MasterSheet is not available"); + p._byteAtom = null; + p._charAtom = charAtom; + } + } + + // Update the text length for its Paragraph and Character stylings + // * reset the length, to the new string's length + // * add on +1 if the last block + + styleAtom.clearStyles(); + + TextPropCollection lastPTPC = null, lastRTPC = null, ptpc = null, rtpc = null; + for (HSLFTextParagraph para : paragraphs) { + ptpc = para.getParagraphStyle(); + ptpc.updateTextSize(0); + if (!ptpc.equals(lastPTPC)) { + lastPTPC = styleAtom.addParagraphTextPropCollection(0); + lastPTPC.copy(ptpc); + } + for (HSLFTextRun tr : para.getTextRuns()) { + rtpc = tr.getCharacterStyle(); + rtpc.updateTextSize(0); + if (!rtpc.equals(lastRTPC)) { + lastRTPC = styleAtom.addCharacterTextPropCollection(0); + lastRTPC.copy(rtpc); + } + int len = tr.getLength(); + ptpc.updateTextSize(ptpc.getCharactersCovered() + len); + rtpc.updateTextSize(len); + lastPTPC.updateTextSize(lastPTPC.getCharactersCovered() + len); + lastRTPC.updateTextSize(lastRTPC.getCharactersCovered() + len); + } + } + + assert (lastPTPC != null && lastRTPC != null && ptpc != null && rtpc != null); + ptpc.updateTextSize(ptpc.getCharactersCovered() + 1); + rtpc.updateTextSize(rtpc.getCharactersCovered() + 1); + lastPTPC.updateTextSize(lastPTPC.getCharactersCovered() + 1); + lastRTPC.updateTextSize(lastRTPC.getCharactersCovered() + 1); + + /** + * If TextSpecInfoAtom is present, we must update the text size in it, + * otherwise the ppt will be corrupted + */ + for (Record r : paragraphs.get(0).getRecords()) { + if (r instanceof TextSpecInfoAtom) { + ((TextSpecInfoAtom) r).setParentSize(rawText.length() + 1); + break; + } + } + + if (_txtbox instanceof EscherTextboxWrapper) { + try { + ((EscherTextboxWrapper) _txtbox).writeOut(null); + } catch (IOException e) { + throw new RuntimeException("failed dummy write", e); + } + } + } + + /** + * Adds the supplied text onto the end of the TextParagraphs, + * creating a new RichTextRun for it to sit in. + * + * @param text the text string used by this object. + */ + protected static HSLFTextRun appendText(List paragraphs, String text, boolean newParagraph) { + text = toInternalString(text); + + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); + + HSLFTextParagraph htp = paragraphs.get(paragraphs.size() - 1); + HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size() - 1); + + boolean isFirst = !newParagraph; + for (String rawText : text.split("(?<=\r)")) { + if (!isFirst) { + TextPropCollection tpc = htp.getParagraphStyle(); + HSLFTextParagraph prevHtp = htp; + htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom); + htp.getParagraphStyle().copy(tpc); + htp.setParentShape(prevHtp.getParentShape()); + htp.setShapeId(prevHtp.getShapeId()); + htp.supplySheet(prevHtp.getSheet()); + paragraphs.add(htp); + } + isFirst = false; + + TextPropCollection tpc = htr.getCharacterStyle(); + // special case, last text run is empty, we will reuse it + if (htr.getLength() > 0) { + htr = new HSLFTextRun(htp); + htr.getCharacterStyle().copy(tpc); + htp.addTextRun(htr); } + htr.setText(rawText); } - return prop == null ? false : prop.getSubValue(index); - } - - protected void setFlag(int index, boolean value) { - // Ensure we have the StyleTextProp atom we're going to need - assert(_paragraphStyle!=null); - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(_paragraphStyle, ParagraphFlagsTextProp.NAME); - prop.setSubValue(value,index); - } - - /** - * Check and add linebreaks to text runs leading other paragraphs - * - * @param paragraphs - */ - protected static void fixLineEndings(List paragraphs) { - HSLFTextRun lastRun = null; - for (HSLFTextParagraph p : paragraphs) { - if (lastRun != null && !lastRun.getRawText().endsWith("\r")) { - lastRun.setText(lastRun.getRawText()+"\r"); - } - List ltr = p.getTextRuns(); - if (ltr.isEmpty()) { - throw new RuntimeException("paragraph without textruns found"); - } - lastRun = ltr.get(ltr.size()-1); - assert(lastRun.getRawText() != null); - } - } - - /** - * Search for a StyleTextPropAtom is for this text header (list of paragraphs) - * - * @param header the header - * @param textLen the length of the rawtext, or -1 if the length is not known - */ - private static StyleTextPropAtom findStyleAtomPresent(TextHeaderAtom header, int textLen) { - boolean afterHeader = false; - StyleTextPropAtom style = null; - for (Record record : header.getParentRecord().getChildRecords()) { - long rt = record.getRecordType(); - if (afterHeader && rt == RecordTypes.TextHeaderAtom.typeID) { - // already on the next header, quit searching - break; - } - afterHeader |= (header == record); - if (afterHeader && rt == RecordTypes.StyleTextPropAtom.typeID) { - // found it - style = (StyleTextPropAtom)record; - } - } - - if (style == null) { - logger.log(POILogger.INFO, "styles atom doesn't exist. Creating dummy record for later saving."); - style = new StyleTextPropAtom((textLen < 0) ? 1 : textLen); - } else { - if (textLen >= 0) { - style.setParentTextSize(textLen); - } - } - - return style; - } - - - /** - * Saves the modified paragraphs/textrun to the records. - * Also updates the styles to the correct text length. - */ - protected static void storeText(List paragraphs) { - fixLineEndings(paragraphs); - - String rawText = toInternalString(getRawText(paragraphs)); - - // Will it fit in a 8 bit atom? - boolean isUnicode = StringUtil.hasMultibyte(rawText); - // isUnicode = true; - - TextHeaderAtom headerAtom = paragraphs.get(0)._headerAtom; - TextBytesAtom byteAtom = paragraphs.get(0)._byteAtom; - TextCharsAtom charAtom = paragraphs.get(0)._charAtom; - StyleTextPropAtom styleAtom = findStyleAtomPresent(headerAtom, rawText.length()); - - // Store in the appropriate record - Record oldRecord = null, newRecord = null; - if (isUnicode) { - if (byteAtom != null || charAtom == null) { - oldRecord = byteAtom; - charAtom = new TextCharsAtom(); - } - newRecord = charAtom; - charAtom.setText(rawText); - } else { - if (charAtom != null || byteAtom == null) { - oldRecord = charAtom; - byteAtom = new TextBytesAtom(); - } - newRecord = byteAtom; - byte[] byteText = new byte[rawText.length()]; - StringUtil.putCompressedUnicode(rawText,byteText,0); - byteAtom.setText(byteText); - } - assert(newRecord != null); - - RecordContainer _txtbox = headerAtom.getParentRecord(); - Record[] cr = _txtbox.getChildRecords(); - int headerIdx = -1, textIdx = -1, styleIdx = -1; - for (int i=0; i paragraphs, String text, boolean newParagraph) { - text = toInternalString(text); - - // check paragraphs - assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - - HSLFTextParagraph htp = paragraphs.get(paragraphs.size()-1); - HSLFTextRun htr = htp.getTextRuns().get(htp.getTextRuns().size()-1); - - boolean isFirst = !newParagraph; - for (String rawText : text.split("(?<=\r)")) { - if (!isFirst) { - TextPropCollection tpc = htp.getParagraphStyle(); - HSLFTextParagraph prevHtp = htp; - htp = new HSLFTextParagraph(htp._headerAtom, htp._byteAtom, htp._charAtom); - htp.getParagraphStyle().copy(tpc); - htp.setParentShape(prevHtp.getParentShape()); - htp.setShapeId(prevHtp.getShapeId()); - htp.supplySheet(prevHtp.getSheet()); - paragraphs.add(htp); - } - isFirst = false; - - TextPropCollection tpc = htr.getCharacterStyle(); - // special case, last text run is empty, we will reuse it - if (htr.getLength() > 0) { - htr = new HSLFTextRun(htp); - htr.getCharacterStyle().copy(tpc); - htp.addTextRun(htr); - } - htr.setText(rawText); - } - - storeText(paragraphs); - - return htr; - } - - /** - * Sets (overwrites) the current text. - * Uses the properties of the first paragraph / textrun - * - * @param text the text string used by this object. - */ - public static HSLFTextRun setText(List paragraphs, String text) { - // check paragraphs - assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); - - Iterator paraIter = paragraphs.iterator(); - HSLFTextParagraph htp = paraIter.next(); // keep first - assert(htp != null); - while (paraIter.hasNext()) { - paraIter.next(); - paraIter.remove(); - } - - Iterator runIter = htp.getTextRuns().iterator(); - HSLFTextRun htr = runIter.next(); - htr.setText(""); - assert(htr != null); - while (runIter.hasNext()) { - runIter.next(); - runIter.remove(); - } - - return appendText(paragraphs, text, false); - } - - public static String getText(List paragraphs) { - assert(!paragraphs.isEmpty()); - String rawText = getRawText(paragraphs); - return toExternalString(rawText, paragraphs.get(0).getRunType()); - } - - public static String getRawText(List paragraphs) { - StringBuilder sb = new StringBuilder(); - for (HSLFTextParagraph p : paragraphs) { - for (HSLFTextRun r : p.getTextRuns()) { - sb.append(r.getRawText()); - } - } - return sb.toString(); - } - - /** - * Returns a new string with line breaks converted into internal ppt - * representation - */ - protected static String toInternalString(String s) { - String ns = s.replaceAll("\\r?\\n", "\r"); - return ns; - } - - /** - * Converts raw text from the text paragraphs to a formatted string, - * i.e. it converts certain control characters used in the raw txt - * - * @param rawText the raw text - * @param runType the run type of the shape, paragraph or headerAtom. - * use -1 if unknown - * @return the formatted string - */ - public static String toExternalString(String rawText, int runType) { - // PowerPoint seems to store files with \r as the line break - // The messes things up on everything but a Mac, so translate - // them to \n - String text = rawText.replace('\r', '\n'); - - switch (runType) { - // 0xB acts like cariage return in page titles and like blank in the - // others - case -1: - case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: - case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: - text = text.replace((char) 0x0B, '\n'); - break; - default: - text = text.replace((char) 0x0B, ' '); - break; - } - - return text; - } - - /** - * For a given PPDrawing, grab all the TextRuns - */ + storeText(paragraphs); + + return htr; + } + + /** + * Sets (overwrites) the current text. + * Uses the properties of the first paragraph / textrun + * + * @param text the text string used by this object. + */ + public static HSLFTextRun setText(List paragraphs, String text) { + // check paragraphs + assert(!paragraphs.isEmpty() && !paragraphs.get(0).getTextRuns().isEmpty()); + + Iterator paraIter = paragraphs.iterator(); + HSLFTextParagraph htp = paraIter.next(); // keep first + assert (htp != null); + while (paraIter.hasNext()) { + paraIter.next(); + paraIter.remove(); + } + + Iterator runIter = htp.getTextRuns().iterator(); + HSLFTextRun htr = runIter.next(); + htr.setText(""); + assert (htr != null); + while (runIter.hasNext()) { + runIter.next(); + runIter.remove(); + } + + return appendText(paragraphs, text, false); + } + + public static String getText(List paragraphs) { + assert (!paragraphs.isEmpty()); + String rawText = getRawText(paragraphs); + return toExternalString(rawText, paragraphs.get(0).getRunType()); + } + + public static String getRawText(List paragraphs) { + StringBuilder sb = new StringBuilder(); + for (HSLFTextParagraph p : paragraphs) { + for (HSLFTextRun r : p.getTextRuns()) { + sb.append(r.getRawText()); + } + } + return sb.toString(); + } + + /** + * Returns a new string with line breaks converted into internal ppt + * representation + */ + protected static String toInternalString(String s) { + String ns = s.replaceAll("\\r?\\n", "\r"); + return ns; + } + + /** + * Converts raw text from the text paragraphs to a formatted string, + * i.e. it converts certain control characters used in the raw txt + * + * @param rawText the raw text + * @param runType the run type of the shape, paragraph or headerAtom. + * use -1 if unknown + * @return the formatted string + */ + public static String toExternalString(String rawText, int runType) { + // PowerPoint seems to store files with \r as the line break + // The messes things up on everything but a Mac, so translate + // them to \n + String text = rawText.replace('\r', '\n'); + + switch (runType) { + // 0xB acts like cariage return in page titles and like blank in the + // others + case -1: + case org.apache.poi.hslf.record.TextHeaderAtom.TITLE_TYPE: + case org.apache.poi.hslf.record.TextHeaderAtom.CENTER_TITLE_TYPE: + text = text.replace((char) 0x0B, '\n'); + break; + default: + text = text.replace((char) 0x0B, ' '); + break; + } + + return text; + } + + /** + * For a given PPDrawing, grab all the TextRuns + */ public static List> findTextParagraphs(PPDrawing ppdrawing, HSLFSheet sheet) { - List> runsV = new ArrayList>(); - for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { - runsV.add(findTextParagraphs(wrapper, sheet)); - } - return runsV; - } - - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param wrapper an EscherTextboxWrapper - */ - protected static List findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) { - // propagate parents to parent-aware records - RecordContainer.handleParentAwareRecords(wrapper); - int shapeId = wrapper.getShapeId(); - List rv = null; - - OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID); - if (ota != null) { - // if we are based on an outline, there are no further records to be parsed from the wrapper - if (sheet == null) { - throw new RuntimeException("Outline atom reference can't be solved without a sheet record"); - } - - List> sheetRuns = sheet.getTextParagraphs(); - assert(sheetRuns != null); - - int idx = ota.getTextIndex(); - for (List r : sheetRuns) { - if (r.isEmpty()) continue; - int ridx = r.get(0).getIndex(); - if (ridx > idx) break; - if (ridx == idx) { - if (rv == null) { - rv = r; - } else { - // create a new container - // TODO: ... is this case really happening? - rv = new ArrayList(rv); - rv.addAll(r); - } - } - } - if(rv == null || rv.isEmpty()) { - logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); - } - } else { - if (sheet != null) { - // check sheet runs first, so we get exactly the same paragraph list - List> sheetRuns = sheet.getTextParagraphs(); - assert(sheetRuns != null); - - for (List paras : sheetRuns) { + List> runsV = new ArrayList>(); + for (EscherTextboxWrapper wrapper : ppdrawing.getTextboxWrappers()) { + runsV.add(findTextParagraphs(wrapper, sheet)); + } + return runsV; + } + + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param wrapper an EscherTextboxWrapper + */ + protected static List findTextParagraphs(EscherTextboxWrapper wrapper, HSLFSheet sheet) { + // propagate parents to parent-aware records + RecordContainer.handleParentAwareRecords(wrapper); + int shapeId = wrapper.getShapeId(); + List rv = null; + + OutlineTextRefAtom ota = (OutlineTextRefAtom)wrapper.findFirstOfType(OutlineTextRefAtom.typeID); + if (ota != null) { + // if we are based on an outline, there are no further records to be parsed from the wrapper + if (sheet == null) { + throw new RuntimeException("Outline atom reference can't be solved without a sheet record"); + } + + List> sheetRuns = sheet.getTextParagraphs(); + assert (sheetRuns != null); + + int idx = ota.getTextIndex(); + for (List r : sheetRuns) { + if (r.isEmpty()) continue; + int ridx = r.get(0).getIndex(); + if (ridx > idx) break; + if (ridx == idx) { + if (rv == null) { + rv = r; + } else { + // create a new container + // TODO: ... is this case really happening? + rv = new ArrayList(rv); + rv.addAll(r); + } + } + } + if (rv == null || rv.isEmpty()) { + logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx); + } + } else { + if (sheet != null) { + // check sheet runs first, so we get exactly the same paragraph list + List> sheetRuns = sheet.getTextParagraphs(); + assert (sheetRuns != null); + + for (List paras : sheetRuns) { if (!paras.isEmpty() && paras.get(0)._headerAtom.getParentRecord() == wrapper) { - rv = paras; - break; - } - } - } - - if (rv == null) { - // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record - List> rvl = findTextParagraphs(wrapper.getChildRecords()); - switch (rvl.size()) { - case 0: break; // nothing found - case 1: rv = rvl.get(0); break; // normal case - default: - throw new RuntimeException("TextBox contains more than one list of paragraphs."); - } - } - } - - if (rv != null) { - StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom(); - - for (HSLFTextParagraph htp : rv) { - htp.setShapeId(shapeId); - htp.setStyleTextProp9Atom(styleTextProp9Atom); - } - } - return rv; - } - - /** - * Scans through the supplied record array, looking for - * a TextHeaderAtom followed by one of a TextBytesAtom or - * a TextCharsAtom. Builds up TextRuns from these - * - * @param records the records to build from - */ + rv = paras; + break; + } + } + } + + if (rv == null) { + // if we haven't found the wrapper in the sheet runs, create a new paragraph list from its record + List> rvl = findTextParagraphs(wrapper.getChildRecords()); + switch (rvl.size()) { + case 0: break; // nothing found + case 1: rv = rvl.get(0); break; // normal case + default: + throw new RuntimeException("TextBox contains more than one list of paragraphs."); + } + } + } + + if (rv != null) { + StyleTextProp9Atom styleTextProp9Atom = wrapper.getStyleTextProp9Atom(); + + for (HSLFTextParagraph htp : rv) { + htp.setShapeId(shapeId); + htp.setStyleTextProp9Atom(styleTextProp9Atom); + } + } + return rv; + } + + /** + * Scans through the supplied record array, looking for + * a TextHeaderAtom followed by one of a TextBytesAtom or + * a TextCharsAtom. Builds up TextRuns from these + * + * @param records the records to build from + */ protected static List> findTextParagraphs(Record[] records) { List> paragraphCollection = new ArrayList>(); - int[] recordIdx = {0}; - + int[] recordIdx = { 0 }; + for (int slwtIndex = 0; recordIdx[0] < records.length; slwtIndex++) { - TextHeaderAtom header = null; - TextBytesAtom tbytes = null; - TextCharsAtom tchars = null; - TextRulerAtom ruler = null; + TextHeaderAtom header = null; + TextBytesAtom tbytes = null; + TextCharsAtom tchars = null; + TextRulerAtom ruler = null; MasterTextPropAtom indents = null; for (Record r : getRecords(records, recordIdx, null)) { long rt = r.getRecordType(); if (RecordTypes.TextHeaderAtom.typeID == rt) { - header = (TextHeaderAtom)r; + header = (TextHeaderAtom) r; } else if (RecordTypes.TextBytesAtom.typeID == rt) { - tbytes = (TextBytesAtom)r; + tbytes = (TextBytesAtom) r; } else if (RecordTypes.TextCharsAtom.typeID == rt) { - tchars = (TextCharsAtom)r; + tchars = (TextCharsAtom) r; } else if (RecordTypes.TextRulerAtom.typeID == rt) { - ruler = (TextRulerAtom)r; + ruler = (TextRulerAtom) r; } else if (RecordTypes.MasterTextPropAtom.typeID == rt) { - indents = (MasterTextPropAtom)r; + indents = (MasterTextPropAtom) r; } // don't search for RecordTypes.StyleTextPropAtom.typeID here ... see findStyleAtomPresent below } if (header == null) break; - + if (header.getParentRecord() instanceof SlideListWithText) { // runs found in PPDrawing are not linked with SlideListWithTexts header.setIndex(slwtIndex); @@ -1093,7 +1071,7 @@ public final class HSLFTextParagraph implements TextParagraph { List paragraphs = new ArrayList(); paragraphCollection.add(paragraphs); - + // split, but keep delimiter for (String para : rawText.split("(?<=\r)")) { HSLFTextParagraph tpara = new HSLFTextParagraph(header, tbytes, tchars); @@ -1116,7 +1094,7 @@ public final class HSLFTextParagraph implements TextParagraph { if (paragraphCollection.isEmpty()) { logger.log(POILogger.DEBUG, "No text records found."); } - + return paragraphCollection; } @@ -1124,25 +1102,25 @@ public final class HSLFTextParagraph implements TextParagraph { int paraIdx = 0, runIdx = 0; HSLFTextRun trun; - for (int csIdx=0; csIdx runs = para.getTextRuns(); trun = runs.get(runIdx); int len = trun.getLength(); - if (ccRun+len <= ccStyle) { + if (ccRun + len <= ccStyle) { ccRun += len; } else { String text = trun.getRawText(); - trun.setText(text.substring(0,ccStyle-ccRun)); + trun.setText(text.substring(0, ccStyle - ccRun)); HSLFTextRun nextRun = new HSLFTextRun(para); - nextRun.setText(text.substring(ccStyle-ccRun)); - runs.add(runIdx+1, nextRun); + nextRun.setText(text.substring(ccStyle - ccRun)); + runs.add(runIdx + 1, nextRun); - ccRun += ccStyle-ccRun; + ccRun += ccStyle - ccRun; } TextPropCollection pCopy = new TextPropCollection(0, TextPropType.character); @@ -1151,7 +1129,7 @@ public final class HSLFTextParagraph implements TextParagraph { len = trun.getLength(); if (paraIdx == paragraphs.size()-1 && runIdx == runs.size()-1) { - if (csIdx < charStyles.size()-1) { + if (csIdx < charStyles.size() - 1) { // special case, empty trailing text run HSLFTextRun nextRun = new HSLFTextRun(para); nextRun.setText(""); @@ -1204,7 +1182,7 @@ public final class HSLFTextParagraph implements TextParagraph { len += trun.getLength(); } para.setIndentLevel(p.getIndentLevel()); - ccPara += len+1; + ccPara += len + 1; } } } @@ -1237,6 +1215,6 @@ public final class HSLFTextParagraph implements TextParagraph { } public EscherTextboxWrapper getTextboxWrapper() { - return (EscherTextboxWrapper)_headerAtom.getParentRecord(); + return (EscherTextboxWrapper) _headerAtom.getParentRecord(); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java index 1e1dca888f..bb4f140415 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFTextRun.java @@ -17,7 +17,8 @@ package org.apache.poi.hslf.usermodel; -import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.fetchOrAddTextProp; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.setPropVal; +import static org.apache.poi.hslf.usermodel.HSLFTextParagraph.getPropVal; import java.awt.Color; @@ -132,39 +133,17 @@ public final class HSLFTextRun implements TextRun { * it if required. */ private void setCharFlagsTextPropVal(int index, boolean value) { - if(getFlag(index) != value) setFlag(index, value); + // TODO: check if paragraph/chars can be handled the same ... + if (getFlag(index) != value) setFlag(index, value); } - /** - * Fetch the value of the given Character related TextProp. - * Returns -1 if that TextProp isn't present. - * If the TextProp isn't present, the value from the appropriate - * Master Sheet will apply. - */ - private int getCharTextPropVal(String propName) { - TextProp prop = null; - if (characterStyle != null){ - prop = characterStyle.findByName(propName); - } - - if (prop == null){ - HSLFSheet sheet = parentParagraph.getSheet(); - int txtype = parentParagraph.getRunType(); - HSLFMasterSheet master = sheet.getMasterSheet(); - if (master != null) - prop = master.getStyleAttribute(txtype, parentParagraph.getIndentLevel(), propName, true); - } - return prop == null ? -1 : prop.getValue(); - } - /** * Sets the value of the given Paragraph TextProp, add if required * @param propName The name of the Paragraph TextProp * @param val The value to set for the TextProp */ public void setCharTextPropVal(String propName, int val) { - TextProp tp = fetchOrAddTextProp(characterStyle, propName); - tp.setValue(val); + setPropVal(characterStyle, propName, val); } @@ -260,8 +239,8 @@ public final class HSLFTextRun implements TextRun { * @return the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript */ public int getSuperscript() { - int val = getCharTextPropVal("superscript"); - return val == -1 ? 0 : val; + TextProp tp = getPropVal(characterStyle, "superscript", parentParagraph); + return tp == null ? 0 : tp.getValue(); } /** @@ -270,14 +249,15 @@ public final class HSLFTextRun implements TextRun { * @param val the percentage of the font size. If the value is positive, it is superscript, otherwise it is subscript */ public void setSuperscript(int val) { - setCharTextPropVal("superscript", val); + setPropVal(characterStyle, "superscript", val); } /** * Gets the font size */ - public double getFontSize() { - return getCharTextPropVal("font.size"); + public Double getFontSize() { + TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph); + return tp == null ? null : (double)tp.getValue(); } @@ -292,7 +272,8 @@ public final class HSLFTextRun implements TextRun { * Gets the font index */ public int getFontIndex() { - return getCharTextPropVal("font.index"); + TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph); + return tp == null ? -1 : tp.getValue(); } /** @@ -329,9 +310,9 @@ public final class HSLFTextRun implements TextRun { if (sheet == null || slideShow == null) { return _fontFamily; } - int fontIdx = getCharTextPropVal("font.index"); - if(fontIdx == -1) { return null; } - return slideShow.getFontCollection().getFontWithId(fontIdx); + TextProp tp = getPropVal(characterStyle, "font.index", parentParagraph); + if (tp == null) { return null; } + return slideShow.getFontCollection().getFontWithId(tp.getValue()); } /** @@ -339,7 +320,9 @@ public final class HSLFTextRun implements TextRun { * @see java.awt.Color */ public Color getFontColor() { - int rgb = getCharTextPropVal("font.color"); + TextProp tp = getPropVal(characterStyle, "font.color", parentParagraph); + if (tp == null) return null; + int rgb = tp.getValue(); int cidx = rgb >> 24; if (rgb % 0x1000000 == 0){ @@ -370,7 +353,7 @@ public final class HSLFTextRun implements TextRun { } protected void setFlag(int index, boolean value) { - BitMaskTextProp prop = (BitMaskTextProp) fetchOrAddTextProp(characterStyle, CharFlagsTextProp.NAME); + BitMaskTextProp prop = (BitMaskTextProp)characterStyle.addWithName(CharFlagsTextProp.NAME); prop.setSubValue(value, index); } diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java index 3db3c6f6d0..d3c606a62d 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java @@ -55,12 +55,21 @@ public class DrawTextParagraph implements Drawable { double rightInset = insets.right; double penY = y; - double leftMargin = paragraph.getLeftMargin(); boolean firstLine = true; - double indent = paragraph.getIndent(); + Double leftMargin = paragraph.getLeftMargin(); + Double indent = paragraph.getIndent(); + if (leftMargin == null) { + leftMargin = (indent != null) ? -indent : 0; + } + if (indent == null) { + indent = (leftMargin != null) ? -leftMargin : 0; + } + //The vertical line spacing - double spacing = paragraph.getLineSpacing(); + Double spacing = paragraph.getLineSpacing(); + if (spacing == null) spacing = 100d; + for(DrawTextFragment line : lines){ double penX = x + leftMargin; @@ -77,7 +86,7 @@ public class DrawTextParagraph implements Drawable { bullet.setPosition(penX + indent, penY); } else if(indent > 0){ // a positive value means the "First Line" indentation: - // the first line is indented and other lines start at the bullet ofset + // the first line is indented and other lines start at the bullet offset bullet.setPosition(penX, penY); penX += indent; } else { @@ -96,7 +105,9 @@ public class DrawTextParagraph implements Drawable { Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); - switch (paragraph.getTextAlign()) { + TextAlign ta = paragraph.getTextAlign(); + if (ta == null) ta = TextAlign.LEFT; + switch (ta) { case CENTER: penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2; break; @@ -219,9 +230,10 @@ public class DrawTextParagraph implements Drawable { if (buColor == null) buColor = (Color)firstLineAttr.getAttribute(TextAttribute.FOREGROUND); float fontSize = (Float)firstLineAttr.getAttribute(TextAttribute.SIZE); - float buSz = (float)bulletStyle.getBulletFontSize(); - if(buSz > 0) fontSize *= buSz* 0.01; - else fontSize = -buSz; + Double buSz = bulletStyle.getBulletFontSize(); + if (buSz == null) buSz = 100d; + if (buSz > 0) fontSize *= buSz* 0.01; + else fontSize = (float)-buSz; AttributedString str = new AttributedString(buCharacter); @@ -237,10 +249,13 @@ public class DrawTextParagraph implements Drawable { protected String getRenderableText(TextRun tr) { StringBuilder buf = new StringBuilder(); TextCap cap = tr.getTextCap(); + String tabs = null; for (char c : tr.getRawText().toCharArray()) { if(c == '\t') { - // TODO: finish support for tabs - buf.append(" "); + if (tabs == null) { + tabs = tab2space(tr); + } + buf.append(tabs); continue; } @@ -255,6 +270,34 @@ public class DrawTextParagraph implements Drawable { return buf.toString(); } + + /** + * Replace a tab with the effective number of white spaces. + */ + private String tab2space(TextRun tr) { + AttributedString string = new AttributedString(" "); + String typeFace = tr.getFontFamily(); + if (typeFace == null) typeFace = "Lucida Sans"; + string.addAttribute(TextAttribute.FAMILY, typeFace); + + Double fs = tr.getFontSize(); + if (fs == null) fs = 12d; + string.addAttribute(TextAttribute.SIZE, fs.floatValue()); + + TextLayout l = new TextLayout(string.getIterator(), new FontRenderContext(null, true, true)); + double wspace = l.getAdvance(); + + Double tabSz = paragraph.getDefaultTabSize(); + if (tabSz == null) tabSz = wspace*4; + + int numSpaces = (int)Math.ceil(tabSz / wspace); + StringBuilder buf = new StringBuilder(); + for(int i = 0; i < numSpaces; i++) { + buf.append(' '); + } + return buf.toString(); + } + /** * Returns wrapping width to break lines in this paragraph @@ -271,8 +314,14 @@ public class DrawTextParagraph implements Drawable { Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape()); - double leftMargin = paragraph.getLeftMargin(); - double indent = paragraph.getIndent(); + Double leftMargin = paragraph.getLeftMargin(); + Double indent = paragraph.getIndent(); + if (leftMargin == null) { + leftMargin = (indent != null) ? -indent : 0; + } + if (indent == null) { + indent = (leftMargin != null) ? -leftMargin : 0; + } double width; TextShape> ts = paragraph.getParentShape(); @@ -323,7 +372,9 @@ public class DrawTextParagraph implements Drawable { text.append(runText); int endIndex = text.length(); - attList.add(new AttributedStringData(TextAttribute.FOREGROUND, run.getFontColor(), beginIndex, endIndex)); + Color fgColor = run.getFontColor(); + if (fgColor == null) fgColor = Color.BLACK; + attList.add(new AttributedStringData(TextAttribute.FOREGROUND, fgColor, beginIndex, endIndex)); // user can pass an custom object to convert fonts String fontFamily = run.getFontFamily(); @@ -335,10 +386,14 @@ public class DrawTextParagraph implements Drawable { if(fontHandler != null) { fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily()); } + if (fontFamily == null) { + fontFamily = paragraph.getDefaultFontFamily(); + } attList.add(new AttributedStringData(TextAttribute.FAMILY, fontFamily, beginIndex, endIndex)); - float fontSz = (float)run.getFontSize(); - attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, beginIndex, endIndex)); + Double fontSz = run.getFontSize(); + if (fontSz == null) fontSz = paragraph.getDefaultFontSize(); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), beginIndex, endIndex)); if(run.isBold()) { attList.add(new AttributedStringData(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, beginIndex, endIndex)); @@ -364,9 +419,9 @@ public class DrawTextParagraph implements Drawable { // ensure that the paragraph contains at least one character // We need this trick to correctly measure text if (text.length() == 0) { - float fontSz = (float)paragraph.getDefaultFontSize(); + Double fontSz = paragraph.getDefaultFontSize(); text.append(" "); - attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, 0, 1)); + attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz.floatValue(), 0, 1)); } AttributedString string = new AttributedString(text.toString()); diff --git a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java index 247c7c1845..bb6c6dd29f 100644 --- a/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java +++ b/src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java @@ -95,7 +95,8 @@ public class DrawTextShape 0) { // positive value means percentage spacing of the height of the first line, e.g. // the higher the first line, the bigger the space before the paragraph @@ -112,7 +113,8 @@ public class DrawTextShape 0) { // positive value means percentage spacing of the height of the last line, e.g. // the higher the last line, the bigger the space after the paragraph diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java index 14eb03c842..e85eee140b 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextParagraph.java @@ -104,10 +104,18 @@ public interface TextParagraph extends Iterable { public interface BulletStyle { String getBulletCharacter(); String getBulletFont(); - double getBulletFontSize(); + + /** + * The bullet point font size + * If bulletFontSize >= 0, then space is a percentage of normal line height. + * If bulletFontSize < 0, the absolute value in points + * + * @return the bullet point font size + */ + Double getBulletFontSize(); Color getBulletFontColor(); } - + /** * The amount of vertical white space before the paragraph * This may be specified in two different ways, percentage spacing and font point spacing: @@ -116,9 +124,30 @@ public interface TextParagraph extends Iterable { * If spaceBefore < 0, the absolute value in points *

* - * @return the vertical white space before the paragraph + * @return the vertical white space before the paragraph, or null if unset */ - double getSpaceBefore(); + Double getSpaceBefore(); + + /** + * Set the amount of vertical white space that will be present before the paragraph. + * This space is specified in either percentage or points: + *

+ * If spaceBefore >= 0, then space is a percentage of normal line height. + * If spaceBefore < 0, the absolute value of linespacing is the spacing in points + *

+ * Examples: + *

+     *      // The paragraph will be formatted to have a spacing before the paragraph text.
+     *      // The spacing will be 200% of the size of the largest text on each line
+     *      paragraph.setSpaceBefore(200);
+     *
+     *      // The spacing will be a size of 48 points
+     *      paragraph.setSpaceBefore(-48.0);
+     * 
+ * + * @param spaceBefore the vertical white space before the paragraph, null to unset + */ + void setSpaceBefore(Double spaceBefore); /** * The amount of vertical white space after the paragraph @@ -128,40 +157,74 @@ public interface TextParagraph extends Iterable { * If spaceBefore < 0, the absolute value of linespacing is the spacing in points *

* - * @return the vertical white space after the paragraph + * @return the vertical white space after the paragraph or null, if unset */ - double getSpaceAfter(); + Double getSpaceAfter(); /** - * @return the left margin (in points) of the paragraph + * Set the amount of vertical white space that will be present after the paragraph. + * This space is specified in either percentage or points: + *

+ * If spaceAfter >= 0, then space is a percentage of normal line height. + * If spaceAfter < 0, the absolute value of linespacing is the spacing in points + *

+ * Examples: + *

+     *      // The paragraph will be formatted to have a spacing after the paragraph text.
+     *      // The spacing will be 200% of the size of the largest text on each line
+     *      paragraph.setSpaceAfter(200);
+     *
+     *      // The spacing will be a size of 48 points
+     *      paragraph.setSpaceAfter(-48.0);
+     * 
+ * + * @param spaceAfter the vertical white space after the paragraph, null to unset */ - double getLeftMargin(); + public void setSpaceAfter(Double spaceAfter); + + /** + * @return the left margin (in points) of the paragraph or null, if unset + */ + Double getLeftMargin(); /** - * @param leftMargin the left margin (in points) + * Specifies the left margin of the paragraph. This is specified in addition to the text body + * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin + * attributes are additive with respect to the text position. + * + * @param leftMargin the left margin (in points) or null to unset */ - void setLeftMargin(double leftMargin); + void setLeftMargin(Double leftMargin); /** - * @return the right margin (in points) of the paragraph + * Specifies the right margin of the paragraph. This is specified in addition to the text body + * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin + * attributes are additive with respect to the text position. + * + * The right margin is not support and therefore ignored by the HSLF implementation. + * + * @return the right margin (in points) of the paragraph or null, if unset */ - double getRightMargin(); + Double getRightMargin(); /** * @param rightMargin the right margin (in points) of the paragraph */ - void setRightMargin(double rightMargin); + void setRightMargin(Double rightMargin); /** * @return the indent (in points) applied to the first line of text in the paragraph. + * or null, if unset */ - double getIndent(); + Double getIndent(); /** + * Specifies the indent size that will be applied to the first line of text in the paragraph. + * * @param indent the indent (in points) applied to the first line of text in the paragraph */ - void setIndent(double indent); + void setIndent(Double indent); /** * Returns the vertical line spacing that is to be used within a paragraph. @@ -171,9 +234,9 @@ public interface TextParagraph extends Iterable { * If linespacing < 0, the absolute value of linespacing is the spacing in points *

* - * @return the vertical line spacing. + * @return the vertical line spacing or null, if unset */ - double getLineSpacing(); + Double getLineSpacing(); /** * This element specifies the vertical line spacing that is to be used within a paragraph. @@ -196,14 +259,14 @@ public interface TextParagraph extends Iterable { * * @param linespacing the vertical line spacing */ - void setLineSpacing(double lineSpacing); + void setLineSpacing(Double lineSpacing); String getDefaultFontFamily(); /** - * @return the default font size, in case its not set in the textrun + * @return the default font size, in case its not set in the textrun or null, if unset */ - double getDefaultFontSize(); + Double getDefaultFontSize(); /** * Returns the alignment that is applied to the paragraph. @@ -217,8 +280,10 @@ public interface TextParagraph extends Iterable { /** * Returns the font alignment that is applied to the paragraph. * - * If this attribute is omitted, then a value of auto (~ left) is implied. - * @return ??? alignment that is applied to the paragraph + * If this attribute is omitted, then null is return, + * user code can imply the a value of {@link FontAlign#AUTO} + * + * @return alignment that is applied to the paragraph */ FontAlign getFontAlign(); @@ -227,5 +292,11 @@ public interface TextParagraph extends Iterable { */ BulletStyle getBulletStyle(); + /** + * @return the default size for a tab character within this paragraph in points, null if unset + */ + Double getDefaultTabSize(); + + TextShape> getParentShape(); } diff --git a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java index 8ac40c1892..bc1652afe5 100644 --- a/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/sl/usermodel/TextRun.java @@ -21,8 +21,6 @@ import java.awt.Color; /** * Some text. - * - * TODO - decide on how we do rich text stuff */ public interface TextRun { enum TextCap { @@ -31,13 +29,13 @@ public interface TextRun { ALL } - public String getRawText(); - public void setText(String text); + String getRawText(); + void setText(String text); TextCap getTextCap(); Color getFontColor(); - double getFontSize(); + Double getFontSize(); String getFontFamily(); boolean isBold(); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java index 8e5652fb81..4733999d49 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPicture.java @@ -22,8 +22,7 @@ import static org.junit.Assert.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.imageio.ImageIO; @@ -35,7 +34,6 @@ import org.apache.poi.sl.usermodel.Slide; import org.apache.poi.sl.usermodel.SlideShow; import org.apache.poi.util.JvmBugs; import org.apache.poi.xslf.usermodel.XMLSlideShow; -import org.junit.Ignore; import org.junit.Test; /** @@ -142,29 +140,43 @@ public final class TestPicture { @Test // @Ignore("Just for visual validation - antialiasing is different on various systems") public void bug54541() throws Exception { - String file = new String[]{ - "54542_cropped_bitmap.pptx", - "54541_cropped_bitmap.ppt", - "54541_cropped_bitmap2.ppt", - "sample_pptx_grouping_issues.pptx" - }[3]; - InputStream is = _slTests.openResourceAsStream(file); - SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is); - is.close(); + String files[] = { +// "sample_pptx_grouping_issues.pptx", +// "54542_cropped_bitmap.pptx", +// "54541_cropped_bitmap.ppt", +// "54541_cropped_bitmap2.ppt", +// "alterman_security.ppt", + "alterman_security2.pptx", + }; + + BitSet pages = new BitSet(); + pages.set(2); - boolean debugOut = false; - Dimension pg = ss.getPageSize(); - int i=1; - for(Slide slide : ss.getSlides()) { - if (debugOut) { - DummyGraphics2d graphics = new DummyGraphics2d(); - slide.draw(graphics); - } else { - BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = img.createGraphics(); - fixFonts(graphics); - slide.draw(graphics); - ImageIO.write(img, "PNG", new File("test"+(i++)+"hslf.png")); + for (String file : files) { + InputStream is = _slTests.openResourceAsStream(file); + SlideShow ss = file.endsWith("pptx") ? new XMLSlideShow(is) : new HSLFSlideShow(is); + is.close(); + + boolean debugOut = false; + Dimension pg = ss.getPageSize(); + for (Slide slide : ss.getSlides()) { + int slideNo = slide.getSlideNumber(); + if (!pages.get(slideNo-1)) { + if (pages.nextSetBit(slideNo-1) == -1) break; else continue; + } + if (debugOut) { + DummyGraphics2d graphics = new DummyGraphics2d(); + slide.draw(graphics); + } else { + BufferedImage img = new BufferedImage(pg.width, pg.height, BufferedImage.TYPE_INT_ARGB); + Graphics2D graphics = img.createGraphics(); + fixFonts(graphics); + slide.draw(graphics); + graphics.setColor(Color.BLACK); + graphics.setStroke(new BasicStroke(1)); + graphics.drawRect(0, 0, (int)pg.getWidth()-1, (int)pg.getHeight()-1); + ImageIO.write(img, "PNG", new File(file.replaceFirst(".pptx?", "-")+slideNo+".png")); + } } } } diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java index 0468955eeb..b57e9f503c 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java @@ -470,7 +470,7 @@ public final class TestRichTextRun { assertEquals(expected, HSLFTextParagraph.getRawText(txt.get(1))); assertEquals(4, txt.get(1).size()); rt = txt.get(1).get(0); - assertEquals('\u2022', rt.getBulletChar()); + assertEquals('\u2022', (char)rt.getBulletChar()); assertTrue(rt.isBullet()); @@ -486,7 +486,7 @@ public final class TestRichTextRun { assertEquals(4, txt.get(0).size()); rt = txt.get(0).get(0); assertTrue(rt.isBullet()); - assertEquals('\u2022', rt.getBulletChar()); + assertEquals('\u2022', (char)rt.getBulletChar()); expected = "I\u2019m a text box with user-defined\r" + @@ -495,7 +495,7 @@ public final class TestRichTextRun { assertEquals(2, txt.get(1).size()); rt = txt.get(1).get(0); assertTrue(rt.isBullet()); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); } @Test @@ -513,8 +513,8 @@ public final class TestRichTextRun { HSLFTextRun tr = rt.getTextRuns().get(0); tr.setFontSize(42); rt.setBullet(true); - rt.setLeftMargin(50); - rt.setIndent(0); + rt.setLeftMargin(50d); + rt.setIndent(0d); rt.setBulletChar('\u263A'); slide.addShape(shape); @@ -522,7 +522,7 @@ public final class TestRichTextRun { assertEquals(true, rt.isBullet()); assertEquals(50.0, rt.getLeftMargin(), 0); assertEquals(0, rt.getIndent(), 0); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); slide.addShape(shape); @@ -541,7 +541,7 @@ public final class TestRichTextRun { assertEquals(true, rt.isBullet()); assertEquals(50.0, rt.getLeftMargin(), 0); assertEquals(0, rt.getIndent(), 0); - assertEquals('\u263A', rt.getBulletChar()); + assertEquals('\u263A', (char)rt.getBulletChar()); } @Test diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java index 9dda9af244..c2f7ac9d08 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestTextRun.java @@ -556,7 +556,7 @@ public final class TestTextRun { int i=0; for (List textParas : slide.getTextParagraphs()) { assertEquals("Arial", textParas.get(0).getTextRuns().get(0).getFontFamily()); - assertEquals(sizes[i++], (int)textParas.get(0).getTextRuns().get(0).getFontSize()); + assertEquals(sizes[i++], textParas.get(0).getTextRuns().get(0).getFontSize().intValue()); } } diff --git a/test-data/slideshow/alterman_security2.pptx b/test-data/slideshow/alterman_security2.pptx new file mode 100644 index 0000000000000000000000000000000000000000..13292286460cab6462696da2849e58edd6997f67 GIT binary patch literal 425540 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 BkW;cJK^PSTR3? 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 z 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∋0m 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%0A{^Rkkn$@1a2T2_R;l3u2*pd=b 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

MT5^@p&3gJd) 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 z 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 literal 0 HcmV?d00001 -- 2.39.5