📄 objrecord.java
字号:
/*********************************************************************
*
* Copyright (C) 2001 Andrew Khan
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
package jxl.biff.drawing;
import common.Logger;
import common.Assert;
import jxl.biff.WritableRecordData;
import jxl.biff.IntegerHelper;
import jxl.biff.Type;
import jxl.read.biff.Record;
/**
* A record which merely holds the OBJ data. Used when copying files which
* contain images
*/
public class ObjRecord extends WritableRecordData
{
/**
* The logger
*/
private final static Logger logger = Logger.getLogger(ObjRecord.class);
/**
* The object type
*/
private ObjType type;
/**
* Indicates whether this record was read in
*/
private boolean read;
/**
* The object id
*/
private int objectId;
/**
* Object type enumeration
*/
private static final class ObjType
{
public int value;
public String desc;
private static ObjType[] types = new ObjType[0];
ObjType(int v, String d)
{
value = v;
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 desc;
}
public static ObjType getType(int val)
{
ObjType retval = UNKNOWN;
for (int i = 0; i < types.length && retval == UNKNOWN ; i++)
{
if (types[i].value == val)
{
retval = types[i];
}
}
return retval;
}
}
// The object types
public static final ObjType TBD2 = new ObjType(0x01, "TBD2");
public static final ObjType TBD = new ObjType(0x02, "TBD");
public static final ObjType CHART = new ObjType(0x05, "Chart");
public static final ObjType TEXT = new ObjType(0x06, "Text");
public static final ObjType BUTTON = new ObjType(0x07, "Button");
public static final ObjType PICTURE = new ObjType(0x08, "Picture");
public static final ObjType CHECKBOX = new ObjType(0x0e, "Checkbox");
public static final ObjType OPTION = new ObjType(0x0c, "Option");
public static final ObjType EDITBOX = new ObjType(0x0d, "Edit Box");
public static final ObjType LABEL = new ObjType(0x0e, "Label");
public static final ObjType DIALOGUEBOX = new ObjType(0x0f, "Dialogue Box");
public static final ObjType LISTBOX = new ObjType(0x12, "List Box");
public static final ObjType GROUPBOX = new ObjType(0x13, "Group Box");
public static final ObjType COMBOBOX = new ObjType(0x14, "Combo Box");
public static final ObjType MSOFFICEDRAWING = new ObjType
(0x1e, "MS Office Drawing");
public static final ObjType FORMCONTROL =
new ObjType (0x14,"Form Combo Box");
public static final ObjType EXCELNOTE =
new ObjType (0x19,"Excel Note");
public static final ObjType UNKNOWN = new ObjType(0xff, "Unknown");
// Field sub records
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;
/**
* Constructs this object from the raw data
*
* @param t the raw data
*/
public ObjRecord(Record t)
{
super(t);
byte[] data = t.getData();
int objtype = IntegerHelper.getInt(data[4], data[5]);
read = true;
type = ObjType.getType(objtype);
objectId = IntegerHelper.getInt(data[6], data[7]);
}
/**
* Constructor
*
* @param objId the object id
* @param t the object type
*/
ObjRecord(int objId, ObjType t)
{
super(Type.OBJ);
objectId = objId;
type = t;
}
/**
* Expose the protected function to the SheetImpl in this package
*
* @return the raw record data
*/
public byte[] getData()
{
if (read)
{
return getRecord().getData();
}
if (type == PICTURE || type == CHART)
{
return getPictureData();
}
else if (type == EXCELNOTE)
{
return getNoteData();
}
else
{
Assert.verify(false);
}
return null;
}
/**
* Gets the ObjRecord subrecords for a picture
*/
private byte[] getPictureData()
{
int dataLength = COMMON_DATA_LENGTH +
CLIPBOARD_FORMAT_LENGTH +
PICTURE_OPTION_LENGTH +
END_LENGTH;
int pos = 0;
byte[] data = new byte[dataLength];
// The common data
// record id
IntegerHelper.getTwoBytes(0x15, data, pos);
// record length
IntegerHelper.getTwoBytes(COMMON_DATA_LENGTH-4, data, pos+2);
// object type
IntegerHelper.getTwoBytes(type.value, data, pos+4);
// object id
IntegerHelper.getTwoBytes(objectId, data, pos+6);
// the options
IntegerHelper.getTwoBytes(0x6011, data, pos+8);
pos += COMMON_DATA_LENGTH;
// The clipboard format
// record id
IntegerHelper.getTwoBytes(0x7, data, pos);
// record length
IntegerHelper.getTwoBytes(CLIPBOARD_FORMAT_LENGTH-4, data, pos+2);
// the data
IntegerHelper.getTwoBytes(0xffff, data, pos+4);
pos += CLIPBOARD_FORMAT_LENGTH;
// Picture option flags
// record id
IntegerHelper.getTwoBytes(0x8, data, pos);
// record length
IntegerHelper.getTwoBytes(PICTURE_OPTION_LENGTH-4, data, pos+2);
// the data
IntegerHelper.getTwoBytes(0x1, data, pos+4);
pos += CLIPBOARD_FORMAT_LENGTH;
// End
// record id
IntegerHelper.getTwoBytes(0x0, data, pos);
// record length
IntegerHelper.getTwoBytes(END_LENGTH-4, data, pos+2);
// the data
pos += END_LENGTH;
return data;
}
/**
* Gets the ObjRecord subrecords for a note
*/
private byte[] getNoteData()
{
int dataLength = COMMON_DATA_LENGTH +
NOTE_STRUCTURE_LENGTH +
END_LENGTH;
int pos = 0;
byte[] data = new byte[dataLength];
// The common data
// record id
IntegerHelper.getTwoBytes(0x15, data, pos);
// record length
IntegerHelper.getTwoBytes(COMMON_DATA_LENGTH-4, data, pos+2);
// object type
IntegerHelper.getTwoBytes(type.value, data, pos+4);
// object id
IntegerHelper.getTwoBytes(objectId, data, pos+6);
// the options
IntegerHelper.getTwoBytes(0x4011, data, pos+8);
pos += COMMON_DATA_LENGTH;
// The note structure
// record id
IntegerHelper.getTwoBytes(0xd, data, pos);
// record length
IntegerHelper.getTwoBytes(NOTE_STRUCTURE_LENGTH-4, data, pos+2);
// the data
pos += NOTE_STRUCTURE_LENGTH;
// End
// record id
IntegerHelper.getTwoBytes(0x0, data, pos);
// record length
IntegerHelper.getTwoBytes(END_LENGTH-4, data, pos+2);
// the data
pos += END_LENGTH;
return data;
}
/**
* Expose the protected function to the SheetImpl in this package
*
* @return the raw record data
*/
public Record getRecord()
{
return super.getRecord();
}
/**
* Accessor for the object type
*
* @return the object type
*/
public ObjType getType()
{
return type;
}
/**
* Accessor for the object id
*/
int getObjectId()
{
return objectId;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -