Author: nick
Date: Tue Jan 15 08:31:29 2008
New Revision: 612148

URL: http://svn.apache.org/viewvc?rev=612148&view=rev
Log:
Some more updates to the records->usermodel support for hssf shapes. Still not 
enough there to be useful to pretty much anyone, but at least there's now a 
framework in place that people can use if they want to support more, and some 
tests

Modified:
    poi/trunk/src/java/org/apache/poi/ddf/EscherContainerRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/model/DrawingManager2.java
    poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
    poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java
    
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java
    poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java

Modified: poi/trunk/src/java/org/apache/poi/ddf/EscherContainerRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ddf/EscherContainerRecord.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ddf/EscherContainerRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/ddf/EscherContainerRecord.java Tue Jan 15 
08:31:29 2008
@@ -100,11 +100,47 @@
         }
         return 8 + childRecordsSize;
     }
+    
+    /**
+     * Do any of our (top level) children have the
+     *  given recordId?
+     */
+    public boolean hasChildOfType(short recordId) {
+        for ( Iterator iterator = getChildRecords().iterator(); 
iterator.hasNext(); )
+        {
+            EscherRecord r = (EscherRecord) iterator.next();
+            if(r.getRecordId() == recordId) {
+               return true;
+            }
+        }
+        return false;
+    }
 
+    /**
+     * Returns a list of all the child (escher) records
+     *  of the container.
+     */
     public List getChildRecords()
     {
         return childRecords;
     }
