aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Burch <nick@apache.org>2010-05-28 13:44:45 +0000
committerNick Burch <nick@apache.org>2010-05-28 13:44:45 +0000
commit8bb16bee4bd474af96970a5f07c469ef50ab8c2e (patch)
treec14edf74ec9b65787b5ce9c144d50a18fdbc9b67
parentda4d5963f3d6402148a3524412dc3f06e4c58799 (diff)
downloadpoi-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
-rw-r--r--src/documentation/content/xdocs/status.xml1
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java19
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java9
-rw-r--r--src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java2
-rw-r--r--src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java38
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());
+ }
+ }
}