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/28 12:56:58 UTC

svn commit: r1354910 - 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/testcases/org/apache/poi/hssf/model/ src/testcases/org/apache/poi/hssf/usermodel/ test-data/...

Author: berlog
Date: Thu Jun 28 10:56:55 2012
New Revision: 1354910

URL: http://svn.apache.org/viewvc?rev=1354910&view=rev
Log:
implemented creating comments in existing files, bugfixes

Added:
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestComment.java
Modified:
    poi/branches/gsoc2012/src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/record/EscherAggregate.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPolygon.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShape.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java
    poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/HSSFTestModelHelper.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/TestDrawingShapes.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/HSSFTestHelper.java
    poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java
    poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/ddf/AbstractEscherOptRecord.java Thu Jun 28 10:56:55 2012
@@ -16,10 +16,7 @@
 ==================================================================== */
 package org.apache.poi.ddf;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
+import java.util.*;
 
 import org.apache.poi.util.HexDump;
 import org.apache.poi.util.LittleEndian;
@@ -140,6 +137,24 @@ public abstract class AbstractEscherOptR
     }
 
     /**
+     * Set an escher property. If a property with given propId already
+     exists it is replaced.
+     *
+     * @param value the property to set.
+     */
+    public void setEscherProperty(EscherProperty value){
+        for ( Iterator<EscherProperty> iterator =
+                      properties.iterator(); iterator.hasNext(); ) {
+            EscherProperty prop = iterator.next();
+            if (prop.getId() == value.getId()){
+                iterator.remove();
+            }
+        }
+        properties.add( value );
+        sortProperties();
+    }
+
+    /**
      * Retrieve the string representation of this record.
      */
     public String toString()

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=1354910&r1=1354909&r2=1354910&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 Thu Jun 28 10:56:55 2012
@@ -1152,4 +1152,15 @@ public final class EscherAggregate exten
     public List<Record> getTailRecords(){
         return Collections.unmodifiableList(tailRec);
     }
+
+    public NoteRecord getNoteRecordByObj(ObjRecord obj){
+        for (Record rec: tailRec){
+            NoteRecord note = (NoteRecord) rec;
+            CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) obj.getSubRecords().get(0);
+            if (note.getShapeId()  == cod.getObjectId()){
+                return note;
+            }
+        }
+        return null;
+    }
 }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFComment.java Thu Jun 28 10:56:55 2012
@@ -16,8 +16,8 @@
 ==================================================================== */
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.hssf.record.NoteRecord;
-import org.apache.poi.hssf.record.TextObjectRecord;
+import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.hssf.record.*;
 import org.apache.poi.ss.usermodel.Comment;
 import org.apache.poi.ss.usermodel.RichTextString;
 
