]> source.dussan.org Git - poi.git/commitdiff
Fix bug #48718 - Make the creation of multiple, un-modified fonts in a row in XSSF...
authorNick Burch <nick@apache.org>
Fri, 28 May 2010 13:44:45 +0000 (13:44 +0000)
committerNick Burch <nick@apache.org>
Fri, 28 May 2010 13:44:45 +0000 (13:44 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@949177 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 93047f340ed1775b27e79856f2b63976dcba02d6..1cf13a4b36d1765965a47690c7c0b45e836385d9 100644 (file)
@@ -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>
index c0ad5f1bd1bf1f70b9bc9f6cd104f2f561e1c554..6120e5b48b24f796d0007c717650e60c4a08fd77 100644 (file)
@@ -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;
index 3b92c6fd3563535f90568e1eb3a1a896065cb5db..1578f6af55197a3e75bfcce580ae569ee6f4e1c9 100644 (file)
@@ -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;
     }
index 2fef9ad5f482ad64720cb958b507042ac131b1b8..4c73e3496a156334f4f82f601415fb4ac7ff1a79 100644 (file)
@@ -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;
     }
 
index cece9d4e8e1f55d99d60bdb8977b3c399293bdfe..5cb25243d75082c454ab55288d37066f574b8cd1 100644 (file)
@@ -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());
+       }
+    }
 }