implemented creating shapes in new file using new model
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/gsoc2012@1358301 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4c43845491
commit
bbe479f069
@ -112,7 +112,7 @@ public class DrawingManager2
|
||||
/**
|
||||
* Finds the next available (1 based) drawing group id
|
||||
*/
|
||||
short findNewDrawingGroupId()
|
||||
public short findNewDrawingGroupId()
|
||||
{
|
||||
short dgId = 1;
|
||||
while ( drawingGroupExists( dgId ) )
|
||||
@ -147,4 +147,7 @@ public class DrawingManager2
|
||||
return dgg;
|
||||
}
|
||||
|
||||
public void incrementDrawingsSaved(){
|
||||
dgg.setDrawingsSaved(dgg.getDrawingsSaved()+1);
|
||||
}
|
||||
}
|
||||
|
@ -1497,7 +1497,7 @@ public final class InternalSheet {
|
||||
return -1;
|
||||
}
|
||||
|
||||
EscherAggregate aggregate = new EscherAggregate( drawingManager );
|
||||
EscherAggregate aggregate = new EscherAggregate();
|
||||
loc = findFirstRecordLocBySid(EscherAggregate.sid);
|
||||
if (loc == -1) {
|
||||
loc = findFirstRecordLocBySid( WindowTwoRecord.sid );
|
||||
|
@ -524,7 +524,7 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
pos += writeDataIntoDrawingRecord(0, drawingData, writtenEscherBytes, pos, data, i);
|
||||
}
|
||||
}
|
||||
if ((pos - offset) < buffer.length-1){
|
||||
if ((pos - offset) < buffer.length - 1) {
|
||||
byte[] drawingData = new byte[buffer.length - (pos - offset)];
|
||||
System.arraycopy(buffer, (pos - offset), drawingData, 0, drawingData.length);
|
||||
pos += writeDataIntoDrawingRecord(0, drawingData, writtenEscherBytes, pos, data, i);
|
||||
@ -613,8 +613,8 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
}
|
||||
|
||||
int drawingRecordSize = rawEscherSize + (shapeToObj.size()) * 4;
|
||||
if (rawEscherSize != 0 && spEndingOffsets.size()==1/**EMPTY**/){
|
||||
continueRecordsHeadersSize +=4;
|
||||
if (rawEscherSize != 0 && spEndingOffsets.size() == 1/**EMPTY**/) {
|
||||
continueRecordsHeadersSize += 4;
|
||||
}
|
||||
int objRecordSize = 0;
|
||||
for (Iterator iterator = shapeToObj.values().iterator(); iterator.hasNext(); ) {
|
||||
@ -1032,7 +1032,7 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
throw new IllegalArgumentException("Can not find client data record");
|
||||
}
|
||||
|
||||
private void buildBaseTree(){
|
||||
private void buildBaseTree() {
|
||||
EscherContainerRecord dgContainer = new EscherContainerRecord();
|
||||
EscherContainerRecord spgrContainer = new EscherContainerRecord();
|
||||
EscherContainerRecord spContainer1 = new EscherContainerRecord();
|
||||
@ -1044,7 +1044,7 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
dg.setRecordId( EscherDgRecord.RECORD_ID );
|
||||
short dgId = 1;
|
||||
dg.setOptions((short) (dgId << 4));
|
||||
dg.setNumShapes(1);
|
||||
dg.setNumShapes(0);
|
||||
dg.setLastMSOSPID(1024);
|
||||
drawingGroupId = dg.getDrawingGroupId();
|
||||
spgrContainer.setRecordId(EscherContainerRecord.SPGR_CONTAINER);
|
||||
@ -1059,7 +1059,7 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
spgr.setRectY2(255);
|
||||
sp1.setRecordId(EscherSpRecord.RECORD_ID);
|
||||
sp1.setOptions((short) 0x0002);
|
||||
sp1.setShapeId(1024);
|
||||
sp1.setShapeId(-1);
|
||||
sp1.setFlags(EscherSpRecord.FLAG_GROUP | EscherSpRecord.FLAG_PATRIARCH);
|
||||
dgContainer.addChildRecord(dg);
|
||||
dgContainer.addChildRecord(spgrContainer);
|
||||
@ -1069,6 +1069,19 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
addEscherRecord(dgContainer);
|
||||
}
|
||||
|
||||
public void setDgId(short dgId) {
|
||||
EscherContainerRecord dgContainer = getEscherContainer();
|
||||
EscherDgRecord dg = dgContainer.getChildById(EscherDgRecord.RECORD_ID);
|
||||
dg.setOptions((short) (dgId << 4));
|
||||
}
|
||||
|
||||
public void setMainSpRecordId(int shapeId){
|
||||
EscherContainerRecord dgContainer = getEscherContainer();
|
||||
EscherContainerRecord spContainer = (EscherContainerRecord) dgContainer.getChildById(EscherContainerRecord.SPGR_CONTAINER).getChild(0);
|
||||
EscherSpRecord sp = (EscherSpRecord) spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||
sp.setShapeId(shapeId);
|
||||
}
|
||||
|
||||
private void convertPatriarch(HSSFPatriarch patriarch) {
|
||||
EscherContainerRecord dgContainer = new EscherContainerRecord();
|
||||
EscherDgRecord dg;
|
||||
@ -1145,22 +1158,25 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return tails records. We need to access them when building shapes.
|
||||
* Every HSSFComment shape has a link to a NoteRecord from the tailRec collection.
|
||||
* Every HSSFComment shape has a link to a NoteRecord from the tailRec collection.
|
||||
*/
|
||||
public List<Record> getTailRecords(){
|
||||
public List<Record> getTailRecords() {
|
||||
return Collections.unmodifiableList(tailRec);
|
||||
}
|
||||
|
||||
public NoteRecord getNoteRecordByObj(ObjRecord obj){
|
||||
for (Record rec: tailRec){
|
||||
public NoteRecord getNoteRecordByObj(ObjRecord obj) {
|
||||
for (Record rec : tailRec) {
|
||||
NoteRecord note = (NoteRecord) rec;
|
||||
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) obj.getSubRecords().get(0);
|
||||
if (note.getShapeId() == cod.getObjectId()){
|
||||
if (note.getShapeId() == cod.getObjectId()) {
|
||||
return note;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void addTailRecord(NoteRecord note){
|
||||
tailRec.add(note);
|
||||
}
|
||||
}
|
||||
|
@ -68,6 +68,12 @@ public class HSSFComment extends HSSFTextbox implements Comment {
|
||||
_note = note;
|
||||
}
|
||||
|
||||
@Override
|
||||
void afterInsert(HSSFPatriarch patriarch) {
|
||||
super.afterInsert(patriarch);
|
||||
_patriarch._getBoundAggregate().addTailRecord(getNoteRecord());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ObjRecord createObjRecord() {
|
||||
ObjRecord obj = new ObjRecord();
|
||||
@ -96,7 +102,9 @@ public class HSSFComment extends HSSFTextbox implements Comment {
|
||||
@Override
|
||||
void setShapeId(int shapeId) {
|
||||
super.setShapeId(shapeId);
|
||||
_note.setShapeId(shapeId-1024);
|
||||
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) _objRecord.getSubRecords().get(0);
|
||||
cod.setObjectId((short) (shapeId));
|
||||
_note.setShapeId(shapeId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -38,10 +38,12 @@ import org.apache.poi.ss.usermodel.ClientAnchor;
|
||||
*/
|
||||
public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
private final List<HSSFShape> _shapes = new ArrayList<HSSFShape>();
|
||||
private int _x1 = 0;
|
||||
private int _y1 = 0 ;
|
||||
private int _x2 = 1023;
|
||||
private int _y2 = 255;
|
||||
// private int _x1 = 0;
|
||||
// private int _y1 = 0 ;
|
||||
// private int _x2 = 1023;
|
||||
// private int _y2 = 255;
|
||||
|
||||
private final EscherSpgrRecord _spgrRecord;
|
||||
|
||||
/**
|
||||
* The EscherAggregate we have been bound to.
|
||||
@ -59,6 +61,18 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
HSSFPatriarch(HSSFSheet sheet, EscherAggregate boundAggregate){
|
||||
_sheet = sheet;
|
||||
_boundAggregate = boundAggregate;
|
||||
EscherContainerRecord spContainer = (EscherContainerRecord) _boundAggregate.getEscherContainer()
|
||||
.getChildContainers().get(0).getChild(0);
|
||||
_spgrRecord = spContainer.getChildById(EscherSpgrRecord.RECORD_ID);
|
||||
buildShapeTree();
|
||||
}
|
||||
|
||||
public void afterCreate(){
|
||||
DrawingManager2 drawingManager = _sheet.getWorkbook().getWorkbook().getDrawingManager();
|
||||
short dgId = drawingManager.findNewDrawingGroupId();
|
||||
_boundAggregate.setDgId(dgId);
|
||||
_boundAggregate.setMainSpRecordId(newShapeId());
|
||||
drawingManager.incrementDrawingsSaved();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -234,17 +248,14 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
* to these coordinates.
|
||||
*/
|
||||
public void setCoordinates(int x1, int y1, int x2, int y2){
|
||||
_x1 = x1;
|
||||
_y1 = y1;
|
||||
_x2 = x2;
|
||||
_y2 = y2;
|
||||
_spgrRecord.setRectY1(y1);
|
||||
_spgrRecord.setRectY2(y2);
|
||||
_spgrRecord.setRectX1(x1);
|
||||
_spgrRecord.setRectX2(x2);
|
||||
}
|
||||
|
||||
int newShapeId() {
|
||||
if (_boundAggregate.getEscherContainer() == null){
|
||||
throw new IllegalStateException("We can use this method for only existing files");
|
||||
}
|
||||
DrawingManager2 dm = _boundAggregate.getDrawingManager();
|
||||
DrawingManager2 dm = _sheet.getWorkbook().getWorkbook().getDrawingManager();
|
||||
EscherDgRecord dg =
|
||||
_boundAggregate.getEscherContainer().getChildById(EscherDgRecord.RECORD_ID);
|
||||
short drawingGroupId = dg.getDrawingGroupId();
|
||||
@ -289,7 +300,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
*/
|
||||
public int getX1()
|
||||
{
|
||||
return _x1;
|
||||
return _spgrRecord.getRectX1();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -297,7 +308,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
*/
|
||||
public int getY1()
|
||||
{
|
||||
return _y1;
|
||||
return _spgrRecord.getRectY1();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -305,7 +316,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
*/
|
||||
public int getX2()
|
||||
{
|
||||
return _x2;
|
||||
return _spgrRecord.getRectX2();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -313,7 +324,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
*/
|
||||
public int getY2()
|
||||
{
|
||||
return _y2;
|
||||
return _spgrRecord.getRectY2();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -348,6 +359,9 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
|
||||
void buildShapeTree(){
|
||||
EscherContainerRecord dgContainer = _boundAggregate.getEscherContainer();
|
||||
if (dgContainer == null){
|
||||
return;
|
||||
}
|
||||
EscherContainerRecord spgrConrainer = dgContainer.getChildContainers().get(0);
|
||||
List<EscherContainerRecord> spgrChildren = spgrConrainer.getChildContainers();
|
||||
|
||||
|
@ -69,10 +69,13 @@ public class HSSFPolygon extends HSSFShape {
|
||||
opt.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEENDCAPSTYLE, false, false, 0x0));
|
||||
|
||||
opt.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
|
||||
opt.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
||||
opt.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
|
||||
opt.setEscherProperty(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
|
||||
opt.setEscherProperty(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
|
||||
opt.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0x0));
|
||||
opt.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 1));
|
||||
|
||||
opt.setEscherProperty(new EscherBoolProperty( EscherProperties.GROUPSHAPE__PRINT, 0x080000));
|
||||
|
||||
EscherRecord anchor = getAnchor().getEscherAnchor();
|
||||
clientData.setRecordId(EscherClientDataRecord.RECORD_ID);
|
||||
|
@ -248,6 +248,11 @@ public abstract class HSSFShape {
|
||||
*/
|
||||
public void setLineStyle(int lineStyle) {
|
||||
setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, lineStyle));
|
||||
if (getLineStyle() == HSSFShape.LINESTYLE_NONE){
|
||||
setPropertyValue(new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080000));
|
||||
} else {
|
||||
setPropertyValue( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -119,6 +119,9 @@ public class HSSFShapeFactory {
|
||||
case CommonObjectDataSubRecord.OBJECT_TYPE_RECTANGLE:
|
||||
shape = new HSSFSimpleShape(container, objRecord);
|
||||
break;
|
||||
case CommonObjectDataSubRecord.OBJECT_TYPE_LINE:
|
||||
shape = new HSSFSimpleShape(container, objRecord);
|
||||
break;
|
||||
case CommonObjectDataSubRecord.OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING:
|
||||
EscherOptRecord optRecord = container.getChildById(EscherOptRecord.RECORD_ID);
|
||||
EscherProperty property = optRecord.lookup(EscherProperties.GEOMETRY__VERTICES);
|
||||
|
@ -57,11 +57,7 @@ public class HSSFShapeGroup extends HSSFShape implements HSSFShapeContainer {
|
||||
|
||||
public HSSFShapeGroup(HSSFShape parent, HSSFAnchor anchor) {
|
||||
super(parent, anchor);
|
||||
_spgrRecord = new EscherSpgrRecord();
|
||||
_spgrRecord.setRectX1(0);
|
||||
_spgrRecord.setRectX2(1023);
|
||||
_spgrRecord.setRectY1(0);
|
||||
_spgrRecord.setRectY2(255);
|
||||
_spgrRecord = ((EscherContainerRecord)_escherContainer.getChild(0)).getChildById(EscherSpgrRecord.RECORD_ID);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -133,6 +129,8 @@ public class HSSFShapeGroup extends HSSFShape implements HSSFShapeContainer {
|
||||
shape.setShapeId(shapeId);
|
||||
_escherContainer.addChildRecord(spContainer);
|
||||
shape.afterInsert(_patriarch);
|
||||
EscherSpRecord sp = shape.getEscherContainer().getChildById(EscherSpRecord.RECORD_ID);
|
||||
sp.setFlags(sp.getFlags() | EscherSpRecord.FLAG_CHILD);
|
||||
}
|
||||
}
|
||||
|
||||
@ -296,7 +294,7 @@ public class HSSFShapeGroup extends HSSFShape implements HSSFShapeContainer {
|
||||
EscherSpRecord spRecord = containerRecord.getChildById(EscherSpRecord.RECORD_ID);
|
||||
spRecord.setShapeId(shapeId);
|
||||
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) _objRecord.getSubRecords().get(0);
|
||||
cod.setObjectId((short) (shapeId-1024));
|
||||
cod.setObjectId((short) (shapeId));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1683,7 +1683,8 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
|
||||
_sheet.aggregateDrawingRecords(_book.getDrawingManager(), true);
|
||||
EscherAggregate agg = (EscherAggregate) _sheet.findFirstRecordBySid(EscherAggregate.sid);
|
||||
_patriarch = new HSSFPatriarch(this, agg);
|
||||
agg.setPatriarch(_patriarch);
|
||||
_patriarch.afterCreate();
|
||||
// agg.setPatriarch(_patriarch);
|
||||
}
|
||||
}
|
||||
return _patriarch;
|
||||
@ -1738,7 +1739,7 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
|
||||
if(agg == null) return null;
|
||||
|
||||
_patriarch = new HSSFPatriarch(this, agg);
|
||||
_patriarch.buildShapeTree();
|
||||
// _patriarch.buildShapeTree();
|
||||
|
||||
//HSSFShapeFactory.createShapeTree();
|
||||
//agg.setPatriarch(_patriarch);
|
||||
|
@ -65,6 +65,7 @@ public class HSSFSimpleShape extends HSSFShape
|
||||
objTypeToShapeType.put(OBJECT_TYPE_RECTANGLE, HSSFShapeType.RECTANGLE.getType());
|
||||
objTypeToShapeType.put(OBJECT_TYPE_PICTURE, HSSFShapeType.PICTURE.getType());
|
||||
objTypeToShapeType.put(OBJECT_TYPE_LINE, HSSFShapeType.LINE.getType());
|
||||
objTypeToShapeType.put(OBJECT_TYPE_OVAL, HSSFShapeType.OVAL.getType());
|
||||
}
|
||||
|
||||
public HSSFSimpleShape(EscherContainerRecord spContainer, ObjRecord objRecord) {
|
||||
@ -93,10 +94,15 @@ public class HSSFSimpleShape extends HSSFShape
|
||||
|
||||
EscherOptRecord optRecord = new EscherOptRecord();
|
||||
optRecord.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
|
||||
optRecord.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
|
||||
optRecord.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
||||
// optRecord.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
|
||||
optRecord.setEscherProperty(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
|
||||
optRecord.setEscherProperty(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
|
||||
optRecord.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0x0));
|
||||
optRecord.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0));
|
||||
optRecord.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
||||
|
||||
optRecord.setEscherProperty( new EscherShapePathProperty( EscherProperties.GEOMETRY__SHAPEPATH, EscherShapePathProperty.COMPLEX ) );
|
||||
optRecord.setEscherProperty(new EscherBoolProperty( EscherProperties.GROUPSHAPE__PRINT, 0x080000));
|
||||
optRecord.setRecordId( EscherOptRecord.RECORD_ID );
|
||||
|
||||
spContainer.addChildRecord(sp);
|
||||
|
@ -119,11 +119,12 @@ public class HSSFTextbox extends HSSFSimpleShape {
|
||||
opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTBOTTOM, 0));
|
||||
|
||||
opt.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
|
||||
opt.setEscherProperty( new EscherBoolProperty( EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x00080008));
|
||||
opt.setEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
|
||||
opt.setEscherProperty(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
|
||||
opt.setEscherProperty(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
|
||||
opt.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0x0));
|
||||
|
||||
opt.setEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 1));
|
||||
opt.setEscherProperty(new EscherBoolProperty( EscherProperties.GROUPSHAPE__PRINT, 0x080000));
|
||||
|
||||
EscherRecord anchor = getAnchor().getEscherAnchor();
|
||||
clientData.setRecordId(EscherClientDataRecord.RECORD_ID);
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.apache.poi.hssf.usermodel.drawing;
|
||||
|
||||
import org.apache.poi.hssf.record.EscherAggregate;
|
||||
import org.apache.poi.hssf.usermodel.HSSFPicture;
|
||||
import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
|
||||
import org.apache.poi.hssf.usermodel.HSSFTextbox;
|
||||
@ -13,6 +14,7 @@ public enum HSSFShapeType {
|
||||
RECTANGLE((short)0x1, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_RECTANGLE),
|
||||
PICTURE((short)0x004B, HSSFPicture.class, HSSFSimpleShape.OBJECT_TYPE_PICTURE),
|
||||
LINE((short)0x14, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_LINE),
|
||||
OVAL(EscherAggregate.ST_ELLIPSE, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_OVAL),
|
||||
TEXT((short)202, HSSFTextbox.class, HSSFTextbox.OBJECT_TYPE_TEXT),
|
||||
ROUND_RECTANGLE((short)0x2, null, null);
|
||||
|
||||
|
@ -195,16 +195,35 @@ public class TestDrawingAggregate extends TestCase {
|
||||
}
|
||||
|
||||
public void testBuildBaseTree(){
|
||||
EscherAggregate agg = new EscherAggregate();
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
|
||||
HSSFPatriarch drawing = sheet.createDrawingPatriarch();
|
||||
EscherAggregate agg1 = HSSFTestHelper.getEscherAggregate(drawing);
|
||||
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
||||
EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);
|
||||
EscherAggregate agg1 = new EscherAggregate(new HSSFTestHelper.MockDrawingManager());
|
||||
EscherSpgrRecord spgr = new EscherSpgrRecord();
|
||||
spgr.setRectY1(0);
|
||||
spgr.setRectY2(255);
|
||||
spgr.setRectX1(0);
|
||||
spgr.setRectX2(1023);
|
||||
EscherContainerRecord spContainer = new EscherContainerRecord();
|
||||
spContainer.addChildRecord(spgr);
|
||||
EscherContainerRecord spgrContainer = new EscherContainerRecord();
|
||||
spgrContainer.addChildRecord(spContainer);
|
||||
EscherContainerRecord dgContainer = new EscherContainerRecord();
|
||||
dgContainer.addChildRecord(spgrContainer);
|
||||
agg1.addEscherRecord(dgContainer);
|
||||
agg1.setPatriarch(HSSFTestHelper.createTestPatriarch(sheet, agg1));
|
||||
agg1.clear();
|
||||
HSSFTestHelper.callConvertPatriarch(agg1);
|
||||
agg1.setPatriarch(null);
|
||||
|
||||
|
||||
agg.setPatriarch(null);
|
||||
//
|
||||
EscherSpRecord sp = (EscherSpRecord) agg.getEscherContainer().getChildContainers().get(0).getChild(0).getChild(1);
|
||||
sp.setShapeId(1025);
|
||||
EscherDgRecord dg = (EscherDgRecord) agg.getEscherContainer().getChild(0);
|
||||
dg.setNumShapes(1);
|
||||
dg.setOptions((short) (1 << 4));
|
||||
|
||||
byte[] aggS = agg.serialize();
|
||||
byte []agg1S = agg1.serialize();
|
||||
|
@ -324,4 +324,14 @@ public class TestDrawingShapes extends TestCase {
|
||||
textbox.setLineStyleColor(textbox.getLineStyleColor());
|
||||
assertEquals(opt1Str, textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID).toXml());
|
||||
}
|
||||
|
||||
public void testDgRecordNumShapes(){
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
||||
|
||||
EscherAggregate aggregate = HSSFTestHelper.getEscherAggregate(patriarch);
|
||||
EscherDgRecord dgRecord = (EscherDgRecord) aggregate.getEscherRecord(0).getChild(0);
|
||||
assertEquals(dgRecord.getNumShapes(), 1);
|
||||
}
|
||||
}
|
||||
|
@ -16,9 +16,7 @@
|
||||
==================================================================== */
|
||||
|
||||
package org.apache.poi.hssf.usermodel;
|
||||
import org.apache.poi.ddf.EscherContainerRecord;
|
||||
import org.apache.poi.ddf.EscherDggRecord;
|
||||
import org.apache.poi.ddf.EscherOptRecord;
|
||||
import org.apache.poi.ddf.*;
|
||||
import org.apache.poi.hssf.model.DrawingManager2;
|
||||
import org.apache.poi.hssf.model.InternalSheet;
|
||||
import org.apache.poi.hssf.model.InternalWorkbook;
|
||||
@ -26,6 +24,7 @@ import org.apache.poi.hssf.record.EscherAggregate;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -35,11 +34,7 @@ import java.util.Map;
|
||||
*/
|
||||
public class HSSFTestHelper {
|
||||
|
||||
private static class MockDrawingManager extends DrawingManager2 {
|
||||
//
|
||||
// public MockDrawingManager(EscherDggRecord dgg) {
|
||||
// super(dgg);
|
||||
// }
|
||||
public static class MockDrawingManager extends DrawingManager2 {
|
||||
|
||||
public MockDrawingManager (){
|
||||
super(null);
|
||||
@ -47,7 +42,22 @@ public class HSSFTestHelper {
|
||||
|
||||
@Override
|
||||
public int allocateShapeId(short drawingGroupId) {
|
||||
return 0; //Mock value
|
||||
return 1025; //Mock value
|
||||
}
|
||||
|
||||
@Override
|
||||
public int allocateShapeId(short drawingGroupId, EscherDgRecord dg) {
|
||||
return 1025;
|
||||
}
|
||||
|
||||
public EscherDgRecord createDgRecord()
|
||||
{
|
||||
EscherDgRecord dg = new EscherDgRecord();
|
||||
dg.setRecordId( EscherDgRecord.RECORD_ID );
|
||||
dg.setOptions( (short) (16) );
|
||||
dg.setNumShapes( 1 );
|
||||
dg.setLastMSOSPID( 1024 );
|
||||
return dg;
|
||||
}
|
||||
}
|
||||
/**
|
||||
|
@ -5,10 +5,7 @@ import org.apache.poi.ddf.EscherSpRecord;
|
||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||
import org.apache.poi.hssf.model.CommentShape;
|
||||
import org.apache.poi.hssf.model.HSSFTestModelHelper;
|
||||
import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
|
||||
import org.apache.poi.hssf.record.NoteRecord;
|
||||
import org.apache.poi.hssf.record.ObjRecord;
|
||||
import org.apache.poi.hssf.record.TextObjectRecord;
|
||||
import org.apache.poi.hssf.record.*;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
@ -29,7 +26,7 @@ public class TestComment extends TestCase {
|
||||
HSSFCell cell = row.createCell(0);
|
||||
cell.setCellComment(comment);
|
||||
|
||||
CommentShape commentShape = HSSFTestModelHelper.createCommentShape(0, comment);
|
||||
CommentShape commentShape = HSSFTestModelHelper.createCommentShape(1025, comment);
|
||||
|
||||
assertEquals(comment.getEscherContainer().getChildRecords().size(), 5);
|
||||
assertEquals(commentShape.getSpContainer().getChildRecords().size(), 5);
|
||||
@ -207,12 +204,16 @@ public class TestComment extends TestCase {
|
||||
HSSFSheet sh = wb.createSheet();
|
||||
HSSFPatriarch patriarch = sh.createDrawingPatriarch();
|
||||
|
||||
EscherAggregate agg = HSSFTestHelper.getEscherAggregate(patriarch);
|
||||
assertEquals(agg.getTailRecords().size(), 0);
|
||||
|
||||
HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
|
||||
assertEquals(agg.getTailRecords().size(), 1);
|
||||
|
||||
HSSFSimpleShape shape = patriarch.createSimpleShape(new HSSFClientAnchor());
|
||||
|
||||
//5 properties of HSSFShape + 8 of HSSFTextbox
|
||||
assertEquals(comment._optRecord.getEscherProperties().size(), 13);
|
||||
//6 properties of HSSFShape + 8 of HSSFTextbox
|
||||
assertEquals(comment._optRecord.getEscherProperties().size(), 14);
|
||||
}
|
||||
|
||||
public void testShapeId(){
|
||||
@ -232,10 +233,10 @@ public class TestComment extends TestCase {
|
||||
assertEquals(comment.getShapeId(), 2024);
|
||||
|
||||
CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) comment.getObjRecord().getSubRecords().get(0);
|
||||
assertEquals(cod.getObjectId(), 1000);
|
||||
assertEquals(cod.getObjectId(), 2024);
|
||||
EscherSpRecord spRecord = (EscherSpRecord) comment.getEscherContainer().getChild(0);
|
||||
assertEquals(spRecord.getShapeId(), 2024);
|
||||
assertEquals(comment.getShapeId(), 2024);
|
||||
assertEquals(comment.getNoteRecord().getShapeId(), 1000);
|
||||
assertEquals(comment.getNoteRecord().getShapeId(), 2024);
|
||||
}
|
||||
}
|
||||
|
@ -2,9 +2,11 @@ package org.apache.poi.hssf.usermodel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.poi.ddf.EscherContainerRecord;
|
||||
import org.apache.poi.ddf.EscherSpgrRecord;
|
||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||
import org.apache.poi.hssf.record.ObjRecord;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@ -222,4 +224,29 @@ public class TestShapeGroup extends TestCase{
|
||||
|
||||
group.getShapeId();
|
||||
}
|
||||
|
||||
public void testSpgrRecord(){
|
||||
HSSFWorkbook wb = new HSSFWorkbook();
|
||||
|
||||
// create a sheet with a text box
|
||||
HSSFSheet sheet = wb.createSheet();
|
||||
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
|
||||
|
||||
HSSFShapeGroup group = patriarch.createGroup(new HSSFClientAnchor());
|
||||
assertSame(((EscherContainerRecord)group.getEscherContainer().getChild(0)).getChildById(EscherSpgrRecord.RECORD_ID), getSpgrRecord(group));
|
||||
}
|
||||
|
||||
private static EscherSpgrRecord getSpgrRecord(HSSFShapeGroup group) {
|
||||
Field spgrField = null;
|
||||
try {
|
||||
spgrField = group.getClass().getDeclaredField("_spgrRecord");
|
||||
spgrField.setAccessible(true);
|
||||
return (EscherSpgrRecord) spgrField.get(group);
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ public class TestText extends TestCase {
|
||||
HSSFSheet sh = wb.createSheet();
|
||||
HSSFPatriarch patriarch = sh.createDrawingPatriarch();
|
||||
HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());
|
||||
TextboxShape textboxShape = HSSFTestModelHelper.createTextboxShape(0, textbox);
|
||||
TextboxShape textboxShape = HSSFTestModelHelper.createTextboxShape(1025, textbox);
|
||||
|
||||
assertEquals(textbox.getEscherContainer().getChildRecords().size(), 5);
|
||||
assertEquals(textboxShape.getSpContainer().getChildRecords().size(), 5);
|
||||
@ -52,7 +52,6 @@ public class TestText extends TestCase {
|
||||
assertTrue(Arrays.equals(expected, actual));
|
||||
|
||||
ObjRecord obj = textbox.getObjRecord();
|
||||
((CommonObjectDataSubRecord) obj.getSubRecords().get(0)).setObjectId(-1024);
|
||||
ObjRecord objShape = textboxShape.getObjRecord();
|
||||
|
||||
expected = obj.serialize();
|
||||
|
Loading…
Reference in New Issue
Block a user