From: Nick Burch Date: Fri, 4 Mar 2011 14:01:14 +0000 (+0000) Subject: Fix bug #50847 - XSSFFont now accepts the full range of Charsets from FontChartset X-Git-Tag: REL_3_8_BETA2~42 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=ca96c8a73a22aa696d5d09cf30ba3de718ac768b;p=poi.git Fix bug #50847 - XSSFFont now accepts the full range of Charsets from FontChartset git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1077950 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 11ed8d25e0..b694475025 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 50847 - XSSFFont now accepts the full range of Charsets from FontChartset 50786 - Speed up calls to HSSFColor.getIndexHash() by returning a cached, unmodifiable Map. HSSFColor.getModifiableIndexHash() provides access to the old (slow but modifiable) functionality 47100 - Change related formulas and named ranges when XSSFWorkbook.setSheetName is called diff --git a/src/java/org/apache/poi/ss/usermodel/FontCharset.java b/src/java/org/apache/poi/ss/usermodel/FontCharset.java index ba06d8cc8f..90e4038b31 100644 --- a/src/java/org/apache/poi/ss/usermodel/FontCharset.java +++ b/src/java/org/apache/poi/ss/usermodel/FontCharset.java @@ -70,6 +70,8 @@ public enum FontCharset { } public static FontCharset valueOf(int value){ + if(value >= _table.length) + return null; return _table[value]; } } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java index 1578f6af55..cdf93c8ff3 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -306,19 +306,11 @@ public class XSSFFont implements Font { * @see FontCharset */ public void setCharSet(int charset) { - CTIntProperty charsetProperty = _ctFont.sizeOfCharsetArray() == 0 ? _ctFont.addNewCharset() : _ctFont.getCharsetArray(0); - switch (charset) { - case Font.ANSI_CHARSET: - charsetProperty.setVal(FontCharset.ANSI.getValue()); - break; - case Font.SYMBOL_CHARSET: - charsetProperty.setVal(FontCharset.SYMBOL.getValue()); - break; - case Font.DEFAULT_CHARSET: - charsetProperty.setVal(FontCharset.DEFAULT.getValue()); - break; - default: - throw new POIXMLException("Attention: an attempt to set a type of unknow charset and charset"); + FontCharset fontCharset = FontCharset.valueOf(charset); + if(fontCharset != null) { + setCharSet(fontCharset); + } else { + throw new POIXMLException("Attention: an attempt to set a type of unknow charset and charset"); } } @@ -328,7 +320,15 @@ public class XSSFFont implements Font { * @param charSet */ public void setCharSet(FontCharset charSet) { - setCharSet((byte)charSet.getValue()); + CTIntProperty charsetProperty; + if(_ctFont.sizeOfCharsetArray() == 0) { + charsetProperty = _ctFont.addNewCharset(); + } else { + charsetProperty = _ctFont.getCharsetArray(0); + } + // We know that FontCharset only has valid entries in it, + // so we can just set the int value from it + charsetProperty.setVal( charSet.getValue() ); } /** diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java index b0de667a36..b55833f419 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFont.java @@ -17,6 +17,7 @@ package org.apache.poi.xssf.usermodel; +import org.apache.poi.POIXMLException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFTestDataSamples; @@ -73,7 +74,22 @@ public final class TestXSSFFont extends BaseTestFont{ xssfFont.setCharSet(FontCharset.DEFAULT); assertEquals(FontCharset.DEFAULT.getValue(),ctFont.getCharsetArray(0).getVal()); - + + // Try with a few less usual ones: + // Set with the Charset itself + xssfFont.setCharSet(FontCharset.RUSSIAN); + assertEquals(FontCharset.RUSSIAN.getValue(), xssfFont.getCharSet()); + // And set with the Charset index + xssfFont.setCharSet(FontCharset.ARABIC.getValue()); + assertEquals(FontCharset.ARABIC.getValue(), xssfFont.getCharSet()); + + // This one isn't allowed + assertEquals(null, FontCharset.valueOf(9999)); + try { + xssfFont.setCharSet(9999); + fail("Shouldn't be able to set an invalid charset"); + } catch(POIXMLException e) {} + // Now try with a few sample files