94 lines
3.0 KiB
Java
94 lines
3.0 KiB
Java
package jxl.biff.drawing;
|
|
|
|
import common.Assert;
|
|
import common.Logger;
|
|
import java.util.ArrayList;
|
|
|
|
public class DrawingData implements EscherStream {
|
|
private static Logger logger = Logger.getLogger(DrawingData.class);
|
|
|
|
private int numDrawings = 0;
|
|
|
|
private byte[] drawingData = null;
|
|
|
|
private boolean initialized = false;
|
|
|
|
private EscherRecord[] spContainers;
|
|
|
|
private void initialize() {
|
|
EscherRecordData er = new EscherRecordData(this, 0);
|
|
Assert.verify(er.isContainer());
|
|
EscherContainer dgContainer = new EscherContainer(er);
|
|
EscherRecord[] children = dgContainer.getChildren();
|
|
children = dgContainer.getChildren();
|
|
EscherContainer spgrContainer = null;
|
|
for (int i = 0; i < children.length && spgrContainer == null; i++) {
|
|
EscherRecord child = children[i];
|
|
if (child.getType() == EscherRecordType.SPGR_CONTAINER)
|
|
spgrContainer = (EscherContainer)child;
|
|
}
|
|
Assert.verify((spgrContainer != null));
|
|
EscherRecord[] spgrChildren = spgrContainer.getChildren();
|
|
boolean nestedContainers = false;
|
|
for (int j = 0; j < spgrChildren.length && !nestedContainers; j++) {
|
|
if (spgrChildren[j].getType() == EscherRecordType.SPGR_CONTAINER)
|
|
nestedContainers = true;
|
|
}
|
|
if (!nestedContainers) {
|
|
this.spContainers = spgrChildren;
|
|
} else {
|
|
ArrayList sps = new ArrayList();
|
|
getSpContainers(spgrContainer, sps);
|
|
this.spContainers = new EscherRecord[sps.size()];
|
|
this.spContainers = (EscherRecord[])sps.toArray((Object[])this.spContainers);
|
|
}
|
|
this.initialized = true;
|
|
}
|
|
|
|
private void getSpContainers(EscherContainer spgrContainer, ArrayList sps) {
|
|
EscherRecord[] spgrChildren = spgrContainer.getChildren();
|
|
for (int i = 0; i < spgrChildren.length; i++) {
|
|
if (spgrChildren[i].getType() == EscherRecordType.SP_CONTAINER) {
|
|
sps.add(spgrChildren[i]);
|
|
} else if (spgrChildren[i].getType() == EscherRecordType.SPGR_CONTAINER) {
|
|
getSpContainers((EscherContainer)spgrChildren[i], sps);
|
|
} else {
|
|
logger.warn("Spgr Containers contains a record other than Sp/Spgr containers");
|
|
}
|
|
}
|
|
}
|
|
|
|
public void addData(byte[] data) {
|
|
addRawData(data);
|
|
this.numDrawings++;
|
|
}
|
|
|
|
public void addRawData(byte[] data) {
|
|
if (this.drawingData == null) {
|
|
this.drawingData = data;
|
|
return;
|
|
}
|
|
byte[] newArray = new byte[this.drawingData.length + data.length];
|
|
System.arraycopy(this.drawingData, 0, newArray, 0, this.drawingData.length);
|
|
System.arraycopy(data, 0, newArray, this.drawingData.length, data.length);
|
|
this.drawingData = newArray;
|
|
this.initialized = false;
|
|
}
|
|
|
|
final int getNumDrawings() {
|
|
return this.numDrawings;
|
|
}
|
|
|
|
EscherContainer getSpContainer(int drawingNum) {
|
|
if (!this.initialized)
|
|
initialize();
|
|
EscherContainer spContainer = (EscherContainer)this.spContainers[drawingNum + 1];
|
|
Assert.verify((spContainer != null));
|
|
return spContainer;
|
|
}
|
|
|
|
public byte[] getData() {
|
|
return this.drawingData;
|
|
}
|
|
}
|