+    
+    /**
+     * Returns all of our children which are also
+     *  EscherContainers (may be 0, 1, or vary rarely
+     *   2 or 3)
+     */
+    public List getChildContainers() {
+       List containers = new ArrayList();
+        for ( Iterator iterator = getChildRecords().iterator(); 
iterator.hasNext(); )
+        {
+            EscherRecord r = (EscherRecord) iterator.next();
+            if(r instanceof EscherContainerRecord) {
+               containers.add(r);
+            }
+        }
+        return containers;
+    }
 
     public void setChildRecords( List childRecords )
     {
@@ -149,26 +185,42 @@
 
     public String toString()
     {
+       return toString("");
+    }
+    public String toString(String indent)
+    {
         String nl = System.getProperty( "line.separator" );
 
         StringBuffer children = new StringBuffer();
         if ( getChildRecords().size() > 0 )
         {
             children.append( "  children: " + nl );
+            
+            int count = 0;
             for ( Iterator iterator = getChildRecords().iterator(); 
iterator.hasNext(); )
             {
+               String newIndent = indent + "   ";
+               
                 EscherRecord record = (EscherRecord) iterator.next();
-                children.append( record.toString() );
-//                children.append( nl );
+                children.append(newIndent + "Child " + count + ":\n");
+                
+                if(record instanceof EscherContainerRecord) {
+                       EscherContainerRecord ecr = 
(EscherContainerRecord)record;
+                       children.append( ecr.toString(newIndent));
+                } else {
+                       children.append( record.toString() );
+                }
+                count++;
             }
         }
 
-        return getClass().getName() + " (" + getRecordName() + "):" + nl +
-                "  isContainer: " + isContainerRecord() + nl +
-                "  options: 0x" + HexDump.toHex( getOptions() ) + nl +
-                "  recordId: 0x" + HexDump.toHex( getRecordId() ) + nl +
-                "  numchildren: " + getChildRecords().size() + nl +
-                children.toString();
+        return 
+               indent + getClass().getName() + " (" + getRecordName() + "):" + 
nl +
+            indent + "  isContainer: " + isContainerRecord() + nl +
+            indent + "  options: 0x" + HexDump.toHex( getOptions() ) + nl +
+            indent + "  recordId: 0x" + HexDump.toHex( getRecordId() ) + nl +
+            indent + "  numchildren: " + getChildRecords().size() + nl +
+            indent + children.toString();
 
     }
 

Modified: poi/trunk/src/java/org/apache/poi/hssf/model/DrawingManager2.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/model/DrawingManager2.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/model/DrawingManager2.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/model/DrawingManager2.java Tue Jan 
15 08:31:29 2008
@@ -39,6 +39,13 @@
     {
         this.dgg = dgg;
     }
+    
+    /**
+     * Clears the cached list of drawing groups
+     */
+    public void clearDrawingGroups() {
+       drawingGroups.clear(); 
+    }
 
     public EscherDgRecord createDgRecord()
     {
@@ -93,9 +100,13 @@
     }
 
     ////////////  Non-public methods /////////////
+    
+    /**
+     * Finds the next available (1 based) drawing group id
+     */
     short findNewDrawingGroupId()
     {
-        short dgId = 1;
+        short dgId = 1; 
         while ( drawingGroupExists( dgId ) )
             dgId++;
         return dgId;

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/EscherAggregate.java Tue Jan 
15 08:31:29 2008
@@ -24,6 +24,8 @@
 import org.apache.poi.hssf.model.DrawingManager2;
 import org.apache.poi.hssf.model.ConvertAnchor;
 import org.apache.poi.hssf.model.CommentShape;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 import java.util.*;
 
@@ -47,6 +49,7 @@
 public class EscherAggregate extends AbstractEscherHolderRecord
 {
     public static final short sid = 9876;
+    private static POILogger log = 
POILogFactory.getLogger(EscherAggregate.class);
 
     public static final short ST_MIN = (short) 0;
     public static final short ST_NOT_PRIMATIVE = ST_MIN;
@@ -533,8 +536,134 @@
                throw new IllegalStateException("Must call setPatriarch() 
first");
        }
        
+       // The top level container ought to have
+       //  the DgRecord and the container of one container
+       //  per shape group (patriach overall first)
+       EscherContainerRecord topContainer =
+               (EscherContainerRecord)getEscherContainer();
+       if(topContainer == null) {
+               return;
+       }
+       topContainer = (EscherContainerRecord) 
+               topContainer.getChildContainers().get(0);
+       
+       List tcc = topContainer.getChildContainers();
+       if(tcc.size() == 0) {
+               throw new IllegalStateException("No child escher containers at 
the point that should hold the patriach data, and one container per top level 
shape!");
+       }
+       
+       // First up, get the patriach position
+       // This is in the first EscherSpgrRecord, in
+       //  the first container, with a EscherSRecord too
+       EscherContainerRecord patriachContainer =
+               (EscherContainerRecord)tcc.get(0);
+       EscherSpgrRecord spgr = null;
+       for(Iterator it = patriachContainer.getChildRecords().iterator(); 
it.hasNext();) {
+               EscherRecord r = (EscherRecord)it.next();
+               if(r instanceof EscherSpgrRecord) {
+                       spgr = (EscherSpgrRecord)r;
+                       break;
+               }
+       }
+       if(spgr != null) {
+               patriarch.setCoordinates(
+                               spgr.getRectX1(), spgr.getRectY1(),
+                               spgr.getRectX2(), spgr.getRectY2()
+               );
+       }
+       
+       // Now process the containers for each group
+       //  and objects
+       for(int i=1; i<tcc.size(); i++) {
+               EscherContainerRecord shapeContainer =
+                       (EscherContainerRecord)tcc.get(i);
+               //System.err.println("\n\n*****\n\n");
+               //System.err.println(shapeContainer);
+               
+               // Could be a group, or a base object
+               if(shapeContainer.getChildRecords().size() == 1 &&
+                               shapeContainer.getChildContainers().size() == 
1) {
+                       // Group
+                       HSSFShapeGroup group =
+                               new HSSFShapeGroup(null, new 
HSSFClientAnchor());
+                       patriarch.getChildren().add(group);
+                       
+                       EscherContainerRecord groupContainer =
+                               
(EscherContainerRecord)shapeContainer.getChild(0);
+                       convertRecordsToUserModel(groupContainer, group);
+               } else if(shapeContainer.hasChildOfType((short)0xF00D)) {
+                       // TextBox
+                       HSSFTextbox box =
+                               new HSSFTextbox(null, new HSSFClientAnchor());
+                       patriarch.getChildren().add(box);
+                       
+                       convertRecordsToUserModel(shapeContainer, box);
+               } else if(shapeContainer.hasChildOfType((short)0xF011)) {
+                       // Not yet supporting EscherClientDataRecord stuff
+               } else {
+                       // Base level
+                       convertRecordsToUserModel(shapeContainer, patriarch);
+               }
+       }
+       
+       // Now, clear any trace of what records make up
+       //  the patriarch
+       // Otherwise, everything will go horribly wrong
+       //  when we try to write out again....
+//     clearEscherRecords();
+       drawingManager.getDgg().setFileIdClusters(new 
EscherDggRecord.FileIdCluster[0]);
+
        // TODO: Support converting our records
        //  back into shapes
+       log.log(POILogger.WARN, "Not processing objects into Patriarch!");
+    }
+    
+    private void convertRecordsToUserModel(EscherContainerRecord 
shapeContainer, Object model) {
+       for(Iterator it = shapeContainer.getChildRecords().iterator(); 
it.hasNext();) {
+               EscherRecord r = (EscherRecord)it.next();
+               if(r instanceof EscherSpgrRecord) {
+                       // This may be overriden by a later 
EscherClientAnchorRecord
+                       EscherSpgrRecord spgr = (EscherSpgrRecord)r;
+                       
+                       if(model instanceof HSSFShapeGroup) {
+                               HSSFShapeGroup g = (HSSFShapeGroup)model;
+                               g.setCoordinates(
+                                               spgr.getRectX1(), 
spgr.getRectY1(),
+                                               spgr.getRectX2(), 
spgr.getRectY2()
+                               );
+                       } else {
+                               throw new IllegalStateException("Got top level 
anchor but not processing a group");
+                       }
+               } 
+               else if(r instanceof EscherClientAnchorRecord) {
+                       EscherClientAnchorRecord car = 
(EscherClientAnchorRecord)r;
+                       
+                       if(model instanceof HSSFShape) {
+                               HSSFShape g = (HSSFShape)model;
+                               g.getAnchor().setDx1(car.getDx1());
+                               g.getAnchor().setDx2(car.getDx2());
+                               g.getAnchor().setDy1(car.getDy1());
+                               g.getAnchor().setDy2(car.getDy2());
+                       } else {
+                               throw new IllegalStateException("Got top level 
anchor but not processing a group or shape");
+                       }
+               }
+               else if(r instanceof EscherTextboxRecord) {
+                       EscherTextboxRecord tbr = (EscherTextboxRecord)r;
+                       
+                       // Also need to find the TextObjectRecord too
+                       // TODO
+               }
+               else if(r instanceof EscherSpRecord) {
+                       // Use flags if needed
+               }
+               else if(r instanceof EscherOptRecord) {
+                       // Use properties if needed
+               }
+               else {
+                       //System.err.println(r);
+               }
+       }
     }
     
     public void clear()

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java Tue Jan 
15 08:31:29 2008
@@ -254,4 +254,10 @@
         return y2;
     }
 
+    /**
+     * Returns the aggregate escher record we're bound to 
+     */
+    protected EscherAggregate _getBoundAggregate() {
+       return boundAggregate;
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java 
(original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java Tue 
Jan 15 08:31:29 2008
@@ -121,7 +121,7 @@
     }
 
     /**
-     * Sets the coordinate space of this group.  All children are contrained
+     * Sets the coordinate space of this group.  All children are constrained
      * to these coordinates.
      */
     public void setCoordinates( int x1, int y1, int x2, int y2 )
@@ -177,5 +177,4 @@
         }
         return count;
     }
-
-}
+}
\ No newline at end of file

Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Tue Jan 15 
08:31:29 2008
@@ -1528,7 +1528,14 @@
     /**
      * Returns the top-level drawing patriach, if there is
      *  one.
-     * This will hold any graphics or charts for the sheet
+     * This will hold any graphics or charts for the sheet.
+     * WARNING - calling this will trigger a parsing of the
+     *  associated escher records. Any that aren't supported
+     *  (such as charts and complex drawing types) will almost
+     *  certainly be lost or corrupted when written out. Only
+     *  use this with simple drawings, otherwise call
+     *  [EMAIL PROTECTED] HSSFSheet#createDrawingPatriarch()} and
+     *  start from scratch!
      */
     public HSSFPatriarch getDrawingPatriarch() {
        book.findDrawingGroup();
@@ -1547,10 +1554,17 @@
                return null;
        }
        
+       // Grab our aggregate record, and wire it up
         EscherAggregate agg = (EscherAggregate) 
sheet.findFirstRecordBySid(EscherAggregate.sid);
         HSSFPatriarch patriarch = new HSSFPatriarch(this, agg);
         agg.setPatriarch(patriarch);
+        
+        // Have it process the records into high level objects
+        //  as best it can do (this step may eat anything
+        //  that isn't supported, you were warned...)
         agg.convertRecordsToUserModel();
+        
+        // Return what we could cope with
         return patriarch;
     }
 

Modified: 
poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java 
(original)
+++ poi/trunk/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java 
Tue Jan 15 08:31:29 2008
@@ -82,21 +82,45 @@
         r2.setOptions( (short) 0x9876 );
         r2.setRecordId( EscherOptRecord.RECORD_ID );
 
+        String expected;
         r.addChildRecord( r2 );
-        String expected = "org.apache.poi.ddf.EscherContainerRecord 
(SpContainer):" + nl +
-                        "  isContainer: true" + nl +
-                        "  options: 0x000F" + nl +
-                        "  recordId: 0xF004" + nl +
-                        "  numchildren: 1" + nl +
-                        "  children: " + nl +
-                        "org.apache.poi.ddf.EscherOptRecord:" + nl +
-                        "  isContainer: false" + nl +
-                        "  options: 0x0003" + nl +
-                        "  recordId: 0xF00B" + nl +
-                        "  numchildren: 0" + nl +
-                        "  properties:" + nl;
+        expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + 
nl +
+                   "  isContainer: true" + nl +
+                   "  options: 0x000F" + nl +
+                   "  recordId: 0xF004" + nl +
+                   "  numchildren: 1" + nl +
+                   "  children: " + nl +
+                   "   Child 0:" + nl +
+                   "org.apache.poi.ddf.EscherOptRecord:" + nl +
+                   "  isContainer: false" + nl +
+                   "  options: 0x0003" + nl +
+                   "  recordId: 0xF00B" + nl +
+                   "  numchildren: 0" + nl +
+                   "  properties:" + nl;
         assertEquals( expected, r.toString() );
 
