mirror of https://github.com/apache/poi.git
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:
parent
93b0bb98bf
commit
7efc80c3e8
|
@ -38,10 +38,6 @@ public class EscherRGBProperty
|
|||
return propertyValue;
|
||||
}
|
||||
|
||||
public void setRgbColor(int color){
|
||||
this.propertyValue = color;
|
||||
}
|
||||
|
||||
public byte getRed()
|
||||
{
|
||||
return (byte) ( propertyValue & 0xFF );
|
||||
|
|
|
@ -80,10 +80,6 @@ public class EscherSimpleProperty extends EscherProperty
|
|||
return propertyValue;
|
||||
}
|
||||
|
||||
public void setPropertyValue(int propertyValue) {
|
||||
this.propertyValue = propertyValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if one escher property is equal to another.
|
||||
*/
|
||||
|
|
|
@ -315,6 +315,10 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
|||
*/
|
||||
private List<Record> tailRec = new ArrayList<Record>();
|
||||
|
||||
public EscherAggregate() {
|
||||
buildBaseTree();
|
||||
}
|
||||
|
||||
public EscherAggregate(DrawingManager2 drawingManager) {
|
||||
this.drawingManager = drawingManager;
|
||||
}
|
||||
|
@ -634,7 +638,6 @@ public final class EscherAggregate extends AbstractEscherHolderRecord {
|
|||
|
||||
public void setPatriarch(HSSFPatriarch 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");
|
||||
}
|
||||
|
||||
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) {
|
||||
EscherContainerRecord dgContainer = new EscherContainerRecord();
|
||||
EscherDgRecord dg;
|
||||
|
|
|
@ -20,8 +20,8 @@ package org.apache.poi.hssf.usermodel;
|
|||
import java.awt.Dimension;
|
||||
import java.io.ByteArrayInputStream;
|
||||
|
||||
import org.apache.poi.ddf.EscherBSERecord;
|
||||
import org.apache.poi.ddf.EscherBlipRecord;
|
||||
import org.apache.poi.ddf.*;
|
||||
import org.apache.poi.hssf.record.ObjRecord;
|
||||
import org.apache.poi.ss.usermodel.Picture;
|
||||
import org.apache.poi.ss.util.ImageUtils;
|
||||
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 int _pictureIndex;
|
||||
public HSSFPicture(EscherContainerRecord spContainer, ObjRecord objRecord) {
|
||||
super(spContainer, objRecord);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a picture object.
|
||||
|
@ -67,12 +69,16 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
|
|||
|
||||
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 )
|
||||
{
|
||||
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
|
||||
*/
|
||||
public Dimension getImageDimension(){
|
||||
EscherBSERecord bse = _patriarch._sheet._book.getBSERecord(_pictureIndex);
|
||||
EscherBSERecord bse = _patriarch._sheet._book.getBSERecord(getPictureIndex());
|
||||
byte[] data = bse.getBlipRecord().getPicturedata();
|
||||
int type = bse.getBlipTypeWin32();
|
||||
return ImageUtils.getImageDimension(new ByteArrayInputStream(data), type);
|
||||
|
@ -228,7 +234,7 @@ public final class HSSFPicture extends HSSFSimpleShape implements Picture {
|
|||
*/
|
||||
public HSSFPictureData getPictureData(){
|
||||
InternalWorkbook iwb = _patriarch._sheet.getWorkbook().getWorkbook();
|
||||
EscherBlipRecord blipRecord = iwb.getBSERecord(_pictureIndex).getBlipRecord();
|
||||
EscherBlipRecord blipRecord = iwb.getBSERecord(getPictureIndex()).getBlipRecord();
|
||||
return new HSSFPictureData(blipRecord);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ public abstract class HSSFShape {
|
|||
public static final int LINEWIDTH_DEFAULT = 9525;
|
||||
public static final int LINESTYLE__COLOR_DEFAULT = 0x08000040;
|
||||
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_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_NONE = -1;
|
||||
|
||||
public static final int LINESTYLE_DEFAULT = LINESTYLE_NONE;
|
||||
|
||||
// TODO - make all these fields private
|
||||
HSSFShape parent;
|
||||
HSSFAnchor anchor;
|
||||
|
@ -108,11 +111,20 @@ public abstract class HSSFShape {
|
|||
* @see HSSFClientAnchor
|
||||
*/
|
||||
public void setAnchor(HSSFAnchor anchor) {
|
||||
int i = 0;
|
||||
int recordId = -1;
|
||||
if (parent == null) {
|
||||
if (anchor instanceof HSSFChildAnchor)
|
||||
throw new IllegalArgumentException("Must use client anchors for shapes directly attached to sheet.");
|
||||
EscherClientAnchorRecord anch = _escherContainer.getChildById(EscherClientAnchorRecord.RECORD_ID);
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
|
@ -120,10 +132,21 @@ public abstract class HSSFShape {
|
|||
throw new IllegalArgumentException("Must use child anchors for shapes attached to groups.");
|
||||
EscherChildAnchorRecord anch = _escherContainer.getChildById(EscherChildAnchorRecord.RECORD_ID);
|
||||
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.addChildRecord(anchor.getEscherAnchor());
|
||||
if (-1 == recordId){
|
||||
_escherContainer.addChildRecord(anchor.getEscherAnchor());
|
||||
} else {
|
||||
_escherContainer.addChildBefore(anchor.getEscherAnchor(), recordId);
|
||||
}
|
||||
this.anchor = anchor;
|
||||
}
|
||||
|
||||
|
@ -139,13 +162,7 @@ public abstract class HSSFShape {
|
|||
* The color applied to the lines of this shape.
|
||||
*/
|
||||
public void setLineStyleColor(int lineStyleColor) {
|
||||
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.LINESTYLE__COLOR);
|
||||
if (null == rgbProperty) {
|
||||
rgbProperty = new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor);
|
||||
_optRecord.addEscherProperty(rgbProperty);
|
||||
} else {
|
||||
rgbProperty.setRgbColor(lineStyleColor);
|
||||
}
|
||||
setPropertyValue(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -153,13 +170,7 @@ public abstract class HSSFShape {
|
|||
*/
|
||||
public void setLineStyleColor(int red, int green, int blue) {
|
||||
int lineStyleColor = ((blue) << 16) | ((green) << 8) | red;
|
||||
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.LINESTYLE__COLOR);
|
||||
if (null == rgbProperty) {
|
||||
rgbProperty = new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor);
|
||||
_optRecord.addEscherProperty(rgbProperty);
|
||||
} else {
|
||||
rgbProperty.setRgbColor(lineStyleColor);
|
||||
}
|
||||
setPropertyValue(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, lineStyleColor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -174,13 +185,7 @@ public abstract class HSSFShape {
|
|||
* The color used to fill this shape.
|
||||
*/
|
||||
public void setFillColor(int fillColor) {
|
||||
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.FILL__FILLCOLOR);
|
||||
if (null == rgbProperty) {
|
||||
rgbProperty = new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor);
|
||||
_optRecord.addEscherProperty(rgbProperty);
|
||||
} else {
|
||||
rgbProperty.setRgbColor(fillColor);
|
||||
}
|
||||
setPropertyValue(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -188,13 +193,7 @@ public abstract class HSSFShape {
|
|||
*/
|
||||
public void setFillColor(int red, int green, int blue) {
|
||||
int fillColor = ((blue) << 16) | ((green) << 8) | red;
|
||||
EscherRGBProperty rgbProperty = _optRecord.lookup(EscherProperties.FILL__FILLCOLOR);
|
||||
if (null == rgbProperty) {
|
||||
rgbProperty = new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor);
|
||||
_optRecord.addEscherProperty(rgbProperty);
|
||||
} else {
|
||||
rgbProperty.setRgbColor(fillColor);
|
||||
}
|
||||
setPropertyValue(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, fillColor));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -202,7 +201,7 @@ public abstract class HSSFShape {
|
|||
*/
|
||||
public int getLineWidth() {
|
||||
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
|
||||
*/
|
||||
public void setLineWidth(int lineWidth) {
|
||||
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEWIDTH);
|
||||
if (null == property) {
|
||||
property = new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, lineWidth);
|
||||
_optRecord.addEscherProperty(property);
|
||||
} else {
|
||||
property.setPropertyValue(lineWidth);
|
||||
}
|
||||
setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, lineWidth));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -227,7 +220,7 @@ public abstract class HSSFShape {
|
|||
public int getLineStyle() {
|
||||
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEDASHING);
|
||||
if (null == property){
|
||||
return -1;
|
||||
return LINESTYLE_DEFAULT;
|
||||
}
|
||||
return property.getPropertyValue();
|
||||
}
|
||||
|
@ -238,13 +231,7 @@ public abstract class HSSFShape {
|
|||
* @param lineStyle One of the constants in LINESTYLE_*
|
||||
*/
|
||||
public void setLineStyle(int lineStyle) {
|
||||
EscherSimpleProperty property = _optRecord.lookup(EscherProperties.LINESTYLE__LINEDASHING);
|
||||
if (null == property) {
|
||||
property = new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, lineStyle);
|
||||
_optRecord.addEscherProperty(property);
|
||||
} else {
|
||||
property.setPropertyValue(lineStyle);
|
||||
}
|
||||
setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, lineStyle));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -252,19 +239,29 @@ public abstract class HSSFShape {
|
|||
*/
|
||||
public boolean isNoFill() {
|
||||
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.
|
||||
*/
|
||||
public void setNoFill(boolean noFill) {
|
||||
EscherBoolProperty property = _optRecord.lookup(EscherProperties.FILL__NOFILLHITTEST);
|
||||
if (null == property) {
|
||||
property = new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, noFill ? 1 : 0);
|
||||
setPropertyValue(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, noFill ? 1 : 0));
|
||||
}
|
||||
|
||||
protected void setPropertyValue(EscherProperty property){
|
||||
if (null == _optRecord.lookup(property.getId())){
|
||||
_optRecord.addEscherProperty(property);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.apache.poi.hssf.usermodel.drawing;
|
||||
|
||||
import org.apache.poi.hssf.usermodel.HSSFPicture;
|
||||
import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
|
||||
|
||||
/**
|
||||
|
@ -9,6 +10,7 @@ import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
|
|||
public enum HSSFShapeType {
|
||||
NOT_PRIMITIVE((short)0x0, null, (short)0),
|
||||
RECTANGLE((short)0x1, HSSFSimpleShape.class, HSSFSimpleShape.OBJECT_TYPE_RECTANGLE),
|
||||
PICTURE((short)0x004B, HSSFPicture.class, HSSFSimpleShape.OBJECT_TYPE_PICTURE),
|
||||
ROUND_RECTANGLE((short)0x2, null, null);
|
||||
|
||||
private Short type;
|
||||
|
|
|
@ -43,6 +43,8 @@ import java.io.ByteArrayOutputStream;
|
|||
import java.io.File;
|
||||
import java.io.FilenameFilter;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
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
|
||||
match the source
|
||||
|
|
|
@ -3,6 +3,9 @@ package org.apache.poi.hssf.model;
|
|||
import junit.framework.TestCase;
|
||||
import org.apache.poi.ddf.*;
|
||||
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.util.HexDump;
|
||||
|
||||
|
@ -72,6 +75,38 @@ public class TestDrawingShapes extends TestCase{
|
|||
assertEquals(true,
|
||||
((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
|
||||
*/
|
||||
|
@ -139,6 +174,28 @@ public class TestDrawingShapes extends TestCase{
|
|||
assertEquals(rectangle2.getAnchor().getDy1(), 4);
|
||||
assertEquals(rectangle2.getAnchor().getDy2(), 5);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
package org.apache.poi.hssf.model;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
import org.apache.poi.ddf.EscherChildAnchorRecord;
|
||||
import org.apache.poi.ddf.EscherClientAnchorRecord;
|
||||
import org.apache.poi.ddf.EscherContainerRecord;
|
||||
import org.apache.poi.ddf.*;
|
||||
import org.apache.poi.hssf.HSSFTestDataSamples;
|
||||
import org.apache.poi.hssf.usermodel.*;
|
||||
import org.apache.poi.util.HexDump;
|
||||
|
||||
/**
|
||||
* @author Evgeniy Berlog
|
||||
|
@ -12,6 +12,63 @@ import org.apache.poi.hssf.usermodel.*;
|
|||
*/
|
||||
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(){
|
||||
EscherContainerRecord container = new EscherContainerRecord();
|
||||
EscherClientAnchorRecord escher = new EscherClientAnchorRecord();
|
||||
|
@ -206,4 +263,116 @@ public class TestHSSFAnchor extends TestCase {
|
|||
assertEquals(anchor.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.
Loading…
Reference in New Issue