package org.apache.poi.hdgf.dev;
import java.io.File;
+import java.io.PrintStream;
+import java.util.Arrays;
import org.apache.poi.hdgf.HDGFDiagram;
import org.apache.poi.hdgf.chunks.Chunk;
* of a Visio file
*/
public final class VSDDumper {
+ final static String tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+
+ final PrintStream ps;
+ final HDGFDiagram hdgf;
+ VSDDumper(PrintStream ps, HDGFDiagram hdgf) {
+ this.ps = ps;
+ this.hdgf = hdgf;
+ }
+
public static void main(String[] args) throws Exception {
if(args.length == 0) {
System.err.println("Use:");
System.exit(1);
}
- HDGFDiagram hdgf = new HDGFDiagram(
- new NPOIFSFileSystem(new File(args[0]))
- );
+ NPOIFSFileSystem poifs = new NPOIFSFileSystem(new File(args[0]));
+ HDGFDiagram hdgf = new HDGFDiagram(poifs);
- System.out.println("Opened " + args[0]);
- System.out.println("The document claims a size of " +
- hdgf.getDocumentSize() + " (" +
- Long.toHexString(hdgf.getDocumentSize()) + ")");
- System.out.println();
-
- dumpStream(hdgf.getTrailerStream(), 0);
+ PrintStream ps = System.out;
+ ps.println("Opened " + args[0]);
+ VSDDumper vd = new VSDDumper(ps, hdgf);
+ vd.dumpFile();
+
+ poifs.close();
}
- public static void dumpStream(Stream stream, int indent) {
- String ind = "";
- for(int i=0; i<indent; i++) {
- ind += " ";
- }
- String ind2 = ind + " ";
- String ind3 = ind2 + " ";
-
-
+ public void dumpFile() {
+ dumpVal("Claimed document size", hdgf.getDocumentSize(), 0);
+ ps.println();
+ dumpStream(hdgf.getTrailerStream(), 0);
+ }
+
+ private void dumpStream(Stream stream, int indent) {
Pointer ptr = stream.getPointer();
- System.out.println(ind + "Stream at\t" + ptr.getOffset() +
- " - " + Integer.toHexString(ptr.getOffset()));
- System.out.println(ind + " Type is\t" + ptr.getType() +
- " - " + Integer.toHexString(ptr.getType()));
- System.out.println(ind + " Format is\t" + ptr.getFormat() +
- " - " + Integer.toHexString(ptr.getFormat()));
- System.out.println(ind + " Length is\t" + ptr.getLength() +
- " - " + Integer.toHexString(ptr.getLength()));
+ dumpVal("Stream at", ptr.getOffset(), indent);
+ dumpVal("Type is", ptr.getType(), indent+1);
+ dumpVal("Format is", ptr.getFormat(), indent+1);
+ dumpVal("Length is", ptr.getLength(), indent+1);
if(ptr.destinationCompressed()) {
- int decompLen = stream._getContentsLength();
- System.out.println(ind + " DC.Length is\t" + decompLen +
- " - " + Integer.toHexString(decompLen));
+ dumpVal("DC.Length is", stream._getContentsLength(), indent+1);
}
- System.out.println(ind + " Compressed is\t" + ptr.destinationCompressed());
- System.out.println(ind + " Stream is\t" + stream.getClass().getName());
+ dumpVal("Compressed is", ptr.destinationCompressed(), indent+1);
+ dumpVal("Stream is", stream.getClass().getName(), indent+1);
byte[] db = stream._getStore()._getContents();
- String ds = "";
- if(db.length >= 8) {
- for(int i=0; i<8; i++) {
- if(i>0) ds += ", ";
- ds += db[i];
- }
- }
- System.out.println(ind + " First few bytes are\t" + ds);
+ String ds = (db.length >= 8) ? Arrays.toString(db) : "[]";
+ dumpVal("First few bytes are", ds, indent+1);
- if(stream instanceof PointerContainingStream) {
- PointerContainingStream pcs = (PointerContainingStream)stream;
- System.out.println(ind + " Has " +
- pcs.getPointedToStreams().length + " children:");
+ if (stream instanceof PointerContainingStream) {
+ Stream streams[] = ((PointerContainingStream)stream).getPointedToStreams();
+ dumpVal("Nbr of children", streams.length, indent+1);
- for(int i=0; i<pcs.getPointedToStreams().length; i++) {
- dumpStream(pcs.getPointedToStreams()[i], (indent+1));
+ for(Stream s : streams) {
+ dumpStream(s, indent+1);
}
}
if(stream instanceof ChunkStream) {
- ChunkStream cs = (ChunkStream)stream;
- System.out.println(ind + " Has " + cs.getChunks().length +
- " chunks:");
-
- for(int i=0; i<cs.getChunks().length; i++) {
- Chunk chunk = cs.getChunks()[i];
- System.out.println(ind2 + "" + chunk.getName());
- System.out.println(ind2 + " Length is " + chunk._getContents().length + " (" + Integer.toHexString(chunk._getContents().length) + ")");
- System.out.println(ind2 + " OD Size is " + chunk.getOnDiskSize() + " (" + Integer.toHexString(chunk.getOnDiskSize()) + ")");
- System.out.println(ind2 + " T / S is " + chunk.getTrailer() + " / " + chunk.getSeparator());
- System.out.println(ind2 + " Holds " + chunk.getCommands().length + " commands");
- for(int j=0; j<chunk.getCommands().length; j++) {
- Command command = chunk.getCommands()[j];
- System.out.println(ind3 + "" +
- command.getDefinition().getName() +
- " " + command.getValue()
- );
- }
+ Chunk chunks[] = ((ChunkStream)stream).getChunks();
+ dumpVal("Nbr of chunks", chunks.length, indent+1);
+
+ for(Chunk chunk : chunks) {
+ dumpChunk(chunk, indent+1);
}
}
}
+
+ private void dumpChunk(Chunk chunk, int indent) {
+ dumpVal(chunk.getName(), "", indent);
+ dumpVal("Length is", chunk._getContents().length, indent);
+ dumpVal("OD Size is", chunk.getOnDiskSize(), indent);
+ dumpVal("T / S is", chunk.getTrailer() + " / " + chunk.getSeparator(), indent);
+ Command commands[] = chunk.getCommands();
+ dumpVal("Nbr of commands", commands.length, indent);
+ for(Command command : commands) {
+ dumpVal(command.getDefinition().getName(), ""+command.getValue(), indent+1);
+ }
+ }
+
+ private void dumpVal(String label, long value, int indent) {
+ ps.print(tabs.substring(0,indent));
+ ps.print(label);
+ ps.print('\t');
+ ps.print(value);
+ ps.print(" (0x");
+ ps.print(Long.toHexString(value));
+ ps.println(")");
+ }
+
+ private void dumpVal(String label, boolean value, int indent) {
+ dumpVal(label, Boolean.toString(value), indent);
+ }
+
+ private void dumpVal(String label, String value, int indent) {
+ ps.print(tabs.substring(0,indent));
+ ps.print(label);
+ ps.print('\t');
+ ps.println(value);
+ }
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.util.Iterator;
+import java.io.PrintStream;
+import java.util.List;
import java.util.Locale;
-import org.apache.poi.hslf.record.Record;
-import org.apache.poi.util.HexDump;
import org.apache.poi.ddf.DefaultEscherRecordFactory;
-import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherRecord;
import org.apache.poi.ddf.EscherTextboxRecord;
-import org.apache.poi.hslf.record.*;
+import org.apache.poi.hslf.record.EscherTextboxWrapper;
+import org.apache.poi.hslf.record.HSLFEscherRecordFactory;
+import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.record.StyleTextPropAtom;
+import org.apache.poi.hslf.record.TextBytesAtom;
+import org.apache.poi.hslf.record.TextCharsAtom;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
+import org.apache.poi.util.HexDump;
/**
* This class provides a way to view the contents of a powerpoint file.
* @author Nick Burch
*/
public final class SlideShowRecordDumper {
- private boolean optVerbose;
- private boolean optEscher;
- private HSLFSlideShowImpl doc;
-
- /**
- * right now this function takes one parameter: a ppt file, and outputs
- * a dump of what it contains
- */
- public static void main(String args[]) throws IOException
- {
- String filename = "";
- boolean verbose = false;
- boolean escher = false;
-
- int ndx=0;
- for (; ndx<args.length; ndx++) {
- if (!args[ndx].substring(0,1).equals("-"))
- break;
-
- if (args[ndx].equals("-escher")) {
- escher = true;
- } else if (args[ndx].equals("-verbose")) {
- verbose = true;
- } else {
- printUsage();
- return;
- }
- }
-
- // parsed any options, expect exactly one remaining arg (filename)
- if (ndx != args.length-1) {
- printUsage();
- return;
- }
-
- filename = args[ndx];
-
- SlideShowRecordDumper foo = new SlideShowRecordDumper(filename, verbose, escher);
-
- foo.printDump();
- }
-
- public static void printUsage() {
- System.err.println("Usage: SlideShowRecordDumper [-escher] [-verbose] <filename>");
- System.err.println("Valid Options:");
- System.err.println("-escher\t\t: dump contents of escher records");
- System.err.println("-verbose\t: dump binary contents of each record");
- }
-
-
- /**
- * Constructs a Powerpoint dump from fileName. Parses the document
- * and dumps out the contents
- *
- * @param fileName The name of the file to read.
- * @throws IOException if there is a problem while parsing the document.
- */
- public SlideShowRecordDumper(String fileName, boolean verbose, boolean escher) throws IOException
- {
- optVerbose = verbose;
- optEscher = escher;
- doc = new HSLFSlideShowImpl(fileName);
- }
-
-
- public void printDump() throws IOException {
- // Prints out the records in the tree
- walkTree(0,0,doc.getRecords());
- }
+ final static String tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
+
+ private boolean optVerbose;
+ private boolean optEscher;
+ private HSLFSlideShowImpl doc;
+ private final PrintStream ps;
+
+ /**
+ * right now this function takes one parameter: a ppt file, and outputs a
+ * dump of what it contains
+ */
+ public static void main(String args[]) throws IOException {
+ String filename = "";
+ boolean verbose = false;
+ boolean escher = false;
+
+ int ndx = 0;
+ for (; ndx < args.length; ndx++) {
+ if (!args[ndx].substring(0, 1).equals("-"))
+ break;
+
+ if (args[ndx].equals("-escher")) {
+ escher = true;
+ } else if (args[ndx].equals("-verbose")) {
+ verbose = true;
+ } else {
+ printUsage();
+ return;
+ }
+ }
- public String makeHex(int number, int padding) {
- String hex = Integer.toHexString(number).toUpperCase(Locale.ROOT);
- while(hex.length() < padding) {
- hex = "0" + hex;
- }
- return hex;
- }
+ // parsed any options, expect exactly one remaining arg (filename)
+ if (ndx != args.length - 1) {
+ printUsage();
+ return;
+ }
- public String reverseHex(String s) {
- StringBuffer ret = new StringBuffer();
+ filename = args[ndx];
+
+ SlideShowRecordDumper foo = new SlideShowRecordDumper(System.out,
+ filename, verbose, escher);
+
+ foo.printDump();
+ }
+
+ public static void printUsage() {
+ System.err.println("Usage: SlideShowRecordDumper [-escher] [-verbose] <filename>");
+ System.err.println("Valid Options:");
+ System.err.println("-escher\t\t: dump contents of escher records");
+ System.err.println("-verbose\t: dump binary contents of each record");
+ }
+
+ /**
+ * Constructs a Powerpoint dump from fileName. Parses the document
+ * and dumps out the contents
+ *
+ * @param fileName The name of the file to read.
+ * @throws IOException if there is a problem while parsing the document.
+ */
+ public SlideShowRecordDumper(PrintStream ps, String fileName, boolean verbose, boolean escher)
+ throws IOException {
+ this.ps = ps;
+ optVerbose = verbose;
+ optEscher = escher;
+ doc = new HSLFSlideShowImpl(fileName);
+ }
+
+
+ public void printDump() throws IOException {
+ // Prints out the records in the tree
+ walkTree(0, 0, doc.getRecords(), 0);
+ }
+
+ public String makeHex(int number, int padding) {
+ String hex = Integer.toHexString(number).toUpperCase(Locale.ROOT);
+ while (hex.length() < padding) {
+ hex = "0" + hex;
+ }
+ return hex;
+ }
- // Get to a multiple of two
- if((s.length() / 2) * 2 != s.length()) { s = "0" + s; }
+ public String reverseHex(String s) {
+ StringBuilder ret = new StringBuilder();
- // Break up into blocks
- char[] c = s.toCharArray();
- for(int i=c.length; i>0; i-=2) {
- ret.append(c[i-2]);
- ret.append(c[i-1]);
- if(i != 2) { ret.append(' '); }
- }
- return ret.toString();
- }
-
- public int getDiskLen(Record r) throws IOException {
- if (r == null) return 0;
+ // Get to a multiple of two
+ int pos = 0;
+ if ((s.length() & 1) == 1) {
+ ret.append(0);
+ pos++;
+ }
+ for (char c : s.toCharArray()) {
+ if (pos > 0 && (pos & 1) == 0) {
+ ret.append(' ');
+ }
+ ret.append(c);
+ pos++;
+ }
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- r.writeOut(baos);
- byte[] b = baos.toByteArray();
- return b.length;
- }
+ return ret.toString();
+ }
- public String getPrintableRecordContents(Record r) throws IOException {
- if (r==null) return "<<null>>";
+ public int getDiskLen(Record r) throws IOException {
+ int diskLen = 0;
+ if (r != null) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ r.writeOut(baos);
+ diskLen = baos.size();
+ }
+ return diskLen;
+ }
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- r.writeOut(baos);
- byte[] b = baos.toByteArray();
- return HexDump.dump(b, 0, 0);
- }
+ public String getPrintableRecordContents(Record r) throws IOException {
+ if (r == null) {
+ return "<<null>>";
+ }
- public String printEscherRecord( EscherRecord er ) {
- String nl = System.getProperty( "line.separator" );
- StringBuffer buf = new StringBuffer();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ r.writeOut(baos);
+ byte[] b = baos.toByteArray();
+ return HexDump.dump(b, 0, 0);
+ }
+ public void printEscherRecord(EscherRecord er, int indent) {
if (er instanceof EscherContainerRecord) {
- buf.append(printEscherContainerRecord( (EscherContainerRecord)er ));
+ printEscherContainerRecord( (EscherContainerRecord)er, indent );
} else if (er instanceof EscherTextboxRecord) {
- buf.append("EscherTextboxRecord:" + nl);
-
- EscherTextboxWrapper etw = new EscherTextboxWrapper((EscherTextboxRecord)er);
- Record children[] = etw.getChildRecords();
- for (int j=0; j<children.length; j++) {
- if (children[j] instanceof StyleTextPropAtom) {
-
- // need preceding Text[Chars|Bytes]Atom to initialize the data structure
- if (j > 0 && (children[j-1] instanceof TextCharsAtom ||
- children[j-1] instanceof TextBytesAtom)) {
-
- int size = (children[j-1] instanceof TextCharsAtom) ?
- ((TextCharsAtom)children[j-1]).getText().length() :
- ((TextBytesAtom)children[j-1]).getText().length();
-
- StyleTextPropAtom tsp = (StyleTextPropAtom)children[j];
- tsp.setParentTextSize(size);
-
- } else {
- buf.append("Error! Couldn't find preceding TextAtom for style\n");
- }
-
- buf.append(children[j].toString() + nl );
- } else {
- buf.append(children[j].toString() + nl );
- }
- }
+ printEscherTextBox( (EscherTextboxRecord)er, indent );
} else {
- buf.append( er.toString() );
+ ps.print( tabs.substring(0, indent) );
+ ps.println( er.toString() );
}
- return buf.toString();
- }
-
- public String printEscherContainerRecord( EscherContainerRecord ecr ) {
- String indent = "";
-
- String nl = System.getProperty( "line.separator" );
-
- StringBuffer children = new StringBuffer();
- int count = 0;
- for ( Iterator<EscherRecord> iterator = ecr.getChildIterator(); iterator.hasNext(); )
- {
- if (count < 1) {
- children.append( " children: " + nl );
+ }
+
+ private void printEscherTextBox( EscherTextboxRecord tbRecord, int indent ) {
+ String ind = tabs.substring(0, indent);
+ ps.println(ind+"EscherTextboxRecord:");
+
+ EscherTextboxWrapper etw = new EscherTextboxWrapper(tbRecord);
+ Record prevChild = null;
+ for (Record child : etw.getChildRecords()) {
+ if (child instanceof StyleTextPropAtom) {
+ // need preceding Text[Chars|Bytes]Atom to initialize the data structure
+ String text = null;
+ if (prevChild instanceof TextCharsAtom) {
+ text = ((TextCharsAtom)prevChild).getText();
+ } else if (prevChild instanceof TextBytesAtom) {
+ text = ((TextBytesAtom)prevChild).getText();
+ } else {
+ ps.println(ind+"Error! Couldn't find preceding TextAtom for style");
+ continue;
+ }
+
+ StyleTextPropAtom tsp = (StyleTextPropAtom)child;
+ tsp.setParentTextSize(text.length());
}
- String newIndent = " ";
-
- EscherRecord record = iterator.next();
- children.append(newIndent + "Child " + count + ":" + nl);
-
- children.append( printEscherRecord(record) );
-
+ ps.println(ind+child.toString());
+ prevChild = child;
+ }
+
+ }
+
+ private void printEscherContainerRecord( EscherContainerRecord ecr, int indent ) {
+ String ind = tabs.substring(0, indent);
+ ps.println(ind + ecr.getClass().getName() + " (" + ecr.getRecordName() + "):");
+ ps.println(ind + " isContainer: " + ecr.isContainerRecord());
+ ps.println(ind + " options: 0x" + HexDump.toHex( ecr.getOptions() ));
+ ps.println(ind + " recordId: 0x" + HexDump.toHex( ecr.getRecordId() ));
+
+ List<EscherRecord> childRecords = ecr.getChildRecords();
+ ps.println(ind + " numchildren: " + childRecords.size());
+ ps.println(ind + " children: ");
+ int count = 0;
+ for ( EscherRecord record : childRecords ) {
+ ps.println(ind + " Child " + count + ":");
+ printEscherRecord(record, indent+1);
count++;
}
+ }
- return
- indent + ecr.getClass().getName() + " (" + ecr.getRecordName() + "):" + nl +
- indent + " isContainer: " + ecr.isContainerRecord() + nl +
- indent + " options: 0x" + HexDump.toHex( ecr.getOptions() ) + nl +
- indent + " recordId: 0x" + HexDump.toHex( ecr.getRecordId() ) + nl +
- indent + " numchildren: " + ecr.getChildRecords().size() + nl +
- indent + children.toString();
- }
+ public void walkTree(int depth, int pos, Record[] records, int indent) throws IOException {
+ String ind = tabs.substring(0, indent);
- public void walkTree(int depth, int pos, Record[] records) throws IOException {
- int indent = depth;
- String ind = "";
- for(int i=0; i<indent; i++) { ind += " "; }
-
- for(int i=0; i<records.length; i++) {
- Record r = records[i];
- if (r == null) {
- System.out.println(ind + "At position " + pos + " (" + makeHex(pos,6) + "):");
- System.out.println(ind + "Warning! Null record found.");
- continue;
- }
+ for (int i = 0; i < records.length; i++) {
+ Record r = records[i];
+ if (r == null) {
+ ps.println(ind + "At position " + pos + " (" + makeHex(pos, 6) + "):");
+ ps.println(ind + "Warning! Null record found.");
+ continue;
+ }
- // Figure out how big it is
- int len = getDiskLen(r);
+ // Figure out how big it is
+ int len = getDiskLen(r);
- // Grab the type as hex
- String hexType = makeHex((int)r.getRecordType(),4);
- String rHexType = reverseHex(hexType);
+ // Grab the type as hex
+ String hexType = makeHex((int) r.getRecordType(), 4);
+ String rHexType = reverseHex(hexType);
// Grab the hslf.record type
Class<? extends Record> c = r.getClass();
}
// Display the record
- System.out.println(ind + "At position " + pos + " (" + makeHex(pos,6) + "):");
- System.out.println(ind + " Record is of type " + cname);
- System.out.println(ind + " Type is " + r.getRecordType() + " (" + hexType + " -> " + rHexType + " )");
- System.out.println(ind + " Len is " + (len-8) + " (" + makeHex((len-8),8) + "), on disk len is " + len );
+ ps.println(ind + "At position " + pos + " (" + makeHex(pos,6) + "):");
+ ps.println(ind + " Record is of type " + cname);
+ ps.println(ind + " Type is " + r.getRecordType() + " (" + hexType + " -> " + rHexType + " )");
+ ps.println(ind + " Len is " + (len-8) + " (" + makeHex((len-8),8) + "), on disk len is " + len );
// print additional information for drawings and atoms
if (optEscher && cname.equals("PPDrawing")) {
EscherRecord er = factory.createRecord(b, 0);
er.fillFields(b, 0, factory);
- System.out.println( printEscherRecord( er ) );
+ printEscherRecord( er, indent+1 );
} else if(optVerbose && r.getChildRecords() == null) {
String recData = getPrintableRecordContents(r);
- System.out.println(ind + recData );
+ ps.println(ind + recData );
}
- System.out.println();
+ ps.println();
// If it has children, show them
if(r.getChildRecords() != null) {
- walkTree((depth+3),pos+8,r.getChildRecords());
+ walkTree((depth+3),pos+8,r.getChildRecords(), indent+1);
}
// Wind on the position marker
import java.util.Iterator;
import java.util.List;
-import org.apache.poi.hssf.record.chart.*;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.DimensionsRecord;
import org.apache.poi.hssf.record.EOFRecord;
import org.apache.poi.hssf.record.SCLRecord;
import org.apache.poi.hssf.record.UnknownRecord;
import org.apache.poi.hssf.record.VCenterRecord;
+import org.apache.poi.hssf.record.chart.AreaFormatRecord;
+import org.apache.poi.hssf.record.chart.AxisLineFormatRecord;
+import org.apache.poi.hssf.record.chart.AxisOptionsRecord;
+import org.apache.poi.hssf.record.chart.AxisParentRecord;
+import org.apache.poi.hssf.record.chart.AxisRecord;
+import org.apache.poi.hssf.record.chart.AxisUsedRecord;
+import org.apache.poi.hssf.record.chart.BarRecord;
+import org.apache.poi.hssf.record.chart.BeginRecord;
+import org.apache.poi.hssf.record.chart.CategorySeriesAxisRecord;
+import org.apache.poi.hssf.record.chart.ChartFormatRecord;
+import org.apache.poi.hssf.record.chart.ChartRecord;
+import org.apache.poi.hssf.record.chart.ChartTitleFormatRecord;
+import org.apache.poi.hssf.record.chart.DataFormatRecord;
+import org.apache.poi.hssf.record.chart.DefaultDataLabelTextPropertiesRecord;
+import org.apache.poi.hssf.record.chart.EndRecord;
+import org.apache.poi.hssf.record.chart.FontBasisRecord;
+import org.apache.poi.hssf.record.chart.FontIndexRecord;
+import org.apache.poi.hssf.record.chart.FrameRecord;
+import org.apache.poi.hssf.record.chart.LegendRecord;
+import org.apache.poi.hssf.record.chart.LineFormatRecord;
+import org.apache.poi.hssf.record.chart.LinkedDataRecord;
+import org.apache.poi.hssf.record.chart.PlotAreaRecord;
+import org.apache.poi.hssf.record.chart.PlotGrowthRecord;
+import org.apache.poi.hssf.record.chart.SeriesIndexRecord;
+import org.apache.poi.hssf.record.chart.SeriesRecord;
+import org.apache.poi.hssf.record.chart.SeriesTextRecord;
+import org.apache.poi.hssf.record.chart.SeriesToChartGroupRecord;
+import org.apache.poi.hssf.record.chart.SheetPropertiesRecord;
+import org.apache.poi.hssf.record.chart.TextRecord;
+import org.apache.poi.hssf.record.chart.TickRecord;
+import org.apache.poi.hssf.record.chart.UnitsRecord;
+import org.apache.poi.hssf.record.chart.ValueRangeRecord;
import org.apache.poi.ss.formula.ptg.Area3DPtg;
import org.apache.poi.ss.formula.ptg.AreaPtgBase;
import org.apache.poi.ss.formula.ptg.Ptg;
private ChartRecord chartRecord;
private LegendRecord legendRecord;
- private ChartTitleFormatRecord chartTitleFormat;
+ @SuppressWarnings("unused")
+ private ChartTitleFormatRecord chartTitleFormat;
private SeriesTextRecord chartTitleText;
private List<ValueRangeRecord> valueRanges = new ArrayList<ValueRangeRecord>();
* NOTE: Does not yet work... checking it in just so others
* can take a look.
*/
- public void createBarChart( HSSFWorkbook workbook, HSSFSheet sheet )
+ public void createBarChart( HSSFWorkbook workbook, HSSFSheet parentSheet )
{
List<Record> records = new ArrayList<Record>();
- sheet.insertChartRecords( records );
+ parentSheet.insertChartRecords( records );
workbook.insertChartRecord();
}
} else if(r instanceof LegendRecord) {
lastChart.legendRecord = (LegendRecord)r;
} else if(r instanceof SeriesRecord) {
- HSSFSeries series = lastChart.new HSSFSeries( (SeriesRecord)r );
+ HSSFSeries series = new HSSFSeries( (SeriesRecord)r );
lastChart.series.add(series);
lastSeries = series;
} else if(r instanceof ChartTitleFormatRecord) {
SeriesTextRecord str = (SeriesTextRecord)r;
if(lastChart.legendRecord == null &&
lastChart.series.size() > 0) {
- HSSFSeries series = (HSSFSeries)
- lastChart.series.get(lastChart.series.size()-1);
+ HSSFSeries series = lastChart.series.get(lastChart.series.size()-1);
series.seriesTitleText = str;
} else {
lastChart.chartTitleText = str;
}
}
- return (HSSFChart[])
- charts.toArray( new HSSFChart[charts.size()] );
+ return charts.toArray( new HSSFChart[charts.size()] );
}
/** Get the X offset of the chart */
* Returns the series of the chart
*/
public HSSFSeries[] getSeries() {
- return (HSSFSeries[])
- series.toArray(new HSSFSeries[series.size()]);
+ return series.toArray(new HSSFSeries[series.size()]);
}
/**
* @param minorUnit minor unit value; Double.NaN - automatic; null - no change
*/
public void setValueRange( int axisIndex, Double minimum, Double maximum, Double majorUnit, Double minorUnit){
- ValueRangeRecord valueRange = (ValueRangeRecord)valueRanges.get( axisIndex );
+ ValueRangeRecord valueRange = valueRanges.get( axisIndex );
if( valueRange == null ) return;
if( minimum != null ){
valueRange.setAutomaticMinimum(minimum.isNaN());
/**
* A series in a chart
*/
- public class HSSFSeries {
+ public static class HSSFSeries {
private SeriesRecord series;
private SeriesTextRecord seriesTitleText;
private LinkedDataRecord dataName;
newSeries = new HSSFSeries(seriesRecord);
newRecord = seriesRecord;
} else if (record instanceof LinkedDataRecord) {
- LinkedDataRecord linkedDataRecord = (LinkedDataRecord) ((LinkedDataRecord)record).clone();
+ LinkedDataRecord linkedDataRecord = ((LinkedDataRecord)record).clone();
if (newSeries != null) {
newSeries.insertData(linkedDataRecord);
}
newRecord = linkedDataRecord;
} else if (record instanceof DataFormatRecord) {
- DataFormatRecord dataFormatRecord = (DataFormatRecord) ((DataFormatRecord)record).clone();
+ DataFormatRecord dataFormatRecord = ((DataFormatRecord)record).clone();
dataFormatRecord.setSeriesIndex((short)seriesIdx) ;
dataFormatRecord.setSeriesNumber((short)seriesIdx) ;
return newSeries;
}
- public boolean removeSeries(HSSFSeries series) {
- int idx = 0;
+ public boolean removeSeries(HSSFSeries remSeries) {
int deep = 0;
int chartDeep = -1;
int lastSeriesDeep = -1;
Iterator<RecordBase> iter = records.iterator();
while (iter.hasNext()) {
RecordBase record = iter.next();
- idx++;
if (record instanceof BeginRecord) {
deep++;
}
} else if (record instanceof SeriesRecord) {
if (chartEntered) {
- if (series.series == record) {
+ if (remSeries.series == record) {
lastSeriesDeep = deep;
removeSeries = true;
} else {