aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Beeker <kiwiwings@apache.org>2014-02-01 22:26:18 +0000
committerAndreas Beeker <kiwiwings@apache.org>2014-02-01 22:26:18 +0000
commit6a864cce7ba1bcfb01125de426b2038ff415a940 (patch)
tree856d7471b9232520fef70943fb367d1ceaa6387b /src
parent40ceccdcbd5f9b03537e3e78c9090082f010c79e (diff)
downloadpoi-6a864cce7ba1bcfb01125de426b2038ff415a940.tar.gz
poi-6a864cce7ba1bcfb01125de426b2038ff415a940.zip
Bug 55802 - Special Letters not exported correct
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1563496 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r--src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java94
-rw-r--r--src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java1
-rw-r--r--src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java51
3 files changed, 138 insertions, 8 deletions
diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
index 3e25656f0a..87932534c8 100644
--- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
+++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
@@ -45,6 +45,8 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
import org.openxmlformats.schemas.drawingml.x2006.main.STShapeType;
+import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
+import org.openxmlformats.schemas.drawingml.x2006.picture.CTPictureNonVisual;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr;
@@ -69,8 +71,6 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
-import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
-import org.openxmlformats.schemas.drawingml.x2006.picture.CTPictureNonVisual;
/**
* XWPFRun object defines a region of text with a common set of properties
@@ -82,6 +82,16 @@ public class XWPFRun implements ISDTContents, IRunElement{
private List<XWPFPicture> pictures;
/**
+ * @see <a href="http://msdn.microsoft.com/en-us/library/ff533743(v=office.12).aspx">[MS-OI29500] Run Fonts</a>
+ */
+ public static enum FontCharRange {
+ ascii /* char 0-127 */,
+ cs /* complex symbol */,
+ eastAsia /* east asia */,
+ hAnsi /* high ansi */
+ };
+
+ /**
* @param r the CTR bean which holds the run attributes
* @param p the parent paragraph
*/
@@ -481,29 +491,97 @@ public class XWPFRun implements ISDTContents, IRunElement{
}
/**
- * Specifies the fonts which shall be used to display the text contents of
+ * Gets the fonts which shall be used to display the text contents of
* this run. Specifies a font which shall be used to format all characters
* in the ASCII range (0 - 127) within the parent run
*
* @return a string representing the font family
*/
public String getFontFamily() {
- CTRPr pr = run.getRPr();
- return (pr != null && pr.isSetRFonts()) ? pr.getRFonts().getAscii()
- : null;
+ return getFontFamily(null);
}
/**
+ * Gets the font family for the specified font char range.
+ * If fcr is null, the font char range "ascii" is used
+ *
+ * @param fcr the font char range, defaults to "ansi"
+ * @return a string representing the font famil
+ */
+ public String getFontFamily(FontCharRange fcr) {
+ CTRPr pr = run.getRPr();
+ if (pr == null || !pr.isSetRFonts()) return null;
+
+ CTFonts fonts = pr.getRFonts();
+ switch (fcr == null ? FontCharRange.ascii : fcr) {
+ default:
+ case ascii:
+ return fonts.getAscii();
+ case cs:
+ return fonts.getCs();
+ case eastAsia:
+ return fonts.getEastAsia();
+ case hAnsi:
+ return fonts.getHAnsi();
+ }
+ }
+
+
+ /**
* Specifies the fonts which shall be used to display the text contents of
* this run. Specifies a font which shall be used to format all characters
- * in the ASCII range (0 - 127) within the parent run
+ * in the ASCII range (0 - 127) within the parent run.
+ *
+ * Also sets the other font ranges, if they haven't been set before
*
* @param fontFamily
+ *
+ * @see FontCharRange
*/
public void setFontFamily(String fontFamily) {
+ setFontFamily(fontFamily, null);
+ }
+
+ /**
+ * Specifies the fonts which shall be used to display the text contents of
+ * this run. The default handling for fcr == null is to overwrite the
+ * ascii font char range with the given font family and also set all not
+ * specified font ranges
+ *
+ * @param fontFamily
+ * @param fcr FontCharRange or null for default handling
+ */
+ public void setFontFamily(String fontFamily, FontCharRange fcr) {
CTRPr pr = run.isSetRPr() ? run.getRPr() : run.addNewRPr();
CTFonts fonts = pr.isSetRFonts() ? pr.getRFonts() : pr.addNewRFonts();
- fonts.setAscii(fontFamily);
+
+ if (fcr == null) {
+ fonts.setAscii(fontFamily);
+ if (!fonts.isSetHAnsi()) {
+ fonts.setHAnsi(fontFamily);
+ }
+ if (!fonts.isSetCs()) {
+ fonts.setCs(fontFamily);
+ }
+ if (!fonts.isSetEastAsia()) {
+ fonts.setEastAsia(fontFamily);
+ }
+ } else {
+ switch (fcr) {
+ case ascii:
+ fonts.setAscii(fontFamily);
+ break;
+ case cs:
+ fonts.setCs(fontFamily);
+ break;
+ case eastAsia:
+ fonts.setEastAsia(fontFamily);
+ break;
+ case hAnsi:
+ fonts.setHAnsi(fontFamily);
+ break;
+ }
+ }
}
/**
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java b/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java
index 20a4898e0d..f7ed6df7c7 100644
--- a/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java
+++ b/src/ooxml/testcases/org/apache/poi/xwpf/AllXWPFTests.java
@@ -37,6 +37,7 @@ import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestXWPFBugs.class,
+ org.apache.poi.xwpf.usermodel.TestXWPFBugs.class,
TestXWPFDocument.class,
TestXWPFWordExtractor.class,
TestXWPFHeaderFooterPolicy.class,
diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java
new file mode 100644
index 0000000000..a40910df60
--- /dev/null
+++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFBugs.java
@@ -0,0 +1,51 @@
+/* ====================================================================
+ 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 static org.junit.Assert.assertEquals;
+
+import org.apache.poi.xwpf.usermodel.XWPFRun.FontCharRange;
+import org.junit.Test;
+
+public class TestXWPFBugs {
+ @Test
+ public void bug55802() throws Exception {
+ String blabla =
+ "Bir, iki, \u00fc\u00e7, d\u00f6rt, be\u015f,\n"+
+ "\nalt\u0131, yedi, sekiz, dokuz, on.\n"+
+ "\nK\u0131rm\u0131z\u0131 don,\n"+
+ "\ngel bizim bah\u00e7eye kon,\n"+
+ "\nsar\u0131 limon";
+ XWPFDocument doc = new XWPFDocument();
+ XWPFRun run = doc.createParagraph().createRun();
+
+ for (String str : blabla.split("\n")) {
+ run.setText(str);
+ run.addBreak();
+ }
+
+ run.setFontFamily("Times New Roman");
+ run.setFontSize(20);
+ assertEquals(run.getFontFamily(), "Times New Roman");
+ assertEquals(run.getFontFamily(FontCharRange.cs), "Times New Roman");
+ assertEquals(run.getFontFamily(FontCharRange.eastAsia), "Times New Roman");
+ assertEquals(run.getFontFamily(FontCharRange.hAnsi), "Times New Roman");
+ run.setFontFamily("Arial", FontCharRange.hAnsi);
+ assertEquals(run.getFontFamily(FontCharRange.hAnsi), "Arial");
+ }
+
+}