@@ -28,59 +28,89 @@ import org.apache.poi.ss.usermodel.RichT
  */
 public class HSSFComment extends HSSFTextbox implements Comment {
 
-	/*
-	 * TODO - make HSSFComment more consistent when created vs read from file.
-	 * Currently HSSFComment has two main forms (corresponding to the two constructors).   There
-	 * are certain operations that only work on comment objects in one of the forms (e.g. deleting
-	 * comments).
-	 * POI is also deficient in its management of RowRecord fields firstCol and lastCol.  Those 
-	 * fields are supposed to take comments into account, but POI does not do this yet (feb 2009).
-	 * It seems like HSSFRow should manage a collection of local HSSFComments 
-	 */
-	
+    /*
+      * TODO - make HSSFComment more consistent when created vs read from file.
+      * Currently HSSFComment has two main forms (corresponding to the two constructors).   There
+      * are certain operations that only work on comment objects in one of the forms (e.g. deleting
+      * comments).
+      * POI is also deficient in its management of RowRecord fields firstCol and lastCol.  Those
+      * fields are supposed to take comments into account, but POI does not do this yet (feb 2009).
+      * It seems like HSSFRow should manage a collection of local HSSFComments
+      */
+
     private boolean _visible;
     private int _row;
     private int _col;
     private String _author;
 
     private NoteRecord _note;
-    private TextObjectRecord _txo;
+
+    public HSSFComment(EscherContainerRecord spContainer, ObjRecord objRecord, TextObjectRecord textObjectRecord, NoteRecord _note) {
+        super(spContainer, objRecord, textObjectRecord);
+        this._note = _note;
+    }
 
     /**
      * Construct a new comment with the given parent and anchor.
      *
      * @param parent
-     * @param anchor  defines position of this anchor in the sheet
+     * @param anchor defines position of this anchor in the sheet
      */
     public HSSFComment(HSSFShape parent, HSSFAnchor anchor) {
         super(parent, anchor);
-        setShapeType(OBJECT_TYPE_COMMENT);
-
+        _note = createNoteRecord();
         //default color for comments
         setFillColor(0x08000050);
 
         //by default comments are hidden
-        _visible = false;
-
-        _author = "";
+        setVisible(false);
+        setAuthor("");
     }
 
     protected HSSFComment(NoteRecord note, TextObjectRecord txo) {
         this(null, new HSSFClientAnchor());
-        _txo = txo;
+        _textObjectRecord = txo;
         _note = note;
     }
 
+    @Override
+    protected ObjRecord createObjRecord() {
+        ObjRecord obj = new ObjRecord();
+        CommonObjectDataSubRecord c = new CommonObjectDataSubRecord();
+        c.setObjectType(OBJECT_TYPE_COMMENT);
+        c.setLocked(true);
+        c.setPrintable(true);
+        c.setAutofill(false);
+        c.setAutoline(true);
+
+        NoteStructureSubRecord u = new NoteStructureSubRecord();
+        EndSubRecord e = new EndSubRecord();
+        obj.addSubRecord(c);
+        obj.addSubRecord(u);
+        obj.addSubRecord(e);
+        return obj;
+    }
+
+    private NoteRecord createNoteRecord(){
+        NoteRecord note = new NoteRecord();
+        note.setFlags(NoteRecord.NOTE_VISIBLE);
+        note.setAuthor("");
+        return note;
+    }
+
+    @Override
+    void setShapeId(int shapeId) {
+        super.setShapeId(shapeId);
+        _note.setShapeId(shapeId-1024);
+    }
+
     /**
      * Returns whether this comment is visible.
      *
      * @param visible <code>true</code> if the comment is visible, <code>false</code> otherwise
      */
-    public void setVisible(boolean visible){
-        if(_note != null) {
-			_note.setFlags(visible ? NoteRecord.NOTE_VISIBLE : NoteRecord.NOTE_HIDDEN);
-		}
-        _visible = visible;
+    public void setVisible(boolean visible) {
+        _note.setFlags(visible ? NoteRecord.NOTE_VISIBLE : NoteRecord.NOTE_HIDDEN);
     }
 
     /**
@@ -89,7 +119,7 @@ public class HSSFComment extends HSSFTex
      * @return <code>true</code> if the comment is visible, <code>false</code> otherwise
      */
     public boolean isVisible() {
-        return _visible;
+        return _note.getFlags() == NoteRecord.NOTE_VISIBLE;
     }
 
     /**
@@ -98,7 +128,7 @@ public class HSSFComment extends HSSFTex
      * @return the 0-based row of the cell that contains the comment
      */
     public int getRow() {
-        return _row;
+        return _note.getRow();
     }
 
     /**
@@ -107,10 +137,7 @@ public class HSSFComment extends HSSFTex
      * @param row the 0-based row of the cell that contains the comment
      */
     public void setRow(int row) {
-        if(_note != null) {
-			_note.setRow(row);
-        }
-        _row = row;
+        _note.setRow(row);
     }
 
     /**
@@ -118,8 +145,8 @@ public class HSSFComment extends HSSFTex
      *
      * @return the 0-based column of the cell that contains the comment
      */
-    public int getColumn(){
-        return _col;
+    public int getColumn() {
+        return _note.getColumn();
     }
 
     /**
@@ -128,17 +155,15 @@ public class HSSFComment extends HSSFTex
      * @param col the 0-based column of the cell that contains the comment
      */
     public void setColumn(int col) {
-        if(_note != null) {
-		    _note.setColumn(col);
-        }
-        _col = col;
+        _note.setColumn(col);
     }
+
     /**
      * @deprecated (Nov 2009) use {@link HSSFComment#setColumn(int)} }
      */
     @Deprecated
     public void setColumn(short col) {
-        setColumn((int)col);
+        setColumn((int) col);
     }
 
     /**
@@ -147,7 +172,7 @@ public class HSSFComment extends HSSFTex
      * @return the name of the original author of the comment
      */
     public String getAuthor() {
-        return _author;
+        return _note.getAuthor();
     }
 
     /**
@@ -155,37 +180,35 @@ public class HSSFComment extends HSSFTex
      *
      * @param author the name of the original author of the comment
      */
-    public void setAuthor(String author){
-        if(_note != null) _note.setAuthor(author);
-        this._author = author;
+    public void setAuthor(String author) {
+        if (_note != null) _note.setAuthor(author);
     }
-    
+
     /**
      * Sets the rich text string used by this comment.
      *
-     * @param string    Sets the rich text string used by this object.
+     * @param string Sets the rich text string used by this object.
      */
     public void setString(RichTextString string) {
         HSSFRichTextString hstring = (HSSFRichTextString) string;
         //if font is not set we must set the default one
-        if (hstring.numFormattingRuns() == 0) hstring.applyFont((short)0);
+        if (hstring.numFormattingRuns() == 0) hstring.applyFont((short) 0);
 
-        if (_txo != null) {
-            _txo.setStr(hstring);
-        }
+        _textObjectRecord.setStr(hstring);
         super.setString(string);
     }
-    
+
     /**
      * Returns the underlying Note record
      */
     protected NoteRecord getNoteRecord() {
-	    return _note;
-	}
+        return _note;
+    }
+
     /**
      * Returns the underlying Text record
      */
     public TextObjectRecord getTextObjectRecord() {
-	    return _txo;
-	}
+        return _textObjectRecord;
+    }
 }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java Thu Jun 28 10:56:55 2012
@@ -163,6 +163,7 @@ public final class HSSFPatriarch impleme
         HSSFComment shape = new HSSFComment(null, anchor);
         shape.anchor = anchor;
         addShape(shape);
+        onCreate(shape);
         return shape;
     }
 

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPolygon.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPolygon.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPolygon.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFPolygon.java Thu Jun 28 10:56:55 2012
@@ -18,6 +18,7 @@
 package org.apache.poi.hssf.usermodel;
 
 import org.apache.poi.ddf.EscherContainerRecord;
