Bug 38486: Added handling of special 0x40 (64 dec) color.
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@425023 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8f60a2dbd8
commit
f20d43c9b3
@ -18,6 +18,7 @@
|
||||
package org.apache.poi.hssf.usermodel;
|
||||
|
||||
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
||||
import org.apache.poi.hssf.util.*;
|
||||
|
||||
/**
|
||||
* High level representation of the style of a cell in a sheet of a workbook.
|
||||
@ -799,6 +800,29 @@ public class HSSFCellStyle
|
||||
return format.getAdtlFillPattern();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the background and foreground fills are set correctly when one
|
||||
* or the other is set to the default color.
|
||||
* <p>Works like the logic table below:</p>
|
||||
* <p>BACKGROUND FOREGROUND</p>
|
||||
* <p>NONE AUTOMATIC</p>
|
||||
* <p>0x41 0x40</p>
|
||||
* <p>NONE RED/ANYTHING</p>
|
||||
* <p>0x40 0xSOMETHING</p>
|
||||
*/
|
||||
private void checkDefaultBackgroundFills() {
|
||||
if (format.getFillForeground() == org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index) {
|
||||
//JMH: Why +1, hell why not. I guess it made some sense to someone at the time. Doesnt
|
||||
//to me now.... But experience has shown that when the fore is set to AUTOMATIC then the
|
||||
//background needs to be incremented......
|
||||
if (format.getFillBackground() != (org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index+1))
|
||||
setFillBackgroundColor((short)(org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index+1));
|
||||
} else if (format.getFillBackground() == org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index+1)
|
||||
//Now if the forground changes to a non-AUTOMATIC color the background resets itself!!!
|
||||
if (format.getFillForeground() != org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index)
|
||||
setFillBackgroundColor(org.apache.poi.hssf.util.HSSFColor.AUTOMATIC.index);
|
||||
}
|
||||
|
||||
/**
|
||||
* set the background fill color.
|
||||
* <p>
|
||||
@ -807,6 +831,13 @@ public class HSSFCellStyle
|
||||
* cs.setFillPattern(HSSFCellStyle.FINE_DOTS );
|
||||
* cs.setFillBackgroundColor(new HSSFColor.RED().getIndex());
|
||||
* </pre>
|
||||
* optionally a Foreground and background fill can be applied:
|
||||
* <i>Note: Ensure Foreground color is set prior to background</i>
|
||||
* <pre>
|
||||
* cs.setFillPattern(HSSFCellStyle.FINE_DOTS );
|
||||
* cs.setFillForegroundColor(new HSSFColor.BLUE().getIndex());
|
||||
* cs.setFillBackgroundColor(new HSSFColor.RED().getIndex());
|
||||
* </pre>
|
||||
* or, for the special case of SOLID_FILL:
|
||||
* <pre>
|
||||
* cs.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND );
|
||||
@ -821,6 +852,7 @@ public class HSSFCellStyle
|
||||
public void setFillBackgroundColor(short bg)
|
||||
{
|
||||
format.setFillBackground(bg);
|
||||
checkDefaultBackgroundFills();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -830,17 +862,24 @@ public class HSSFCellStyle
|
||||
|
||||
public short getFillBackgroundColor()
|
||||
{
|
||||
return format.getFillBackground();
|
||||
short result = format.getFillBackground();
|
||||
//JMH: Do this ridiculous conversion, and let HSSFCellStyle
|
||||
//internally migrate back and forth
|
||||
if (result == (HSSFColor.AUTOMATIC.index+1))
|
||||
return HSSFColor.AUTOMATIC.index;
|
||||
else return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* set the foreground fill color
|
||||
* <i>Note: Ensure Foreground color is set prior to background color.</i>
|
||||
* @param bg color
|
||||
*/
|
||||
|
||||
public void setFillForegroundColor(short bg)
|
||||
{
|
||||
format.setFillForeground(bg);
|
||||
checkDefaultBackgroundFills();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -56,7 +56,7 @@ public class HSSFFont
|
||||
public final static short BOLDWEIGHT_BOLD = 0x2bc;
|
||||
|
||||
/**
|
||||
* normal type of black color
|
||||
* normal type of black color.
|
||||
*/
|
||||
|
||||
public final static short COLOR_NORMAL = 0x7fff;
|
||||
@ -266,7 +266,7 @@ public class HSSFFont
|
||||
/**
|
||||
* set the color for the font
|
||||
* @param color to use
|
||||
* @see #COLOR_NORMAL
|
||||
* @see #COLOR_NORMAL Note: Use this rather than HSSFColor.AUTOMATIC for default font color
|
||||
* @see #COLOR_RED
|
||||
*/
|
||||
|
||||
|
@ -44,11 +44,16 @@ public class HSSFPalette
|
||||
*/
|
||||
public HSSFColor getColor(short index)
|
||||
{
|
||||
//Handle the special AUTOMATIC case
|
||||
if (index == HSSFColor.AUTOMATIC.index)
|
||||
return HSSFColor.AUTOMATIC.getInstance();
|
||||
else {
|
||||
byte[] b = palette.getColor(index);
|
||||
if (b != null)
|
||||
{
|
||||
return new CustomColor(index, b);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -1693,4 +1693,38 @@ public class HSSFColor
|
||||
return hexString;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Special Default/Normal/Automatic color.
|
||||
* <p><i>Note:</i> This class is NOT in the default HashTables returned by HSSFColor.
|
||||
* The index is a special case which is interpreted in the various setXXXColor calls.
|
||||
*
|
||||
* @author Jason
|
||||
*
|
||||
*/
|
||||
public final static class AUTOMATIC extends HSSFColor
|
||||
{
|
||||
private static HSSFColor instance = new AUTOMATIC();
|
||||
|
||||
public final static short index = 0x40;
|
||||
|
||||
public short getIndex()
|
||||
{
|
||||
return index;
|
||||
}
|
||||
|
||||
public short [] getTriplet()
|
||||
{
|
||||
return BLACK.triplet;
|
||||
}
|
||||
|
||||
public String getHexString()
|
||||
{
|
||||
return BLACK.hexString;
|
||||
}
|
||||
|
||||
public static HSSFColor getInstance() {
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user