You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by be...@apache.org on 2012/06/22 11:37:18 UTC

svn commit: r1352818 - in /poi/branches/gsoc2012: src/java/org/apache/poi/ddf/ src/java/org/apache/poi/hssf/record/ src/java/org/apache/poi/hssf/usermodel/ src/java/org/apache/poi/hssf/usermodel/drawing/ src/testcases/org/apache/poi/hssf/model/ test-da...

Author: berlog
Date: Fri Jun 22 09:37:17 2012
New Revision: 1352818

URL: http://svn.apache.org/viewvc?rev=1352818&view=rev
Log:
added support for HSSFPicture in HSSFShapeFactory, fixed bugs, added tests

Modified:
    poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherRGBProperty.java
    poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherSimpleProperty.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/drawing/HSSFShapeType.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestHSSFAnchor.java
    poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherRGBProperty.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherRGBProperty.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherRGBProperty.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherRGBProperty.java Fri Jun 22 09:37:17 2012
@@ -38,10 +38,6 @@ public class EscherRGBProperty
         return propertyValue;
     }
 
-    public void setRgbColor(int color){
-        this.propertyValue = color;
-    }
-
     public byte getRed()
     {
         return (byte) ( propertyValue & 0xFF );

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherSimpleProperty.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherSimpleProperty.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherSimpleProperty.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/ddf/EscherSimpleProperty.java Fri Jun 22 09:37:17 2012
@@ -80,10 +80,6 @@ public class EscherSimpleProperty extend
         return propertyValue;
     }
 
-    public void setPropertyValue(int propertyValue) {
-        this.propertyValue = propertyValue;
-    }
-
     /**
      * Returns true if one escher property is equal to another.
      */

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java Fri Jun 22 09:37:17 2012
@@ -315,6 +315,10 @@ public final class EscherAggregate exten
      */
     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 exten
 
     public void setPatriarch(HSSFPatriarch patriarch) {
         this.patriarch = patriarch;
-        convertPatriarch(patriarch);
     }
 
     /**
@@ -1025,6 +1028,43 @@ public final class EscherAggregate exten
         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;

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPicture.java Fri Jun 22 09:37:17 2012
@@ -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 H
      */
     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 H
 
     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 H
      * @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 H
      */
     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);
     }
 }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java Fri Jun 22 09:37:17 2012
@@ -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);
         }
     }
 

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/drawing/HSSFShapeType.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/drawing/HSSFShapeType.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/drawing/HSSFShapeType.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/drawing/HSSFShapeType.java Fri Jun 22 09:37:17 2012
@@ -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.HSS
 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;

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingAggregate.java Fri Jun 22 09:37:17 2012
@@ -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 extend
         }
     }
 
+    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

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java Fri Jun 22 09:37:17 2012
@@ -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 T
         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 T
         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 T
             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());
+    }
 }

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestHSSFAnchor.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestHSSFAnchor.java?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestHSSFAnchor.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestHSSFAnchor.java Fri Jun 22 09:37:17 2012
@@ -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 Test
         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);
+    }
 }

Modified: poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls?rev=1352818&r1=1352817&r2=1352818&view=diff
==============================================================================
Binary files - no diff available.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org