📄 drawing.java
字号:
/*********************************************************************
*
* Copyright (C) 2002 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 java.io.IOException;
import java.io.FileInputStream;
import common.Assert;
import common.Logger;
import jxl.Image;
import jxl.WorkbookSettings;
import jxl.biff.ByteData;
import jxl.biff.IntegerHelper;
import jxl.biff.IndexMapping;
import jxl.biff.Type;
import jxl.write.biff.File;
import jxl.biff.drawing.MsoDrawingRecord;
import jxl.biff.drawing.ObjRecord;
/**
* Contains the various biff records used to insert a drawing into a
* worksheet
*/
public class Drawing implements DrawingGroupObject, Image
{
/**
* The logger
*/
private static Logger logger = Logger.getLogger(Drawing.class);
/**
* The spContainer that was read in
*/
private EscherContainer readSpContainer;
/**
* The MsoDrawingRecord associated with the drawing
*/
private MsoDrawingRecord msoDrawingRecord;
/**
* The ObjRecord associated with the drawing
*/
private ObjRecord objRecord;
/**
* Initialized flag
*/
private boolean initialized = false;
/**
* The file containing the image
*/
private java.io.File imageFile;
/**
* The raw image data, used instead of an image file
*/
private byte[] imageData;
/**
* The object id, assigned by the drawing group
*/
private int objectId;
/**
* The blip id
*/
private int blipId;
/**
* The column position of the image
*/
private double x;
/**
* The row position of the image
*/
private double y;
/**
* The width of the image in cells
*/
private double width;
/**
* The height of the image in cells
*/
private double height;
/**
* The number of places this drawing is referenced
*/
private int referenceCount;
/**
* The top level escher container
*/
private EscherContainer escherData;
/**
* Where this image came from (read, written or a copy)
*/
private Origin origin;
/**
* The drawing group for all the images
*/
private DrawingGroup drawingGroup;
/**
* The drawing data
*/
private DrawingData drawingData;
/**
* The type of this drawing object
*/
private ShapeType type;
/**
* The shape id
*/
private int shapeId;
/**
* The drawing position on the sheet
*/
private int drawingNumber;
/**
* Constructor used when reading images
*
* @param mso the drawing record
* @param obj the object record
* @param dd the drawing data for all drawings on this sheet
* @param dg the drawing group
*/
public Drawing(MsoDrawingRecord mso, ObjRecord obj,
DrawingData dd,
DrawingGroup dg)
{
drawingGroup = dg;
msoDrawingRecord = mso;
drawingData = dd;
objRecord = obj;
initialized = false;
origin = Origin.READ;
drawingData.addData(msoDrawingRecord.getData());
drawingNumber = drawingData.getNumDrawings() - 1;
drawingGroup.addDrawing(this);
Assert.verify(mso != null && obj != null);
initialize();
}
/**
* Copy constructor used to copy drawings from read to write
*
* @param d the drawing to copy
*/
protected Drawing(DrawingGroupObject dgo, DrawingGroup dg)
{
Drawing d = (Drawing) dgo;
Assert.verify(d.origin == Origin.READ);
msoDrawingRecord = d.msoDrawingRecord;
objRecord = d.objRecord;
initialized = false;
origin = Origin.READ;
drawingData = d.drawingData;
drawingGroup = dg;
drawingNumber = d.drawingNumber;
drawingGroup.addDrawing(this);
}
/**
* Constructor invoked when writing the images
*
* @param x the column
* @param y the row
* @param width the width in cells
* @param height the height in cells
* @param image the image file
*/
public Drawing(double x, double y, double width, double height,
java.io.File image)
{
imageFile = image;
initialized = true;
origin = Origin.WRITE;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
referenceCount = 1;
type = ShapeType.PICTURE_FRAME;
}
/**
* Constructor invoked when writing the images
*
* @param x the column
* @param y the row
* @param width the width in cells
* @param height the height in cells
* @param image the image data
*/
public Drawing(double x, double y, double width, double height,
byte[] image)
{
imageData = image;
initialized = true;
origin = Origin.WRITE;
this.x = x;
this.y = y;
this.width = width;
this.height = height;
referenceCount = 1;
type = ShapeType.PICTURE_FRAME;
}
/**
* Initializes the member variables from the Escher stream data
*/
private void initialize()
{
readSpContainer = drawingData.getSpContainer(drawingNumber);
Assert.verify(readSpContainer != null);
EscherRecord[] children = readSpContainer.getChildren();
Sp sp = (Sp) readSpContainer.getChildren()[0];
shapeId = sp.getShapeId();
objectId = objRecord.getObjectId();
type = ShapeType.getType(sp.getShapeType());
if (type == ShapeType.UNKNOWN)
{
logger.warn("Unknown shape type");
}
Opt opt = (Opt) readSpContainer.getChildren()[1];
if (opt.getProperty(260) != null)
{
blipId = opt.getProperty(260).value;
}
if (opt.getProperty(261) != null)
{
imageFile = new java.io.File(opt.getProperty(261).stringValue);
}
else
{
if (type == ShapeType.PICTURE_FRAME)
{
logger.warn("no filename property for drawing");
imageFile = new java.io.File(Integer.toString(blipId));
}
}
ClientAnchor clientAnchor = null;
for (int i = 0 ; i < children.length && clientAnchor == null ; i++)
{
if (children[i].getType() == EscherRecordType.CLIENT_ANCHOR)
{
clientAnchor = (ClientAnchor) children[i];
}
}
if (clientAnchor == null)
{
logger.warn("client anchor not found");
}
else
{
x = clientAnchor.getX1();
y = clientAnchor.getY1();
width = clientAnchor.getX2() - x;
height = clientAnchor.getY2() - y;
}
if (blipId == 0)
{
logger.warn("linked drawings are not supported");
}
initialized = true;
}
/**
* Accessor for the image file
*
* @return the image file
*/
public java.io.File getImageFile()
{
return imageFile;
}
/**
* Accessor for the image file path. Normally this is the absolute path
* of a file on the directory system, but if this drawing was constructed
* using an byte[] then the blip id is returned
*
* @return the image file path, or the blip id
*/
public String getImageFilePath()
{
if (imageFile == null)
{
// return the blip id, if it exists
return blipId != 0 ? Integer.toString(blipId) : "__new__image__";
}
return imageFile.getPath();
}
/**
* Sets the object id. Invoked by the drawing group when the object is
* added to id
*
* @param objid the object id
* @param bip the blip id
* @param sid the shape id
*/
public final void setObjectId(int objid, int bip, int sid)
{
objectId = objid;
blipId = bip;
shapeId = shapeId;
if (origin == Origin.READ)
{
origin = Origin.READ_WRITE;
}
}
/**
* Accessor for the object id
*
* @return the object id
*/
public final int getObjectId()
{
if (!initialized)
{
initialize();
}
return objectId;
}
/**
* Accessor for the shape id
*
* @return the shape id
*/
public int getShapeId()
{
if (!initialized)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -