178 lines
5.0 KiB
Java
178 lines
5.0 KiB
Java
package jxl.biff.drawing;
|
|
|
|
import common.Assert;
|
|
import common.Logger;
|
|
import jxl.biff.IntegerHelper;
|
|
import jxl.biff.Type;
|
|
import jxl.biff.WritableRecordData;
|
|
import jxl.read.biff.Record;
|
|
|
|
public class ObjRecord extends WritableRecordData {
|
|
private static final Logger logger = Logger.getLogger(ObjRecord.class);
|
|
|
|
private ObjType type;
|
|
|
|
private boolean read;
|
|
|
|
private int objectId;
|
|
|
|
private static final class ObjType {
|
|
public int value;
|
|
|
|
public String desc;
|
|
|
|
private static ObjType[] types = new ObjType[0];
|
|
|
|
ObjType(int v, String d) {
|
|
this.value = v;
|
|
this.desc = d;
|
|
ObjType[] oldtypes = types;
|
|
types = new ObjType[types.length + 1];
|
|
System.arraycopy(oldtypes, 0, types, 0, oldtypes.length);
|
|
types[oldtypes.length] = this;
|
|
}
|
|
|
|
public String toString() {
|
|
return this.desc;
|
|
}
|
|
|
|
public static ObjType getType(int val) {
|
|
ObjType retval = ObjRecord.UNKNOWN;
|
|
for (int i = 0; i < types.length && retval == ObjRecord.UNKNOWN; i++) {
|
|
if ((types[i]).value == val)
|
|
retval = types[i];
|
|
}
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
public static final ObjType TBD2 = new ObjType(1, "TBD2");
|
|
|
|
public static final ObjType TBD = new ObjType(2, "TBD");
|
|
|
|
public static final ObjType CHART = new ObjType(5, "Chart");
|
|
|
|
public static final ObjType TEXT = new ObjType(6, "Text");
|
|
|
|
public static final ObjType BUTTON = new ObjType(7, "Button");
|
|
|
|
public static final ObjType PICTURE = new ObjType(8, "Picture");
|
|
|
|
public static final ObjType CHECKBOX = new ObjType(14, "Checkbox");
|
|
|
|
public static final ObjType OPTION = new ObjType(12, "Option");
|
|
|
|
public static final ObjType EDITBOX = new ObjType(13, "Edit Box");
|
|
|
|
public static final ObjType LABEL = new ObjType(14, "Label");
|
|
|
|
public static final ObjType DIALOGUEBOX = new ObjType(15, "Dialogue Box");
|
|
|
|
public static final ObjType LISTBOX = new ObjType(18, "List Box");
|
|
|
|
public static final ObjType GROUPBOX = new ObjType(19, "Group Box");
|
|
|
|
public static final ObjType COMBOBOX = new ObjType(20, "Combo Box");
|
|
|
|
public static final ObjType MSOFFICEDRAWING = new ObjType(30, "MS Office Drawing");
|
|
|
|
public static final ObjType FORMCONTROL = new ObjType(20, "Form Combo Box");
|
|
|
|
public static final ObjType EXCELNOTE = new ObjType(25, "Excel Note");
|
|
|
|
public static final ObjType UNKNOWN = new ObjType(255, "Unknown");
|
|
|
|
private static final int COMMON_DATA_LENGTH = 22;
|
|
|
|
private static final int CLIPBOARD_FORMAT_LENGTH = 6;
|
|
|
|
private static final int PICTURE_OPTION_LENGTH = 6;
|
|
|
|
private static final int NOTE_STRUCTURE_LENGTH = 26;
|
|
|
|
private static final int END_LENGTH = 4;
|
|
|
|
public ObjRecord(Record t) {
|
|
super(t);
|
|
byte[] data = t.getData();
|
|
int objtype = IntegerHelper.getInt(data[4], data[5]);
|
|
this.read = true;
|
|
this.type = ObjType.getType(objtype);
|
|
if (this.type == UNKNOWN)
|
|
logger.warn("unknown object type code " + objtype);
|
|
this.objectId = IntegerHelper.getInt(data[6], data[7]);
|
|
}
|
|
|
|
ObjRecord(int objId, ObjType t) {
|
|
super(Type.OBJ);
|
|
this.objectId = objId;
|
|
this.type = t;
|
|
}
|
|
|
|
public byte[] getData() {
|
|
if (this.read)
|
|
return getRecord().getData();
|
|
if (this.type == PICTURE || this.type == CHART)
|
|
return getPictureData();
|
|
if (this.type == EXCELNOTE)
|
|
return getNoteData();
|
|
Assert.verify(false);
|
|
return null;
|
|
}
|
|
|
|
private byte[] getPictureData() {
|
|
int dataLength = 38;
|
|
int pos = 0;
|
|
byte[] data = new byte[dataLength];
|
|
IntegerHelper.getTwoBytes(21, data, pos);
|
|
IntegerHelper.getTwoBytes(18, data, pos + 2);
|
|
IntegerHelper.getTwoBytes(this.type.value, data, pos + 4);
|
|
IntegerHelper.getTwoBytes(this.objectId, data, pos + 6);
|
|
IntegerHelper.getTwoBytes(24593, data, pos + 8);
|
|
pos += 22;
|
|
IntegerHelper.getTwoBytes(7, data, pos);
|
|
IntegerHelper.getTwoBytes(2, data, pos + 2);
|
|
IntegerHelper.getTwoBytes(65535, data, pos + 4);
|
|
pos += 6;
|
|
IntegerHelper.getTwoBytes(8, data, pos);
|
|
IntegerHelper.getTwoBytes(2, data, pos + 2);
|
|
IntegerHelper.getTwoBytes(1, data, pos + 4);
|
|
pos += 6;
|
|
IntegerHelper.getTwoBytes(0, data, pos);
|
|
IntegerHelper.getTwoBytes(0, data, pos + 2);
|
|
pos += 4;
|
|
return data;
|
|
}
|
|
|
|
private byte[] getNoteData() {
|
|
int dataLength = 52;
|
|
int pos = 0;
|
|
byte[] data = new byte[dataLength];
|
|
IntegerHelper.getTwoBytes(21, data, pos);
|
|
IntegerHelper.getTwoBytes(18, data, pos + 2);
|
|
IntegerHelper.getTwoBytes(this.type.value, data, pos + 4);
|
|
IntegerHelper.getTwoBytes(this.objectId, data, pos + 6);
|
|
IntegerHelper.getTwoBytes(16401, data, pos + 8);
|
|
pos += 22;
|
|
IntegerHelper.getTwoBytes(13, data, pos);
|
|
IntegerHelper.getTwoBytes(22, data, pos + 2);
|
|
pos += 26;
|
|
IntegerHelper.getTwoBytes(0, data, pos);
|
|
IntegerHelper.getTwoBytes(0, data, pos + 2);
|
|
pos += 4;
|
|
return data;
|
|
}
|
|
|
|
public Record getRecord() {
|
|
return super.getRecord();
|
|
}
|
|
|
|
public ObjType getType() {
|
|
return this.type;
|
|
}
|
|
|
|
int getObjectId() {
|
|
return this.objectId;
|
|
}
|
|
}
|