From 2a7b04d945710edfb91137cf5c0568c547a89b65 Mon Sep 17 00:00:00 2001 From: Glen Stampoultzis Date: Sat, 9 Mar 2002 12:41:12 +0000 Subject: [PATCH] Update for the chart record git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@352167 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/hssf/record/ChartRecord.java | 178 ++++++++++++------ src/records/definitions/chart_record.xml | 10 + .../poi/hssf/record/TestChartRecord.java | 115 +++++++++++ 3 files changed, 244 insertions(+), 59 deletions(-) create mode 100644 src/records/definitions/chart_record.xml create mode 100644 src/testcases/org/apache/poi/hssf/record/TestChartRecord.java diff --git a/src/java/org/apache/poi/hssf/record/ChartRecord.java b/src/java/org/apache/poi/hssf/record/ChartRecord.java index 32ecacf14..55f92db34 100644 --- a/src/java/org/apache/poi/hssf/record/ChartRecord.java +++ b/src/java/org/apache/poi/hssf/record/ChartRecord.java @@ -53,39 +53,44 @@ * . */ + package org.apache.poi.hssf.record; + + +import org.apache.poi.util.BitField; import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.StringUtil; +import org.apache.poi.util.HexDump; /** - * The CHART record defines the location of a chart an it's size. - *

- * This record supports the charting capability of the program. - *

- * This is currently based on BIFF4 but will up updated to take into - * account changed required by BIFF8. - * + * The chart record is used to define the location and size of a chart. + * NOTE: This source is automatically generated please do not modify this file. Either subclass or + * remove the record in src/records/definitions. + * @author Glen Stampoultzis (glens at apache.org) */ - public class ChartRecord extends Record { - public static final short sid = 0x1002; - private int field1_x_position; - private int field2_y_position; - private int field3_x_size; - private int field4_y_size; + public final static short sid = 0x1002; + private int field_1_x; + private int field_2_y; + private int field_3_width; + private int field_4_height; + public ChartRecord() { + } /** - * Constructs a ChartRecord record and sets its fields appropriately. + * Constructs a Chart record and sets its fields appropriately. * - * @param id id must be 0x1002 or an exception will be throw upon validation - * @param size the size of the data area of the record + * @param id id must be 0x1002 or an exception + * will be throw upon validation + * @param size size the size of the data area of the record * @param data data of the record (should not contain sid/len) */ @@ -95,10 +100,11 @@ public class ChartRecord } /** - * Constructs a SeriesRecord record and sets its fields appropriately. + * Constructs a Chart record and sets its fields appropriately. * - * @param id id must be 0x1002 or an exception will be throw upon validation - * @param size the size of the data area of the record + * @param id id must be 0x1002 or an exception + * will be throw upon validation + * @param size size the size of the data area of the record * @param data data of the record (should not contain sid/len) * @param offset of the record's data */ @@ -108,54 +114,77 @@ public class ChartRecord super(id, size, data, offset); } + /** + * Checks the sid matches the expected side for this record + * + * @param id the expected sid. + */ protected void validateSid(short id) { if (id != sid) { - throw new RecordFormatException("NOT A CHART RECORD"); + throw new RecordFormatException("Not a Chart record"); } } protected void fillFields(byte [] data, short size, int offset) { - field1_x_position = LittleEndian.getInt(data, 0 + offset); - field2_y_position = LittleEndian.getInt(data, 4 + offset); - field3_x_size = LittleEndian.getInt(data, 8 + offset); - field4_y_size = LittleEndian.getInt(data, 12 + offset); + field_1_x = LittleEndian.getInt(data, 0 + offset); + field_2_y = LittleEndian.getInt(data, 4 + offset); + field_3_width = LittleEndian.getInt(data, 8 + offset); + field_4_height = LittleEndian.getInt(data, 12 + offset); + } public String toString() { StringBuffer buffer = new StringBuffer(); - buffer.append("[CHART]\n"); - buffer.append(" .xPosition = ").append(getXPosition()) - .append("\n"); - buffer.append(" .yPosition = ").append(getYPosition()) - .append("\n"); - buffer.append(" .xSize = ").append(getXSize()) - .append("\n"); - buffer.append(" .ySize = ").append(getYSize()) - .append("\n"); - buffer.append("[/CHART]\n"); + buffer.append("[Chart]\n"); + + buffer.append(" .x = ") + .append("0x") + .append(HexDump.toHex((int)getX())) + .append(" (").append(getX()).append(" )\n"); + + buffer.append(" .y = ") + .append("0x") + .append(HexDump.toHex((int)getY())) + .append(" (").append(getY()).append(" )\n"); + + buffer.append(" .width = ") + .append("0x") + .append(HexDump.toHex((int)getWidth())) + .append(" (").append(getWidth()).append(" )\n"); + + buffer.append(" .height = ") + .append("0x") + .append(HexDump.toHex((int)getHeight())) + .append(" (").append(getHeight()).append(" )\n"); + + buffer.append("[/Chart]\n"); return buffer.toString(); } - public int serialize(int offset, byte [] data) + public int serialize(int offset, byte[] data) { LittleEndian.putShort(data, 0 + offset, sid); - LittleEndian.putShort(data, 2 + offset, - (( short ) 20)); // 20 byte length - LittleEndian.putInt(data, 4 + offset, getXPosition()); - LittleEndian.putInt(data, 8 + offset, getYPosition()); - LittleEndian.putInt(data, 12 + offset, getXSize()); - LittleEndian.putInt(data, 16 + offset, getYSize()); + LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4)); + + LittleEndian.putInt(data, 4 + offset, field_1_x); + LittleEndian.putInt(data, 8 + offset, field_2_y); + LittleEndian.putInt(data, 12 + offset, field_3_width); + LittleEndian.putInt(data, 16 + offset, field_4_height); + return getRecordSize(); } + /** + * Size of record (exluding 4 byte header) + */ public int getRecordSize() { - return 20; + return 4 + 4 + 4 + 4 + 4; } public short getSid() @@ -163,43 +192,74 @@ public class ChartRecord return this.sid; } - public int getXPosition() + + /** + * Get the x field for the Chart record. + */ + public int getX() { - return field1_x_position; + return field_1_x; } - public void setXPosition(int xPosition) + /** + * Set the x field for the Chart record. + */ + public void setX(int field_1_x) { - this.field1_x_position = xPosition; + this.field_1_x = field_1_x; } - public int getYPosition() + /** + * Get the y field for the Chart record. + */ + public int getY() { - return field2_y_position; + return field_2_y; } - public void setYPosition(int yPosition) + /** + * Set the y field for the Chart record. + */ + public void setY(int field_2_y) { - this.field2_y_position = yPosition; + this.field_2_y = field_2_y; } - public int getXSize() + /** + * Get the width field for the Chart record. + */ + public int getWidth() { - return field3_x_size; + return field_3_width; } - public void setXSize(int xSize) + /** + * Set the width field for the Chart record. + */ + public void setWidth(int field_3_width) { - this.field3_x_size = xSize; + this.field_3_width = field_3_width; } - public int getYSize() + /** + * Get the height field for the Chart record. + */ + public int getHeight() { - return field4_y_size; + return field_4_height; } - public void setYSize(int ySize) + /** + * Set the height field for the Chart record. + */ + public void setHeight(int field_4_height) { - this.field4_y_size = ySize; + this.field_4_height = field_4_height; } -} + + +} // END OF CLASS + + + + diff --git a/src/records/definitions/chart_record.xml b/src/records/definitions/chart_record.xml new file mode 100644 index 000000000..486d35c39 --- /dev/null +++ b/src/records/definitions/chart_record.xml @@ -0,0 +1,10 @@ + + The chart record is used to define the location and size of a chart. + Glen Stampoultzis (glens at apache.org) + + + + + + + diff --git a/src/testcases/org/apache/poi/hssf/record/TestChartRecord.java b/src/testcases/org/apache/poi/hssf/record/TestChartRecord.java new file mode 100644 index 000000000..d49a3cbb6 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/record/TestChartRecord.java @@ -0,0 +1,115 @@ + +/* ==================================================================== + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Apache" and "Apache Software Foundation" and + * "Apache POI" must not be used to endorse or promote products + * derived from this software without prior written permission. For + * written permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * "Apache POI", nor may "Apache" appear in their name, without + * prior written permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + + +package org.apache.poi.hssf.record; + + +import junit.framework.TestCase; + +/** + * Tests the serialization and deserialization of the ChartRecord + * class works correctly. Test data taken directly from a real + * Excel file. + * + + * @author Glen Stampoultzis (glens at apache.org) + */ +public class TestChartRecord + extends TestCase +{ + byte[] data = new byte[] { + (byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00, + (byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00, + (byte)0xE8,(byte)0xFF,(byte)0xD0,(byte)0x01, + (byte)0xC8,(byte)0xCC,(byte)0xE5,(byte)0x00 + }; + + public TestChartRecord(String name) + { + super(name); + } + + public void testLoad() + throws Exception + { + + ChartRecord record = new ChartRecord((short)0x1002, (short)data.length, data); + assertEquals( 0, record.getX()); + assertEquals( 0, record.getY()); + assertEquals( 30474216, record.getWidth()); + assertEquals( 15060168, record.getHeight()); + + + assertEquals( 20, record.getRecordSize() ); + + record.validateSid((short)0x1002); + } + + public void testStore() + { + ChartRecord record = new ChartRecord(); + record.setX( 0 ); + record.setY( 0 ); + record.setWidth( 30474216 ); + record.setHeight( 15060168 ); + + + byte [] recordBytes = record.serialize(); + assertEquals(recordBytes.length - 4, data.length); + for (int i = 0; i < data.length; i++) + assertEquals("At offset " + i, data[i], recordBytes[i+4]); + } +}