]> source.dussan.org Git - poi.git/commitdiff
improved support for line breaks in XSLF
authorYegor Kozlov <yegor@apache.org>
Fri, 3 Feb 2012 08:24:38 +0000 (08:24 +0000)
committerYegor Kozlov <yegor@apache.org>
Fri, 3 Feb 2012 08:24:38 +0000 (08:24 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1240026 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xslf/usermodel/TextFragment.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java
src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java
src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextRun.java

index 6bcb716ee5d81de1cc6671ad2e0930a9fcade05c..6bdf45ae109acead370b46024bd69aabadb9f3cd 100644 (file)
@@ -55,7 +55,8 @@ class TextFragment {
      * @return full height of this text run which is sum of ascent, descent and leading\r
      */\r
     public float getHeight(){\r
-        return _layout.getAscent() + _layout.getDescent() + _layout.getLeading();\r
+        double h = Math.ceil(_layout.getAscent()) + Math.ceil(_layout.getDescent()) + _layout.getLeading();\r
+        return (float)h;\r
     }\r
 \r
     /**\r
diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFLineBreak.java
new file mode 100644 (file)
index 0000000..3f5d50a
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ *  ====================================================================\r
+ *    Licensed to the Apache Software Foundation (ASF) under one or more\r
+ *    contributor license agreements.  See the NOTICE file distributed with\r
+ *    this work for additional information regarding copyright ownership.\r
+ *    The ASF licenses this file to You under the Apache License, Version 2.0\r
+ *    (the "License"); you may not use this file except in compliance with\r
+ *    the License.  You may obtain a copy of the License at\r
+ *\r
+ *        http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ *    Unless required by applicable law or agreed to in writing, software\r
+ *    distributed under the License is distributed on an "AS IS" BASIS,\r
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ *    See the License for the specific language governing permissions and\r
+ *    limitations under the License.\r
+ * ====================================================================\r
+ */\r
+\r
+package org.apache.poi.xslf.usermodel;\r
+\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;\r
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;\r
+\r
+/**\r
+ * @author Yegor Kozlov\r
+ */\r
+class XSLFLineBreak extends XSLFTextRun {\r
+    private final CTTextCharacterProperties _brProps;\r
+\r
+    XSLFLineBreak(CTRegularTextRun r, XSLFTextParagraph p, CTTextCharacterProperties brProps){\r
+        super(r, p);\r
+        _brProps = brProps;\r
+    }\r
+\r
+    @Override\r
+    protected CTTextCharacterProperties getRPr(){\r
+        return _brProps;\r
+    }\r
+\r
+    public void setText(String text){\r
+        throw new IllegalStateException("You cannot change text of a line break, it is always '\\n'");\r
+    }\r
+\r
+}\r
index b2d5953743a0ca4ce8f98bdc4641fa61cbef0382..73c2e52d99ab609bd1955832ed0e321473e5f1ec 100644 (file)
@@ -115,6 +115,11 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
         return _runs.iterator();\r
     }\r
 \r
+    /**\r
+     * Add a new run of text\r
+     *\r
+     * @return a new run of text\r
+     */\r
     public XSLFTextRun addNewTextRun(){\r
         CTRegularTextRun r = _p.addNewR();\r
         CTTextCharacterProperties rPr = r.addNewRPr();\r
@@ -124,8 +129,25 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
         return run;\r
     }\r
 \r
-    public void addLineBreak(){\r
-        _p.addNewBr();\r
+    /**\r
+     * Insert a line break\r
+     *\r
+     * @return text run representing this line break ('\n')\r
+     */\r
+    public XSLFTextRun addLineBreak(){\r
+        CTTextLineBreak br = _p.addNewBr();\r
+        CTTextCharacterProperties brProps = br.addNewRPr();\r
+        if(_runs.size() > 0){\r
+            // by default line break has the font size of the last text run\r
+            CTTextCharacterProperties prevRun = _runs.get(_runs.size() - 1).getRPr();\r
+            brProps.set(prevRun);\r
+        }\r
+        CTRegularTextRun r = CTRegularTextRun.Factory.newInstance();\r
+        r.setRPr(brProps);\r
+        r.setT("\n");\r
+        XSLFTextRun run = new XSLFLineBreak(r, this, brProps);\r
+        _runs.add(run);\r
+        return run;\r
     }\r
 \r
     /**\r
index ff54d5ceba8f35b66345208aa47cfb05ab7952a7..d7a10c20c8d0dec67e1e839e657752129a29c130 100644 (file)
@@ -121,7 +121,7 @@ public class XSLFTextRun {
     }\r
 \r
     public void setFontColor(Color color){\r
-        CTTextCharacterProperties rPr = getRpR();\r
+        CTTextCharacterProperties rPr = getRPr();\r
         CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill();\r
         CTSRgbColor clr = fill.isSetSrgbClr() ? fill.getSrgbClr() : fill.addNewSrgbClr();\r
         clr.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});\r
@@ -163,7 +163,7 @@ public class XSLFTextRun {
      * The value of <code>-1</code> unsets the Sz attribyte from the underlying xml bean\r
      */\r
     public void setFontSize(double fontSize){\r
-        CTTextCharacterProperties rPr = getRpR();\r
+        CTTextCharacterProperties rPr = getRPr();\r
         if(fontSize == -1.0) {\r
             if(rPr.isSetSz()) rPr.unsetSz();\r
         } else {\r
@@ -226,7 +226,7 @@ public class XSLFTextRun {
      * @param spc  character spacing in points.\r
      */\r
     public void setCharacterSpacing(double spc){\r
-        CTTextCharacterProperties rPr = getRpR();\r
+        CTTextCharacterProperties rPr = getRPr();\r
         if(spc == 0.0) {\r
             if(rPr.isSetSpc()) rPr.unsetSpc();\r
         } else {\r
@@ -245,7 +245,7 @@ public class XSLFTextRun {
     }\r
 \r
     public void setFontFamily(String typeface, byte charset, byte pictAndFamily, boolean isSymbol){\r
-        CTTextCharacterProperties rPr = getRpR();\r
+        CTTextCharacterProperties rPr = getRPr();\r
 \r
         if(typeface == null){\r
             if(rPr.isSetLatin()) rPr.unsetLatin();\r
@@ -314,8 +314,8 @@ public class XSLFTextRun {
      *\r
      * @param strike whether a run of text will be formatted as strikethrough text.\r
      */\r
-    public void setStrikethrough(boolean strike){\r
-        getRpR().setStrike(strike ? STTextStrikeType.SNG_STRIKE : STTextStrikeType.NO_STRIKE);\r
+    public void setStrikethrough(boolean strike) {\r
+        getRPr().setStrike(strike ? STTextStrikeType.SNG_STRIKE : STTextStrikeType.NO_STRIKE);\r
     }\r
 \r
     /**\r
@@ -393,7 +393,7 @@ public class XSLFTextRun {
      * @param bold whether this run of text will be formatted as bold text\r
      */\r
     public void setBold(boolean bold){\r
-        getRpR().setB(bold);\r
+        getRPr().setB(bold);\r
     }\r
 \r
     /**\r
@@ -417,7 +417,7 @@ public class XSLFTextRun {
      * @param italic whether this run of text is formatted as italic text\r
      */\r
     public void setItalic(boolean italic){\r
-        getRpR().setI(italic);\r
+        getRPr().setI(italic);\r
     }\r
 \r
     /**\r
@@ -440,8 +440,8 @@ public class XSLFTextRun {
     /**\r
      * @param underline whether this run of text is formatted as underlined text\r
      */\r
-    public void setUnderline(boolean underline){\r
-        getRpR().setU(underline ? STTextUnderlineType.SNG : STTextUnderlineType.NONE);\r
+    public void setUnderline(boolean underline) {\r
+        getRPr().setU(underline ? STTextUnderlineType.SNG : STTextUnderlineType.NONE);\r
     }\r
 \r
     /**\r
@@ -461,7 +461,7 @@ public class XSLFTextRun {
         return fetcher.getValue() == null ? false : fetcher.getValue();\r
     }\r
 \r
-    protected CTTextCharacterProperties getRpR(){\r
+    protected CTTextCharacterProperties getRPr(){\r
         return _r.isSetRPr() ? _r.getRPr() : _r.addNewRPr();\r
     }\r
 \r
@@ -485,7 +485,7 @@ public class XSLFTextRun {
     private boolean fetchCharacterProperty(CharacterPropertyFetcher fetcher){\r
         boolean ok = false;\r
 \r
-        if(_r.isSetRPr()) ok = fetcher.fetch(_r.getRPr());\r
+        if(_r.isSetRPr()) ok = fetcher.fetch(getRPr());\r
 \r
         if(!ok) {\r
             XSLFTextShape shape = _p.getParentShape();\r
index e2183a72465d8a44a932c1b933345b18afeb3359..cb7ad736f1bc74bc9e1d7dabdbe4a7ed8abe6b39 100644 (file)
@@ -189,7 +189,7 @@ public class TestXSLFPowerPointExtractor extends TestCase {
          "Theme Master first level\n" +
          "And the 2nd level\n" +
          "Our 3rd level goes here\n" +
-         "And onto the 4th, such fun.\n" +
+         "And onto the 4th, such fun....\n" +
          "Finally is the Fifth level\n";
       
       // Check the whole text
index 19eee771f4bffeeb6995ecb5f0f4b3bfc0f89adc..2a44c058bb5eff364122531d53a74cda93b62f2c 100644 (file)
@@ -290,4 +290,32 @@ public class TestXSLFTextParagraph extends TestCase {
         p.setBullet(false);\r
         assertFalse(p.isBullet());\r
     }\r
+\r
+    public void testLineBreak(){\r
+        XMLSlideShow ppt = new XMLSlideShow();\r
+        XSLFSlide slide = ppt.createSlide();\r
+        XSLFTextShape sh = slide.createAutoShape();\r
+\r
+        XSLFTextParagraph p = sh.addNewTextParagraph();\r
+        XSLFTextRun r1 = p.addNewTextRun();\r
+        r1.setText("Hello,");\r
+        XSLFTextRun r2 = p.addLineBreak();\r
+        assertEquals("\n", r2.getText());\r
+        r2.setFontSize(10.0);\r
+        assertEquals(10.0, r2.getFontSize());\r
+        XSLFTextRun r3 = p.addNewTextRun();\r
+        r3.setText("World!");\r
+        r3.setFontSize(20.0);\r
+        XSLFTextRun r4 = p.addLineBreak();\r
+        assertEquals(20.0, r4.getFontSize());\r
+\r
+        assertEquals("Hello,\nWorld!\n",sh.getText());\r
+\r
+        try {\r
+            r2.setText("aaa");\r
+            fail("Expected IllegalStateException");\r
+        } catch (IllegalStateException e){\r
+            assertEquals("You cannot change text of a line break, it is always '\\n'", e.getMessage());\r
+        }\r
+    }\r
 }\r
index 3ee2616b0b80066dc1cdf7aa7e5f6964d51e6640..256c9eaecb090e8c852eb1d665821906728f549a 100644 (file)
 package org.apache.poi.xslf.usermodel;\r
 \r
 import junit.framework.TestCase;\r
-import org.apache.poi.util.POILogFactory;\r
-import org.apache.poi.util.POILogger;\r
-import org.apache.poi.xslf.XSLFTestDataSamples;\r
 \r
 import java.awt.*;\r
-import java.awt.geom.Rectangle2D;\r
-import java.awt.image.BufferedImage;\r
-import java.util.List;\r
 \r
 /**\r
  * @author Yegor Kozlov\r
@@ -39,7 +33,7 @@ public class TestXSLFTextRun extends TestCase {
         XSLFTextShape sh = slide.createAutoShape();\r
 \r
         XSLFTextRun r = sh.addNewTextParagraph().addNewTextRun();\r
-        assertEquals("en-US", r.getRpR().getLang());\r
+        assertEquals("en-US", r.getRPr().getLang());\r
 \r
         assertEquals(0., r.getCharacterSpacing());\r
         r.setCharacterSpacing(3);\r
@@ -48,7 +42,7 @@ public class TestXSLFTextRun extends TestCase {
         assertEquals(-3., r.getCharacterSpacing());\r
         r.setCharacterSpacing(0);\r
         assertEquals(0., r.getCharacterSpacing());\r
-        assertFalse(r.getRpR().isSetSpc());\r
+        assertFalse(r.getRPr().isSetSpc());\r
 \r
         assertEquals(Color.black, r.getFontColor());\r
         r.setFontColor(Color.red);\r