]> source.dussan.org Git - poi.git/commitdiff
[bug-65934] add removeTextParagraph
authorPJ Fanning <fanningpj@apache.org>
Mon, 7 Mar 2022 10:19:13 +0000 (10:19 +0000)
committerPJ Fanning <fanningpj@apache.org>
Mon, 7 Mar 2022 10:19:13 +0000 (10:19 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1898668 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java
poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java

index 2a0e6aded7a7b71f3891ec681de1870d0d77cd29..691dd1aa8a3e27f376bdac53ef59ddab2dbe456a 100644 (file)
@@ -22,6 +22,7 @@ package org.apache.poi.xslf.usermodel;
 import java.awt.Graphics2D;
 import java.awt.geom.Rectangle2D;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
@@ -203,9 +204,15 @@ public abstract class XSLFTextShape extends XSLFSimpleShape
         return run;
     }
 
+    /**
+     * Get the TextParagraphs for this text box. Removing an item from this list will not reliably remove
+     * the item from the underlying document. Use <code>removeTextParagraph</code> for that.
+     *
+     * @return the TextParagraphs for this text box
+     */
     @Override
     public List<XSLFTextParagraph> getTextParagraphs() {
-        return _paragraphs;
+        return Collections.unmodifiableList(_paragraphs);
     }
 
     /**
@@ -229,6 +236,29 @@ public abstract class XSLFTextShape extends XSLFSimpleShape
         return paragraph;
     }
 
+    /**
+     * @param paragraph paragraph to remove
+     * @return whether the paragraph was removed
+     * @since POI 5.2.2
+     */
+    public boolean removeTextParagraph(XSLFTextParagraph paragraph) {
+        CTTextParagraph ctTextParagraph = paragraph.getXmlObject();
+        CTTextBody txBody = getTextBody(false);
+        if (txBody != null) {
+            if (_paragraphs.remove(paragraph)) {
+                for (int i = 0; i < txBody.sizeOfPArray(); i++) {
+                    if (txBody.getPArray(i).equals(ctTextParagraph)) {
+                        txBody.removeP(i);
+                        return true;
+                    }
+                }
+            }
+            return false;
+        } else {
+            return false;
+        }
+    }
+
     @Override
     public void setVerticalAlignment(VerticalAlignment anchor) {
         CTTextBodyProperties bodyPr = getTextBodyPr(true);
index 749a8faeca9978ef7a5384d7a65b0eb6d95396e3..cfde3fefa6a468380bc425839e37a33009925a2a 100644 (file)
@@ -146,12 +146,33 @@ class TestXSLFTextParagraph {
         assertEquals(expectedWidth, dtp.getWrappingWidth(false, null), 0);
 
         ppt.close();
-     }
+    }
+
+    @Test
+    void testRemoveTextParagraph() throws IOException {
+        try (XMLSlideShow ppt = new XMLSlideShow()) {
+            XSLFSlide slide = ppt.createSlide();
+            XSLFTextShape sh = slide.createAutoShape();
+            sh.setLineColor(Color.black);
+
+            XSLFTextParagraph p = sh.addNewTextParagraph();
+            p.addNewTextRun().setText(
+                    "Paragraph formatting allows for more granular control " +
+                            "of text within a shape. Properties here apply to all text " +
+                            "residing within the corresponding paragraph.");
+
+            assertTrue(sh.removeTextParagraph(p));
+
+            assertTrue(sh.getTextParagraphs().isEmpty());
+
+            assertEquals(0, sh.getTextBody(true).sizeOfPArray());
+        }
+    }
 
-    /**
-     * test breaking test into lines.
-     * This test requires that the Arial font is available and will run only on windows
-     */
+        /**
+         * test breaking test into lines.
+         * This test requires that the Arial font is available and will run only on windows
+         */
     @Test
     void testBreakLines() throws IOException {
         String os = System.getProperty("os.name");