From 891827cc04243f0aefdea9596fa61dea1bb30f63 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 5 Jun 2016 01:04:58 +0000 Subject: [PATCH] Regression fix for XSLF - master style was always overridden, because of r1745100 - AIOOB in TextDirection mapping git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1746858 13f79535-47bb-0310-9956-ffa450edef68 --- .../xslf/model/CharacterPropertyFetcher.java | 6 +- .../poi/xslf/usermodel/XSLFLineBreak.java | 5 +- .../poi/xslf/usermodel/XSLFTextParagraph.java | 12 +- .../poi/xslf/usermodel/XSLFTextRun.java | 108 ++++++++++-------- .../poi/xslf/usermodel/XSLFTextShape.java | 49 +++++--- .../poi/xslf/usermodel/TestXSLFTable.java | 19 ++- .../poi/xslf/usermodel/TestXSLFTextRun.java | 4 +- test-data/slideshow/table_test2.pptx | Bin 0 -> 33414 bytes 8 files changed, 125 insertions(+), 78 deletions(-) create mode 100644 test-data/slideshow/table_test2.pptx diff --git a/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java b/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java index c20f94259b..3358a72774 100644 --- a/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java +++ b/src/ooxml/java/org/apache/poi/xslf/model/CharacterPropertyFetcher.java @@ -22,17 +22,13 @@ package org.apache.poi.xslf.model; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; -/** - * - * @author Yegor Kozlov - */ public abstract class CharacterPropertyFetcher extends ParagraphPropertyFetcher { public CharacterPropertyFetcher(int level) { super(level); } public boolean fetch(CTTextParagraphProperties props) { - if (props.isSetDefRPr()) { + if (props != null && props.isSetDefRPr()) { return fetch(props.getDefRPr()); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java index 3f5d50ab83..bdbc461f4b 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java @@ -22,9 +22,6 @@ package org.apache.poi.xslf.usermodel; import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; -/** - * @author Yegor Kozlov - */ class XSLFLineBreak extends XSLFTextRun { private final CTTextCharacterProperties _brProps; @@ -34,7 +31,7 @@ class XSLFLineBreak extends XSLFTextRun { } @Override - protected CTTextCharacterProperties getRPr(){ + protected CTTextCharacterProperties getRPr(boolean create){ return _brProps; } 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 b2a8b3314b..e276a8a52c 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -151,7 +151,7 @@ public class XSLFTextParagraph implements TextParagraph 0){ // by default line break has the font size of the last text run - CTTextCharacterProperties prevRun = _runs.get(_runs.size() - 1).getRPr(); + CTTextCharacterProperties prevRun = _runs.get(_runs.size() - 1).getRPr(true); brProps.set(prevRun); } CTRegularTextRun r = CTRegularTextRun.Factory.newInstance(); @@ -1043,7 +1043,15 @@ public class XSLFTextParagraph implements TextParagraph0; i--) { thisP.removeR(i-1); } 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 c374c4016b..3c4f5936e3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -96,7 +96,7 @@ public class XSLFTextRun implements TextRun { SolidPaint sp = (SolidPaint)color; Color c = DrawPaint.applyColorTransform(sp.getSolidColor()); - CTTextCharacterProperties rPr = getRPr(); + CTTextCharacterProperties rPr = getRPr(true); CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill(); XSLFColor col = new XSLFColor(fill, getParentParagraph().getParentShape().getSheet().getTheme(), fill.getSchemeClr()); @@ -107,17 +107,19 @@ public class XSLFTextRun implements TextRun { public PaintStyle getFontColor(){ CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - XSLFShape shape = _p.getParentShape(); - CTShapeStyle style = shape.getSpStyle(); - CTSchemeColor phClr = null; - if (style != null && style.getFontRef() != null) { - phClr = style.getFontRef().getSchemeClr(); - } - - PaintStyle ps = shape.getPaint(props, phClr); - if (ps != null) { - setValue(ps); - return true; + if (props != null) { + XSLFShape shape = _p.getParentShape(); + CTShapeStyle style = shape.getSpStyle(); + CTSchemeColor phClr = null; + if (style != null && style.getFontRef() != null) { + phClr = style.getFontRef().getSchemeClr(); + } + + PaintStyle ps = shape.getPaint(props, phClr); + if (ps != null) { + setValue(ps); + return true; + } } return false; @@ -129,7 +131,7 @@ public class XSLFTextRun implements TextRun { @Override public void setFontSize(Double fontSize){ - CTTextCharacterProperties rPr = getRPr(); + CTTextCharacterProperties rPr = getRPr(true); if(fontSize == null) { if (rPr.isSetSz()) rPr.unsetSz(); } else { @@ -149,7 +151,7 @@ public class XSLFTextRun implements TextRun { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetSz()){ + if (props != null && props.isSetSz()) { setValue(props.getSz()*0.01); return true; } @@ -169,7 +171,7 @@ public class XSLFTextRun implements TextRun { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetSpc()){ + if (props != null && props.isSetSpc()) { setValue(props.getSpc()*0.01); return true; } @@ -190,7 +192,7 @@ public class XSLFTextRun implements TextRun { * @param spc character spacing in points. */ public void setCharacterSpacing(double spc){ - CTTextCharacterProperties rPr = getRPr(); + CTTextCharacterProperties rPr = getRPr(true); if(spc == 0.0) { if(rPr.isSetSpc()) rPr.unsetSpc(); } else { @@ -204,7 +206,7 @@ public class XSLFTextRun implements TextRun { } public void setFontFamily(String typeface, byte charset, byte pictAndFamily, boolean isSymbol){ - CTTextCharacterProperties rPr = getRPr(); + CTTextCharacterProperties rPr = getRPr(true); if(typeface == null){ if(rPr.isSetLatin()) rPr.unsetLatin(); @@ -229,16 +231,18 @@ public class XSLFTextRun implements TextRun { CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - CTTextFont font = props.getLatin(); - if(font != null){ - String typeface = font.getTypeface(); - if("+mj-lt".equals(typeface)) { - typeface = theme.getMajorFont(); - } else if ("+mn-lt".equals(typeface)){ - typeface = theme.getMinorFont(); + if (props != null) { + CTTextFont font = props.getLatin(); + if (font != null) { + String typeface = font.getTypeface(); + if("+mj-lt".equals(typeface)) { + typeface = theme.getMajorFont(); + } else if ("+mn-lt".equals(typeface)){ + typeface = theme.getMinorFont(); + } + setValue(typeface); + return true; } - setValue(typeface); - return true; } return false; } @@ -253,10 +257,12 @@ public class XSLFTextRun implements TextRun { CharacterPropertyFetcher visitor = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - CTTextFont font = props.getLatin(); - if(font != null){ - setValue(font.getPitchFamily()); - return true; + if (props != null) { + CTTextFont font = props.getLatin(); + if (font != null) { + setValue(font.getPitchFamily()); + return true; + } } return false; } @@ -268,14 +274,14 @@ public class XSLFTextRun implements TextRun { @Override public void setStrikethrough(boolean strike) { - getRPr().setStrike(strike ? STTextStrikeType.SNG_STRIKE : STTextStrikeType.NO_STRIKE); + getRPr(true).setStrike(strike ? STTextStrikeType.SNG_STRIKE : STTextStrikeType.NO_STRIKE); } @Override public boolean isStrikethrough() { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetStrike()){ + if(props != null && props.isSetStrike()) { setValue(props.getStrike() != STTextStrikeType.NO_STRIKE); return true; } @@ -290,7 +296,7 @@ public class XSLFTextRun implements TextRun { public boolean isSuperscript() { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetBaseline()){ + if (props != null && props.isSetBaseline()) { setValue(props.getBaseline() > 0); return true; } @@ -311,7 +317,7 @@ public class XSLFTextRun implements TextRun { * @param baselineOffset */ public void setBaselineOffset(double baselineOffset){ - getRPr().setBaseline((int) baselineOffset * 1000); + getRPr(true).setBaseline((int) baselineOffset * 1000); } /** @@ -338,7 +344,7 @@ public class XSLFTextRun implements TextRun { public boolean isSubscript() { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetBaseline()){ + if (props != null && props.isSetBaseline()) { setValue(props.getBaseline() < 0); return true; } @@ -355,7 +361,7 @@ public class XSLFTextRun implements TextRun { public TextCap getTextCap() { CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetCap()){ + if (props != null && props.isSetCap()) { int idx = props.getCap().intValue() - 1; setValue(TextCap.values()[idx]); return true; @@ -369,14 +375,14 @@ public class XSLFTextRun implements TextRun { @Override public void setBold(boolean bold){ - getRPr().setB(bold); + getRPr(true).setB(bold); } @Override public boolean isBold(){ CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetB()){ + if (props != null && props.isSetB()) { setValue(props.getB()); return true; } @@ -389,14 +395,14 @@ public class XSLFTextRun implements TextRun { @Override public void setItalic(boolean italic){ - getRPr().setI(italic); + getRPr(true).setI(italic); } @Override public boolean isItalic(){ CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetI()){ + if (props != null && props.isSetI()) { setValue(props.getI()); return true; } @@ -409,14 +415,14 @@ public class XSLFTextRun implements TextRun { @Override public void setUnderlined(boolean underline) { - getRPr().setU(underline ? STTextUnderlineType.SNG : STTextUnderlineType.NONE); + getRPr(true).setU(underline ? STTextUnderlineType.SNG : STTextUnderlineType.NONE); } @Override public boolean isUnderlined(){ CharacterPropertyFetcher fetcher = new CharacterPropertyFetcher(_p.getIndentLevel()){ public boolean fetch(CTTextCharacterProperties props){ - if(props.isSetU()){ + if (props != null && props.isSetU()) { setValue(props.getU() != STTextUnderlineType.NONE); return true; } @@ -427,8 +433,20 @@ public class XSLFTextRun implements TextRun { return fetcher.getValue() == null ? false : fetcher.getValue(); } - protected CTTextCharacterProperties getRPr(){ - return _r.isSetRPr() ? _r.getRPr() : _r.addNewRPr(); + /** + * Return the character properties + * + * @param create if true, create an empty character properties object if it doesn't exist + * @return the character properties or null if create was false and the properties haven't exist + */ + protected CTTextCharacterProperties getRPr(boolean create) { + if (_r.isSetRPr()) { + return _r.getRPr(); + } else if (create) { + return _r.addNewRPr(); + } else { + return null; + } } @Override @@ -463,7 +481,7 @@ public class XSLFTextRun implements TextRun { XSLFSheet sheet = shape.getSheet(); boolean ok = false; - if (_r.isSetRPr()) ok = fetcher.fetch(getRPr()); + if (_r.isSetRPr()) ok = fetcher.fetch(getRPr(false)); if (ok) return true; ok = shape.fetchShapeProperty(fetcher); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index a4400d21ba..91b0869b89 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -112,8 +112,8 @@ public abstract class XSLFTextShape extends XSLFSimpleShape if (text == null) return null; // copy properties from last paragraph / textrun or paragraph end marker - CTTextParagraphProperties pPr = null; - CTTextCharacterProperties rPr = null; + CTTextParagraphProperties otherPPr = null; + CTTextCharacterProperties otherRPr = null; boolean firstPara; XSLFTextParagraph para; @@ -124,25 +124,33 @@ public abstract class XSLFTextShape extends XSLFSimpleShape firstPara = !newParagraph; para = _paragraphs.get(_paragraphs.size()-1); CTTextParagraph ctp = para.getXmlObject(); - pPr = ctp.getPPr(); + otherPPr = ctp.getPPr(); List runs = para.getTextRuns(); if (!runs.isEmpty()) { XSLFTextRun r0 = runs.get(runs.size()-1); - rPr = r0.getXmlObject().getRPr(); - } else if (ctp.isSetEndParaRPr()) { - rPr = ctp.getEndParaRPr(); + otherRPr = r0.getRPr(false); + if (otherRPr == null) { + otherRPr = ctp.getEndParaRPr(); + } } + // don't copy endParaRPr to the run in case there aren't any other runs + // this is the case when setText() was called initially + // otherwise the master style will be overridden/ignored } XSLFTextRun run = null; for (String lineTxt : text.split("\\r\\n?|\\n")) { if (!firstPara) { - if (para != null && para.getXmlObject().isSetEndParaRPr()) { - para.getXmlObject().unsetEndParaRPr(); + if (para != null) { + CTTextParagraph ctp = para.getXmlObject(); + CTTextCharacterProperties unexpectedRPr = ctp.getEndParaRPr(); + if (unexpectedRPr != null && unexpectedRPr != otherRPr) { + ctp.unsetEndParaRPr(); + } } para = addNewTextParagraph(); - if (pPr != null) { - para.getXmlObject().setPPr(pPr); + if (otherPPr != null) { + para.getXmlObject().setPPr(otherPPr); } } boolean firstRun = true; @@ -152,8 +160,8 @@ public abstract class XSLFTextShape extends XSLFSimpleShape } run = para.addNewTextRun(); run.setText(runText); - if (rPr != null) { - run.getXmlObject().setRPr(rPr); + if (otherRPr != null) { + run.getRPr(true).set(otherRPr); } firstRun = false; } @@ -261,8 +269,21 @@ public abstract class XSLFTextShape extends XSLFSimpleShape CTTextBodyProperties bodyPr = getTextBodyPr(); if (bodyPr != null) { STTextVerticalType.Enum val = bodyPr.getVert(); - if(val != null){ - return TextDirection.values()[val.intValue() - 1]; + if(val != null) { + switch (val.intValue()) { + default: + case STTextVerticalType.INT_HORZ: + return TextDirection.HORIZONTAL; + case STTextVerticalType.INT_EA_VERT: + case STTextVerticalType.INT_MONGOLIAN_VERT: + case STTextVerticalType.INT_VERT: + return TextDirection.VERTICAL; + case STTextVerticalType.INT_VERT_270: + return TextDirection.VERTICAL_270; + case STTextVerticalType.INT_WORD_ART_VERT_RTL: + case STTextVerticalType.INT_WORD_ART_VERT: + return TextDirection.STACKED; + } } } return TextDirection.HORIZONTAL; diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java index a58fb603a4..9b6dd3d597 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTable.java @@ -34,9 +34,6 @@ import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell; import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame; -/** - * @author Yegor Kozlov - */ public class TestXSLFTable { @Test public void testRead() throws IOException { @@ -82,8 +79,8 @@ public class TestXSLFTable { @Test public void testCreate() throws IOException { - XMLSlideShow ppt = new XMLSlideShow(); - XSLFSlide slide = ppt.createSlide(); + XMLSlideShow ppt1 = new XMLSlideShow(); + XSLFSlide slide = ppt1.createSlide(); XSLFTable tbl = slide.createTable(); assertNotNull(tbl.getCTTable()); @@ -145,7 +142,17 @@ public class TestXSLFTable { cell1.setVerticalAlignment(null); assertEquals(VerticalAlignment.TOP, cell1.getVerticalAlignment()); - ppt.close(); + XMLSlideShow ppt2 = XSLFTestDataSamples.writeOutAndReadBack(ppt1); + ppt1.close(); + + slide = ppt2.getSlides().get(0); + tbl = (XSLFTable)slide.getShapes().get(0); + assertEquals(2, tbl.getNumberOfColumns()); + assertEquals(1, tbl.getNumberOfRows()); + assertEquals("POI", tbl.getCell(0, 0).getText()); + assertEquals("Apache", tbl.getCell(0, 1).getText()); + + ppt2.close(); } @Test diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextRun.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextRun.java index a3d2c50e88..5b2fa7b2ac 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextRun.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextRun.java @@ -40,7 +40,7 @@ public class TestXSLFTextRun { XSLFTextShape sh = slide.createAutoShape(); XSLFTextRun r = sh.addNewTextParagraph().addNewTextRun(); - assertEquals("en-US", r.getRPr().getLang()); + assertEquals("en-US", r.getRPr(true).getLang()); assertEquals(0., r.getCharacterSpacing(), 0); r.setCharacterSpacing(3); @@ -49,7 +49,7 @@ public class TestXSLFTextRun { assertEquals(-3., r.getCharacterSpacing(), 0); r.setCharacterSpacing(0); assertEquals(0., r.getCharacterSpacing(), 0); - assertFalse(r.getRPr().isSetSpc()); + assertFalse(r.getRPr(true).isSetSpc()); assertTrue(sameColor(Color.black, r.getFontColor())); r.setFontColor(Color.red); diff --git a/test-data/slideshow/table_test2.pptx b/test-data/slideshow/table_test2.pptx new file mode 100644 index 0000000000000000000000000000000000000000..625071782280717c71fa66c5d88e32c67e2c151e GIT binary patch literal 33414 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