From 3aa84d4555ff73ee44302e9a4c8cd35f7cef2dd8 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 11 Aug 2015 20:01:26 +0000 Subject: [PATCH] Support XWPF field runs, the same way that we handle hyperlink runs git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1695361 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xwpf/usermodel/XWPFFieldRun.java | 48 +++++++++++++++++++ .../poi/xwpf/usermodel/XWPFHyperlinkRun.java | 4 +- .../poi/xwpf/usermodel/XWPFParagraph.java | 17 +++---- .../poi/xwpf/usermodel/TestXWPFParagraph.java | 19 ++++++++ 4 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFieldRun.java diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFieldRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFieldRun.java new file mode 100644 index 0000000000..997c7d0cb3 --- /dev/null +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFieldRun.java @@ -0,0 +1,48 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.xwpf.usermodel; + +import org.apache.poi.util.Internal; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSimpleField; + +/** + * A run of text which is part of a field, such as Title + * of Page number or Author. + * Any given Field may be made up of multiple of these. + */ +public class XWPFFieldRun extends XWPFRun { + private CTSimpleField field; + + public XWPFFieldRun(CTSimpleField field, CTR run, IRunBody p) { + super(run, p); + this.field = field; + } + + @Internal + public CTSimpleField getCTField() { + return field; + } + + public String getFieldInstruction() { + return field.getInstr(); + } + + public void setFieldInstruction(String instruction) { + field.setInstr(instruction); + } +} diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHyperlinkRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHyperlinkRun.java index 4c8158a411..9a79b20f0f 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHyperlinkRun.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHyperlinkRun.java @@ -16,6 +16,7 @@ ==================================================================== */ package org.apache.poi.xwpf.usermodel; +import org.apache.poi.util.Internal; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; @@ -30,7 +31,8 @@ public class XWPFHyperlinkRun extends XWPFRun { super(run, p); this.hyperlink = hyperlink; } - + + @Internal public CTHyperlink getCTHyperlink() { return hyperlink; } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java index 0eae922479..65c726d102 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java @@ -142,13 +142,21 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para iruns.add(r); } if (o instanceof CTHyperlink) { - CTHyperlink link = (CTHyperlink) o; + CTHyperlink link = (CTHyperlink)o; for (CTR r : link.getRArray()) { XWPFHyperlinkRun hr = new XWPFHyperlinkRun(link, r, this); runs.add(hr); iruns.add(hr); } } + if (o instanceof CTSimpleField) { + CTSimpleField field = (CTSimpleField)o; + for (CTR r : field.getRArray()) { + XWPFFieldRun fr = new XWPFFieldRun(field, r, this); + runs.add(fr); + iruns.add(fr); + } + } if (o instanceof CTSdtBlock) { XWPFSDT cc = new XWPFSDT((CTSdtBlock) o, part); iruns.add(cc); @@ -164,13 +172,6 @@ public class XWPFParagraph implements IBodyElement, IRunBody, ISDTContents, Para iruns.add(cr); } } - if (o instanceof CTSimpleField) { - for (CTR r : ((CTSimpleField) o).getRArray()) { - XWPFRun cr = new XWPFRun(r, this); - runs.add(cr); - iruns.add(cr); - } - } if (o instanceof CTSmartTagRun) { // Smart Tags can be nested many times. // This implementation does not preserve the tagging information diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index 31be821e06..f53d524b01 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -22,6 +22,7 @@ import java.math.BigInteger; import java.util.List; import junit.framework.TestCase; + import org.apache.poi.xwpf.XWPFTestDataSamples; import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture; import org.openxmlformats.schemas.drawingml.x2006.picture.PicDocument; @@ -495,6 +496,24 @@ public final class TestXWPFParagraph extends TestCase { assertTrue(p.removeRun(0)); } + + public void testFieldRuns() throws Exception { + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("FldSimple.docx"); + List ps = doc.getParagraphs(); + assertEquals(1, ps.size()); + + XWPFParagraph p = ps.get(0); + assertEquals(1, p.getRuns().size()); + assertEquals(1, p.getIRuns().size()); + + XWPFRun r = p.getRuns().get(0); + assertEquals(XWPFFieldRun.class, r.getClass()); + + XWPFFieldRun fr = (XWPFFieldRun)r; + assertEquals(" FILENAME \\* MERGEFORMAT ", fr.getFieldInstruction()); + assertEquals("FldSimple.docx", fr.text()); + assertEquals("FldSimple.docx", p.getText()); + } @SuppressWarnings("deprecation") public void testRuns() { -- 2.39.5