added support for HSSFPicture in HSSFShapeFactory, fixed bugs, added tests

git-svn-id: https://svn.apache.org/repos/asf/poi/branches/gsoc2012@1352818 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Evgeniy Berlog 2012-06-22 09:37:17 +00:00
parent 93b0bb98bf
commit 7efc80c3e8
10 changed files with 405 additions and 69 deletions

View File

@ -38,10 +38,6 @@ public class EscherRGBProperty
return propertyValue; return propertyValue;
} }
public void setRgbColor(int color){
this.propertyValue = color;
}
public byte getRed() public byte getRed()
{ {
return (byte) ( propertyValue & 0xFF ); return (byte) ( propertyValue & 0xFF );

View File

@ -80,10 +80,6 @@ public class EscherSimpleProperty extends EscherProperty
return propertyValue; return propertyValue;
} }
public void setPropertyValue(int propertyValue) {
this.propertyValue = propertyValue;
}
/** /**
* Returns true if one escher property is equal to another. * Returns true if one escher property is equal to another.
*/ */

View File

@ -315,6 +315,10 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
*/ */
private List<Record> tailRec = new ArrayList<Record>(); private List<Record> tailRec = new ArrayList<Record>();
public EscherAggregate() {
buildBaseTree();
}
public EscherAggregate(DrawingManager2 drawingManager) { public EscherAggregate(DrawingManager2 drawingManager) {
this.drawingManager = drawingManager; this.drawingManager = drawingManager;
} }
@ -634,7 +638,6 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
public void setPatriarch(HSSFPatriarch patriarch) { public void setPatriarch(HSSFPatriarch patriarch) {
this.patriarch = patriarch; this.patriarch = patriarch;
convertPatriarch(patriarch);
} }
/** /**
@ -1025,6 +1028,43 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
throw new IllegalArgumentException("Can not find client data record"); throw new IllegalArgumentException("Can not find client data record");
} }
private void buildBaseTree(){
EscherContainerRecord dgContainer = new EscherContainerRecord();
EscherContainerRecord spgrContainer = new EscherContainerRecord();
EscherContainerRecord spContainer1 = new EscherContainerRecord();
EscherSpgrRecord spgr = new EscherSpgrRecord();
EscherSpRecord sp1 = new EscherSpRecord();
dgContainer.setRecordId(EscherContainerRecord.DG_CONTAINER);
dgContainer.setOptions((short) 0x000F);
EscherDgRecord dg = new EscherDgRecord();
dg.setRecordId( EscherDgRecord.RECORD_ID );
short dgId = 1;
dg.setOptions( (short) ( dgId << 4 ) );
dg.setNumShapes( 1 );
dg.setLastMSOSPID( 1024 );
drawingGroupId = dg.getDrawingGroupId();
spgrContainer.setRecordId(EscherContainerRecord.SPGR_CONTAINER);
spgrContainer.setOptions((short) 0x000F);
spContainer1.setRecordId(EscherContainerRecord.SP_CONTAINER);
spContainer1.setOptions((short) 0x000F);
spgr.setRecordId(EscherSpgrRecord.RECORD_ID);
spgr.setOptions((short) 0x0001); // version
spgr.setRectX1(0);
spgr.setRectY1(0);
spgr.setRectX2(1023);
spgr.setRectY2(255);
sp1.setRecordId(EscherSpRecord.RECORD_ID);
sp1.setOptions((short) 0x0002);
sp1.setShapeId(1024);
sp1.setFlags(EscherSpRecord.FLAG_GROUP | EscherSpRecord.FLAG_PATRIARCH);
dgContainer.addChildRecord(dg);
dgContainer.addChildRecord(spgrContainer);
spgrContainer.addChildRecord(spContainer1);
spContainer1.addChildRecord(spgr);
spContainer1.addChildRecord(sp1);
addEscherRecord(dgContainer);
}
private void convertPatriarch(HSSFPatriarch patriarch) { private void convertPatriarch(HSSFPatriarch patriarch) {
EscherContainerRecord dgContainer = new EscherContainerRecord(); EscherContainerRecord dgContainer = new EscherContainerRecord();
EscherDgRecord dg; EscherDgRecord dg;

View File

@ -20,8 +20,8 @@ package org.apache.poi.hssf.usermodel;
import java.awt.Dimension; import java.awt.Dimension;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.*;
import org.apache.poi.ddf.EscherBlipRecord; import org.apache.poi.hssf.record.ObjRecord;
import org.apache.poi.ss.usermodel.Picture; import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.util.ImageUtils; import org.apache.poi.ss.util.ImageUtils;
import org.apache.poi.hssf.model.InternalWorkbook; import org.apache.poi.hssf.model.InternalWorkbook;
@ -54,7 +54,9 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
*/ */
private static final int PX_ROW = 15; private static final int PX_ROW = 15;
private int _pictureIndex; public HSSFPicture(EscherContainerRecord spContainer, ObjRecord objRecord) {
super(spContainer, objRecord);
}
/** /**
* Constructs a picture object. * Constructs a picture object.
@ -67,12 +69,16 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
public int getPictureIndex() public int getPictureIndex()
{ {
return _pictureIndex; EscherSimpleProperty property = _optRecord.lookup(EscherProperties.BLIP__BLIPTODISPLAY);
if (null == property){
return -1;
}
return property.getPropertyValue();
} }
public void setPictureIndex( int pictureIndex ) public void setPictureIndex( int pictureIndex )
{ {
this._pictureIndex = pictureIndex; setPropertyValue(new EscherSimpleProperty( EscherProperties.BLIP__BLIPTODISPLAY, false, true, pictureIndex));
} }
/** /**
@ -215,7 +221,7 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
* @return image dimension * @return image dimension
*/ */
public Dimension getImageDimension(){ public Dimension getImageDimension(){
EscherBSERecord bse = _patriarch._sheet._book.getBSERecord(_pictureIndex); EscherBSERecord bse = _patriarch._sheet._book.getBSERecord(getPictureIndex());
byte[] data = bse.getBlipRecord().getPicturedata(); byte[] data = bse.getBlipRecord().getPicturedata();
int type = bse.getBlipTypeWin32(); int type = bse.getBlipTypeWin32();
return ImageUtils.getImageDimension(new ByteArrayInputStream(data), type); return ImageUtils.getImageDimension(new ByteArrayInputStream(data), type);
@ -228,7 +234,7 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
*/ */
public HSSFPictureData getPictureData(){ public HSSFPictureData getPictureData(){
InternalWorkbook iwb = _patriarch._sheet.getWorkbook().getWorkbook(); InternalWorkbook iwb = _patriarch._sheet.getWorkbook().getWorkbook();
EscherBlipRecord blipRecord = iwb.getBSERecord(_pictureIndex).getBlipRecord(); EscherBlipRecord blipRecord = iwb.getBSERecord(getPictureIndex()).getBlipRecord();
return new HSSFPictureData(blipRecord); return new HSSFPictureData(blipRecord);
} }
} }