+import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.hssf.record.ObjRecord;
 
 /**
@@ -38,12 +39,18 @@ public class HSSFPolygon
 
     @Override
     protected EscherContainerRecord createSpContainer() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        EscherContainerRecord spContainer = new EscherContainerRecord();
+        spContainer.setRecordId( EscherContainerRecord.SP_CONTAINER );
+        spContainer.setOptions( (short) 0x000F );
+        EscherOptRecord optRecord = new EscherOptRecord();
+        optRecord.setRecordId(EscherOptRecord.RECORD_ID);
+        spContainer.addChildRecord(optRecord);
+        return spContainer;
     }
 
     @Override
     protected ObjRecord createObjRecord() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        return null;
     }
 
     public int[] getXPoints()

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=1354910&r1=1354909&r2=1354910&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 Thu Jun 28 10:56:55 2012
@@ -53,8 +53,8 @@ public abstract class HSSFShape {
     HSSFAnchor anchor;
     HSSFPatriarch _patriarch;
 
-    protected EscherContainerRecord _escherContainer;
-    protected ObjRecord _objRecord;
+    protected final EscherContainerRecord _escherContainer;
+    protected final ObjRecord _objRecord;
     protected final EscherOptRecord _optRecord;
 
     public HSSFShape(EscherContainerRecord spContainer, ObjRecord objRecord) {
@@ -70,14 +70,11 @@ public abstract class HSSFShape {
     public HSSFShape(HSSFShape parent, HSSFAnchor anchor) {
         this.parent = parent;
         this.anchor = anchor;
-        this._escherContainer = new EscherContainerRecord();
-        _optRecord = new EscherOptRecord();
-        _optRecord.setRecordId( EscherOptRecord.RECORD_ID );
-        _optRecord.addEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
-        _optRecord.addEscherProperty(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
-        _optRecord.addEscherProperty(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
-        _optRecord.addEscherProperty(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
-        _optRecord.addEscherProperty(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0x0));
+        this._escherContainer = createSpContainer();
+        _optRecord = _escherContainer.getChildById(EscherOptRecord.RECORD_ID);
+        addStandardOptions(_optRecord);
+        _objRecord = createObjRecord();
+
     }
 
     protected abstract EscherContainerRecord createSpContainer();
@@ -90,6 +87,14 @@ public abstract class HSSFShape {
         CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) _objRecord.getSubRecords().get(0);
         cod.setObjectId((short) (shapeId-1024));
     }
+
+    private void addStandardOptions(EscherOptRecord optRecord){
+        setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEDASHING, LINESTYLE_SOLID));
+        setPropertyValue(new EscherSimpleProperty(EscherProperties.LINESTYLE__LINEWIDTH, LINEWIDTH_DEFAULT));
+        setPropertyValue(new EscherRGBProperty(EscherProperties.FILL__FILLCOLOR, FILL__FILLCOLOR_DEFAULT));
+        setPropertyValue(new EscherRGBProperty(EscherProperties.LINESTYLE__COLOR, LINESTYLE__COLOR_DEFAULT));
+        setPropertyValue(new EscherBoolProperty(EscherProperties.FILL__NOFILLHITTEST, 0x0));
+    }
     
     int getShapeId(){
         return ((EscherSpRecord)_escherContainer.getChildById(EscherSpRecord.RECORD_ID)).getShapeId();
@@ -270,19 +275,7 @@ public abstract class HSSFShape {
     }
 
     protected void setPropertyValue(EscherProperty property){
-        if (null == _optRecord.lookup(property.getId())){
-            _optRecord.addEscherProperty(property);
-        } else {
-            int i=0;
-            for (EscherProperty prop: _optRecord.getEscherProperties()){
-                if (prop.getId() == property.getId()){
-                    _optRecord.getEscherProperties().remove(i);
-                    break;
-                }
-                i++;
-            }
-            _optRecord.addEscherProperty(property);
-        }
+        _optRecord.setEscherProperty(property);
     }
 
     /**

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeFactory.java Thu Jun 28 10:56:55 2012
@@ -127,6 +127,9 @@ public class HSSFShapeFactory {
                 case CommonObjectDataSubRecord.OBJECT_TYPE_TEXT:
                     shape = new HSSFTextbox(container, objRecord, txtRecord);
                     break;
+                case CommonObjectDataSubRecord.OBJECT_TYPE_COMMENT:
+                    shape = new HSSFComment(container, objRecord, txtRecord, agg.getNoteRecordByObj(objRecord));
+                    break;
                 default:
                     shape = new HSSFSimpleShape(container, objRecord);
             }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java Thu Jun 28 10:56:55 2012
@@ -17,11 +17,7 @@
 
 package org.apache.poi.hssf.usermodel;
 
-import org.apache.poi.ddf.EscherChildAnchorRecord;
-import org.apache.poi.ddf.EscherClientAnchorRecord;
-import org.apache.poi.ddf.EscherContainerRecord;
-import org.apache.poi.ddf.EscherRecord;
-import org.apache.poi.ddf.EscherSpgrRecord;
+import org.apache.poi.ddf.*;
 import org.apache.poi.hssf.model.TextboxShape;
 import org.apache.poi.hssf.record.EscherAggregate;
 import org.apache.poi.hssf.record.ObjRecord;
@@ -76,7 +72,13 @@ public class HSSFShapeGroup
 
     @Override
     protected EscherContainerRecord createSpContainer() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        EscherContainerRecord spContainer = new EscherContainerRecord();
+        spContainer.setRecordId( EscherContainerRecord.SP_CONTAINER );
+        spContainer.setOptions( (short) 0x000F );
+        EscherOptRecord optRecord = new EscherOptRecord();
+        optRecord.setRecordId(EscherOptRecord.RECORD_ID);
+        spContainer.addChildRecord(optRecord);
+        return spContainer;
     }
 
     @Override

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Thu Jun 28 10:56:55 2012
@@ -2007,4 +2007,27 @@ public final class HSSFSheet implements 
         return new HSSFAutoFilter(this);
     }
 
+    protected HSSFComment findCellComment(int row, int column) {
+        return lookForComment(getDrawingPatriarch(), row, column);
+    }
+
+    private HSSFComment lookForComment(HSSFShapeContainer container, int row, int column){
+        for (Object object: container.getChildren()){
+            HSSFShape shape = (HSSFShape) object;
+            if (shape instanceof HSSFShapeGroup){
+                HSSFShape res =  lookForComment((HSSFShapeContainer) shape, row, column);
+                if (null != res){
+                    return (HSSFComment) res;
+                }
+                continue;
+            }
+            if (shape instanceof HSSFComment){
+                HSSFComment comment = (HSSFComment) shape;
+                if (comment.getColumn() == column && comment.getRow() == row){
+                    return comment;
+                }
+            }
+        }
+        return null;
+    }
 }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java Thu Jun 28 10:56:55 2012
@@ -60,8 +60,6 @@ public class HSSFSimpleShape
     public final static short       OBJECT_TYPE_COMMENT            = 25;
 //    public final static short       OBJECT_TYPE_MICROSOFT_OFFICE_DRAWING = 30;
 
-    int shapeType = OBJECT_TYPE_LINE;
-
     private static final Map <Short, Short> objTypeToShapeType = new HashMap<Short, Short>();
 
     static {
@@ -77,8 +75,6 @@ public class HSSFSimpleShape
     public HSSFSimpleShape( HSSFShape parent, HSSFAnchor anchor)
     {
         super( parent, anchor );
-        _escherContainer = createSpContainer();
-        _objRecord = createObjRecord();
         setShapeType(OBJECT_TYPE_LINE);
     }
 
@@ -96,8 +92,11 @@ public class HSSFSimpleShape
         clientData.setRecordId( EscherClientDataRecord.RECORD_ID );
         clientData.setOptions( (short) 0x0000 );
 
+        EscherOptRecord optRecord = new EscherOptRecord();
+        optRecord.setRecordId( EscherOptRecord.RECORD_ID );
+
         spContainer.addChildRecord(sp);
-        spContainer.addChildRecord(_optRecord);
+        spContainer.addChildRecord(optRecord);
         spContainer.addChildRecord(anchor.getEscherAnchor());
         spContainer.addChildRecord(clientData);
         return spContainer;
@@ -159,6 +158,6 @@ public class HSSFSimpleShape
             System.out.println("Unknown shape type: "+shapeType);
             return;
         }
-        spRecord.setShapeType(objTypeToShapeType.get((short)shapeType));
+        spRecord.setShapeType(objTypeToShapeType.get((short) shapeType));
     }
 }

Modified: poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java (original)
+++ poi/branches/gsoc2012/src/java/org/apache/poi/hssf/usermodel/HSSFTextbox.java Thu Jun 28 10:56:55 2012
@@ -47,11 +47,7 @@ public class HSSFTextbox extends HSSFSim
     public final static short VERTICAL_ALIGNMENT_JUSTIFY = 4;
     public final static short VERTICAL_ALIGNMENT_DISTRIBUTED = 7;
 
-
-    int marginLeft, marginRight, marginTop, marginBottom;
-    short halign, valign;
-
-    private TextObjectRecord _textObjectRecord;
+    protected TextObjectRecord _textObjectRecord;
 
     public HSSFTextbox(EscherContainerRecord spContainer, ObjRecord objRecord, TextObjectRecord textObjectRecord) {
         super(spContainer, objRecord);
@@ -113,15 +109,16 @@ public class HSSFTextbox extends HSSFSim
         sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE);
         opt.setRecordId(EscherOptRecord.RECORD_ID);
         opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTID, 0));
-        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTLEFT, getMarginLeft()));
-        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTRIGHT, getMarginRight()));
-        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTBOTTOM, getMarginBottom()));
-        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTTOP, getMarginTop()));
-
         opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__WRAPTEXT, 0));
         opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__ANCHORTEXT, 0));
         opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GROUPSHAPE__PRINT, 0x00080000));
 
+        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTLEFT, 0));
+        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTRIGHT, 0));
+        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTTOP, 0));
+        opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.TEXT__TEXTBOTTOM, 0));
+
+
         EscherRecord anchor = getAnchor().getEscherAnchor();
         clientData.setRecordId(EscherClientDataRecord.RECORD_ID);
         clientData.setOptions((short) 0x0000);

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/HSSFTestModelHelper.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/HSSFTestModelHelper.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/HSSFTestModelHelper.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/model/HSSFTestModelHelper.java Thu Jun 28 10:56:55 2012
@@ -1,5 +1,6 @@
 package org.apache.poi.hssf.model;
 
+import org.apache.poi.hssf.usermodel.HSSFComment;
 import org.apache.poi.hssf.usermodel.HSSFTextbox;
 
 /**
@@ -10,4 +11,8 @@ public class HSSFTestModelHelper {
     public static TextboxShape createTextboxShape(int shapeId, HSSFTextbox textbox){
         return new TextboxShape(textbox, shapeId);
     }
+
+    public static CommentShape createCommentShape(int shapeId, HSSFComment comment){
+        return new CommentShape(comment, shapeId);
+    }
 }

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=1354910&r1=1354909&r2=1354910&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 Thu Jun 28 10:56:55 2012
@@ -17,7 +17,7 @@ import static junit.framework.Assert.ass
  * @author Evgeniy Berlog
  * date: 12.06.12
  */
-public class TestDrawingShapes extends TestCase{
+public class TestDrawingShapes extends TestCase {
 
     /**
      * HSSFShape tree bust be built correctly
@@ -33,7 +33,7 @@ public class TestDrawingShapes extends T
      * ----shape
      * ----shape
      */
-    public void testDrawingGroups(){
+    public void testDrawingGroups() {
         HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
         HSSFSheet sheet = wb.getSheet("groups");
         HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
@@ -47,7 +47,7 @@ public class TestDrawingShapes extends T
     }
 
     public void testHSSFShapeCompatibility() {
-        HSSFShape shape = new HSSFSimpleShape(null, new  HSSFClientAnchor());
+        HSSFShape shape = new HSSFSimpleShape(null, new HSSFClientAnchor());
         assertEquals(0x08000040, shape.getLineStyleColor());
         assertEquals(0x08000009, shape.getFillColor());
         assertEquals(HSSFShape.LINEWIDTH_DEFAULT, shape.getLineWidth());
@@ -61,22 +61,22 @@ public class TestDrawingShapes extends T
 
         assertEquals(7, opt.getEscherProperties().size());
         assertEquals(true,
-                ((EscherBoolProperty)opt.lookup(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE)).isTrue());
+                ((EscherBoolProperty) opt.lookup(EscherProperties.TEXT__SIZE_TEXT_TO_FIT_SHAPE)).isTrue());
         assertEquals(0x00000004,
-                ((EscherSimpleProperty)opt.lookup(EscherProperties.GEOMETRY__SHAPEPATH)).getPropertyValue());
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.GEOMETRY__SHAPEPATH)).getPropertyValue());
         assertEquals(0x08000009,
-                ((EscherSimpleProperty)opt.lookup(EscherProperties.FILL__FILLCOLOR)).getPropertyValue());
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.FILL__FILLCOLOR)).getPropertyValue());
         assertEquals(true,
-                ((EscherBoolProperty)opt.lookup(EscherProperties.FILL__NOFILLHITTEST)).isTrue());
+                ((EscherBoolProperty) opt.lookup(EscherProperties.FILL__NOFILLHITTEST)).isTrue());
         assertEquals(0x08000040,
-                ((EscherSimpleProperty)opt.lookup(EscherProperties.LINESTYLE__COLOR)).getPropertyValue());
+                ((EscherSimpleProperty) opt.lookup(EscherProperties.LINESTYLE__COLOR)).getPropertyValue());
         assertEquals(true,
-                ((EscherBoolProperty)opt.lookup(EscherProperties.LINESTYLE__NOLINEDRAWDASH)).isTrue());
+                ((EscherBoolProperty) opt.lookup(EscherProperties.LINESTYLE__NOLINEDRAWDASH)).isTrue());
         assertEquals(true,
-                ((EscherBoolProperty)opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());
+                ((EscherBoolProperty) opt.lookup(EscherProperties.GROUPSHAPE__PRINT)).isTrue());
     }
 
