You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@poi.apache.org by av...@apache.org on 2003/01/02 12:17:57 UTC
cvs commit: jakarta-poi/src/testcases/org/apache/poi/hssf HSSFTests.java
avik 2003/01/02 03:17:57
Modified: src/documentation/xdocs/hssf quick-guide.xml
src/java/org/apache/poi/hssf/model Workbook.java
src/java/org/apache/poi/hssf/record PaletteRecord.java
src/java/org/apache/poi/hssf/usermodel HSSFWorkbook.java
src/testcases/org/apache/poi/hssf HSSFTests.java
Log:
PR 15743: Add support for custom palettes: Submitted by Brian Sanders
Revision Changes Path
1.12 +55 -0 jakarta-poi/src/documentation/xdocs/hssf/quick-guide.xml
Index: quick-guide.xml
===================================================================
RCS file: /home/cvs/jakarta-poi/src/documentation/xdocs/hssf/quick-guide.xml,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- quick-guide.xml 7 Oct 2002 17:15:19 -0000 1.11
+++ quick-guide.xml 2 Jan 2003 11:17:56 -0000 1.12
@@ -27,6 +27,7 @@
<li><link href="#FrillsAndFills">Fills and color</link></li>
<li><link href="#MergedCells">Merging cells</link></li>
<li><link href="#WorkingWithFonts">Working with fonts</link></li>
+ <li><link href="#CustomColors">Custom colors</link></li>
<li><link href="#ReadWriteWorkbook">Reading and writing</link></li>
<li><link href="#NewLinesInCells">Use newlines in cells.</link></li>
<li><link href="#DataFormats">Create user defined data formats.</link></li>
@@ -278,6 +279,60 @@
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
+ </source>
+ </section>
+ <anchor id="CustomColors"/>
+ <section title="Custom colors">
+ <source>
+ HSSFWorkbook wb = new HSSFWorkbook();
+ HSSFSheet sheet = wb.createSheet();
+ HSSFRow row = sheet.createRow((short) 0);
+ HSSFCell cell = row.createCell((short) 0);
+ cell.setCellValue("Default Palette");
+
+ //apply some colors from the standard palette,
+ // as in the previous examples.
+ //we'll use red text on a lime background
+
+ HSSFCellStyle style = wb.createCellStyle();
+ style.setFillForegroundColor(HSSFColor.LIME.index);
+ style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
+
+ HSSFFont font = wb.createFont();
+ font.setColor(HSSFColor.RED.index);
+ style.setFont(font);
+
+ cell.setCellStyle(style);
+
+ //save with the default palette
+ FileOutputStream out = new FileOutputStream("default_palette.xls");
+ wb.write(out);
+ out.close();
+
+ //now, let's replace RED and LIME in the palette
+ // with a more attractive combination
+ // (lovingly borrowed from freebsd.org)
+
+ cell.setCellValue("Modified Palette");
+
+ //creating a custom palette for the workbook
+ HSSFPalette palette = wb.getCustomPalette();
+
+ //replacing the standard red with freebsd.org red
+ palette.setColorAtIndex(HSSFColor.RED.index,
+ (byte) 153, //RGB red (0-255)
+ (byte) 0, //RGB green
+ (byte) 0 //RGB blue
+ );
+ //replacing lime with freebsd.org gold
+ palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);
+
+ //save with the modified palette
+ // note that wherever we have previously used RED or LIME, the
+ // new colors magically appear
+ out = new FileOutputStream("modified_palette.xls");
+ wb.write(out);
+ out.close();
</source>
</section>
<anchor id="ReadWriteWorkbook"/>
1.24 +40 -1 jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java
Index: Workbook.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/model/Workbook.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- Workbook.java 16 Dec 2002 11:16:41 -0000 1.23
+++ Workbook.java 2 Jan 2003 11:17:57 -0000 1.24
@@ -89,6 +89,7 @@
* @author Sergei Kozello (sergeikozello at mail.ru)
* @author Luc Girardin (luc dot girardin at macrofocus dot com)
* @author Dan Sherman (dsherman at isisph.com)
+ * @author Brian Sanders (bsanders at risklabs dot com) - custom palette
* @see org.apache.poi.hssf.usermodel.HSSFWorkbook
* @version 1.0-pre
*/
@@ -146,6 +147,7 @@
private int backuppos = 0; // holds the position of the backup record.
private int namepos = 0; // holds the position of last name record
private int supbookpos = 0; // holds the position of sup book
+ private int palettepos = 0; // hold the position of the palette, if applicable
private short maxformatid = -1; // holds the max format id
private boolean uses1904datewindowing = false; // whether 1904 date windowing is being used
@@ -249,7 +251,9 @@
log.log(DEBUG, "found datewindow1904 record at " + k);
retval.uses1904datewindowing = ((DateWindow1904Record)rec).getWindowing() == 1;
break;
-
+ case PaletteRecord.sid:
+ log.log(DEBUG, "found palette record at " + k);
+ retval.palettepos = k;
default :
}
records.add(rec);
@@ -328,6 +332,7 @@
{
records.add( retval.createStyle( k ) );
}
+ retval.palettepos = records.size();
records.add( retval.createUseSelFS() );
for ( int k = 0; k < 1; k++ )
{ // now just do 1
@@ -578,6 +583,7 @@
ExtendedFormatRecord xf = createExtendedFormat();
++xfpos;
+ ++palettepos;
++bspos;
records.add(xfpos, xf);
numxfs++;
@@ -1567,6 +1573,16 @@
}
/**
+ * Creates a palette record initialized to the default palette
+ * @return a PaletteRecord instance populated with the default colors
+ * @see org.apache.poi.hssf.record.PaletteRecord
+ */
+ protected PaletteRecord createPalette()
+ {
+ return new PaletteRecord(PaletteRecord.sid);
+ }
+
+ /**
* Creates the UseSelFS object with the use natural language flag set to 0 (false)
* @return record containing a UseSelFSRecord
* @see org.apache.poi.hssf.record.UseSelFSRecord
@@ -1864,6 +1880,7 @@
public short createFormat( String format )
{
++xfpos; //These are to ensure that positions are updated properly
+ ++palettepos;
++bspos;
FormatRecord rec = new FormatRecord();
maxformatid = maxformatid >= (short) 0xa4 ? (short) ( maxformatid + 1 ) : (short) 0xa4; //Starting value from M$ empiracle study.
@@ -1941,6 +1958,7 @@
// {
// backuppos += chartRecords.size();
// fontpos += chartRecords.size();
+// palettepos += chartRecords.size();
// bspos += chartRecords.size();
// xfpos += chartRecords.size();
//
@@ -1955,5 +1973,26 @@
*/
public boolean isUsing1904DateWindowing() {
return uses1904datewindowing;
+ }
+
+ /**
+ * Returns the custom palette in use for this workbook; if a custom palette record
+ * does not exist, then it is created.
+ */
+ public PaletteRecord getCustomPalette()
+ {
+ PaletteRecord palette;
+ Record rec = (Record) records.get(palettepos);
+ if (rec instanceof PaletteRecord)
+ {
+ palette = (PaletteRecord) rec;
+ }
+ else
+ {
+ palette = createPalette();
+ records.add(palettepos, palette);
+ ++bspos;
+ }
+ return palette;
}
}
1.2 +132 -8 jakarta-poi/src/java/org/apache/poi/hssf/record/PaletteRecord.java
Index: PaletteRecord.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/record/PaletteRecord.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PaletteRecord.java 25 Jul 2002 05:10:23 -0000 1.1
+++ PaletteRecord.java 2 Jan 2003 11:17:57 -0000 1.2
@@ -63,6 +63,7 @@
/**
* PaletteRecord - Supports custom palettes.
* @author Andrew C. Oliver (acoliver at apache dot org)
+ * @author Brian Sanders (bsanders at risklabs dot com) - custom palette editing
* @version 2.0-pre
*/
@@ -70,13 +71,25 @@
extends Record
{
public final static short sid = 0x92;
-
+ /** The standard size of an XLS palette */
+ public final static byte STANDARD_PALETTE_SIZE = (byte) 56;
+ /** The byte index of the first color */
+ public final static short FIRST_COLOR_INDEX = (short) 0x8;
+
private short field_1_numcolors;
private List field_2_colors;
public PaletteRecord()
{
}
+
+ /**
+ * Constructs a custom palette with the default set of colors
+ */
+ public PaletteRecord(short id)
+ {
+ super(id, STANDARD_PALETTE_SIZE, getDefaultData());
+ }
/**
* Constructs a PaletteRecord record and sets its fields appropriately.
@@ -131,7 +144,7 @@
{
StringBuffer buffer = new StringBuffer();
- buffer.append("[Palette]\n");
+ buffer.append("[PALETTE]\n");
buffer.append(" numcolors = ").append(field_1_numcolors)
.append('\n');
for (int k = 0; k < field_1_numcolors; k++) {
@@ -142,16 +155,18 @@
buffer.append("/*colornum = ").append(k)
.append('\n');
}
- buffer.append("[/Palette]\n");
+ buffer.append("[/PALETTE]\n");
return buffer.toString();
}
public int serialize(int offset, byte [] data)
{
LittleEndian.putShort(data, 0 + offset, sid);
+ LittleEndian.putShort(data, 2 + offset, (short) (getRecordSize() - 4));
+ LittleEndian.putShort(data, 4 + offset, field_1_numcolors);
for (int k = 0; k < field_1_numcolors; k++) {
PColor c = (PColor)field_2_colors.get(k);
- c.serialize(data, (2+offset+(k*4)));
+ c.serialize(data, (6+offset+(k*4)));
}
return getRecordSize();
@@ -159,7 +174,7 @@
public int getRecordSize()
{
- return 2 + (field_1_numcolors * 4);
+ return 4 + 2 + (field_1_numcolors * 4);
}
public short getSid()
@@ -167,6 +182,115 @@
return this.sid;
}
+ /**
+ * Returns the color value at a given index
+ *
+ * @return the RGB triplet for the color, or null if the specified index
+ * does not exist
+ */
+ public byte[] getColor(short byteIndex)
+ {
+ int i = byteIndex - FIRST_COLOR_INDEX;
+ if (i < 0 || i >= field_2_colors.size())
+ {
+ return null;
+ }
+ PColor color = (PColor) field_2_colors.get(i);
+ return new byte[] { color.red, color.green, color.blue };
+ }
+
+ /**
+ * Sets the color value at a given index
+ *
+ * If the given index is greater than the current last color index,
+ * then black is inserted at every index required to make the palette continuous.
+ *
+ * @param i the index to set; if this index is less than 0x8 or greater than
+ * 0x40, then no modification is made
+ */
+ public void setColor(short byteIndex, byte red, byte green, byte blue)
+ {
+ int i = byteIndex - FIRST_COLOR_INDEX;
+ if (i < 0 || i >= STANDARD_PALETTE_SIZE)
+ {
+ return;
+ }
+ while (field_2_colors.size() <= i)
+ {
+ field_2_colors.add(new PColor((byte) 0, (byte) 0, (byte) 0));
+ }
+ PColor custColor = new PColor(red, green, blue);
+ field_2_colors.set(i, custColor);
+ }
+
+ /**
+ * Returns the default palette as PaletteRecord binary data
+ *
+ * @see org.apache.poi.hssf.model.Workbook#createPalette
+ */
+ public static byte[] getDefaultData()
+ {
+ return new byte[]
+ {
+ STANDARD_PALETTE_SIZE, (byte) 0,
+ (byte) 0, (byte) 0, (byte) 0, (byte) 0, //color 0...
+ (byte) 255, (byte) 255, (byte) 255, (byte) 0,
+ (byte) 255, (byte) 0, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 255, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 0, (byte) 255, (byte) 0,
+ (byte) 255, (byte) 255, (byte) 0, (byte) 0,
+ (byte) 255, (byte) 0, (byte) 255, (byte) 0,
+ (byte) 0, (byte) 255, (byte) 255, (byte) 0,
+ (byte) 128, (byte) 0, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 128, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 0, (byte) 128, (byte) 0,
+ (byte) 128, (byte) 128, (byte) 0, (byte) 0,
+ (byte) 128, (byte) 0, (byte) 128, (byte) 0,
+ (byte) 0, (byte) 128, (byte) 128, (byte) 0,
+ (byte) 192, (byte) 192, (byte) 192, (byte) 0,
+ (byte) 128, (byte) 128, (byte) 128, (byte) 0,
+ (byte) 153, (byte) 153, (byte) 255, (byte) 0,
+ (byte) 153, (byte) 51, (byte) 102, (byte) 0,
+ (byte) 255, (byte) 255, (byte) 204, (byte) 0,
+ (byte) 204, (byte) 255, (byte) 255, (byte) 0,
+ (byte) 102, (byte) 0, (byte) 102, (byte) 0,
+ (byte) 255, (byte) 128, (byte) 128, (byte) 0,
+ (byte) 0, (byte) 102, (byte) 204, (byte) 0,
+ (byte) 204, (byte) 204, (byte) 255, (byte) 0,
+ (byte) 0, (byte) 0, (byte) 128, (byte) 0,
+ (byte) 255, (byte) 0, (byte) 255, (byte) 0,
+ (byte) 255, (byte) 255, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 255, (byte) 255, (byte) 0,
+ (byte) 128, (byte) 0, (byte) 128, (byte) 0,
+ (byte) 128, (byte) 0, (byte) 0, (byte) 0,
+ (byte) 0, (byte) 128, (byte) 128, (byte) 0,
+ (byte) 0, (byte) 0, (byte) 255, (byte) 0,
+ (byte) 0, (byte) 204, (byte) 255, (byte) 0,
+ (byte) 204, (byte) 255, (byte) 255, (byte) 0,
+ (byte) 204, (byte) 255, (byte) 204, (byte) 0,
+ (byte) 255, (byte) 255, (byte) 153, (byte) 0,
+ (byte) 153, (byte) 204, (byte) 255, (byte) 0,
+ (byte) 255, (byte) 153, (byte) 204, (byte) 0,
+ (byte) 204, (byte) 153, (byte) 255, (byte) 0,
+ (byte) 255, (byte) 204, (byte) 153, (byte) 0,
+ (byte) 51, (byte) 102, (byte) 255, (byte) 0,
+ (byte) 51, (byte) 204, (byte) 204, (byte) 0,
+ (byte) 153, (byte) 204, (byte) 0, (byte) 0,
+ (byte) 255, (byte) 204, (byte) 0, (byte) 0,
+ (byte) 255, (byte) 153, (byte) 0, (byte) 0,
+ (byte) 255, (byte) 102, (byte) 0, (byte) 0,
+ (byte) 102, (byte) 102, (byte) 153, (byte) 0,
+ (byte) 150, (byte) 150, (byte) 150, (byte) 0,
+ (byte) 0, (byte) 51, (byte) 102, (byte) 0,
+ (byte) 51, (byte) 153, (byte) 102, (byte) 0,
+ (byte) 0, (byte) 51, (byte) 0, (byte) 0,
+ (byte) 51, (byte) 51, (byte) 0, (byte) 0,
+ (byte) 153, (byte) 51, (byte) 0, (byte) 0,
+ (byte) 153, (byte) 51, (byte) 102, (byte) 0,
+ (byte) 51, (byte) 51, (byte) 153, (byte) 0,
+ (byte) 51, (byte) 51, (byte) 51, (byte) 0
+ };
+ }
}
/**
@@ -191,9 +315,9 @@
public String toString() {
StringBuffer buffer = new StringBuffer();
- buffer.append(" red = ").append(red).append('\n');
- buffer.append(" green = ").append(green).append('\n');
- buffer.append(" blue = ").append(blue).append('\n');
+ buffer.append(" red = ").append(red & 0xff).append('\n');
+ buffer.append(" green = ").append(green & 0xff).append('\n');
+ buffer.append(" blue = ").append(blue & 0xff).append('\n');
return buffer.toString();
}
}
1.19 +5 -0 jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java
Index: HSSFWorkbook.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- HSSFWorkbook.java 16 Dec 2002 11:16:41 -0000 1.18
+++ HSSFWorkbook.java 2 Jan 2003 11:17:57 -0000 1.19
@@ -728,6 +728,11 @@
}
+ public HSSFPalette getCustomPalette()
+ {
+ return new HSSFPalette(workbook.getCustomPalette());
+ }
+
/**
* Copies nodes from one POIFS to the other minus the excepts
* @param source is the source POIFS to copy from
1.3 +4 -0 jakarta-poi/src/testcases/org/apache/poi/hssf/HSSFTests.java
Index: HSSFTests.java
===================================================================
RCS file: /home/cvs/jakarta-poi/src/testcases/org/apache/poi/hssf/HSSFTests.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- HSSFTests.java 10 Nov 2002 16:46:48 -0000 1.2
+++ HSSFTests.java 2 Jan 2003 11:17:57 -0000 1.3
@@ -27,6 +27,7 @@
import org.apache.poi.hssf.record.TestLinkedDataRecord;
import org.apache.poi.hssf.record.TestNumberFormatIndexRecord;
import org.apache.poi.hssf.record.TestObjectLinkRecord;
+import org.apache.poi.hssf.record.TestPaletteRecord;
import org.apache.poi.hssf.record.TestPlotAreaRecord;
import org.apache.poi.hssf.record.TestPlotGrowthRecord;
import org.apache.poi.hssf.record.TestRecordFactory;
@@ -53,6 +54,7 @@
import org.apache.poi.hssf.usermodel.TestFormulas;
import org.apache.poi.hssf.usermodel.TestHSSFCell;
import org.apache.poi.hssf.usermodel.TestHSSFDateUtil;
+import org.apache.poi.hssf.usermodel.TestHSSFPalette;
import org.apache.poi.hssf.usermodel.TestHSSFRow;
import org.apache.poi.hssf.usermodel.TestHSSFSheet;
import org.apache.poi.hssf.usermodel.TestNamedRange;
@@ -86,6 +88,7 @@
suite.addTest(new TestSuite(TestFormulas.class));
suite.addTest(new TestSuite(TestHSSFCell.class));
suite.addTest(new TestSuite(TestHSSFDateUtil.class));
+ suite.addTest(new TestSuite(TestHSSFPalette.class));
suite.addTest(new TestSuite(TestHSSFRow.class));
suite.addTest(new TestSuite(TestHSSFSheet.class));
suite.addTest(new TestSuite(TestNamedRange.class));
@@ -116,6 +119,7 @@
suite.addTest(new TestSuite(TestLinkedDataRecord.class));
suite.addTest(new TestSuite(TestNumberFormatIndexRecord.class));
suite.addTest(new TestSuite(TestObjectLinkRecord.class));
+ suite.addTest(new TestSuite(TestPaletteRecord.class));
suite.addTest(new TestSuite(TestPlotAreaRecord.class));
suite.addTest(new TestSuite(TestPlotGrowthRecord.class));
suite.addTest(new TestSuite(TestRecordFactory.class));