View File

@ -30,6 +30,7 @@ public abstract class HSSFShape {
public static final int LINEWIDTH_DEFAULT = 9525; public static final int LINEWIDTH_DEFAULT = 9525;
public static final int LINESTYLE__COLOR_DEFAULT = 0x08000040; public static final int LINESTYLE__COLOR_DEFAULT = 0x08000040;
public static final int FILL__FILLCOLOR_DEFAULT = 0x08000009; public static final int FILL__FILLCOLOR_DEFAULT = 0x08000009;
public static final boolean NO_FILL_DEFAULT = true;
public static final int LINESTYLE_SOLID = 0; // Solid (continuous) pen public static final int LINESTYLE_SOLID = 0; // Solid (continuous) pen
public static final int LINESTYLE_DASHSYS = 1; // PS_DASH system dash style public static final int LINESTYLE_DASHSYS = 1; // PS_DASH system dash style
@ -44,6 +45,8 @@ public abstract class HSSFShape {
public static final int LINESTYLE_LONGDASHDOTDOTGEL = 10; // long dash short dash short dash public static final int LINESTYLE_LONGDASHDOTDOTGEL = 10; // long dash short dash short dash
public static final int LINESTYLE_NONE = -1; public static final int LINESTYLE_NONE = -1;
public static final int LINESTYLE_DEFAULT = LINESTYLE_NONE;
// TODO - make all these fields private // TODO - make all these fields private
HSSFShape parent; HSSFShape parent;
HSSFAnchor anchor; HSSFAnchor anchor;
@ -108,11 +111,20 @@ public abstract class HSSFShape {
* @see HSSFClientAnchor * @see HSSFClientAnchor
*/ */
public void setAnchor(HSSFAnchor anchor) { public void setAnchor(HSSFAnchor anchor) {
int i = 0;
int recordId = -1;
if (parent == null) { if (parent == null) {
if (anchor instanceof HSSFChildAnchor) if (anchor instanceof HSSFChildAnchor)
throw new IllegalArgumentException("Must use client anchors for shapes directly attached to sheet."); throw new IllegalArgumentException("Must use client anchors for shapes directly attached to sheet.");
EscherClientAnchorRecord anch = _escherContainer.getChildById(EscherClientAnchorRecord.RECORD_ID); EscherClientAnchorRecord anch = _escherContainer.getChildById(EscherClientAnchorRecord.RECORD_ID);
if (null != anch) { if (null != anch) {
for (i=0; i< _escherContainer.getChildRecords().size(); i++){
if (_escherContainer.getChild(i).getRecordId() == EscherClientAnchorRecord.RECORD_ID){
if (i != _escherContainer.getChildRecords().size() -1){
recordId = _escherContainer.getChild(i+1).getRecordId();
}
}
}
_escherContainer.removeChildRecord(anch); _escherContainer.removeChildRecord(anch);
} }
} else { } else {
@ -120,10 +132,21 @@ public abstract class HSSFShape {
throw new IllegalArgumentException("Must use child anchors for shapes attached to groups."); throw new IllegalArgumentException("Must use child anchors for shapes attached to groups.");
EscherChildAnchorRecord anch = _escherContainer.getChildById(EscherChildAnchorRecord.RECORD_ID); EscherChildAnchorRecord anch = _escherContainer.getChildById(EscherChildAnchorRecord.RECORD_ID);
if (null != anch) { if (null != anch) {
for (i=0; i< _escherContainer.getChildRecords().size(); i++){
if (_escherContainer.getChild(i).getRecordId() == EscherChildAnchorRecord.RECORD_ID){
if (i != _escherContainer.getChildRecords().size() -1){
recordId = _escherContainer.getChild(i+1).getRecordId();
}
}
}
_escherContainer.removeChildRecord(anch); _escherContainer.removeChildRecord(anch);
} }
} }
_escherContainer.addChildRecord(anchor.getEscherAnchor()); if (-1 == recordId){
_escherContainer.addChildRecord(anchor.getEscherAnchor());
} else {
_escherContainer.addChildBefore(anchor.getEscherAnchor(), recordId);
}
this.anchor = anchor; this.anchor = anchor;
} }
@ -139,13 +162,7 @@ public abstract class HSSFShape {
* The color applied to the lines of this shape. * The color applied to the lines of this shape.
*/ */
public void setLineStyleColor(int lineStyleColor) { public void setLineStyleColor(int lineStyleColor) {
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.LINESTYLE__COLOR); setPropertyValue(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor));
if (null == rgbProperty) {
rgbProperty = new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor);
_optRecord.addEscherProperty(rgbProperty);
} else {
rgbProperty.setRgbColor(lineStyleColor);
}
} }
/** /**
@ -153,13 +170,7 @@ public abstract class HSSFShape {
*/ */
public void setLineStyleColor(int red, int green, int blue) { public void setLineStyleColor(int red, int green, int blue) {
int lineStyleColor = ((blue) << 16) | ((green) << 8) | red; int lineStyleColor = ((blue) << 16) | ((green) << 8) | red;
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.LINESTYLE__COLOR); setPropertyValue(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor));
if (null == rgbProperty) {
rgbProperty = new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor);
_optRecord.addEscherProperty(rgbProperty);
} else {
rgbProperty.setRgbColor(lineStyleColor);
}
} }
/** /**
@ -174,13 +185,7 @@ public abstract class HSSFShape {
* The color used to fill this shape. * The color used to fill this shape.
*/ */
public void setFillColor(int fillColor) { public void setFillColor(int fillColor) {
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.FILL__FILLCOLOR); setPropertyValue(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor));
if (null == rgbProperty) {
rgbProperty = new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor);
_optRecord.addEscherProperty(rgbProperty);
} else {
rgbProperty.setRgbColor(fillColor);
}
} }
/** /**
@ -188,13 +193,7 @@ public abstract class HSSFShape {
*/ */
public void setFillColor(int red, int green, int blue) { public void setFillColor(int red, int green, int blue) {
int fillColor = ((blue) << 16) | ((green) << 8) | red; int fillColor = ((blue) << 16) | ((green) << 8) | red;
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.FILL__FILLCOLOR); setPropertyValue(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor));
if (null == rgbProperty) {
rgbProperty = new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor);
_optRecord.addEscherProperty(rgbProperty);
} else {
rgbProperty.setRgbColor(fillColor);
}
} }
/** /**
@ -202,7 +201,7 @@ public abstract class HSSFShape {
*/ */
public int getLineWidth() { public int getLineWidth() {
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEWIDTH); EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEWIDTH);
return property.getPropertyValue(); return property == null ? LINEWIDTH_DEFAULT: property.getPropertyValue();
} }
/** /**
@ -212,13 +211,7 @@ public abstract class HSSFShape {
* @see HSSFShape#LINEWIDTH_ONE_PT * @see HSSFShape#LINEWIDTH_ONE_PT
*/ */
public void setLineWidth(int lineWidth) { public void setLineWidth(int lineWidth) {
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEWIDTH); setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, lineWidth));
if (null == property) {
property = new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, lineWidth);
_optRecord.addEscherProperty(property);
} else {
property.setPropertyValue(lineWidth);
}
} }
/** /**
@ -227,7 +220,7 @@ public abstract class HSSFShape {
public int getLineStyle() { public int getLineStyle() {
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEDASHING); EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEDASHING);
if (null == property){ if (null == property){
return -1; return LINESTYLE_DEFAULT;
} }
return property.getPropertyValue(); return property.getPropertyValue();
} }
@ -238,13 +231,7 @@ public abstract class HSSFShape {
* @param lineStyle One of the constants in LINESTYLE_* * @param lineStyle One of the constants in LINESTYLE_*
*/ */
public void setLineStyle(int lineStyle) { public void setLineStyle(int lineStyle) {
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEDASHING); setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, lineStyle));
if (null == property) {
property = new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, lineStyle);
_optRecord.addEscherProperty(property);
} else {
property.setPropertyValue(lineStyle);
}
} }
/** /**
@ -252,19 +239,29 @@ public abstract class HSSFShape {
*/ */
public boolean isNoFill() { public boolean isNoFill() {
EscherBoolProperty property = _optRecord.lookup(EscherProperties.FILL__NOFILLHITTEST); EscherBoolProperty property = _optRecord.lookup(EscherProperties.FILL__NOFILLHITTEST);
return property.isTrue(); return property == null ? NO_FILL_DEFAULT : property.isTrue();
} }
/** /**
* Sets whether this shape is filled or transparent. * Sets whether this shape is filled or transparent.
*/ */
public void setNoFill(boolean noFill) { public void setNoFill(boolean noFill) {
EscherBoolProperty property = _optRecord.lookup(EscherProperties.FILL__NOFILLHITTEST); setPropertyValue(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, noFill ? 1 : 0));
if (null == property) { }
property = new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, noFill ? 1 : 0);
protected void setPropertyValue(EscherProperty property){
if (null == _optRecord.lookup(property.getId())){
_optRecord.addEscherProperty(property); _optRecord.addEscherProperty(property);
} else { } else {
property.setPropertyValue(noFill ? 1 : 0); int i=0;
for (EscherProperty prop: _optRecord.getEscherProperties()){
if (prop.getId() == property.getId()){
_optRecord.getEscherProperties().remove(i);
break;
}
i++;
}
_optRecord.addEscherProperty(property);
} }
} }

