From 104d4dac06a8af9734298a4cfdc071f0b7eb0d33 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 20 Feb 2018 00:25:43 +0000 Subject: [PATCH] [bug-62018] use ints to index fonts git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1824826 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/view/SVTableCellEditor.java | 315 +++++++++--------- .../poi/hssf/view/SVTableCellRenderer.java | 4 +- .../poi/ss/examples/CellStyleDetails.java | 2 +- .../apache/poi/ss/examples/html/ToHtml.java | 2 +- .../poi/hssf/record/ExtendedFormatRecord.java | 2 +- .../poi/hssf/usermodel/HSSFCellStyle.java | 20 +- .../apache/poi/hssf/usermodel/HSSFFont.java | 18 +- .../poi/hssf/usermodel/HSSFWorkbook.java | 41 +-- .../apache/poi/ss/usermodel/CellStyle.java | 11 +- .../org/apache/poi/ss/usermodel/Font.java | 13 + .../org/apache/poi/ss/usermodel/Workbook.java | 21 ++ src/java/org/apache/poi/ss/util/CellUtil.java | 24 +- .../org/apache/poi/ss/util/SheetUtil.java | 4 +- .../poi/xssf/streaming/SXSSFWorkbook.java | 31 +- .../poi/xssf/usermodel/XSSFCellStyle.java | 13 + .../apache/poi/xssf/usermodel/XSSFFont.java | 16 +- .../poi/xssf/usermodel/XSSFWorkbook.java | 23 +- .../ss/usermodel/BaseTestBugzillaIssues.java | 10 +- .../apache/poi/ss/usermodel/BaseTestCell.java | 2 +- .../apache/poi/ss/usermodel/BaseTestFont.java | 2 +- 20 files changed, 337 insertions(+), 237 deletions(-) diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java index 41de3d77c..f80b073a0 100644 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableCellEditor.java @@ -40,173 +40,176 @@ import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor.HSSFColorPredefined; import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; /** * Sheet Viewer Table Cell Editor -- not commented via javadoc as it * nearly completely consists of overridden methods. * - * @author Jason Height + * @author Jason Height */ public class SVTableCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener { - private static final Color black = getAWTColor(HSSFColorPredefined.BLACK); - private static final Color white = getAWTColor(HSSFColorPredefined.WHITE); + private static final Color black = getAWTColor(HSSFColorPredefined.BLACK); + private static final Color white = getAWTColor(HSSFColorPredefined.WHITE); + private static final POILogger logger = POILogFactory.getLogger(SVTableCellEditor.class); - private HSSFWorkbook wb; - private JTextField editor; + private HSSFWorkbook wb; + private JTextField editor; - public SVTableCellEditor(HSSFWorkbook wb) { - this.wb = wb; - this.editor = new JTextField(); - } - - - /** - * Gets the cellEditable attribute of the SVTableCellEditor object - * - * @return The cellEditable value - */ - @Override - public boolean isCellEditable(java.util.EventObject e) { - if (e instanceof MouseEvent) { - return ((MouseEvent) e).getClickCount() >= 2; + public SVTableCellEditor(HSSFWorkbook wb) { + this.wb = wb; + this.editor = new JTextField(); } - return false; - } - @Override - public boolean shouldSelectCell(EventObject anEvent) { - return true; - } - - - public boolean startCellEditing(EventObject anEvent) { - System.out.println("Start Cell Editing"); - return true; - } - - - @Override - public boolean stopCellEditing() { - System.out.println("Stop Cell Editing"); - fireEditingStopped(); - return true; - } - - - @Override - public void cancelCellEditing() { - System.out.println("Cancel Cell Editing"); - fireEditingCanceled(); - } - - - @Override - public void actionPerformed(ActionEvent e) { - System.out.println("Action performed"); - stopCellEditing(); - } - - - /** - * Gets the cellEditorValue attribute of the SVTableCellEditor object - * - * @return The cellEditorValue value - */ - @Override - public Object getCellEditorValue() { - System.out.println("GetCellEditorValue"); - //JMH Look at when this method is called. Should it return a HSSFCell? - return editor.getText(); - } - - - /** - * Gets the tableCellEditorComponent attribute of the SVTableCellEditor object - * - * @return The tableCellEditorComponent value - */ - @Override - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, - int row, - int column) { - System.out.println("GetTableCellEditorComponent"); - HSSFCell cell = (HSSFCell) value; - if (cell != null) { - HSSFCellStyle style = cell.getCellStyle(); - HSSFFont f = wb.getFontAt(style.getFontIndex()); - boolean isbold = f.getBold(); - boolean isitalics = f.getItalic(); - - int fontstyle = Font.PLAIN; - - if (isbold) { - fontstyle = Font.BOLD; - } - if (isitalics) { - fontstyle = fontstyle | Font.ITALIC; - } - - int fontheight = f.getFontHeightInPoints(); - if (fontheight == 9) { - fontheight = 10; //fix for stupid ol Windows - } - - Font font = new Font(f.getFontName(),fontstyle,fontheight); - editor.setFont(font); - - if (style.getFillPattern() == FillPatternType.SOLID_FOREGROUND) { - editor.setBackground(getAWTColor(style.getFillForegroundColor(), white)); - } else { - editor.setBackground(white); - } - - editor.setForeground(getAWTColor(f.getColor(), black)); - - - //Set the value that is rendered for the cell - switch (cell.getCellType()) { - case BLANK: - editor.setText(""); - break; - case BOOLEAN: - if (cell.getBooleanCellValue()) { - editor.setText("true"); - } else { - editor.setText("false"); - } - break; - case NUMERIC: - editor.setText(Double.toString(cell.getNumericCellValue())); - break; - case STRING: - editor.setText(cell.getRichStringCellValue().getString()); - break; - case FORMULA: - default: - editor.setText("?"); - } - switch (style.getAlignment()) { - case LEFT: - case JUSTIFY: - case FILL: - editor.setHorizontalAlignment(SwingConstants.LEFT); - break; - case CENTER: - case CENTER_SELECTION: - editor.setHorizontalAlignment(SwingConstants.CENTER); - break; - case GENERAL: - case RIGHT: - editor.setHorizontalAlignment(SwingConstants.RIGHT); - break; - default: - editor.setHorizontalAlignment(SwingConstants.LEFT); - break; - } - + /** + * Gets the cellEditable attribute of the SVTableCellEditor object + * + * @return The cellEditable value + */ + @Override + public boolean isCellEditable(java.util.EventObject e) { + if (e instanceof MouseEvent) { + return ((MouseEvent) e).getClickCount() >= 2; + } + return false; + } + + + @Override + public boolean shouldSelectCell(EventObject anEvent) { + return true; + } + + + public boolean startCellEditing(EventObject anEvent) { + logger.log(POILogger.INFO, "Start Cell Editing"); + return true; + } + + + @Override + public boolean stopCellEditing() { + logger.log(POILogger.INFO, "Stop Cell Editing"); + fireEditingStopped(); + return true; + } + + + @Override + public void cancelCellEditing() { + logger.log(POILogger.INFO, "Cancel Cell Editing"); + fireEditingCanceled(); + } + + + @Override + public void actionPerformed(ActionEvent e) { + logger.log(POILogger.INFO, "Action performed"); + stopCellEditing(); + } + + + /** + * Gets the cellEditorValue attribute of the SVTableCellEditor object + * + * @return The cellEditorValue value + */ + @Override + public Object getCellEditorValue() { + logger.log(POILogger.INFO, "GetCellEditorValue"); + //JMH Look at when this method is called. Should it return a HSSFCell? + return editor.getText(); + } + + + /** + * Gets the tableCellEditorComponent attribute of the SVTableCellEditor object + * + * @return The tableCellEditorComponent value + */ + @Override + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, + int row, + int column) { + logger.log(POILogger.INFO, "GetTableCellEditorComponent"); + HSSFCell cell = (HSSFCell) value; + if (cell != null) { + HSSFCellStyle style = cell.getCellStyle(); + HSSFFont f = wb.getFontAt(style.getFontIntIndex()); + boolean isbold = f.getBold(); + boolean isitalics = f.getItalic(); + + int fontstyle = Font.PLAIN; + + if (isbold) { + fontstyle = Font.BOLD; + } + if (isitalics) { + fontstyle = fontstyle | Font.ITALIC; + } + + int fontheight = f.getFontHeightInPoints(); + if (fontheight == 9) { + fontheight = 10; //fix for stupid ol Windows + } + + Font font = new Font(f.getFontName(), fontstyle, fontheight); + editor.setFont(font); + + if (style.getFillPattern() == FillPatternType.SOLID_FOREGROUND) { + editor.setBackground(getAWTColor(style.getFillForegroundColor(), white)); + } else { + editor.setBackground(white); + } + + editor.setForeground(getAWTColor(f.getColor(), black)); + + + //Set the value that is rendered for the cell + switch (cell.getCellType()) { + case BLANK: + editor.setText(""); + break; + case BOOLEAN: + if (cell.getBooleanCellValue()) { + editor.setText("true"); + } else { + editor.setText("false"); + } + break; + case NUMERIC: + editor.setText(Double.toString(cell.getNumericCellValue())); + break; + case STRING: + editor.setText(cell.getRichStringCellValue().getString()); + break; + case FORMULA: + default: + editor.setText("?"); + } + switch (style.getAlignment()) { + case LEFT: + case JUSTIFY: + case FILL: + editor.setHorizontalAlignment(SwingConstants.LEFT); + break; + case CENTER: + case CENTER_SELECTION: + editor.setHorizontalAlignment(SwingConstants.CENTER); + break; + case GENERAL: + case RIGHT: + editor.setHorizontalAlignment(SwingConstants.RIGHT); + break; + default: + editor.setHorizontalAlignment(SwingConstants.LEFT); + break; + } + + } + return editor; } - return editor; - } } diff --git a/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java b/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java index d1f7d18b9..1b9a62145 100644 --- a/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java +++ b/src/examples/src/org/apache/poi/hssf/view/SVTableCellRenderer.java @@ -140,7 +140,7 @@ public class SVTableCellRenderer extends JLabel @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - boolean isBorderSet = false; + boolean isBorderSet = false; //If the JTables default cell renderer has been setup correctly the //value will be the HSSFCell that we are trying to render @@ -148,7 +148,7 @@ public class SVTableCellRenderer extends JLabel if (c != null) { HSSFCellStyle s = c.getCellStyle(); - HSSFFont f = wb.getFontAt(s.getFontIndex()); + HSSFFont f = wb.getFontAt(s.getFontIntIndex()); setFont(SVTableUtils.makeFont(f)); if (s.getFillPattern() == FillPatternType.SOLID_FOREGROUND) { diff --git a/src/examples/src/org/apache/poi/ss/examples/CellStyleDetails.java b/src/examples/src/org/apache/poi/ss/examples/CellStyleDetails.java index 9090b5ddf..b2e7e0b94 100644 --- a/src/examples/src/org/apache/poi/ss/examples/CellStyleDetails.java +++ b/src/examples/src/org/apache/poi/ss/examples/CellStyleDetails.java @@ -63,7 +63,7 @@ public class CellStyleDetails { System.out.print("FG=" + renderColor(style.getFillForegroundColorColor()) + " "); System.out.print("BG=" + renderColor(style.getFillBackgroundColorColor()) + " "); - Font font = wb.getFontAt(style.getFontIndex()); + Font font = wb.getFontAt(style.getFontIntIndex()); System.out.print("Font=" + font.getFontName() + " "); System.out.print("FontColor="); if (font instanceof HSSFFont) { diff --git a/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java index 1787982dc..8c97993f4 100644 --- a/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java +++ b/src/examples/src/org/apache/poi/ss/examples/html/ToHtml.java @@ -300,7 +300,7 @@ public class ToHtml { } private void fontStyle(CellStyle style) { - Font font = wb.getFontAt(style.getFontIndex()); + Font font = wb.getFontAt(style.getFontIntIndex()); if (font.getBold()) { out.format(" font-weight: bold;%n"); diff --git a/src/java/org/apache/poi/hssf/record/ExtendedFormatRecord.java b/src/java/org/apache/poi/hssf/record/ExtendedFormatRecord.java index 3d043681b..e18754030 100644 --- a/src/java/org/apache/poi/hssf/record/ExtendedFormatRecord.java +++ b/src/java/org/apache/poi/hssf/record/ExtendedFormatRecord.java @@ -1660,7 +1660,7 @@ public final class ExtendedFormatRecord @Override public String toString() { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append("[EXTENDEDFORMAT]\n"); if (getXFType() == XF_STYLE) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java index 64a0d12e9..a2169018c 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCellStyle.java @@ -169,7 +169,7 @@ public final class HSSFCellStyle implements CellStyle { * set the font for this style * @param font a font object created or retrieved from the HSSFWorkbook object * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#createFont() - * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(short) + * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(int) */ @Override public void setFont(Font font) { @@ -186,19 +186,31 @@ public final class HSSFCellStyle implements CellStyle { * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(short) */ @Override + @Deprecated public short getFontIndex() { return _format.getFontIndex(); } + /** + * gets the index of the font for this style + * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(int) + * @since 4.0.0 + */ + @Override + public int getFontIntIndex() + { + return _format.getFontIndex(); + } + /** * gets the font for this style * @param parentWorkbook The HSSFWorkbook that this style belongs to - * @see org.apache.poi.hssf.usermodel.HSSFCellStyle#getFontIndex() - * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(short) + * @see org.apache.poi.hssf.usermodel.HSSFCellStyle#getFontIntIndex() + * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(int) */ public HSSFFont getFont(org.apache.poi.ss.usermodel.Workbook parentWorkbook) { - return ((HSSFWorkbook) parentWorkbook).getFontAt(getFontIndex()); + return ((HSSFWorkbook) parentWorkbook).getFontAt(getFontIntIndex()); } /** diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java index d07da152b..722dc0b74 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFont.java @@ -25,7 +25,7 @@ import org.apache.poi.ss.usermodel.Font; * Represents a Font used in a workbook. * * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#createFont() - * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(short) + * @see org.apache.poi.hssf.usermodel.HSSFWorkbook#getFontAt(int) * @see org.apache.poi.hssf.usermodel.HSSFCellStyle#setFont(HSSFFont) */ public final class HSSFFont implements Font { @@ -46,12 +46,12 @@ public final class HSSFFont implements Font { public final static String FONT_ARIAL = "Arial"; - private FontRecord font; - private short index; + private FontRecord font; + private int index; /** Creates a new instance of HSSFFont */ - protected HSSFFont(short index, FontRecord rec) + protected HSSFFont(int index, FontRecord rec) { font = rec; this.index = index; @@ -85,7 +85,15 @@ public final class HSSFFont implements Font { * unless you're comparing which one is which) */ - public short getIndex() + public short getIndex() { return (short)index; } + + /** + * get the index within the HSSFWorkbook (sequence within the collection of Font objects) + * @return unique index number of the underlying record this Font represents (probably you don't care + * unless you're comparing which one is which) + */ + + public int getIndexAsInt() { return index; } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 9d8ec90da..cd38a136f 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -178,13 +178,13 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss * this holds the HSSFFont objects attached to this workbook. * We only create these from the low level records as required. */ - private Map fonts; + private Map fonts; /** * holds whether or not to preserve other nodes in the POIFS. Used * for macros and embedded objects. */ - private boolean preserveNodes; + private boolean preserveNodes; /** * Used to keep track of the data formatter so that all @@ -1171,13 +1171,13 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss public HSSFFont createFont() { /*FontRecord font =*/ workbook.createNewFont(); - short fontindex = (short) (getNumberOfFonts() - 1); + int fontindex = getNumberOfFontsAsInt() - 1; if (fontindex > 3) { fontindex++; // THERE IS NO FOUR!! } - if(fontindex == Short.MAX_VALUE){ + if(fontindex >= Short.MAX_VALUE){ throw new IllegalArgumentException("Maximum number of fonts was exceeded"); } @@ -1194,8 +1194,8 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss String name, boolean italic, boolean strikeout, short typeOffset, byte underline) { - short numberOfFonts = getNumberOfFonts(); - for (short i=0; i<=numberOfFonts; i++) { + int numberOfFonts = getNumberOfFontsAsInt(); + for (int i = 0; i <= numberOfFonts; i++) { // Remember - there is no 4! if(i == 4) { continue; @@ -1218,24 +1218,25 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss return null; } - /** - * get the number of fonts in the font table - * @return number of fonts - */ - @Override - public short getNumberOfFonts() - { - return (short) workbook.getNumberOfFontRecords(); + @Deprecated + public short getNumberOfFonts() { + return (short)getNumberOfFontsAsInt(); } - /** - * Get the font at the given index number - * @param idx index number - * @return HSSFFont at the index - */ @Override + public int getNumberOfFontsAsInt() { + return workbook.getNumberOfFontRecords(); + } + + @Override + @Deprecated public HSSFFont getFontAt(short idx) { + return getFontAt((int)idx); + } + + @Override + public HSSFFont getFontAt(int idx) { if(fonts == null) { fonts = new HashMap<>(); } @@ -1243,7 +1244,7 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss // So we don't confuse users, give them back // the same object every time, but create // them lazily - Short sIdx = Short.valueOf(idx); + Integer sIdx = Integer.valueOf(idx); if(fonts.containsKey(sIdx)) { return fonts.get(sIdx); } diff --git a/src/java/org/apache/poi/ss/usermodel/CellStyle.java b/src/java/org/apache/poi/ss/usermodel/CellStyle.java index 57b052b16..3e9f37439 100644 --- a/src/java/org/apache/poi/ss/usermodel/CellStyle.java +++ b/src/java/org/apache/poi/ss/usermodel/CellStyle.java @@ -49,16 +49,25 @@ public interface CellStyle { * set the font for this style * @param font a font object created or retrieved from the Workbook object * @see Workbook#createFont() - * @see Workbook#getFontAt(short) + * @see Workbook#getFontAt(int) */ void setFont(Font font); /** * gets the index of the font for this style * @see Workbook#getFontAt(short) + * @deprecated use getFontIntIndex() instead */ + @Removal(version = "4.2") short getFontIndex(); + /** + * gets the index of the font for this style + * @see Workbook#getFontAt(int) + * @since 4.0.0 + */ + int getFontIntIndex(); + /** * set the cell's using this style to be hidden * @param hidden - whether the cell using this style should be hidden diff --git a/src/java/org/apache/poi/ss/usermodel/Font.java b/src/java/org/apache/poi/ss/usermodel/Font.java index 7c218531c..66c54ba89 100644 --- a/src/java/org/apache/poi/ss/usermodel/Font.java +++ b/src/java/org/apache/poi/ss/usermodel/Font.java @@ -18,6 +18,8 @@ package org.apache.poi.ss.usermodel; +import org.apache.poi.util.Removal; + public interface Font { /** @@ -267,9 +269,20 @@ public interface Font { * * @return unique index number of the underlying record this Font represents (probably you don't care * unless you're comparing which one is which) + * @deprecated use getIndexAsInt() instead */ + @Removal(version = "4.2") public short getIndex(); + /** + * get the index within the XSSFWorkbook (sequence within the collection of Font objects) + * + * @return unique index number of the underlying record this Font represents (probably you don't care + * unless you're comparing which one is which) + * @since 4.0.0 + */ + public int getIndexAsInt(); + public void setBold(boolean bold); public boolean getBold(); diff --git a/src/java/org/apache/poi/ss/usermodel/Workbook.java b/src/java/org/apache/poi/ss/usermodel/Workbook.java index f8f5b28ee..bd34cb2b7 100644 --- a/src/java/org/apache/poi/ss/usermodel/Workbook.java +++ b/src/java/org/apache/poi/ss/usermodel/Workbook.java @@ -265,17 +265,38 @@ public interface Workbook extends Closeable, Iterable { * Get the number of fonts in the font table * * @return number of fonts + * @deprecated use getNumberOfFontsAsInt() instead */ + @Removal(version = "4.2") short getNumberOfFonts(); + /** + * Get the number of fonts in the font table + * + * @return number of fonts + * @since 4.0.0 + */ + int getNumberOfFontsAsInt(); + /** * Get the font at the given index number * * @param idx index number (0-based) * @return font at the index + * @deprecated use getFontAt(int) */ + @Removal(version = "4.2") Font getFontAt(short idx); + /** + * Get the font at the given index number + * + * @param idx index number (0-based) + * @return font at the index + * @since 4.0.0 + */ + Font getFontAt(int idx); + /** * Create a new Cell style and add it to the workbook's style table * diff --git a/src/java/org/apache/poi/ss/util/CellUtil.java b/src/java/org/apache/poi/ss/util/CellUtil.java index e1b909917..15036761a 100644 --- a/src/java/org/apache/poi/ss/util/CellUtil.java +++ b/src/java/org/apache/poi/ss/util/CellUtil.java @@ -234,7 +234,7 @@ public final class CellUtil { public static void setFont(Cell cell, Font font) { // Check if font belongs to workbook Workbook wb = cell.getSheet().getWorkbook(); - final short fontIndex = font.getIndex(); + final int fontIndex = font.getIndexAsInt(); if (!wb.getFontAt(fontIndex).equals(font)) { throw new IllegalArgumentException("Font does not belong to this workbook"); } @@ -408,7 +408,7 @@ public final class CellUtil { style.setFillPattern(getFillPattern(properties, FILL_PATTERN)); style.setFillForegroundColor(getShort(properties, FILL_FOREGROUND_COLOR)); style.setFillBackgroundColor(getShort(properties, FILL_BACKGROUND_COLOR)); - style.setFont(workbook.getFontAt(getShort(properties, FONT))); + style.setFont(workbook.getFontAt(getInt(properties, FONT))); style.setHidden(getBoolean(properties, HIDDEN)); style.setIndention(getShort(properties, INDENTION)); style.setLeftBorderColor(getShort(properties, LEFT_BORDER_COLOR)); @@ -429,8 +429,24 @@ public final class CellUtil { */ private static short getShort(Map properties, String name) { Object value = properties.get(name); - if (value instanceof Short) { - return ((Short) value).shortValue(); + if (value instanceof Number) { + return ((Number) value).shortValue(); + } + return 0; + } + + /** + * Utility method that returns the named int value form the given map. + * + * @param properties map of named properties (String -> Object) + * @param name property name + * @return zero if the property does not exist, or is not a {@link Integer} + * otherwise the property value + */ + private static int getInt(Map properties, String name) { + Object value = properties.get(name); + if (value instanceof Number) { + return ((Number) value).intValue(); } return 0; } diff --git a/src/java/org/apache/poi/ss/util/SheetUtil.java b/src/java/org/apache/poi/ss/util/SheetUtil.java index 8f1345230..2293ebcb1 100644 --- a/src/java/org/apache/poi/ss/util/SheetUtil.java +++ b/src/java/org/apache/poi/ss/util/SheetUtil.java @@ -144,7 +144,7 @@ public class SheetUtil { if (cellType == CellType.FORMULA) cellType = cell.getCachedFormulaResultType(); - Font font = wb.getFontAt(style.getFontIndex()); + Font font = wb.getFontAt(style.getFontIntIndex()); double width = -1; if (cellType == CellType.STRING) { @@ -266,7 +266,7 @@ public class SheetUtil { */ @Internal public static int getDefaultCharWidth(final Workbook wb) { - Font defaultFont = wb.getFontAt((short) 0); + Font defaultFont = wb.getFontAt( 0); AttributedString str = new AttributedString(String.valueOf(defaultChar)); copyAttributes(defaultFont, str, 0, 1); diff --git a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java index b385628f7..acf9d0f30 100644 --- a/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java @@ -811,27 +811,28 @@ public class SXSSFWorkbook implements Workbook { { return _wb.findFont(bold, color, fontHeight, name, italic, strikeout, typeOffset, underline); } - - /** - * Get the number of fonts in the font table - * - * @return number of fonts - */ @Override - public short getNumberOfFonts() - { - return _wb.getNumberOfFonts(); + @Deprecated + public short getNumberOfFonts() { + return (short)getNumberOfFontsAsInt(); } - /** - * Get the font at the given index number - * - * @param idx index number (0-based) - * @return font at the index - */ @Override + public int getNumberOfFontsAsInt() + { + return _wb.getNumberOfFontsAsInt(); + } + + @Override + @Deprecated public Font getFontAt(short idx) + { + return getFontAt((int)idx); + } + + @Override + public Font getFontAt(int idx) { return _wb.getFontAt(idx); } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java index cd5a3bb76..df6429603 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java @@ -469,10 +469,23 @@ public class XSSFCellStyle implements CellStyle { * @see org.apache.poi.xssf.usermodel.XSSFWorkbook#getFontAt(short) */ @Override + @Deprecated public short getFontIndex() { return (short) getFontId(); } + /** + * Gets the index of the font for this style + * + * @return short - font index + * @see org.apache.poi.xssf.usermodel.XSSFWorkbook#getFontAt(int) + * @since 4.0.0 + */ + @Override + public int getFontIntIndex() { + return getFontId(); + } + /** * Get whether the cell's using this style are to be hidden * 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 c24fb1000..50e76ba86 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFont.java @@ -63,7 +63,7 @@ public class XSSFFont implements Font { private IndexedColorMap _indexedColorMap; private ThemesTable _themes; private CTFont _ctFont; - private short _index; + private int _index; /** * Create a new XSSFFont @@ -615,12 +615,14 @@ public class XSSFFont implements Font { setFamily(family.getValue()); } - /** - * get the index within the XSSFWorkbook (sequence within the collection of Font objects) - * @return unique index number of the underlying record this Font represents (probably you don't care - * unless you're comparing which one is which) - */ - public short getIndex() + @Override + @Deprecated + public short getIndex() { + return (short)getIndexAsInt(); + } + + @Override + public int getIndexAsInt() { return _index; } 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 1bb256c62..96176385c 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java @@ -925,6 +925,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { /** * Finds a font that matches the one with the supplied attributes + * + * @return the font with the matched attributes or null */ @Override public XSSFFont findFont(boolean bold, short color, short fontHeight, String name, boolean italic, boolean strikeout, short typeOffset, byte underline) { @@ -972,17 +974,16 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { return stylesSource.getStyleAt(idx); } - /** - * Get the font at the given index number - * - * @param idx index number - * @return XSSFFont at the index - */ @Override public XSSFFont getFontAt(short idx) { return stylesSource.getFontAt(idx); } + @Override + public XSSFFont getFontAt(int idx) { + return stylesSource.getFontAt(idx); + } + /** * Get the first named range with the given name. * @@ -1075,13 +1076,13 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook { return stylesSource.getNumCellStyles(); } - /** - * Get the number of fonts in the this workbook - * - * @return number of fonts - */ @Override public short getNumberOfFonts() { + return (short)getNumberOfFontsAsInt(); + } + + @Override + public int getNumberOfFontsAsInt() { return (short)stylesSource.getFonts().size(); } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java index 49309d93e..2b40d3757 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestBugzillaIssues.java @@ -1013,19 +1013,19 @@ public abstract class BaseTestBugzillaIssues { Workbook wb = _testDataProvider.createWorkbook(); int startingFonts = wb instanceof HSSFWorkbook ? 4 : 1; - assertEquals(startingFonts, wb.getNumberOfFonts()); + assertEquals(startingFonts, wb.getNumberOfFontsAsInt()); // Get a font, and slightly change it Font a = wb.createFont(); - assertEquals(startingFonts+1, wb.getNumberOfFonts()); + assertEquals(startingFonts+1, wb.getNumberOfFontsAsInt()); a.setFontHeightInPoints((short)23); - assertEquals(startingFonts+1, wb.getNumberOfFonts()); + assertEquals(startingFonts+1, wb.getNumberOfFontsAsInt()); // Get two more, unchanged /*Font b =*/ wb.createFont(); - assertEquals(startingFonts+2, wb.getNumberOfFonts()); + assertEquals(startingFonts+2, wb.getNumberOfFontsAsInt()); /*Font c =*/ wb.createFont(); - assertEquals(startingFonts+3, wb.getNumberOfFonts()); + assertEquals(startingFonts+3, wb.getNumberOfFontsAsInt()); wb.close(); } diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java index 59536005a..acf099992 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestCell.java @@ -276,7 +276,7 @@ public abstract class BaseTestCell { cs = c.getCellStyle(); assertNotNull("Formula Cell Style", cs); - assertEquals("Font Index Matches", f.getIndex(), cs.getFontIndex()); + assertEquals("Font Index Matches", f.getIndexAsInt(), cs.getFontIndex()); assertEquals("Top Border", BorderStyle.THIN, cs.getBorderTop()); assertEquals("Left Border", BorderStyle.THIN, cs.getBorderLeft()); assertEquals("Right Border", BorderStyle.THIN, cs.getBorderRight()); diff --git a/src/testcases/org/apache/poi/ss/usermodel/BaseTestFont.java b/src/testcases/org/apache/poi/ss/usermodel/BaseTestFont.java index 5657babed..30756ab60 100644 --- a/src/testcases/org/apache/poi/ss/usermodel/BaseTestFont.java +++ b/src/testcases/org/apache/poi/ss/usermodel/BaseTestFont.java @@ -58,7 +58,7 @@ public abstract class BaseTestFont { @Test public final void testGetNumberOfFonts() throws IOException { Workbook wb = _testDataProvider.createWorkbook(); - int num0 = wb.getNumberOfFonts(); + int num0 = wb.getNumberOfFontsAsInt(); Font f1=wb.createFont(); f1.setBold(true);