-    public void testDefaultPictureSettings(){
+    public void testDefaultPictureSettings() {
         HSSFPicture picture = new HSSFPicture(null, new HSSFClientAnchor());
         assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
         assertEquals(picture.getFillColor(), HSSFShape.FILL__FILLCOLOR_DEFAULT);
@@ -89,7 +89,7 @@ public class TestDrawingShapes extends T
     /**
      * No NullPointerException should appear
      */
-    public void testDefaultSettingsWithEmptyContainer(){
+    public void testDefaultSettingsWithEmptyContainer() {
         EscherContainerRecord container = new EscherContainerRecord();
         EscherOptRecord opt = new EscherOptRecord();
         opt.setRecordId(EscherOptRecord.RECORD_ID);
@@ -107,6 +107,7 @@ public class TestDrawingShapes extends T
         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
      */
@@ -116,7 +117,7 @@ public class TestDrawingShapes extends T
         HSSFSheet sheet = wb.createSheet();
 
         HSSFPatriarch drawing = sheet.createDrawingPatriarch();
-        HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 200, 200, (short)2, 2, (short)15, 15);
+        HSSFClientAnchor anchor = new HSSFClientAnchor(10, 10, 200, 200, (short) 2, 2, (short) 15, 15);
         anchor.setAnchorType(2);
         assertEquals(anchor.getAnchorType(), 2);
 
@@ -139,7 +140,7 @@ public class TestDrawingShapes extends T
         assertEquals(1, drawing.getChildren().size());
 
         HSSFSimpleShape rectangle2 =
-                (HSSFSimpleShape)drawing.getChildren().get(0);
+                (HSSFSimpleShape) drawing.getChildren().get(0);
         assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE,
                 rectangle2.getShapeType());
         assertEquals(10000, rectangle2.getLineWidth());
@@ -163,7 +164,7 @@ public class TestDrawingShapes extends T
         sheet = wb.getSheetAt(0);
         drawing = sheet.getDrawingPatriarch();
         assertEquals(1, drawing.getChildren().size());
-        rectangle2 = (HSSFSimpleShape)drawing.getChildren().get(0);
+        rectangle2 = (HSSFSimpleShape) drawing.getChildren().get(0);
         assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, rectangle2.getShapeType());
         assertEquals(77, rectangle2.getLineWidth());
         assertEquals(9, rectangle2.getLineStyle());
@@ -183,7 +184,7 @@ public class TestDrawingShapes extends T
         assertEquals(drawing.getChildren().size(), 2);
     }
 