View File

@ -1,5 +1,6 @@
package org.apache.poi.hssf.usermodel.drawing; package org.apache.poi.hssf.usermodel.drawing;
import org.apache.poi.hssf.usermodel.HSSFPicture;
import org.apache.poi.hssf.usermodel.HSSFSimpleShape; import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
/** /**
@ -9,6 +10,7 @@ import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
public enum HSSFShapeType { public enum HSSFShapeType {
NOT_PRIMITIVE((short)0x0, null, (short)0), NOT_PRIMITIVE((short)0x0, null, (short)0),
RECTANGLE((short)0x1, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_RECTANGLE), RECTANGLE((short)0x1, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_RECTANGLE),
PICTURE((short)0x004B, HSSFPicture.class, HSSFSimpleShape.OBJECT_TYPE_PICTURE),
ROUND_RECTANGLE((short)0x2, null, null); ROUND_RECTANGLE((short)0x2, null, null);
private Short type; private Short type;

View File

@ -43,6 +43,8 @@ import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -192,6 +194,40 @@ 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);
callConvertPatriarch(agg1);
agg1.setPatriarch(null);
agg.setPatriarch(null);
byte[] aggS = agg.serialize();
byte []agg1S = agg1.serialize();
assertEquals(aggS.length, agg1S.length);
assertTrue(Arrays.equals(aggS, agg1S));
}
private static void callConvertPatriarch(EscherAggregate agg) {
Method method = null;
try {
method = agg.getClass().getDeclaredMethod("convertPatriarch", HSSFPatriarch.class);
method.setAccessible(true);
method.invoke(agg, agg.getPatriarch());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (InvocationTargetException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
/** /**
* when reading incomplete data ensure that the serialized bytes * when reading incomplete data ensure that the serialized bytes
match the source match the source

View File

@ -3,6 +3,9 @@ package org.apache.poi.hssf.model;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.ddf.*; import org.apache.poi.ddf.*;
import org.apache.poi.hssf.HSSFTestDataSamples; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
import org.apache.poi.hssf.record.EscherAggregate;
import org.apache.poi.hssf.record.ObjRecord;
import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.util.HexDump; import org.apache.poi.util.HexDump;
@ -72,6 +75,38 @@ public class TestDrawingShapes extends TestCase{
assertEquals(true, assertEquals(true,
((EscherBoolProperty)opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue()); ((EscherBoolProperty)opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());
} }
public void testDefaultPictureSettings(){
HSSFPicture picture = new HSSFPicture(null, new HSSFClientAnchor());
assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_SOLID);
assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
assertEquals(picture.isNoFill(), false);
assertEquals(picture.getPictureIndex(), -1);//not set yet
}
/**
* No NullPointerException should appear
*/
public void testDefaultSettingsWithEmptyContainer(){
EscherContainerRecord container = new EscherContainerRecord();
EscherOptRecord opt = new EscherOptRecord();
opt.setRecordId(EscherOptRecord.RECORD_ID);
container.addChildRecord(opt);
ObjRecord obj = new ObjRecord();
CommonObjectDataSubRecord cod = new CommonObjectDataSubRecord();
cod.setObjectType(HSSFSimpleShape.OBJECT_TYPE_PICTURE);
obj.addSubRecord(cod);
HSSFPicture picture = new HSSFPicture(container, obj);
assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
assertEquals(picture.isNoFill(), HSSFShape.NO_FILL_DEFAULT);
assertEquals(picture.getPictureIndex(), -1);//not set yet
}
/** /**
* create a rectangle, save the workbook, read back and verify that all shape properties are there * create a rectangle, save the workbook, read back and verify that all shape properties are there
*/ */
@ -139,6 +174,28 @@ public class TestDrawingShapes extends TestCase{
assertEquals(rectangle2.getAnchor().getDy1(), 4); assertEquals(rectangle2.getAnchor().getDy1(), 4);
assertEquals(rectangle2.getAnchor().getDy2(), 5); assertEquals(rectangle2.getAnchor().getDy2(), 5);
assertEquals(rectangle2.isNoFill(), false); assertEquals(rectangle2.isNoFill(), false);
HSSFSimpleShape rect3 = drawing.createSimpleShape(new HSSFClientAnchor());
rect3.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
drawing = wb.getSheetAt(0).getDrawingPatriarch();
assertEquals(drawing.getChildren().size(), 2);
}
public void testReadExistingImage(){
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
HSSFSheet sheet = wb.getSheet("pictures");
HSSFPatriarch drawing = sheet.getDrawingPatriarch();
assertEquals(1, drawing.getChildren().size());
HSSFPicture picture = (HSSFPicture) drawing.getChildren().get(0);
assertEquals(picture.getPictureIndex(), 1);
assertEquals(picture.getLineStyleColor(), HSSFShape.LINESTYLE__COLOR_DEFAULT);
assertEquals(picture.getFillColor(), 0x5DC943);
assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
assertEquals(picture.isNoFill(), true);
} }
@ -157,4 +214,41 @@ public class TestDrawingShapes extends TestCase{
assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT*2); assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT*2);
} }
} }
public void testShapeIds() {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet1 = wb.createSheet();
HSSFPatriarch patriarch1 = sheet1.createDrawingPatriarch();
for(int i = 0; i < 2; i++) {
patriarch1.createSimpleShape(new HSSFClientAnchor());
}
wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
sheet1 = wb.getSheetAt(0);
patriarch1 = sheet1.getDrawingPatriarch();
EscherAggregate agg1 = HSSFTestHelper.getEscherAggregate(patriarch1);
// last shape ID cached in EscherDgRecord
EscherDgRecord dg1 =
agg1.getEscherContainer().getChildById(EscherDgRecord.RECORD_ID);
assertEquals(1026, dg1.getLastMSOSPID());
// iterate over shapes and check shapeId
EscherContainerRecord spgrContainer =
agg1.getEscherContainer().getChildContainers().get(0);
// root spContainer + 2 spContainers for shapes
assertEquals(3, spgrContainer.getChildRecords().size());
EscherSpRecord sp0 =
((EscherContainerRecord)spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);
assertEquals(1024, sp0.getShapeId());
EscherSpRecord sp1 =
((EscherContainerRecord)spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);
assertEquals(1025, sp1.getShapeId());
EscherSpRecord sp2 =
((EscherContainerRecord)spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);
assertEquals(1026, sp2.getShapeId());
}
} }