+        r.addChildRecord( r2 );
+        expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + 
nl +
+                   "  isContainer: true" + nl +
+                   "  options: 0x000F" + nl +
+                   "  recordId: 0xF004" + nl +
+                   "  numchildren: 2" + nl +
+                   "  children: " + nl +
+                   "   Child 0:" + nl +
+                   "org.apache.poi.ddf.EscherOptRecord:" + nl +
+                   "  isContainer: false" + nl +
+                   "  options: 0x0003" + nl +
+                   "  recordId: 0xF00B" + nl +
+                   "  numchildren: 0" + nl +
+                   "  properties:" + nl +
+                   "   Child 1:" + nl +
+                   "org.apache.poi.ddf.EscherOptRecord:" + nl +
+                   "  isContainer: false" + nl +
+                   "  options: 0x0003" + nl +
+                   "  recordId: 0xF00B" + nl +
+                   "  numchildren: 0" + nl +
+                   "  properties:" + nl;
+        assertEquals( expected, r.toString() );
     }
 
     public void testGetRecordSize() throws Exception

Modified: 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java 
(original)
+++ 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java 
Tue Jan 15 08:31:29 2008
@@ -20,24 +20,36 @@
 import junit.framework.TestCase;
 
 import java.awt.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 
 /**
  * Tests the capabilities of the EscherGraphics class.
+ * 
+ * All tests have two escher groups available to them,
+ *  one anchored at 0,0,1022,255 and another anchored
+ *  at 20,30,500,200 
  *
  * @author Glen Stampoultzis (glens at apache.org)
  */
 public class TestEscherGraphics extends TestCase
 {
-    private HSSFShapeGroup escherGroup;
+       private HSSFWorkbook workbook;
+       private HSSFPatriarch patriarch;
+    private HSSFShapeGroup escherGroupA;
+    private HSSFShapeGroup escherGroupB;
     private EscherGraphics graphics;
 
     protected void setUp() throws Exception
     {
-        HSSFWorkbook workbook = new HSSFWorkbook();
+        workbook = new HSSFWorkbook();
+        
         HSSFSheet sheet = workbook.createSheet("test");
-        escherGroup = sheet.createDrawingPatriarch().createGroup(new 
HSSFClientAnchor(0,0,1023,255,(short)0,0,(short) 0,0));
-        escherGroup = new HSSFShapeGroup(null, new HSSFChildAnchor());
-        graphics = new EscherGraphics(this.escherGroup, workbook, Color.black, 
1.0f);
+        patriarch = sheet.createDrawingPatriarch();
+        escherGroupA = patriarch.createGroup(new 
HSSFClientAnchor(0,0,1022,255,(short)0,0,(short) 0,0));
+        escherGroupB = patriarch.createGroup(new 
HSSFClientAnchor(20,30,500,200,(short)0,0,(short) 0,0));
+//        escherGroup = new HSSFShapeGroup(null, new HSSFChildAnchor());
+        graphics = new EscherGraphics(this.escherGroupA, workbook, 
Color.black, 1.0f);
         super.setUp();
     }
 
@@ -74,7 +86,7 @@
     public void testFillRect() throws Exception
     {
         graphics.fillRect( 10, 10, 20, 20 );
-        HSSFSimpleShape s = (HSSFSimpleShape) escherGroup.getChildren().get(0);
+        HSSFSimpleShape s = (HSSFSimpleShape) 
escherGroupA.getChildren().get(0);
         assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, s.getShapeType());
         assertEquals(10, s.getAnchor().getDx1());
         assertEquals(10, s.getAnchor().getDy1());
@@ -85,8 +97,198 @@
     public void testDrawString() throws Exception
     {
         graphics.drawString("This is a test", 10, 10);
-        HSSFTextbox t = (HSSFTextbox) escherGroup.getChildren().get(0);
+        HSSFTextbox t = (HSSFTextbox) escherGroupA.getChildren().get(0);
         assertEquals("This is a test", t.getString().getString().toString());
     }
 
+    public void testGetDataBackAgain() throws Exception {
+       HSSFSheet s;
+       HSSFShapeGroup s1;
+       HSSFShapeGroup s2;
+       
+       patriarch.setCoordinates(10, 20, 30, 40);
+       
+       ByteArrayOutputStream baos = new ByteArrayOutputStream();
+       workbook.write(baos);
+       workbook = new HSSFWorkbook(new 
ByteArrayInputStream(baos.toByteArray()));
+       s = workbook.getSheetAt(0);
+       
+       patriarch = s.getDrawingPatriarch();
+       
+       assertNotNull(patriarch);
+       assertEquals(10, patriarch.getX1());
+       assertEquals(20, patriarch.getY1());
+       assertEquals(30, patriarch.getX2());
+       assertEquals(40, patriarch.getY2());
+       
+       // Check the two groups too
+       assertEquals(2, patriarch.countOfAllChildren());
+       assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup);
+       assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup);
+       
+       s1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
+       s2 = (HSSFShapeGroup)patriarch.getChildren().get(1);
+       
+       assertEquals(0, s1.getX1());
+       assertEquals(0, s1.getY1());
+       assertEquals(1023, s1.getX2());
+       assertEquals(255, s1.getY2());
+       assertEquals(0, s2.getX1());
+       assertEquals(0, s2.getY1());
+       assertEquals(1023, s2.getX2());
+       assertEquals(255, s2.getY2());
+       
+       assertEquals(0, s1.getAnchor().getDx1());
+       assertEquals(0, s1.getAnchor().getDy1());
+       assertEquals(1022, s1.getAnchor().getDx2());
+       assertEquals(255, s1.getAnchor().getDy2());
+       assertEquals(20, s2.getAnchor().getDx1());
+       assertEquals(30, s2.getAnchor().getDy1());
+       assertEquals(500, s2.getAnchor().getDx2());
+       assertEquals(200, s2.getAnchor().getDy2());
+       
+       
+       // Write and re-load once more, to check that's ok
+       baos = new ByteArrayOutputStream();
+       workbook.write(baos);
+       workbook = new HSSFWorkbook(new 
ByteArrayInputStream(baos.toByteArray()));
+       s = workbook.getSheetAt(0);
+       patriarch = s.getDrawingPatriarch();
+       
+       assertNotNull(patriarch);
+       assertEquals(10, patriarch.getX1());
+       assertEquals(20, patriarch.getY1());
+       assertEquals(30, patriarch.getX2());
+       assertEquals(40, patriarch.getY2());
+       
+       // Check the two groups too
+       assertEquals(2, patriarch.countOfAllChildren());
+       assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup);
+       assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup);
+       
+       s1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
+       s2 = (HSSFShapeGroup)patriarch.getChildren().get(1);
+       
+       assertEquals(0, s1.getX1());
+       assertEquals(0, s1.getY1());
+       assertEquals(1023, s1.getX2());
+       assertEquals(255, s1.getY2());
+       assertEquals(0, s2.getX1());
+       assertEquals(0, s2.getY1());
+       assertEquals(1023, s2.getX2());
+       assertEquals(255, s2.getY2());
+       
+       assertEquals(0, s1.getAnchor().getDx1());
+       assertEquals(0, s1.getAnchor().getDy1());
+       assertEquals(1022, s1.getAnchor().getDx2());
+       assertEquals(255, s1.getAnchor().getDy2());
+       assertEquals(20, s2.getAnchor().getDx1());
+       assertEquals(30, s2.getAnchor().getDy1());
+       assertEquals(500, s2.getAnchor().getDx2());
+       assertEquals(200, s2.getAnchor().getDy2());
+       
+       // Change the positions of the first groups,
+       //  but not of their anchors
+       s1.setCoordinates(2, 3, 1021, 242);
+       
+       baos = new ByteArrayOutputStream();
+       workbook.write(baos);
+       workbook = new HSSFWorkbook(new 
ByteArrayInputStream(baos.toByteArray()));
+       s = workbook.getSheetAt(0);
+       patriarch = s.getDrawingPatriarch();
+       
+       assertNotNull(patriarch);
+       assertEquals(10, patriarch.getX1());
+       assertEquals(20, patriarch.getY1());
+       assertEquals(30, patriarch.getX2());
+       assertEquals(40, patriarch.getY2());
+       
+       // Check the two groups too
+       assertEquals(2, patriarch.countOfAllChildren());
+       assertEquals(2, patriarch.getChildren().size());
+       assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup);
+       assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup);
+       
+       s1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
+       s2 = (HSSFShapeGroup)patriarch.getChildren().get(1);
+       
+       assertEquals(2, s1.getX1());
+       assertEquals(3, s1.getY1());
+       assertEquals(1021, s1.getX2());
+       assertEquals(242, s1.getY2());
+       assertEquals(0, s2.getX1());
+       assertEquals(0, s2.getY1());
+       assertEquals(1023, s2.getX2());
+       assertEquals(255, s2.getY2());
+       
+       assertEquals(0, s1.getAnchor().getDx1());
+       assertEquals(0, s1.getAnchor().getDy1());
+       assertEquals(1022, s1.getAnchor().getDx2());
+       assertEquals(255, s1.getAnchor().getDy2());
+       assertEquals(20, s2.getAnchor().getDx1());
+       assertEquals(30, s2.getAnchor().getDy1());
+       assertEquals(500, s2.getAnchor().getDx2());
+       assertEquals(200, s2.getAnchor().getDy2());
+       
+       
+       // Now add some text to one group, and some more
+       //  to the base, and check we can get it back again
+       HSSFTextbox tbox1 =
+               patriarch.createTextbox(new HSSFClientAnchor(1,2,3,4, 
(short)0,0,(short)0,0));
+       tbox1.setString(new HSSFRichTextString("I am text box 1"));
+       HSSFTextbox tbox2 =
+               s2.createTextbox(new HSSFChildAnchor(41,42,43,44));
+       tbox2.setString(new HSSFRichTextString("This is text box 2"));
+       
+       assertEquals(3, patriarch.getChildren().size());
+       
+       
+       baos = new ByteArrayOutputStream();
+       workbook.write(baos);
+       workbook = new HSSFWorkbook(new 
ByteArrayInputStream(baos.toByteArray()));
+       s = workbook.getSheetAt(0);
+       
+       patriarch = s.getDrawingPatriarch();
+       
+       assertNotNull(patriarch);
+       assertEquals(10, patriarch.getX1());
+       assertEquals(20, patriarch.getY1());
+       assertEquals(30, patriarch.getX2());
+       assertEquals(40, patriarch.getY2());
+       
+       // Check the two groups and the text
+       assertEquals(3, patriarch.countOfAllChildren());
+       assertEquals(2, patriarch.getChildren().size());
+       
+       // Should be two groups and a text
+       assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup);
+       assertTrue(patriarch.getChildren().get(1) instanceof HSSFTextbox);
+//     assertTrue(patriarch.getChildren().get(2) instanceof HSSFShapeGroup);
+       
+       s1 = (HSSFShapeGroup)patriarch.getChildren().get(0);
+       tbox1 = (HSSFTextbox)patriarch.getChildren().get(1);
+       
+//     s2 = (HSSFShapeGroup)patriarch.getChildren().get(1);
+       
+       assertEquals(2, s1.getX1());
+       assertEquals(3, s1.getY1());
+       assertEquals(1021, s1.getX2());
+       assertEquals(242, s1.getY2());
+       assertEquals(0, s2.getX1());
+       assertEquals(0, s2.getY1());
+       assertEquals(1023, s2.getX2());
+       assertEquals(255, s2.getY2());
+       
+       assertEquals(0, s1.getAnchor().getDx1());
+       assertEquals(0, s1.getAnchor().getDy1());
+       assertEquals(1022, s1.getAnchor().getDx2());
+       assertEquals(255, s1.getAnchor().getDy2());
+       assertEquals(20, s2.getAnchor().getDx1());
+       assertEquals(30, s2.getAnchor().getDy1());
+       assertEquals(500, s2.getAnchor().getDx2());
+       assertEquals(200, s2.getAnchor().getDy2());
+       
+       // Not working just yet
+       //assertEquals("I am text box 1", tbox1.getString().getString());
+    }
 }

Modified: 
poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java
URL: 
http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java?rev=612148&r1=612147&r2=612148&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java 
(original)
+++ poi/trunk/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java 
Tue Jan 15 08:31:29 2008
@@ -151,6 +151,13 @@
         assertNull(b.getSheetAt(1).getDrawingPatriarch());
         assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart());
         
+        // We've now called getDrawingPatriarch() so 
+        //  everything will be all screwy
+        // So, start again
+        b = new HSSFWorkbook(
+                       new FileInputStream(new 
File(filename,"44010-SingleChart.xls"))
+        );
+        
         b = writeRead(b);
         assertEquals(2, b.getNumberOfSheets());
         s = b.getSheetAt(1);
@@ -177,6 +184,13 @@
         assertNull(b.getSheetAt(1).getDrawingPatriarch());
         assertNull(b.getSheetAt(2).getDrawingPatriarch());
         assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart());
+        
+        // We've now called getDrawingPatriarch() so 
+        //  everything will be all screwy
+        // So, start again
+        b = new HSSFWorkbook(
+                       new FileInputStream(new 
File(filename,"44010-TwoCharts.xls"))
+        );
         
         b = writeRead(b);
         assertEquals(3, b.getNumberOfSheets());



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to