diff options
author | Nick Burch <nick@apache.org> | 2010-05-28 13:44:45 +0000 |
---|---|---|
committer | Nick Burch <nick@apache.org> | 2010-05-28 13:44:45 +0000 |
commit | 8bb16bee4bd474af96970a5f07c469ef50ab8c2e (patch) | |
tree | c14edf74ec9b65787b5ce9c144d50a18fdbc9b67 | |
parent | da4d5963f3d6402148a3524412dc3f06e4c58799 (diff) | |
download | poi-8bb16bee4bd474af96970a5f07c469ef50ab8c2e.tar.gz poi-8bb16bee4bd474af96970a5f07c469ef50ab8c2e.zip |
Fix bug #48718 - Make the creation of multiple, un-modified fonts in a row in XSSF match the old HSSF behaviour
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@949177 13f79535-47bb-0310-9956-ffa450edef68
5 files changed, 62 insertions, 7 deletions
diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 93047f340e..1cf13a4b36 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ <changes> <release version="3.7-SNAPSHOT" date="2010-??-??"> + <action dev="POI-DEVELOPERS" type="fix">48718 - Make the creation of multiple, un-modified fonts in a row in XSSF match the old HSSF behaviour</action> <action dev="POI-DEVELOPERS" type="fix">44916 - Allow access to the HSSFPatriarch from HSSFSheet once created</action> <action dev="POI-DEVELOPERS" type="add">48779 - Allow you to get straight from a CellStyle to a Color, irrespective of if the Color is indexed or inline-defined</action> <action dev="POI-DEVELOPERS" type="add">48924 - Allow access of the HWPF DateAndTime underlying date values</action> diff --git a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java index c0ad5f1bd1..6120e5b48b 100644 --- a/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java +++ b/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java @@ -176,14 +176,29 @@ public class StylesTable extends POIXMLDocumentPart { return fonts.get(idx); } - public int putFont(XSSFFont font) { - int idx = fonts.indexOf(font); + /** + * Records the given font in the font table. + * Will re-use an existing font index if this + * font matches another, EXCEPT if forced + * registration is requested. + * This allows people to create several fonts + * then customise them later. + */ + public int putFont(XSSFFont font, boolean forceRegistration) { + int idx = -1; + if(!forceRegistration) { + idx = fonts.indexOf(font); + } + if (idx != -1) { return idx; } fonts.add(font); return fonts.size() - 1; } + public int putFont(XSSFFont font) { + return putFont(font, false); + } public XSSFCellStyle getStyleAt(int idx) { int styleXfId = 0; 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 3b92c6fd35..1578f6af55 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -85,7 +85,7 @@ public class XSSFFont implements Font { setFontName(DEFAULT_FONT_NAME); setFontHeight((double)DEFAULT_FONT_SIZE); } - + /** * get the underlying CTFont font */ @@ -516,10 +516,11 @@ public class XSSFFont implements Font { /** - * Register ourselfs in the style table + * Perform a registration of ourselves + * to the style table */ - public long putFont(StylesTable styles) { - short idx = (short)styles.putFont(this); + public long registerTo(StylesTable styles) { + short idx = (short)styles.putFont(this, true); this._index = idx; return idx; } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java index 2fef9ad5f4..4c73e3496a 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -453,7 +453,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X */ public XSSFFont createFont() { XSSFFont font = new XSSFFont(); - font.putFont(stylesSource); + font.registerTo(stylesSource); return font; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java index cece9d4e8e..5cb25243d7 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java @@ -20,14 +20,17 @@ package org.apache.poi.xssf.usermodel; import java.util.List; import org.apache.poi.POIXMLDocumentPart; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.openxml4j.opc.PackagePart; import org.apache.poi.openxml4j.opc.PackagingURIHelper; import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.XSSFITestDataProvider; import org.apache.poi.xssf.XSSFTestDataSamples; import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill; @@ -259,4 +262,39 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues { assertEquals(null, cs.getFillBackgroundXSSFColor().getARGBHex()); assertEquals(null, cs.getFillBackgroundColorColor().getARGBHex()); } + + /** + * With HSSF, if you create a font, don't change it, and + * create a 2nd, you really do get two fonts that you + * can alter as and when you want. + * With XSSF, that wasn't the case, but this verfies + * that it now is again + */ + public void test48718() throws Exception { + // Verify the HSSF behaviour + // Then ensure the same for XSSF + Workbook[] wbs = new Workbook[] { + new HSSFWorkbook(), + new XSSFWorkbook() + }; + int[] initialFonts = new int[] { 4, 1 }; + for(int i=0; i<wbs.length; i++) { + Workbook wb = wbs[i]; + int startingFonts = initialFonts[i]; + + assertEquals(startingFonts, wb.getNumberOfFonts()); + + // Get a font, and slightly change it + Font a = wb.createFont(); + assertEquals(startingFonts+1, wb.getNumberOfFonts()); + a.setFontHeightInPoints((short)23); + assertEquals(startingFonts+1, wb.getNumberOfFonts()); + + // Get two more, unchanged + Font b = wb.createFont(); + assertEquals(startingFonts+2, wb.getNumberOfFonts()); + Font c = wb.createFont(); + assertEquals(startingFonts+3, wb.getNumberOfFonts()); + } + } } |