-    public void testReadExistingImage(){
+    public void testReadExistingImage() {
         HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
         HSSFSheet sheet = wb.getSheet("pictures");
         HSSFPatriarch drawing = sheet.getDrawingPatriarch();
@@ -196,6 +197,9 @@ public class TestDrawingShapes extends T
         assertEquals(picture.getLineWidth(), HSSFShape.LINEWIDTH_DEFAULT);
         assertEquals(picture.getLineStyle(), HSSFShape.LINESTYLE_DEFAULT);
         assertEquals(picture.isNoFill(), true);
+
+        picture.setPictureIndex(2);
+        assertEquals(picture.getPictureIndex(), 2);
     }
 
 
@@ -206,20 +210,19 @@ public class TestDrawingShapes extends T
         HSSFPatriarch drawing = sheet.getDrawingPatriarch();
         assertEquals(1, drawing.getChildren().size());
 
-        for(HSSFShape shape : drawing.getChildren()){
-            assertEquals(shape.isNoFill(), true);
-            assertEquals(shape.getLineStyle(), HSSFShape.LINESTYLE_DASHDOTGEL);
-            assertEquals(shape.getLineStyleColor(), 0x616161);
-            assertEquals(HexDump.toHex(shape.getFillColor()), shape.getFillColor(), 0x2CE03D);
-            assertEquals(shape.getLineWidth(), HSSFShape.LINEWIDTH_ONE_PT*2);
-        }
+        HSSFSimpleShape shape = (HSSFSimpleShape) drawing.getChildren().get(0);
+        assertEquals(shape.isNoFill(), true);
+        assertEquals(shape.getLineStyle(), HSSFShape.LINESTYLE_DASHDOTGEL);
+        assertEquals(shape.getLineStyleColor(), 0x616161);
+        assertEquals(HexDump.toHex(shape.getFillColor()), shape.getFillColor(), 0x2CE03D);
+        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++) {
+        for (int i = 0; i < 2; i++) {
             patriarch1.createSimpleShape(new HSSFClientAnchor());
         }
 
@@ -240,15 +243,15 @@ public class TestDrawingShapes extends T
         assertEquals(3, spgrContainer.getChildRecords().size());
 
         EscherSpRecord sp0 =
-                ((EscherContainerRecord)spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);
+                ((EscherContainerRecord) spgrContainer.getChild(0)).getChildById(EscherSpRecord.RECORD_ID);
         assertEquals(1024, sp0.getShapeId());
 
         EscherSpRecord sp1 =
-                ((EscherContainerRecord)spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);
+                ((EscherContainerRecord) spgrContainer.getChild(1)).getChildById(EscherSpRecord.RECORD_ID);
         assertEquals(1025, sp1.getShapeId());
 
         EscherSpRecord sp2 =
-                ((EscherContainerRecord)spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);
+                ((EscherContainerRecord) spgrContainer.getChild(2)).getChildById(EscherSpRecord.RECORD_ID);
         assertEquals(1026, sp2.getShapeId());
     }
 
@@ -256,7 +259,7 @@ public class TestDrawingShapes extends T
      * Test get new id for shapes from existing file
      * File already have for 1 shape on each sheet, because document must contain EscherDgRecord for each sheet
      */
-    public void testAllocateNewIds(){
+    public void testAllocateNewIds() {
         HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("empty.xls");
         HSSFSheet sheet = wb.getSheetAt(0);
         HSSFPatriarch patriarch = sheet.getDrawingPatriarch();
@@ -288,4 +291,37 @@ public class TestDrawingShapes extends T
         assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1027);
         assertEquals(HSSFTestHelper.allocateNewShapeId(patriarch), 1028);
     }
