From 8be47cb969b6a5e2e040055283bd899a633205dc Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Mon, 7 Mar 2022 10:19:13 +0000 Subject: [PATCH] [bug-65934] add removeTextParagraph git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1898668 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XSLFTextShape.java | 32 ++++++++++++++++++- .../xslf/usermodel/TestXSLFTextParagraph.java | 31 +++++++++++++++--- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index 2a0e6aded7..691dd1aa8a 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -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 removeTextParagraph for that. + * + * @return the TextParagraphs for this text box + */ @Override public List 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); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 749a8faeca..cfde3fefa6 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -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"); -- 2.39.5