From: Andreas Beeker Date: Sun, 5 Jun 2016 01:04:58 +0000 (+0000) Subject: Regression fix for XSLF X-Git-Tag: REL_3_15_BETA2~203 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=891827cc04243f0aefdea9596fa61dea1bb30f63;p=poi.git 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 --- 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 0000000000..6250717822 Binary files /dev/null and b/test-data/slideshow/table_test2.pptx differ