View File

@ -1,10 +1,10 @@
package org.apache.poi.hssf.model; package org.apache.poi.hssf.model;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.ddf.EscherChildAnchorRecord; import org.apache.poi.ddf.*;
import org.apache.poi.ddf.EscherClientAnchorRecord; import org.apache.poi.hssf.HSSFTestDataSamples;
import org.apache.poi.ddf.EscherContainerRecord;
import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.util.HexDump;
/** /**
* @author Evgeniy Berlog * @author Evgeniy Berlog
@ -12,6 +12,63 @@ import org.apache.poi.hssf.usermodel.*;
*/ */
public class TestHSSFAnchor extends TestCase { public class TestHSSFAnchor extends TestCase {
public void testDefaultValues(){
HSSFClientAnchor clientAnchor = new HSSFClientAnchor();
assertEquals(clientAnchor.getAnchorType(), 0);
assertEquals(clientAnchor.getCol1(), 0);
assertEquals(clientAnchor.getCol2(), 0);
assertEquals(clientAnchor.getDx1(), 0);
assertEquals(clientAnchor.getDx2(), 0);
assertEquals(clientAnchor.getDy1(), 0);
assertEquals(clientAnchor.getDy2(), 0);
assertEquals(clientAnchor.getRow1(), 0);
assertEquals(clientAnchor.getRow2(), 0);
clientAnchor = new HSSFClientAnchor(new EscherClientAnchorRecord());
assertEquals(clientAnchor.getAnchorType(), 0);
assertEquals(clientAnchor.getCol1(), 0);
assertEquals(clientAnchor.getCol2(), 0);
assertEquals(clientAnchor.getDx1(), 0);
assertEquals(clientAnchor.getDx2(), 0);
assertEquals(clientAnchor.getDy1(), 0);
assertEquals(clientAnchor.getDy2(), 0);
assertEquals(clientAnchor.getRow1(), 0);
assertEquals(clientAnchor.getRow2(), 0);
HSSFChildAnchor childAnchor = new HSSFChildAnchor();
assertEquals(childAnchor.getDx1(), 0);
assertEquals(childAnchor.getDx2(), 0);
assertEquals(childAnchor.getDy1(), 0);
assertEquals(childAnchor.getDy2(), 0);
childAnchor = new HSSFChildAnchor(new EscherChildAnchorRecord());
assertEquals(childAnchor.getDx1(), 0);
assertEquals(childAnchor.getDx2(), 0);
assertEquals(childAnchor.getDy1(), 0);
assertEquals(childAnchor.getDy2(), 0);
}
public void testCorrectOrderInSpContainer(){
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
HSSFSheet sheet = wb.getSheet("pictures");
HSSFPatriarch drawing = sheet.getDrawingPatriarch();
HSSFSimpleShape rectangle = (HSSFSimpleShape) drawing.getChildren().get(0);
rectangle.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);
assertEquals(rectangle.getEscherContainer().getChild(0).getRecordId(), EscherSpRecord.RECORD_ID);
assertEquals(rectangle.getEscherContainer().getChild(1).getRecordId(), EscherOptRecord.RECORD_ID);
assertEquals(" " + HexDump.toHex(rectangle.getEscherContainer().getChild(2).getRecordId()) + " ", rectangle.getEscherContainer().getChild(2).getRecordId(), EscherClientAnchorRecord.RECORD_ID);
assertEquals(rectangle.getEscherContainer().getChild(3).getRecordId(), EscherClientDataRecord.RECORD_ID);
rectangle.setAnchor(new HSSFClientAnchor());
assertEquals(rectangle.getEscherContainer().getChild(0).getRecordId(), EscherSpRecord.RECORD_ID);
assertEquals(rectangle.getEscherContainer().getChild(1).getRecordId(), EscherOptRecord.RECORD_ID);
assertEquals(" " + HexDump.toHex(rectangle.getEscherContainer().getChild(2).getRecordId()) + " ", rectangle.getEscherContainer().getChild(2).getRecordId(), EscherClientAnchorRecord.RECORD_ID);
assertEquals(rectangle.getEscherContainer().getChild(3).getRecordId(), EscherClientDataRecord.RECORD_ID);
}
public void testCreateClientAnchorFromContainer(){ public void testCreateClientAnchorFromContainer(){
EscherContainerRecord container = new EscherContainerRecord(); EscherContainerRecord container = new EscherContainerRecord();
EscherClientAnchorRecord escher = new EscherClientAnchorRecord(); EscherClientAnchorRecord escher = new EscherClientAnchorRecord();
@ -206,4 +263,116 @@ public class TestHSSFAnchor extends TestCase {
assertEquals(anchor.getDy2(), 118); assertEquals(anchor.getDy2(), 118);
assertEquals(escher.getDy2(), 118); assertEquals(escher.getDy2(), 118);
} }
public void testEqualsToSelf(){
HSSFClientAnchor clientAnchor = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
assertEquals(clientAnchor, clientAnchor);
HSSFChildAnchor childAnchor = new HSSFChildAnchor(0, 1, 2, 3);
assertEquals(childAnchor, childAnchor);
}
public void testPassIncompatibleTypeIsFalse(){
HSSFClientAnchor clientAnchor = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
assertNotSame(clientAnchor, "wrongType");
HSSFChildAnchor childAnchor = new HSSFChildAnchor(0, 1, 2, 3);
assertNotSame(childAnchor, "wrongType");
}
public void testNullReferenceIsFalse() {
HSSFClientAnchor clientAnchor = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
assertFalse("Passing null to equals should return false", clientAnchor.equals(null));
HSSFChildAnchor childAnchor = new HSSFChildAnchor(0, 1, 2, 3);
assertFalse("Passing null to equals should return false", childAnchor.equals(null));
}
public void testEqualsIsReflexiveIsSymmetric() {
HSSFClientAnchor clientAnchor1 = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
HSSFClientAnchor clientAnchor2 = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
assertTrue(clientAnchor1.equals(clientAnchor2));
assertTrue(clientAnchor1.equals(clientAnchor2));
HSSFChildAnchor childAnchor1 = new HSSFChildAnchor(0, 1, 2, 3);
HSSFChildAnchor childAnchor2 = new HSSFChildAnchor(0, 1, 2, 3);
assertTrue(childAnchor1.equals(childAnchor2));
assertTrue(childAnchor2.equals(childAnchor1));
}
public void testEqualsValues(){
HSSFClientAnchor clientAnchor1 = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
HSSFClientAnchor clientAnchor2 = new HSSFClientAnchor(0, 1, 2, 3, (short)4, 5, (short)6, 7);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setDx1(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setDx1(0);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setDy1(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setDy1(1);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setDx2(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setDx2(2);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setDy2(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setDy2(3);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setCol1(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setCol1(4);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setRow1(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setRow1(5);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setCol2(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setCol2(6);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setRow2(10);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setRow2(7);
assertEquals(clientAnchor1, clientAnchor2);
clientAnchor2.setAnchorType(3);
assertNotSame(clientAnchor1, clientAnchor2);
clientAnchor2.setAnchorType(0);
assertEquals(clientAnchor1, clientAnchor2);
HSSFChildAnchor childAnchor1 = new HSSFChildAnchor(0, 1, 2, 3);
HSSFChildAnchor childAnchor2 = new HSSFChildAnchor(0, 1, 2, 3);
childAnchor1.setDx1(10);
assertNotSame(childAnchor1, childAnchor2);
childAnchor1.setDx1(0);
assertEquals(childAnchor1, childAnchor2);
childAnchor2.setDy1(10);
assertNotSame(childAnchor1, childAnchor2);
childAnchor2.setDy1(1);
assertEquals(childAnchor1, childAnchor2);
childAnchor2.setDx2(10);
assertNotSame(childAnchor1, childAnchor2);
childAnchor2.setDx2(2);
assertEquals(childAnchor1, childAnchor2);
childAnchor2.setDy2(10);
assertNotSame(childAnchor1, childAnchor2);
childAnchor2.setDy2(3);
assertEquals(childAnchor1, childAnchor2);
}
} }

Binary file not shown.