+
+    public void testOpt() throws Exception {
+        HSSFWorkbook wb = new HSSFWorkbook();
+
+        // create a sheet with a text box
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());
+        EscherOptRecord opt1 = HSSFTestHelper.getOptRecord(textbox);
+        EscherOptRecord opt2 = textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID);
+        assertSame(opt1, opt2);
+    }
+    
+    public void testCorrectOrderInOptRecord(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sheet = wb.createSheet();
+        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
+
+        HSSFTextbox textbox = patriarch.createTextbox(new HSSFClientAnchor());
+        EscherOptRecord opt = HSSFTestHelper.getOptRecord(textbox);    
+        
+        String opt1Str = opt.toXml();
+
+        textbox.setFillColor(textbox.getFillColor());
+        assertEquals(opt1Str, textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID).toXml());
+        textbox.setLineStyle(textbox.getLineStyle());
+        assertEquals(opt1Str, textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID).toXml());
+        textbox.setLineWidth(textbox.getLineWidth());
+        assertEquals(opt1Str, textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID).toXml());
+        textbox.setLineStyleColor(textbox.getLineStyleColor());
+        assertEquals(opt1Str, textbox.getEscherContainer().getChildById(EscherOptRecord.RECORD_ID).toXml());
+    }
 }

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/HSSFTestHelper.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/HSSFTestHelper.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/HSSFTestHelper.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/HSSFTestHelper.java Thu Jun 28 10:56:55 2012
@@ -16,6 +16,7 @@
 ==================================================================== */
 
 package org.apache.poi.hssf.usermodel;
+import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.hssf.model.InternalSheet;
 import org.apache.poi.hssf.model.InternalWorkbook;
 import org.apache.poi.hssf.record.EscherAggregate;
@@ -47,4 +48,8 @@ public class HSSFTestHelper {
     public static int allocateNewShapeId(HSSFPatriarch patriarch){
         return patriarch.newShapeId();
     }
+
+    public static EscherOptRecord getOptRecord(HSSFShape shape){
+        return shape._optRecord;
+    }
 }

