From d29d1d7d9b65c55b93fb0418efa21ad9202b606c Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 4 Jun 2010 17:19:31 +0000 Subject: [PATCH] Apply with tweaks the patch from bug #45269 - improve replaceText on HWPF ranges git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@951498 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/status.xml | 1 + .../org/apache/poi/hwpf/usermodel/Range.java | 5 ++- .../poi/hwpf/usermodel/TestProblems.java | 37 ++++++++++++++++++ .../hwpf/usermodel/TestRangeReplacement.java | 8 +++- test-data/document/Bug45269.doc | Bin 0 -> 64512 bytes 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 test-data/document/Bug45269.doc diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 20794454f..45793d796 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 45269 - improve replaceText on HWPF ranges 47815 - correct documentation on what happens when you request a String from a non-string Formula cell 49386 - avoid NPE when extracting OOXML file properties which are dates 49377 - only call DecimalFormat.setRoundingMode on Java 1.6 - it's needed to match excel's rendering of numbers diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java index ff6f2162e..1cac46d09 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/Range.java @@ -745,8 +745,9 @@ public class Range { // TODO -instantiable superclass subRange.insertBefore(pValue); - if (subRange.getEndOffset() != previousEndOffset) - _end += (subRange.getEndOffset() - previousEndOffset); + if (subRange.getEndOffset() != previousEndOffset) { + adjustForInsert(subRange.getEndOffset() - previousEndOffset); + } // re-create the sub-range so we can delete it subRange = new Range((absPlaceHolderIndex + pValue.length()), (absPlaceHolderIndex diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java index dbb02d4a0..94b66f894 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -161,4 +161,41 @@ public final class TestProblems extends HWPFTestCase { HWPFDocument doc2 = writeOutAndRead(doc); assertEquals("Nick Burch", doc2.getSummaryInformation().getAuthor()); } + + /** + * Test for reading paragraphs from Range after replacing some + * text in this Range. + * Bug #45269 + */ + public void testReadParagraphsAfterReplaceText()throws Exception{ + HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc"); + Range range = doc.getRange(); + + String toFind = "campo1"; + String longer = " foi porraaaaa "; + String shorter = " foi "; + + //check replace with longer text + for (int x = 0; x < range.numParagraphs(); x++) { + Paragraph para = range.getParagraph(x); + int offset = para.text().indexOf(toFind); + if (offset >= 0) { + para.replaceText(toFind, longer, offset); + assertEquals(offset, para.text().indexOf(longer)); + } + } + + doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc"); + range = doc.getRange(); + + //check replace with shorter text + for (int x = 0; x < range.numParagraphs(); x++) { + Paragraph para = range.getParagraph(x); + int offset = para.text().indexOf(toFind); + if (offset >= 0) { + para.replaceText(toFind, shorter, offset); + assertEquals(offset, para.text().indexOf(shorter)); + } + } + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeReplacement.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeReplacement.java index 8303224bd..9798a756d 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeReplacement.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestRangeReplacement.java @@ -85,12 +85,16 @@ public final class TestRangeReplacement extends TestCase { HWPFDocument daDoc = HWPFTestDataSamples.openSampleFile(illustrativeDocFile); + // Has one section Range range = daDoc.getRange(); assertEquals(1, range.numSections()); + // The first section has 5 paragraphs Section section = range.getSection(0); assertEquals(5, section.numParagraphs()); + + // Change some text Paragraph para = section.getParagraph(2); String text = para.text(); @@ -101,12 +105,14 @@ public final class TestRangeReplacement extends TestCase { para.replaceText(searchText, replacementText, offset); + // Ensure we still have one section, 5 paragraphs assertEquals(1, range.numSections()); section = range.getSection(0); - assertEquals(4, section.numParagraphs()); + assertEquals(5, section.numParagraphs()); para = section.getParagraph(2); + // Ensure the text is what we should now have text = para.text(); assertEquals(expectedText2, text); } diff --git a/test-data/document/Bug45269.doc b/test-data/document/Bug45269.doc new file mode 100644 index 0000000000000000000000000000000000000000..aea4ff93d61f671be442041017164c65bee2e1ca GIT binary patch literal 64512 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 Gp8O98K@~v& literal 0 HcmV?d00001