Added: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestComment.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestComment.java?rev=1354910&view=auto
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestComment.java (added)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestComment.java Thu Jun 28 10:56:55 2012
@@ -0,0 +1,241 @@
+package org.apache.poi.hssf.usermodel;
+
+import junit.framework.TestCase;
+import org.apache.poi.ddf.EscherSpRecord;
+import org.apache.poi.hssf.HSSFTestDataSamples;
+import org.apache.poi.hssf.model.CommentShape;
+import org.apache.poi.hssf.model.HSSFTestModelHelper;
+import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
+import org.apache.poi.hssf.record.NoteRecord;
+import org.apache.poi.hssf.record.ObjRecord;
+import org.apache.poi.hssf.record.TextObjectRecord;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+/**
+ * @author Evgeniy Berlog
+ * @date 26.06.12
+ */
+public class TestComment extends TestCase {
+
+    public void testResultEqualsToAbstractShape() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+        HSSFRow row = sh.createRow(0);
+        HSSFCell cell = row.createCell(0);
+        cell.setCellComment(comment);
+
+        CommentShape commentShape = HSSFTestModelHelper.createCommentShape(0, comment);
+
+        assertEquals(comment.getEscherContainer().getChildRecords().size(), 5);
+        assertEquals(commentShape.getSpContainer().getChildRecords().size(), 5);
+
+        //sp record
+        byte[] expected = commentShape.getSpContainer().getChild(0).serialize();
+        byte[] actual = comment.getEscherContainer().getChild(0).serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        expected = commentShape.getSpContainer().getChild(2).serialize();
+        actual = comment.getEscherContainer().getChild(2).serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        expected = commentShape.getSpContainer().getChild(3).serialize();
+        actual = comment.getEscherContainer().getChild(3).serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        expected = commentShape.getSpContainer().getChild(4).serialize();
+        actual = comment.getEscherContainer().getChild(4).serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        ObjRecord obj = comment.getObjRecord();
+        ObjRecord objShape = commentShape.getObjRecord();
+
+        expected = obj.serialize();
+        actual = objShape.serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        TextObjectRecord tor = comment.getTextObjectRecord();
+        TextObjectRecord torShape = commentShape.getTextObjectRecord();
+
+        expected = tor.serialize();
+        actual = torShape.serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+
+        NoteRecord note = comment.getNoteRecord();
+        NoteRecord noteShape = commentShape.getNoteRecord();
+
+        expected = note.serialize();
+        actual = noteShape.serialize();
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(Arrays.equals(expected, actual));
+    }
+
+    public void testAddToExistingFile() {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+        comment.setString(new HSSFRichTextString("comment1"));
+        comment = patriarch.createCellComment(new HSSFClientAnchor());
+        comment.setString(new HSSFRichTextString("comment2"));
+
+        assertEquals(patriarch.getChildren().size(), 2);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sh = wb.getSheetAt(0);
+        patriarch = sh.getDrawingPatriarch();
+
+        assertEquals(patriarch.getChildren().size(), 2);
+        comment = patriarch.createCellComment(new HSSFClientAnchor());
+        comment.setString(new HSSFRichTextString("comment3"));
+
+        assertEquals(patriarch.getChildren().size(), 3);
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sh = wb.getSheetAt(0);
+        patriarch = sh.getDrawingPatriarch();
+        assertEquals(patriarch.getChildren().size(), 3);
+        assertEquals(((HSSFComment) patriarch.getChildren().get(0)).getString().getString(), "comment1");
+        assertEquals(((HSSFComment) patriarch.getChildren().get(1)).getString().getString(), "comment2");
+        assertEquals(((HSSFComment) patriarch.getChildren().get(2)).getString().getString(), "comment3");
+    }
+
+    public void testSetGetProperties() throws IOException {
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+        comment.setString(new HSSFRichTextString("comment1"));
+        assertEquals(comment.getString().getString(), "comment1");
+
+        comment.setAuthor("poi");
+        assertEquals(comment.getAuthor(), "poi");
+
+        comment.setColumn(3);
+        assertEquals(comment.getColumn(), 3);
+
+        comment.setRow(4);
+        assertEquals(comment.getRow(), 4);
+
+        comment.setVisible(false);
+        assertEquals(comment.isVisible(), false);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sh = wb.getSheetAt(0);
+        patriarch = sh.getDrawingPatriarch();
+
+        comment = (HSSFComment) patriarch.getChildren().get(0);
+
+        assertEquals(comment.getString().getString(), "comment1");
+        assertEquals("poi", comment.getAuthor());
+        assertEquals(comment.getColumn(), 3);
+        assertEquals(comment.getRow(), 4);
+        assertEquals(comment.isVisible(), false);
+
+        comment.setString(new HSSFRichTextString("comment12"));
+        comment.setAuthor("poi2");
+        comment.setColumn(32);
+        comment.setRow(42);
+        comment.setVisible(true);
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sh = wb.getSheetAt(0);
+        patriarch = sh.getDrawingPatriarch();
+        comment = (HSSFComment) patriarch.getChildren().get(0);
+
+        assertEquals(comment.getString().getString(), "comment12");
+        assertEquals("poi2", comment.getAuthor());
+        assertEquals(comment.getColumn(), 32);
+        assertEquals(comment.getRow(), 42);
+        assertEquals(comment.isVisible(), true);
+    }
+
+    public void testExistingFileWithComment(){
+        HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");
+        HSSFSheet sheet = wb.getSheet("comments");
+        HSSFPatriarch drawing = sheet.getDrawingPatriarch();
+        assertEquals(1, drawing.getChildren().size());
+        HSSFComment comment = (HSSFComment) drawing.getChildren().get(0);
+        assertEquals(comment.getAuthor(), "evgeniy");
+        assertEquals(comment.getString().getString(), "evgeniy:\npoi test");
+        assertEquals(comment.getColumn(), 1);
+        assertEquals(comment.getRow(), 2);
+    }
+
+    public void testFindComments(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+        HSSFRow row = sh.createRow(5);
+        HSSFCell cell = row.createCell(4);
+        cell.setCellComment(comment);
+
+        HSSFTestModelHelper.createCommentShape(0, comment);
+
+        assertNotNull(sh.findCellComment(5, 4));
+        assertNull(sh.findCellComment(5, 5));
+
+        wb = HSSFTestDataSamples.writeOutAndReadBack(wb);
+        sh = wb.getSheetAt(0);
+
+        assertNotNull(sh.findCellComment(5, 4));
+        assertNull(sh.findCellComment(5, 5));
+    }
+
+    public void testInitState(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+
+        HSSFSimpleShape shape = patriarch.createSimpleShape(new HSSFClientAnchor());
+
+        //5 properties of HSSFShape + 8 of HSSFTextbox
+        assertEquals(comment._optRecord.getEscherProperties().size(), 13);
+    }
+
+    public void testShapeId(){
+        HSSFWorkbook wb = new HSSFWorkbook();
+        HSSFSheet sh = wb.createSheet();
+        HSSFPatriarch patriarch = sh.createDrawingPatriarch();
+
+        HSSFComment comment = patriarch.createCellComment(new HSSFClientAnchor());
+
+        comment.setShapeId(2024);
+        /**
+         * SpRecord.id == shapeId
+         * ObjRecord.id == shapeId - 1024
+         * NoteRecord.id == ObjectRecord.id == shapeId - 1024
+         */
+
+        assertEquals(comment.getShapeId(), 2024);
+
+        CommonObjectDataSubRecord cod = (CommonObjectDataSubRecord) comment.getObjRecord().getSubRecords().get(0);
+        assertEquals(cod.getObjectId(), 1000);
+        EscherSpRecord spRecord = (EscherSpRecord) comment.getEscherContainer().getChild(0);
+        assertEquals(spRecord.getShapeId(), 2024);
+        assertEquals(comment.getShapeId(), 2024);
+        assertEquals(comment.getNoteRecord().getShapeId(), 1000);
+    }
+}

Modified: poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java?rev=1354910&r1=1354909&r2=1354910&view=diff
==============================================================================
--- poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java (original)
+++ poi/branches/gsoc2012/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFComment.java Thu Jun 28 10:56:55 2012
@@ -32,7 +32,7 @@ public final class TestHSSFComment exten
     }
 
     public void testDefaultShapeType() {
-        HSSFComment comment = new HSSFComment((HSSFShape)null, (HSSFAnchor)null);
+        HSSFComment comment = new HSSFComment((HSSFShape)null, new HSSFClientAnchor());
         assertEquals(HSSFSimpleShape.OBJECT_TYPE_COMMENT, comment.getShapeType());
     }
 

Modified: poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls
URL: http://svn.apache.org/viewvc/poi/branches/gsoc2012/test-data/spreadsheet/drawings.xls?rev=1354910&r1=1354909&r2=1354910&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