You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ye...@apache.org on 2008/10/10 16:54:33 UTC

svn commit: r703490 [1/2] - in /poi/branches/ooxml/src: ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/ ooxml/java/org/apache/poi/ ooxml/java/org/apache/poi/xssf/dev/ ooxml/java/org/apache/poi/xssf/model/ ooxml/java/org/apache/poi/xssf/usermodel/ o...

Author: yegor
Date: Fri Oct 10 07:54:32 2008
New Revision: 703490

URL: http://svn.apache.org/viewvc?rev=703490&view=rev
Log:
Initial support for SpreadsheetML drawings,implemented XSSFPicture, added ability to add pictures to workbook, refactored XSSFPictureData to be a subclass of  POIXMLDocumentPart. Also refactored misc odds and ends in order to produce xml better compatible with what MS Office produces

Added:
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java   (with props)
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java   (with props)
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java   (with props)
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java   (with props)
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java   (with props)
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java   (with props)
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java   (with props)
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPicture.java   (with props)
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java   (with props)
    poi/branches/ooxml/src/testcases/org/apache/poi/hssf/data/WithDrawing.xlsx   (with props)
Modified:
    poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLRelation.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/dev/XSSFSave.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/Drawing.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
    poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java
    poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFSheet.java

Modified: poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java (original)
+++ poi/branches/ooxml/src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Sheet.java Fri Oct 10 07:54:32 2008
@@ -672,7 +672,7 @@
      *
      * @return  The new patriarch.
      */
-    Patriarch createDrawingPatriarch();
+    //Patriarch createDrawingPatriarch();
 
     /**
      * Expands or collapses a column group.

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLDocumentPart.java Fri Oct 10 07:54:32 2008
@@ -43,6 +43,7 @@
         DEFAULT_XML_OPTIONS = new XmlOptions();
         DEFAULT_XML_OPTIONS.setSaveOuter();
         DEFAULT_XML_OPTIONS.setUseDefaultNamespace();
+        DEFAULT_XML_OPTIONS.setSaveAggressiveNamespaces();
     }
 
     protected PackagePart packagePart;
@@ -158,16 +159,30 @@
      * @return the created child POIXMLDocumentPart
      */
     protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, Class<? extends POIXMLDocumentPart> cls, int idx){
+        return createRelationship(descriptor, cls, idx, false);
+    }
+
+    /**
+     * Create a new child POIXMLDocumentPart
+     *
+     * @param descriptor the part descriptor
+     * @param cls the Class object identifying the type of instance to create
+     * @param idx part number
+     * @param norel if true, then no relationship is added. 
+     * @return the created child POIXMLDocumentPart
+     */
+    protected POIXMLDocumentPart createRelationship(POIXMLRelation descriptor, Class<? extends POIXMLDocumentPart> cls, int idx, boolean norel){
         try {
 
             PackagePartName ppName = PackagingURIHelper.createPartName(descriptor.getFileName(idx));
-            PackageRelationship rel =
-                packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation());
+            PackageRelationship rel = null;
+            if(!norel) rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, descriptor.getRelation());
 
             PackagePart part = packagePart.getPackage().createPart(ppName, descriptor.getContentType());
             POIXMLDocumentPart doc = cls.newInstance();
             doc.packageRel = rel;
             doc.packagePart = part;
+            doc.parent = this;
             addRelation(doc);
             return doc;
         } catch (Exception e){

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLRelation.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLRelation.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLRelation.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/POIXMLRelation.java Fri Oct 10 07:54:32 2008
@@ -23,22 +23,64 @@
  */
 public class POIXMLRelation {
 
+    /**
+     * Describes the content stored in a part.
+     */
     protected String _type;
+
+    /**
+     * The kind of connection between a source part and a target part in a package.
+     */
     protected String _relation;
+
+    /**
+     * The path component of a pack URI.
+     */
     protected String _defaultName;
 
     /**
      * Instantiates a POIXMLRelation.
+     *
+     * @param type content type
+     * @param rel  relationship
+     * @param defaultName default item name
      */
-    protected POIXMLRelation(String type, String rel, String defaultName) {
+    public POIXMLRelation(String type, String rel, String defaultName) {
         _type = type;
         _relation = rel;
         _defaultName = defaultName;
     }
 
-    public String getContentType() { return _type; }
-    public String getRelation() { return _relation; }
-    public String getDefaultFileName() { return _defaultName; }
+    /**
+     * Return the content type. Content types define a media type, a subtype, and an
+     * optional set of parameters, as defined in RFC 2616.
+     *
+     * @return the content type
+     */
+    public String getContentType() {
+        return _type;
+    }
+
+    /**
+     * Return the relationship, the kind of connection between a source part and a target part in a package.
+     * Relationships make the connections between parts directly discoverable without looking at the content
+     * in the parts, and without altering the parts themselves.
+     *
+     * @return the relationship
+     */
+    public String getRelation() {
+        return _relation;
+    }
+
+    /**
+     * Return the default part name. Part names are used to refer to a part in the context of a
+     * package, typically as part of a URI.
+     *
+     * @return the default part name
+     */
+    public String getDefaultFileName() {
+        return _defaultName;
+    }
 
     /**
      * Returns the filename for the nth one of these,

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/dev/XSSFSave.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/dev/XSSFSave.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/dev/XSSFSave.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/dev/XSSFSave.java Fri Oct 10 07:54:32 2008
@@ -31,7 +31,6 @@
         for (int i = 0; i < args.length; i++) {
             XSSFWorkbook wb = new XSSFWorkbook(args[i]);
 
-            System.out.println("wb.getNumberOfSheets(): " + wb.getNumberOfSheets());
             int sep = args[i].lastIndexOf('.');
             String outfile = args[i].substring(0, sep) + "-save.xlsx";
             FileOutputStream out = new FileOutputStream(outfile);

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/Drawing.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/Drawing.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/Drawing.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/Drawing.java Fri Oct 10 07:54:32 2008
@@ -16,7 +16,7 @@
  * A drawing object in XSSF. May well have raw pictures
  *  attached to it as children.
  */
-public class Drawing implements XSSFChildContainingModel {
+public class Drawing implements XSSFModel {
 	private CTDrawing drawing;
 	private String originalId;
 	
@@ -77,20 +77,11 @@
 	 * Generates and adds XSSFActiveXData children
 	 */
 	public void generateChild(PackagePart childPart, String childRelId) {
-		XSSFPictureData pd = new XSSFPictureData(childPart, childRelId);
-		pictures.add(pd);
-	}
+		//XSSFPictureData pd = new XSSFPictureData(childPart, childRelId);
+		//pictures.add(pd);
+        throw new RuntimeException("deprecated");
+    }
 
-	public WritableChild getChildForWriting(int index) {
-		if(index >= pictures.size()) {
-			throw new IllegalArgumentException("Can't get child at " + index + " when size is " + getNumberOfChildren());
-		}
-		return new WritableChild(
-				pictures.get(index),
-				XSSFRelation.IMAGES
-		);
-	}
-	
 	public ArrayList<XSSFPictureData> getPictures()
 	{
 		return this.pictures;

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/SharedStringsTable.java Fri Oct 10 07:54:32 2008
@@ -198,9 +198,7 @@
      * @throws IOException if an error occurs while writing.
      */
     public void writeTo(OutputStream out) throws IOException {
-        XmlOptions options = new XmlOptions();
-        options.setSaveOuter();
-        options.setUseDefaultNamespace();
+        XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS);
 
         //re-create the sst table every time saving a workbook
         SstDocument doc = SstDocument.Factory.newInstance();

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java Fri Oct 10 07:54:32 2008
@@ -330,13 +330,7 @@
 	 * @throws IOException if an error occurs while writing.
 	 */
 	public void writeTo(OutputStream out) throws IOException {
-		XmlOptions options = new XmlOptions();
-		options.setSaveOuter();
-		options.setUseDefaultNamespace();
-
-		// Requests use of whitespace for easier reading
-		options.setSavePrettyPrint();
-
+		XmlOptions options = new XmlOptions(DEFAULT_XML_OPTIONS);
 
 		// Work on the current one
 		// Need to do this, as we don't handle

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,212 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+/**
+ * All know type of automatic shapes in DrawingML
+ *
+ * @author Yegor Kozlov
+ */
+public class ShapeTypes {
+    public static final int LINE = 1;
+    public static final int LINE_INV = 2;
+    public static final int TRIANGLE = 3;
+    public static final int RT_TRIANGLE = 4;
+    public static final int RECT = 5;
+    public static final int DIAMOND = 6;
+    public static final int PARALLELOGRAM = 7;
+    public static final int TRAPEZOID = 8;
+    public static final int NON_ISOSCELES_TRAPEZOID = 9;
+    public static final int PENTAGON = 10;
+    public static final int HEXAGON = 11;
+    public static final int HEPTAGON = 12;
+    public static final int OCTAGON = 13;
+    public static final int DECAGON = 14;
+    public static final int DODECAGON = 15;
+    public static final int STAR_4 = 16;
+    public static final int STAR_5 = 17;
+    public static final int STAR_6 = 18;
+    public static final int STAR_7 = 19;
+    public static final int STAR_8 = 20;
+    public static final int STAR_10 = 21;
+    public static final int STAR_12 = 22;
+    public static final int STAR_16 = 23;
+    public static final int STAR_24 = 24;
+    public static final int STAR_32 = 25;
+    public static final int ROUND_RECT = 26;
+    public static final int ROUND_1_RECT = 27;
+    public static final int ROUND_2_SAME_RECT = 28;
+    public static final int ROUND_2_DIAG_RECT = 29;
+    public static final int SNIP_ROUND_RECT = 30;
+    public static final int SNIP_1_RECT = 31;
+    public static final int SNIP_2_SAME_RECT = 32;
+    public static final int SNIP_2_DIAG_RECT = 33;
+    public static final int PLAQUE = 34;
+    public static final int ELLIPSE = 35;
+    public static final int TEARDROP = 36;
+    public static final int HOME_PLATE = 37;
+    public static final int CHEVRON = 38;
+    public static final int PIE_WEDGE = 39;
+    public static final int PIE = 40;
+    public static final int BLOCK_ARC = 41;
+    public static final int DONUT = 42;
+    public static final int NO_SMOKING = 43;
+    public static final int RIGHT_ARROW = 44;
+    public static final int LEFT_ARROW = 45;
+    public static final int UP_ARROW = 46;
+    public static final int DOWN_ARROW = 47;
+    public static final int STRIPED_RIGHT_ARROW = 48;
+    public static final int NOTCHED_RIGHT_ARROW = 49;
+    public static final int BENT_UP_ARROW = 50;
+    public static final int LEFT_RIGHT_ARROW = 51;
+    public static final int UP_DOWN_ARROW = 52;
+    public static final int LEFT_UP_ARROW = 53;
+    public static final int LEFT_RIGHT_UP_ARROW = 54;
+    public static final int QUAD_ARROW = 55;
+    public static final int LEFT_ARROW_CALLOUT = 56;
+    public static final int RIGHT_ARROW_CALLOUT = 57;
+    public static final int UP_ARROW_CALLOUT = 58;
+    public static final int DOWN_ARROW_CALLOUT = 59;
+    public static final int LEFT_RIGHT_ARROW_CALLOUT = 60;
+    public static final int UP_DOWN_ARROW_CALLOUT = 61;
+    public static final int QUAD_ARROW_CALLOUT = 62;
+    public static final int BENT_ARROW = 63;
+    public static final int UTURN_ARROW = 64;
+    public static final int CIRCULAR_ARROW = 65;
+    public static final int LEFT_CIRCULAR_ARROW = 66;
+    public static final int LEFT_RIGHT_CIRCULAR_ARROW = 67;
+    public static final int CURVED_RIGHT_ARROW = 68;
+    public static final int CURVED_LEFT_ARROW = 69;
+    public static final int CURVED_UP_ARROW = 70;
+    public static final int CURVED_DOWN_ARROW = 71;
+    public static final int SWOOSH_ARROW = 72;
+    public static final int CUBE = 73;
+    public static final int CAN = 74;
+    public static final int LIGHTNING_BOLT = 75;
+    public static final int HEART = 76;
+    public static final int SUN = 77;
+    public static final int MOON = 78;
+    public static final int SMILEY_FACE = 79;
+    public static final int IRREGULAR_SEAL_1 = 80;
+    public static final int IRREGULAR_SEAL_2 = 81;
+    public static final int FOLDED_CORNER = 82;
+    public static final int BEVEL = 83;
+    public static final int FRAME = 84;
+    public static final int HALF_FRAME = 85;
+    public static final int CORNER = 86;
+    public static final int DIAG_STRIPE = 87;
+    public static final int CHORD = 88;
+    public static final int ARC = 89;
+    public static final int LEFT_BRACKET = 90;
+    public static final int RIGHT_BRACKET = 91;
+    public static final int LEFT_BRACE = 92;
+    public static final int RIGHT_BRACE = 93;
+    public static final int BRACKET_PAIR = 94;
+    public static final int BRACE_PAIR = 95;
+    public static final int STRAIGHT_CONNECTOR_1 = 96;
+    public static final int BENT_CONNECTOR_2 = 97;
+    public static final int BENT_CONNECTOR_3 = 98;
+    public static final int BENT_CONNECTOR_4 = 99;
+    public static final int BENT_CONNECTOR_5 = 100;
+    public static final int CURVED_CONNECTOR_2 = 101;
+    public static final int CURVED_CONNECTOR_3 = 102;
+    public static final int CURVED_CONNECTOR_4 = 103;
+    public static final int CURVED_CONNECTOR_5 = 104;
+    public static final int CALLOUT_1 = 105;
+    public static final int CALLOUT_2 = 106;
+    public static final int CALLOUT_3 = 107;
+    public static final int ACCENT_CALLOUT_1 = 108;
+    public static final int ACCENT_CALLOUT_2 = 109;
+    public static final int ACCENT_CALLOUT_3 = 110;
+    public static final int BORDER_CALLOUT_1 = 111;
+    public static final int BORDER_CALLOUT_2 = 112;
+    public static final int BORDER_CALLOUT_3 = 113;
+    public static final int ACCENT_BORDER_CALLOUT_1 = 114;
+    public static final int ACCENT_BORDER_CALLOUT_2 = 115;
+    public static final int ACCENT_BORDER_CALLOUT_3 = 116;
+    public static final int WEDGE_RECT_CALLOUT = 117;
+    public static final int WEDGE_ROUND_RECT_CALLOUT = 118;
+    public static final int WEDGE_ELLIPSE_CALLOUT = 119;
+    public static final int CLOUD_CALLOUT = 120;
+    public static final int CLOUD = 121;
+    public static final int RIBBON = 122;
+    public static final int RIBBON_2 = 123;
+    public static final int ELLIPSE_RIBBON = 124;
+    public static final int ELLIPSE_RIBBON_2 = 125;
+    public static final int LEFT_RIGHT_RIBBON = 126;
+    public static final int VERTICAL_SCROLL = 127;
+    public static final int HORIZONTAL_SCROLL = 128;
+    public static final int WAVE = 129;
+    public static final int DOUBLE_WAVE = 130;
+    public static final int PLUS = 131;
+    public static final int FLOW_CHART_PROCESS = 132;
+    public static final int FLOW_CHART_DECISION = 133;
+    public static final int FLOW_CHART_INPUT_OUTPUT = 134;
+    public static final int FLOW_CHART_PREDEFINED_PROCESS = 135;
+    public static final int FLOW_CHART_INTERNAL_STORAGE = 136;
+    public static final int FLOW_CHART_DOCUMENT = 137;
+    public static final int FLOW_CHART_MULTIDOCUMENT = 138;
+    public static final int FLOW_CHART_TERMINATOR = 139;
+    public static final int FLOW_CHART_PREPARATION = 140;
+    public static final int FLOW_CHART_MANUAL_INPUT = 141;
+    public static final int FLOW_CHART_MANUAL_OPERATION = 142;
+    public static final int FLOW_CHART_CONNECTOR = 143;
+    public static final int FLOW_CHART_PUNCHED_CARD = 144;
+    public static final int FLOW_CHART_PUNCHED_TAPE = 145;
+    public static final int FLOW_CHART_SUMMING_JUNCTION = 146;
+    public static final int FLOW_CHART_OR = 147;
+    public static final int FLOW_CHART_COLLATE = 148;
+    public static final int FLOW_CHART_SORT = 149;
+    public static final int FLOW_CHART_EXTRACT = 150;
+    public static final int FLOW_CHART_MERGE = 151;
+    public static final int FLOW_CHART_OFFLINE_STORAGE = 152;
+    public static final int FLOW_CHART_ONLINE_STORAGE = 153;
+    public static final int FLOW_CHART_MAGNETIC_TAPE = 154;
+    public static final int FLOW_CHART_MAGNETIC_DISK = 155;
+    public static final int FLOW_CHART_MAGNETIC_DRUM = 156;
+    public static final int FLOW_CHART_DISPLAY = 157;
+    public static final int FLOW_CHART_DELAY = 158;
+    public static final int FLOW_CHART_ALTERNATE_PROCESS = 159;
+    public static final int FLOW_CHART_OFFPAGE_CONNECTOR = 160;
+    public static final int ACTION_BUTTON_BLANK = 161;
+    public static final int ACTION_BUTTON_HOME = 162;
+    public static final int ACTION_BUTTON_HELP = 163;
+    public static final int ACTION_BUTTON_INFORMATION = 164;
+    public static final int ACTION_BUTTON_FORWARD_NEXT = 165;
+    public static final int ACTION_BUTTON_BACK_PREVIOUS = 166;
+    public static final int ACTION_BUTTON_END = 167;
+    public static final int ACTION_BUTTON_BEGINNING = 168;
+    public static final int ACTION_BUTTON_RETURN = 169;
+    public static final int ACTION_BUTTON_DOCUMENT = 170;
+    public static final int ACTION_BUTTON_SOUND = 171;
+    public static final int ACTION_BUTTON_MOVIE = 172;
+    public static final int GEAR_6 = 173;
+    public static final int GEAR_9 = 174;
+    public static final int FUNNEL = 175;
+    public static final int MATH_PLUS = 176;
+    public static final int MATH_MINUS = 177;
+    public static final int MATH_MULTIPLY = 178;
+    public static final int MATH_DIVIDE = 179;
+    public static final int MATH_EQUAL = 180;
+    public static final int MATH_NOT_EQUAL = 181;
+    public static final int CORNER_TABS = 182;
+    public static final int SQUARE_TABS = 183;
+    public static final int PLAQUE_TABS = 184;
+    public static final int CHART_X = 185;
+    public static final int CHART_STAR = 186;
+    public static final int CHART_PLUS = 187;
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/ShapeTypes.java
------------------------------------------------------------------------------
    svn:executable = *

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,187 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
+
+/**
+ * A client anchor is attached to an excel worksheet.  It anchors against
+ * top-left and buttom-right cells.
+ *
+ * @author Yegor Kozlov
+ */
+public class XSSFClientAnchor {
+
+    /**
+     * Starting anchor point
+     */
+    private CTMarker cell1;
+
+    /**
+     * Ending anchor point
+     */
+    private CTMarker cell2;
+
+    /**
+     * Creates a new client anchor and defaults all the anchor positions to 0.
+     */
+    public XSSFClientAnchor() {
+        cell1 = CTMarker.Factory.newInstance();
+        cell1.setCol(0);
+        cell1.setColOff(0);
+        cell1.setRow(0);
+        cell1.setRowOff(0);
+        cell2 = CTMarker.Factory.newInstance();
+        cell2.setCol(0);
+        cell2.setColOff(0);
+        cell2.setRow(0);
+        cell2.setRowOff(0);
+    }
+
+    /**
+     * Creates a new client anchor and sets the top-left and bottom-right
+     * coordinates of the anchor.
+     *
+     * @param dx1  the x coordinate within the first cell.
+     * @param dy1  the y coordinate within the first cell.
+     * @param dx2  the x coordinate within the second cell.
+     * @param dy2  the y coordinate within the second cell.
+     * @param col1 the column (0 based) of the first cell.
+     * @param row1 the row (0 based) of the first cell.
+     * @param col2 the column (0 based) of the second cell.
+     * @param row2 the row (0 based) of the second cell.
+     */
+    public XSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2) {
+        this();
+        cell1.setCol(col1);
+        cell1.setColOff(dx1);
+        cell1.setRow(row1);
+        cell1.setRowOff(dy1);
+        cell2.setCol(col2);
+        cell2.setColOff(dx2);
+        cell2.setRow(row2);
+        cell2.setRowOff(dy2);
+    }
+
+    /**
+     * Create XSSFClientAnchor from existing xml beans
+     *
+     * @param cell1 starting anchor point
+     * @param cell2 ending anchor point
+     */
+    protected XSSFClientAnchor(CTMarker cell1, CTMarker cell2) {
+        this.cell1 = cell1;
+        this.cell2 = cell2;
+    }
+
+    public int getCol1() {
+        return cell1.getCol();
+    }
+
+    public void setCol1(short col1) {
+        cell1.setCol(col1);
+    }
+
+    public int getCol2() {
+        return cell2.getCol();
+    }
+
+    public void setCol2(short col2) {
+        cell2.setCol(col2);
+    }
+
+    public int getRow1() {
+        return cell1.getRow();
+    }
+
+    public void setRow1(int row1) {
+        cell1.setRow(row1);
+    }
+
+    public int getRow2() {
+        return cell2.getRow();
+    }
+
+    public void setRow2(int row2) {
+        cell2.setRow(row2);
+    }
+
+    public int getDx1() {
+        return (int)cell1.getColOff();
+    }
+
+    public void setDx1(int dx1) {
+        cell1.setColOff(dx1);
+    }
+
+    public int getDy1() {
+        return (int)cell1.getRowOff();
+    }
+
+    public void setDy1(int dy1) {
+        cell1.setRowOff(dy1);
+    }
+
+    public int getDy2() {
+        return (int)cell2.getRowOff();
+    }
+
+    public void setDy2(int dy2) {
+        cell2.setRowOff(dy2);
+    }
+
+    public int getDx2() {
+        return (int)cell2.getColOff();
+    }
+
+    public void setDx2(int dx2) {
+        cell2.setColOff(dx2);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o == null || !(o instanceof XSSFClientAnchor)) return false;
+
+        XSSFClientAnchor anchor = (XSSFClientAnchor) o;
+        return cell1.toString().equals(anchor.getFrom().toString()) &&
+               cell2.toString().equals(anchor.getTo().toString()) ;
+
+    }
+
+    @Override
+    public String toString(){
+        return "from : " + cell1.toString()  + "; to: " + cell2.toString();
+    }
+
+    /**
+     * Return starting anchor point
+     *
+     * @return starting anchor point
+     */
+    public CTMarker getFrom(){
+        return cell1;
+    }
+
+    /**
+     * Return ending anchor point
+     *
+     * @return ending anchor point
+     */
+    public CTMarker getTo(){
+        return cell2;
+    }
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFClientAnchor.java
------------------------------------------------------------------------------
    svn:executable = *

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,155 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.poi.POIXMLDocumentPart;
+import org.apache.xmlbeans.XmlException;
+import org.apache.xmlbeans.XmlOptions;
+import org.openxml4j.opc.*;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.STEditAs;
+import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
+
+import javax.xml.namespace.QName;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Map;
+import java.util.HashMap;
+
+/**
+ * Represents a SpreadsheetML drawing
+ *
+ * @author Yegor Kozlov
+ */
+public class XSSFDrawing extends POIXMLDocumentPart {
+    /**
+     * Root element of the SpreadsheetML Drawing part
+     */
+    private CTDrawing drawing;
+
+    /**
+     * Create a new SpreadsheetML drawing
+     *
+     * @see org.apache.poi.xssf.usermodel.XSSFWorksheet#createDrawingPatriarch()
+     */
+    public XSSFDrawing() {
+        super(null, null);
+        drawing = newDrawing();
+    }
+
+    /**
+     * Construct a SpreadsheetML drawing from a package part
+     *
+     * @param part the package part holding the drawing data,
+     * the content type must be <code>application/vnd.openxmlformats-officedocument.drawing+xml</code>
+     * @param rel  the package relationship holding this drawing,
+     * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing
+     */
+    public XSSFDrawing(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
+        super(part, rel);
+        drawing = CTDrawing.Factory.parse(part.getInputStream());
+    }
+
+    /**
+     * Construct a new CTDrawing bean. By default, it's just an empty placeholder for drawing objects
+     *
+     * @return a new CTDrawing bean
+     */
+    private static CTDrawing newDrawing(){
+        return CTDrawing.Factory.newInstance();
+    }
+
+    /**
+     * Return the underlying CTDrawing bean, the root element of the SpreadsheetML Drawing part.
+     *
+     * @return the underlying CTDrawing bean
+     */
+    public CTDrawing getCTDrawing(){
+        return drawing;
+    }
+
+    @Override
+    protected void commit() throws IOException {
+        XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
+
+        /*
+            Saved drawings must have the following namespaces set:
+            <xdr:wsDr
+                xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
+                xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing">
+        */
+        xmlOptions.setSaveSyntheticDocumentElement(new QName(CTDrawing.type.getName().getNamespaceURI(), "wsDr", "xdr"));
+        Map map = new HashMap();
+        map.put("http://schemas.openxmlformats.org/drawingml/2006/main", "a");
+        map.put(STRelationshipId.type.getName().getNamespaceURI(), "r");
+        xmlOptions.setSaveSuggestedPrefixes(map);
+
+        PackagePart part = getPackagePart();
+        OutputStream out = part.getOutputStream();
+        drawing.save(out, xmlOptions);
+        out.close();
+    }
+
+    /**
+     * Creates a picture.
+     *
+     * @param anchor    the client anchor describes how this picture is attached to the sheet.
+     * @param pictureIndex the index of the picture in the workbook collection of pictures,
+     *   {@link org.apache.poi.xssf.usermodel.XSSFWorkbook#getAllPictures()} .
+     *
+     * @return  the newly created picture shape.
+     */
+    public XSSFPicture createPicture(XSSFClientAnchor anchor, int pictureIndex)
+    {
+        XSSFWorkbook wb = (XSSFWorkbook)getParent().getParent();
+        XSSFPictureData data = wb.getAllPictures().get(pictureIndex);
+        PackagePartName ppName = data.getPackagePart().getPartName();
+        PackageRelationship rel = packagePart.addRelationship(ppName, TargetMode.INTERNAL, XSSFRelation.IMAGES.getRelation());
+        addRelation(new XSSFPictureData(data.getPackagePart(), rel));
+        CTTwoCellAnchor ctAnchor = createTwoCellAnchor(anchor);
+        return new XSSFPicture(this, rel, ctAnchor);
+    }
+
+    /**
+     * Creates a simple shape.  This includes such shapes as lines, rectangles,
+     * and ovals.
+     *
+     * @param anchor    the client anchor describes how this group is attached
+     *                  to the sheet.
+     * @return  the newly created shape.
+     */
+    public XSSFSimpleShape createSimpleShape(XSSFClientAnchor anchor)
+    {
+        CTTwoCellAnchor ctAnchor = createTwoCellAnchor(anchor);
+        return new XSSFSimpleShape(this, ctAnchor);
+    }
+
+    /**
+     * Create and initialize a CTTwoCellAnchor that anchors a shape against top-left and bottom-right cells.
+     *
+     * @return a new CTTwoCellAnchor
+     */
+    private CTTwoCellAnchor createTwoCellAnchor(XSSFClientAnchor anchor){
+        CTTwoCellAnchor ctAnchor = drawing.addNewTwoCellAnchor();
+        ctAnchor.setEditAs(STEditAs.ONE_CELL);
+        ctAnchor.setFrom(anchor.getFrom());
+        ctAnchor.setTo(anchor.getTo());
+        ctAnchor.addNewClientData();
+        return ctAnchor;
+    }
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFFactory.java Fri Oct 10 07:54:32 2008
@@ -41,6 +41,8 @@
         parts.put(XSSFRelation.SHARED_STRINGS.getRelation(), SharedStringsTable.class);
         parts.put(XSSFRelation.STYLES.getRelation(), StylesTable.class);
         parts.put(XSSFRelation.SHEET_COMMENTS.getRelation(), CommentsTable.class);
+        parts.put(XSSFRelation.DRAWINGS.getRelation(), XSSFDrawing.class);
+        parts.put(XSSFRelation.IMAGES.getRelation(), XSSFPictureData.class);
     }
 
     public POIXMLDocumentPart create(PackageRelationship rel, PackagePart p){

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,325 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.*;
+import org.openxmlformats.schemas.drawingml.x2006.main.*;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.POIXMLDocumentPart;
+import org.openxml4j.opc.PackageRelationship;
+import org.openxml4j.opc.PackagePart;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Element;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Iterator;
+
+/**
+ * Represents a picture shape in a SpreadsheetML drawing.
+ *
+ * @author Yegor Kozlov
+ */
+public class XSSFPicture extends XSSFShape {
+    private static final POILogger logger = POILogFactory.getLogger(XSSFPicture.class);
+
+    /**
+     * width of 1px in columns with default width
+     */
+    private static final float PX_DEFAULT = 0.125f;
+    /**
+     * width of 1px in columns with overridden width
+     */
+    private static final float PX_MODIFIED = 0.143f;
+
+    /**
+     * Height of 1px of a row
+     */
+    private static final int PX_ROW = 15;
+
+    /**
+     * This object specifies a picture object and all its properties
+     */
+    private CTPicture ctPicture;
+
+    /**
+     * Construct a new XSSFPicture object. This constructor is called from
+     *  {@link XSSFDrawing#createPicture(XSSFClientAnchor, int)}
+     *
+     * @param parent the XSSFDrawing that owns this picture
+     * @param rel    the relationship to the picture data
+     * @param anchor the two cell anchor placeholder for this picture,
+     *   this object encloses the CTPicture bean that holds all the picture properties
+     */
+    protected XSSFPicture(XSSFDrawing parent, PackageRelationship rel, CTTwoCellAnchor anchor){
+        super(parent, anchor);
+        //Create a new picture and attach it to the specified two-cell anchor
+        ctPicture = newPicture(rel);
+        anchor.setPic(ctPicture);
+    }
+
+    /**
+     * Create a new CTPicture bean and initialize its required attributes
+     *
+     * @param rel the relationship to the picture data
+     * @return a new CTPicture bean
+     */
+    private static CTPicture newPicture(PackageRelationship rel){
+        CTPicture pic = CTPicture.Factory.newInstance();
+
+        CTPictureNonVisual nvpr = pic.addNewNvPicPr();
+        CTNonVisualDrawingProps nvProps = nvpr.addNewCNvPr();
+        //YK: TODO shape IDs must be unique across workbook
+        int shapeId = 1;
+        nvProps.setId(shapeId);
+        nvProps.setName("Picture " + shapeId);
+        nvProps.setDescr(rel.getTargetURI().toString());
+        CTNonVisualPictureProperties nvPicProps = nvpr.addNewCNvPicPr();
+        nvPicProps.addNewPicLocks().setNoChangeAspect(true);
+
+        CTBlipFillProperties blip = pic.addNewBlipFill();
+        blip.addNewBlip().setEmbed(rel.getId());
+        blip.addNewStretch().addNewFillRect();
+
+        CTShapeProperties sppr = pic.addNewSpPr();
+        CTTransform2D t2d = sppr.addNewXfrm();
+        CTPositiveSize2D ext = t2d.addNewExt();
+        //should be original picture width and height expressed in EMUs
+        ext.setCx(0);
+        ext.setCy(0);
+
+        CTPoint2D off = t2d.addNewOff();
+        off.setX(0);
+        off.setY(0);
+
+        CTPresetGeometry2D prstGeom = sppr.addNewPrstGeom();
+        prstGeom.setPrst(STShapeType.RECT);
+        prstGeom.addNewAvLst();
+        return pic;
+    }
+
+    /**
+     * Return the underlying CTPicture bean that holds all properties for this picture
+     *
+     * @return the underlying CTPicture bean
+     */
+    public CTPicture getCTPicture(){
+        return ctPicture;
+    }
+
+    /**
+     * Reset the image to the original size.
+     */
+    public void resize(){
+        XSSFClientAnchor anchor = getAnchor();
+
+        XSSFClientAnchor pref = getPreferredSize();
+
+        int row2 = anchor.getRow1() + (pref.getRow2() - pref.getRow1());
+        int col2 = anchor.getCol1() + (pref.getCol2() - pref.getCol1());
+
+        anchor.setCol2((short)col2);
+        anchor.setDx1(0);
+        anchor.setDx2(pref.getDx2());
+
+        anchor.setRow2(row2);
+        anchor.setDy1(0);
+        anchor.setDy2(pref.getDy2());
+    }
+
+    /**
+     * Calculate the preferred size for this picture.
+     *
+     * @return XSSFClientAnchor with the preferred size for this image
+     */
+    public XSSFClientAnchor getPreferredSize(){
+        XSSFClientAnchor anchor = getAnchor();
+
+        XSSFPictureData data = getPictureData();
+        Dimension size = getImageDimension(data.getPackagePart(), data.getPictureType());
+
+        float w = 0;
+
+        //space in the leftmost cell
+        w += anchor.getDx1()/EMU_PER_POINT;
+        short col2 = (short)(anchor.getCol1() + 1);
+        int dx2 = 0;
+
+        while(w < size.width){
+            w += getColumnWidthInPixels(col2++);
+        }
+
+        if(w > size.width) {
+            //calculate dx2, offset in the rightmost cell
+            col2--;
+            float cw = getColumnWidthInPixels(col2);
+            float delta = w - size.width;
+            dx2 = (int)(EMU_PER_POINT*(cw-delta));
+        }
+        anchor.setCol2(col2);
+        anchor.setDx2(dx2);
+
+        float h = 0;
+        h += (1 - anchor.getDy1()/256)* getRowHeightInPixels(anchor.getRow1());
+        int row2 = anchor.getRow1() + 1;
+        int dy2 = 0;
+
+        while(h < size.height){
+            h += getRowHeightInPixels(row2++);
+        }
+        if(h > size.height) {
+            row2--;
+            float ch = getRowHeightInPixels(row2);
+            float delta = h - size.height;
+            dy2 = (int)((ch-delta)/ch*256);
+        }
+        anchor.setRow2(row2);
+        anchor.setDy2(dy2);
+
+        return anchor;
+    }
+
+    private float getColumnWidthInPixels(int column){
+        XSSFSheet sheet = (XSSFSheet)getDrawing().getParent();
+        int cw = sheet.getColumnWidth(column);
+        float px = getPixelWidth(column);
+
+        return cw/px;
+    }
+
+    private float getRowHeightInPixels(int i){
+        XSSFSheet sheet = (XSSFSheet)getDrawing().getParent();
+
+        XSSFRow row = sheet.getRow(i);
+        float height;
+        if(row != null) height = row.getHeight();
+        else height = sheet.getDefaultRowHeight();
+
+        return height/PX_ROW;
+    }
+
+    private float getPixelWidth(int column){
+        XSSFSheet sheet = (XSSFSheet)getDrawing().getParent();
+
+        int def = sheet.getDefaultColumnWidth();
+        int cw = sheet.getColumnWidth(column);
+
+        return cw == def ? PX_DEFAULT : PX_MODIFIED;
+    }
+
+    /**
+     * Return the dimension of this image
+     *
+     * @param part the package part holding raw picture data
+     * @param type type of the picture: {@link Workbook#PICTURE_TYPE_JPEG, Workbook#PICTURE_TYPE_PNG or Workbook#PICTURE_TYPE_DIB)
+     *
+     * @return image dimension in pixels
+     */
+    protected static Dimension getImageDimension(PackagePart part, int type){
+        Dimension size = new Dimension();
+
+        switch (type){
+            //we can calculate the preferred size only for JPEG and PNG
+            //other formats like WMF, EMF and PICT are not supported in Java
+            case Workbook.PICTURE_TYPE_JPEG:
+            case Workbook.PICTURE_TYPE_PNG:
+            case Workbook.PICTURE_TYPE_DIB:
+                try {
+                    //read the image using javax.imageio.*
+                    ImageInputStream iis = ImageIO.createImageInputStream( part.getInputStream() );
+                    Iterator i = ImageIO.getImageReaders( iis );
+                    ImageReader r = (ImageReader) i.next();
+                    r.setInput( iis );
+                    BufferedImage img = r.read(0);
+
+                    int[] dpi = getResolution(r);
+
+                    //if DPI is zero then assume standard 96 DPI
+                    //since cannot divide by zero
+                    if (dpi[0] == 0) dpi[0] = 96;
+                    if (dpi[1] == 0) dpi[1] = 96;
+
+                    size.width = img.getWidth()*96/dpi[0];
+                    size.height = img.getHeight()*96/dpi[1];
+
+                } catch (IOException e){
+                    //silently return if ImageIO failed to read the image
+                    logger.log(POILogger.WARN, e);
+                }
+
+                break;
+            default:
+                logger.log(POILogger.WARN, "Only JPEG, PNG and DIB pictures can be automatically sized");
+        }
+        return size;
+    }
+
+    /**
+     * The metadata of PNG and JPEG can contain the width of a pixel in millimeters.
+     * Return the the "effective" dpi calculated as <code>25.4/HorizontalPixelSize</code>
+     * and <code>25.4/VerticalPixelSize</code>.  Where 25.4 is the number of mm in inch.
+     *
+     * @return array of two elements: <code>{horisontalPdi, verticalDpi}</code>.
+     * {96, 96} is the default.
+     */
+    protected static int[] getResolution(ImageReader r) throws IOException {
+        int hdpi=96, vdpi=96;
+        double mm2inch = 25.4;
+
+        NodeList lst;
+        Element node = (Element)r.getImageMetadata(0).getAsTree("javax_imageio_1.0");
+        lst = node.getElementsByTagName("HorizontalPixelSize");
+        if(lst != null && lst.getLength() == 1) hdpi = (int)(mm2inch/Float.parseFloat(((Element)lst.item(0)).getAttribute("value")));
+
+        lst = node.getElementsByTagName("VerticalPixelSize");
+        if(lst != null && lst.getLength() == 1) vdpi = (int)(mm2inch/Float.parseFloat(((Element)lst.item(0)).getAttribute("value")));
+
+        return new int[]{hdpi, vdpi};
+    }
+
+    /**
+     * return the anchor that is used by this shape.
+     *
+     * @return  the anchor that is used by this shape.
+     */
+    public XSSFClientAnchor getAnchor(){
+        CTTwoCellAnchor ctAnchor = (CTTwoCellAnchor)getShapeContainer();
+        return new XSSFClientAnchor(ctAnchor.getFrom(), ctAnchor.getTo());
+    }
+
+    /**
+     * Return picture data for this shape
+     *
+     * @return picture data for this shape
+     */
+    public XSSFPictureData getPictureData() {
+        String blipId = ctPicture.getBlipFill().getBlip().getEmbed();
+        for (POIXMLDocumentPart part : getDrawing().getRelations()) {
+            if(part.getPackageRelationship().getId().equals(blipId)){
+                return (XSSFPictureData)part;
+            }
+        }
+        logger.log(POILogger.WARN, "Picture data was not found for blipId=" + blipId);
+        return null;
+    }
+
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPicture.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java Fri Oct 10 07:54:32 2008
@@ -18,51 +18,105 @@
 package org.apache.poi.xssf.usermodel;
 
 import java.io.IOException;
-import java.io.OutputStream;
-
 import org.apache.poi.ss.usermodel.PictureData;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.util.IOUtils;
-import org.apache.poi.xssf.model.XSSFWritableModel;
+import org.apache.poi.POIXMLDocumentPart;
+import org.apache.poi.POIXMLException;
+import org.apache.poi.POIXMLRelation;
 import org.openxml4j.opc.PackagePart;
+import org.openxml4j.opc.PackageRelationship;
 
 /**
- * Raw picture data, normally attached to a 
- *  vmlDrawing
+ * Raw picture data, normally attached to a SpreadsheetML Drawing.
+ * As a rule, pictures are stored in the /xl/media/ part of a SpreadsheetML package.
  */
-public class XSSFPictureData implements PictureData, XSSFWritableModel {
-    private PackagePart packagePart;
-    private String originalId;
-
-    public XSSFPictureData(PackagePart packagePart, String originalId) {
-        this(packagePart);
-        this.originalId = originalId;
-    }
-    
-    public XSSFPictureData(PackagePart packagePart) {
-        this.packagePart = packagePart;
-    }
-
-    public String getOriginalId() {
-    	return originalId;
-    }
-    
-    protected PackagePart getPart() {
-    	return packagePart;
-    }
-    
-	public void writeTo(OutputStream out) throws IOException {
-		IOUtils.copy(packagePart.getInputStream(), out);
-	}
+public class XSSFPictureData extends POIXMLDocumentPart implements PictureData {
 
+    /**
+     * Relationships for each known picture type
+     */
+    protected static final POIXMLRelation[] RELATIONS;
+    static {
+        RELATIONS = new POIXMLRelation[8];
+        RELATIONS[Workbook.PICTURE_TYPE_EMF] = new POIXMLRelation("image/x-emf", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.emf");
+        RELATIONS[Workbook.PICTURE_TYPE_WMF] = new POIXMLRelation("image/x-wmf", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.wmf");
+        RELATIONS[Workbook.PICTURE_TYPE_PICT] = new POIXMLRelation("image/pict", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.pict");
+        RELATIONS[Workbook.PICTURE_TYPE_JPEG] = new POIXMLRelation("image/jpeg", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.jpeg");
+        RELATIONS[Workbook.PICTURE_TYPE_PNG] = new POIXMLRelation("image/png", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.png");
+        RELATIONS[Workbook.PICTURE_TYPE_DIB] = new POIXMLRelation("image/dib", XSSFRelation.IMAGES.getRelation(), "/xl/media/image#.dib");
+    }
+
+    /**
+     * Create a new XSSFPictureData node
+     *
+     * @see org.apache.poi.xssf.usermodel.XSSFWorkbook#addPicture(byte[], int)
+     */
+    public XSSFPictureData() {
+        super(null, null);
+    }
+
+    /**
+     * Construct XSSFPictureData from a package part
+     *
+     * @param part the package part holding the drawing data,
+     * @param rel  the package relationship holding this drawing,
+     * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/image
+     */
+    public XSSFPictureData(PackagePart part, PackageRelationship rel) {
+        super(part, rel);
+    }
+
+    /**
+     * Gets the picture data as a byte array.
+     * <p>
+     * Note, that this call might be expensive since all the picture data is copied into a temporary byte array.
+     * You can grab the picture data directly from the underlying package part as follows:
+     * <br/>
+     * <code>
+     * InputStream is = getPackagePart().getInputStream();
+     * </code>
+     * </p>
+     *
+     * @return the picture data.
+     */
     public byte[] getData() {
-    	try {
-    		return IOUtils.toByteArray(packagePart.getInputStream());
-    	} catch(IOException e) {
-    		throw new RuntimeException(e);
-    	}
+        try {
+            return IOUtils.toByteArray(getPackagePart().getInputStream());
+        } catch(IOException e) {
+            throw new POIXMLException(e);
+        }
     }
 
+    /**
+     * Suggests a file extension for this image.
+     *
+     * @return the file extension.
+     */
     public String suggestFileExtension() {
-    	return packagePart.getPartName().getExtension();
+        return getPackagePart().getPartName().getExtension();
+    }
+
+    /**
+     * Return an integer constant that specifies type of this picture
+     *
+     * @return an integer constant that specifies type of this picture 
+     * @see Workbook#PICTURE_TYPE_EMF
+     * @see Workbook#PICTURE_TYPE_WMF
+     * @see Workbook#PICTURE_TYPE_PICT
+     * @see Workbook#PICTURE_TYPE_JPEG
+     * @see Workbook#PICTURE_TYPE_PNG
+     * @see Workbook#PICTURE_TYPE_DIB
+     */
+    public int getPictureType(){
+        String contentType = getPackagePart().getContentType();
+        for (int i = 0; i < RELATIONS.length; i++) {
+            if(RELATIONS[i] == null) continue;
+
+            if(RELATIONS[i].getContentType().equals(contentType)){
+                return i;
+            }
+        }
+        return 0;
     }
 }

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java Fri Oct 10 07:54:32 2008
@@ -83,7 +83,7 @@
 		    StylesTable.class
 	);
 	public static final XSSFRelation DRAWINGS = new XSSFRelation(
-			"application/vnd.openxmlformats-officedocument.drawingml.chart+xml",
+			"application/vnd.openxmlformats-officedocument.drawing+xml",
 			"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing",
 			"/xl/drawings/drawing#.xml",
 			null
@@ -95,9 +95,10 @@
 			Drawing.class
 	);
     public static final XSSFRelation IMAGES = new XSSFRelation(
-    		"image/x-emf", // TODO
+            //client will substitute $type and $ext with the appropriate values depending on the passed data
+            "image/$type",
      		"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
-    		"/xl/media/image#.emf",
+    		"/xl/media/image#.$ext",
     		null
     );
 	public static final XSSFRelation<CommentsTable> SHEET_COMMENTS = create(

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,93 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import org.apache.xmlbeans.XmlObject;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTAbsoluteAnchor;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTOneCellAnchor;
+import org.openxmlformats.schemas.drawingml.x2006.chartDrawing.CTGroupShape;
+
+/**
+ * Represents a shape in a SpreadsheetML drawing.
+ * 
+ * @author Yegor Kozlov
+ */
+public abstract class XSSFShape {
+    public static final int EMU_PER_POINT = 12700;
+
+
+    /**
+     * Shape container. Can be CTTwoCellAnchor, CTOneCellAnchor, CTAbsoluteAnchor or CTGroupShape
+     */
+    private XmlObject spContainer;
+
+    /**
+     * Parent drawing
+     */
+    private XSSFDrawing drawing;
+
+    /**
+     * The parent shape, always not-null for shapes in groups
+     */
+    private XSSFShape parent;
+
+    /**
+     * Construct a new XSSFSimpleShape object.
+     *
+     * @param parent the XSSFDrawing that owns this shape
+     * @param anchor an object that encloses the shape bean,
+     *   can be CTTwoCellAnchor, CTOneCellAnchor, CTAbsoluteAnchor or CTGroupShape
+     */
+    protected XSSFShape(XSSFDrawing parent, XmlObject anchor){
+        drawing = parent;
+        if(!(anchor instanceof CTTwoCellAnchor) && !(anchor instanceof CTOneCellAnchor) &&
+           !(anchor instanceof CTAbsoluteAnchor) && !(anchor instanceof CTGroupShape)) {
+            throw new IllegalArgumentException("anchor must be one of the following types: " +
+                    "CTTwoCellAnchor, CTOneCellAnchor, CTAbsoluteAnchor or CTGroupShape");
+        }
+        spContainer = anchor;
+    }
+
+    /**
+     * Return the anchor bean that encloses this shape.
+     * Can be CTTwoCellAnchor, CTOneCellAnchor, CTAbsoluteAnchor or CTGroupShape.
+     *
+     * @return the anchor bean that encloses this shape
+     */
+    public XmlObject getShapeContainer(){
+        return spContainer;
+    }
+
+    /**
+     * Return the drawing that owns this shape
+     *
+     * @return the parent drawing that owns this shape
+     */
+    public XSSFDrawing getDrawing(){
+        return drawing;
+    }
+
+    /**
+     * Gets the parent shape.
+     */
+    public XSSFShape getParent()
+    {
+        return parent;
+    }
+
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFShape.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSheet.java Fri Oct 10 07:54:32 2008
@@ -19,11 +19,7 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import javax.xml.namespace.QName;
 
 import org.apache.poi.hssf.util.PaneInformation;
@@ -31,7 +27,6 @@
 import org.apache.poi.ss.usermodel.CommentsSource;
 import org.apache.poi.ss.usermodel.Footer;
 import org.apache.poi.ss.usermodel.Header;
-import org.apache.poi.ss.usermodel.Patriarch;
 import org.apache.poi.ss.usermodel.PrintSetup;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -40,16 +35,18 @@
 import org.apache.poi.ss.util.Region;
 import org.apache.poi.xssf.model.CommentsTable;
 import org.apache.poi.xssf.model.Control;
-import org.apache.poi.xssf.model.Drawing;
 import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.POIXMLException;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
 import org.apache.xmlbeans.XmlOptions;
 import org.apache.xmlbeans.XmlException;
 import org.openxml4j.opc.PackagePart;
 import org.openxml4j.opc.PackageRelationship;
 import org.openxml4j.opc.PackageRelationshipCollection;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
+import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
 
 
 /**
@@ -62,6 +59,8 @@
  * </p>
  */
 public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
+    private static POILogger logger = POILogFactory.getLogger(XSSFSheet.class);
+
     protected CTSheet sheet;
     protected CTWorksheet worksheet;
     protected CTDialogsheet dialogsheet;
@@ -72,7 +71,6 @@
     protected CTMergeCells ctMergeCells;
 
 
-    protected List<Drawing> drawings;
     protected List<Control> controls;
 
 
@@ -149,7 +147,6 @@
         ctFormat.setDefaultRowHeight(15.0);
 
         CTSheetView ctView = worksheet.addNewSheetViews().addNewSheetView();
-        ctView.setTabSelected(true);
         ctView.setWorkbookViewId(0);
 
         worksheet.addNewDimension().setRef("A1");
@@ -167,11 +164,6 @@
         return worksheet;
     }
 
-    public List<Drawing> getDrawings()
-    {
-        return drawings;
-        }
-
     public List<Control> getControls()
     {
         return controls;
@@ -263,9 +255,42 @@
         columnHelper.setColBestFit(column, true);
     }
 
-    public Patriarch createDrawingPatriarch() {
-        // TODO Auto-generated method stub
-        return null;
+    /**
+     * Create a new SpreadsheetML drawing. If this sheet already contains a drawing - return that.
+     *
+     * @return a SpreadsheetML drawing
+     */
+    public XSSFDrawing createDrawingPatriarch() {
+        XSSFDrawing drawing = null;
+        CTDrawing ctDrawing = worksheet.getDrawing();
+        if(ctDrawing == null) {
+            //drawingNumber = #drawings.size() + 1
+            int drawingNumber = getPackagePart().getPackage().getPartsByRelationshipType(XSSFRelation.DRAWINGS.getRelation()).size() + 1;
+            drawing = (XSSFDrawing)createRelationship(XSSFRelation.DRAWINGS, XSSFDrawing.class, drawingNumber);
+            String relId = drawing.getPackageRelationship().getId();
+
+            //add CT_Drawing element which indicates that this sheet contains drawing components built on the drawingML platform.
+            //The relationship Id references the part containing the drawingML definitions.
+            ctDrawing = worksheet.addNewDrawing();
+            ctDrawing.setId(relId);
+        } else {
+            //search the referenced drawing in the list of the sheet's relations
+            for(POIXMLDocumentPart p : getRelations()){
+                if(p instanceof XSSFDrawing) {
+                    XSSFDrawing dr = (XSSFDrawing)p;
+                    String drId = dr.getPackageRelationship().getId();
+                    if(drId.equals(ctDrawing.getId())){
+                        drawing = dr;
+                        break;
+                    }
+                    break;
+                }
+            }
+            if(drawing == null){
+                logger.log(POILogger.ERROR, "Can't find drawing with id=" + ctDrawing.getId() + " in the list of the sheet's relationships");
+            }
+        }
+        return drawing;
     }
 
     /**
@@ -406,14 +431,16 @@
     }
 
     public int getColumnWidth(int columnIndex) {
-        return (int) columnHelper.getColumn(columnIndex, false).getWidth();
+        CTCol col = columnHelper.getColumn(columnIndex, false);
+        return col == null ? getDefaultColumnWidth() : (int)col.getWidth();
     }
     public short getColumnWidth(short column) {
         return (short) getColumnWidth(column & 0xFFFF);
     }
 
     public int getDefaultColumnWidth() {
-        return (int)getSheetTypeSheetFormatPr().getDefaultColWidth();
+        CTSheetFormatPr pr = getSheetTypeSheetFormatPr();
+        return pr.isSetDefaultColWidth() ? (int)pr.getDefaultColWidth() : (int)pr.getBaseColWidth();
     }
 
     public short getDefaultRowHeight() {
@@ -1570,14 +1597,15 @@
 
         XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
         xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorksheet.type.getName().getNamespaceURI(), "worksheet"));
+
+        Map map = new HashMap();
+        map.put(STRelationshipId.type.getName().getNamespaceURI(), "r");
+        xmlOptions.setSaveSuggestedPrefixes(map);
+
         PackagePart part = getPackagePart();
         OutputStream out = part.getOutputStream();
         worksheet.save(out, xmlOptions);
         out.close();
     }
 
-    protected void setParent(POIXMLDocumentPart p){
-        this.parent = p;
-    }
-
 }

Added: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java (added)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,178 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTShape;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTShapeNonVisual;
+import org.openxmlformats.schemas.drawingml.x2006.main.*;
+
+/**
+ * Represents an auto-shape in a SpreadsheetML drawing.
+ *
+ * @author Yegor Kozlov
+ */
+public class XSSFSimpleShape extends XSSFShape {
+
+    private CTShape ctShape;
+
+    /**
+     * Construct a new XSSFSimpleShape object.
+     *
+     * @param parent the XSSFDrawing that owns this shape
+     * @param anchor the two cell anchor placeholder for this shape,
+     *               this object encloses the shape bean that holds all the shape properties
+     */
+    protected XSSFSimpleShape(XSSFDrawing parent, CTTwoCellAnchor anchor) {
+        super(parent, anchor);
+        ctShape = anchor.addNewSp();
+        newShape(ctShape);
+    }
+
+    /**
+     * Initialize default structure of a new auto-shape
+     *
+     * @param shape newly created shape to initialize
+     */
+    private static void newShape(CTShape shape) {
+        CTShapeNonVisual nv = shape.addNewNvSpPr();
+        CTNonVisualDrawingProps nvp = nv.addNewCNvPr();
+        int shapeId = 1;
+        nvp.setId(shapeId);
+        nvp.setName("Shape " + shapeId);
+        nv.addNewCNvSpPr();
+
+        CTShapeProperties sp = shape.addNewSpPr();
+        CTTransform2D t2d = sp.addNewXfrm();
+        CTPositiveSize2D p1 = t2d.addNewExt();
+        p1.setCx(0);
+        p1.setCy(0);
+        CTPoint2D p2 = t2d.addNewOff();
+        p2.setX(0);
+        p2.setY(0);
+
+        CTPresetGeometry2D geom = sp.addNewPrstGeom();
+        geom.setPrst(STShapeType.RECT);
+        geom.addNewAvLst();
+
+        CTShapeStyle style = shape.addNewStyle();
+        CTSchemeColor scheme = style.addNewLnRef().addNewSchemeClr();
+        scheme.setVal(STSchemeColorVal.ACCENT_1);
+        scheme.addNewShade().setVal(50000);
+        style.getLnRef().setIdx(2);
+
+        CTStyleMatrixReference fillref = style.addNewFillRef();
+        fillref.setIdx(1);
+        fillref.addNewSchemeClr().setVal(STSchemeColorVal.ACCENT_1);
+
+        CTStyleMatrixReference effectRef = style.addNewEffectRef();
+        effectRef.setIdx(0);
+        effectRef.addNewSchemeClr().setVal(STSchemeColorVal.ACCENT_1);
+
+        CTFontReference fontRef = style.addNewFontRef();
+        fontRef.setIdx(STFontCollectionIndex.MINOR);
+        fontRef.addNewSchemeClr().setVal(STSchemeColorVal.LT_1);
+
+        CTTextBody body = shape.addNewTxBody();
+        CTTextBodyProperties bodypr = body.addNewBodyPr();
+        bodypr.setAnchor(STTextAnchoringType.CTR);
+        bodypr.setRtlCol(false);
+        CTTextParagraph p = body.addNewP();
+        p.addNewPPr().setAlgn(STTextAlignType.CTR);
+
+        body.addNewLstStyle();
+    }
+
+    /**
+     * Gets the shape type, one of the constants defined in {@link ShapeTypes}.
+     *
+     * @return the shape type
+     * @see ShapeTypes
+     */
+    public int getShapeType() {
+        return ctShape.getSpPr().getPrstGeom().getPrst().intValue();
+    }
+
+    /**
+     * Sets the shape types.
+     *
+     * @param type the shape type, one of the constants defined in {@link ShapeTypes}.
+     * @see ShapeTypes
+     */
+    public void setShapeType(int type) {
+        ctShape.getSpPr().getPrstGeom().setPrst(STShapeType.Enum.forInt(type));
+    }
+
+
+    /**
+     * Whether this shape is not filled with a color
+     *
+     * @return true if this shape is not filled with a color.
+     */
+    public boolean isNoFill() {
+        return ctShape.getSpPr().isSetNoFill();
+    }
+
+    /**
+     * Sets whether this shape is filled or transparent.
+     *
+     * @param noFill if true then no fill will be applied to the shape element.
+     */
+    public void setNoFill(boolean noFill) {
+        CTShapeProperties props = ctShape.getSpPr();
+        //unset solid and pattern fills if they are set
+        if (props.isSetPattFill()) props.unsetPattFill();
+        if (props.isSetSolidFill()) props.unsetSolidFill();
+
+        props.setNoFill(CTNoFillProperties.Factory.newInstance());
+    }
+
+    /**
+     * Sets the color used to fill this shape using the solid fill pattern.
+     */
+    public void setFillColor(int red, int green, int blue) {
+        CTShapeProperties props = ctShape.getSpPr();
+        CTSolidColorFillProperties fill = props.isSetSolidFill() ? props.getSolidFill() : props.addNewSolidFill();
+        CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
+        rgb.setVal(new byte[]{(byte)red, (byte)green, (byte)blue});
+        fill.setSrgbClr(rgb);
+    }
+
+    /**
+     * The color applied to the lines of this shape.
+     */
+    public void setLineStyleColor( int red, int green, int blue ) {
+        CTShapeProperties props = ctShape.getSpPr();
+        CTLineProperties ln = props.isSetLn() ? props.getLn() : props.addNewLn();
+        CTSolidColorFillProperties fill = ln.isSetSolidFill() ? ln.getSolidFill() : ln.addNewSolidFill();
+        CTSRgbColor rgb = CTSRgbColor.Factory.newInstance();
+        rgb.setVal(new byte[]{(byte)red, (byte)green, (byte)blue});
+        fill.setSrgbClr(rgb);
+    }
+
+    /**
+     * Specifies the width to be used for the underline stroke.
+     *
+     * @param lineWidth width in points
+     */
+    public void setLineWidth( double lineWidth ) {
+        CTShapeProperties props = ctShape.getSpPr();
+        CTLineProperties ln = props.isSetLn() ? props.getLn() : props.addNewLn();
+        ln.setW((int)(lineWidth*EMU_PER_POINT));
+    }
+
+}

Propchange: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFSimpleShape.java
------------------------------------------------------------------------------
    svn:executable = *

Modified: poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (original)
+++ poi/branches/ooxml/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java Fri Oct 10 07:54:32 2008
@@ -19,10 +19,9 @@
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.util.*;
 import javax.xml.namespace.QName;
 import org.apache.poi.POIXMLDocument;
 import org.apache.poi.POIXMLDocumentPart;
@@ -35,6 +34,7 @@
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
 import org.apache.poi.util.PackageHelper;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.xssf.model.*;
 import org.apache.poi.POIXMLException;
 import org.apache.xmlbeans.XmlObject;
@@ -44,6 +44,7 @@
 import org.openxml4j.opc.*;
 import org.openxml4j.opc.Package;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
+import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
 
 /**
  * High level representation of a SpreadsheetML workbook.  This is the first object most users
@@ -93,6 +94,11 @@
      */
     private MissingCellPolicy missingCellPolicy = Row.RETURN_NULL_AND_BLANK;
 
+    /**
+     * array of pictures for this workbook
+     */
+    private List<XSSFPictureData> pictures;
+
     private static POILogger log = POILogFactory.getLogger(XSSFWorkbook.class);
 
     /**
@@ -250,9 +256,33 @@
         return this.workbook;
     }
 
+    /**
+     * Adds a picture to the workbook.
+     *
+     * @param pictureData       The bytes of the picture
+     * @param format            The format of the picture.
+     *
+     * @return the index to this picture (0 based), the added picture can be obtained from {@link #getAllPictures()} .
+     * @see #PICTURE_TYPE_EMF
+     * @see #PICTURE_TYPE_WMF
+     * @see #PICTURE_TYPE_PICT
+     * @see #PICTURE_TYPE_JPEG
+     * @see #PICTURE_TYPE_PNG
+     * @see #PICTURE_TYPE_DIB
+     * @see #getAllPictures()
+     */
     public int addPicture(byte[] pictureData, int format) {
-        // TODO Auto-generated method stub
-        return 0;
+        int imageNumber = getAllPictures().size() + 1;
+        XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFPictureData.class, imageNumber, true);
+        try {
+            OutputStream out = img.getPackagePart().getOutputStream();
+            out.write(pictureData);
+            out.close();
+        } catch (IOException e){
+            throw new POIXMLException(e);
+        }
+        pictures.add(img);
+        return imageNumber - 1;
     }
 
     public XSSFSheet cloneSheet(int sheetNum) {
@@ -363,13 +393,12 @@
 
         int sheetNumber = getNumberOfSheets() + 1;
         XSSFSheet wrapper = (XSSFSheet)createRelationship(XSSFRelation.WORKSHEET, XSSFSheet.class, sheetNumber);
-        wrapper.setParent(this);
 
         CTSheet sheet = addSheet(sheetname);
         wrapper.sheet = sheet;
         sheet.setId(wrapper.getPackageRelationship().getId());
         sheet.setSheetId(sheetNumber);
-
+        if(sheets.size() == 0) wrapper.setSelected(true);
         this.sheets.add(wrapper);
         return wrapper;
     }
@@ -438,27 +467,21 @@
      *
      * @return the list of pictures (a list of {@link XSSFPictureData} objects.)
      */
-    public List<PictureData> getAllPictures() {
-        // In OOXML pictures are referred to in sheets
-        List<PictureData> pictures = new LinkedList<PictureData>();
-        for(POIXMLDocumentPart p : getRelations()){
-            if (p instanceof XSSFSheet) {
-                PackagePart sheetPart = p.getPackagePart();
-                try {
-                    PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation());
-                    for (PackageRelationship rel : prc) {
-                        PackagePart drawingPart = getTargetPart(rel);
-                        PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(XSSFRelation.IMAGES.getRelation());
-                        for (PackageRelationship rel2 : prc2) {
-                            PackagePart imagePart = getTargetPart(rel2);
-                            XSSFPictureData pd = new XSSFPictureData(imagePart);
-                            pictures.add(pd);
+    public List<XSSFPictureData> getAllPictures() {
+        if(pictures == null) {
+            //In OOXML pictures are referred to in sheets,
+            //dive into sheet's relations, select drawings and their images
+            pictures = new ArrayList();
+            for(XSSFSheet sh : sheets){
+                for(POIXMLDocumentPart dr : sh.getRelations()){
+                    if(dr instanceof XSSFDrawing){
+                        for(POIXMLDocumentPart img : dr.getRelations()){
+                            if(img instanceof XSSFPictureData){
+                                pictures.add((XSSFPictureData)img);
+                            }
                         }
                     }
-                } catch (InvalidFormatException e) {
-                    throw new POIXMLException(e.getMessage(), e);
                 }
-
             }
         }
         return pictures;
@@ -705,7 +728,7 @@
      */
     public void removeSheetAt(int index) {
         validateSheetIndex(index);
-        
+
         this.sheets.remove(index);
         this.workbook.getSheets().removeSheet(index);
     }
@@ -878,6 +901,10 @@
 
         XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
         xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorkbook.type.getName().getNamespaceURI(), "workbook"));
+        Map map = new HashMap();
+        map.put(STRelationshipId.type.getName().getNamespaceURI(), "r");
+        xmlOptions.setSaveSuggestedPrefixes(map);
+
         PackagePart part = getPackagePart();
         OutputStream out = part.getOutputStream();
         workbook.save(out, xmlOptions);

Modified: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java?rev=703490&r1=703489&r2=703490&view=diff
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java (original)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/io/TestLoadSaveXSSF.java Fri Oct 10 07:54:32 2008
@@ -28,6 +28,7 @@
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFPictureData;
 
 
 public class TestLoadSaveXSSF extends TestCase {
@@ -42,7 +43,7 @@
             filename = "src/ooxml/testcases/org/apache/poi/xssf/data";
         }
     }
-    
+
     public void testLoadSample() throws Exception {
         XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "sample.xlsx").getAbsolutePath());
         assertEquals(3, workbook.getNumberOfSheets());
@@ -55,7 +56,7 @@
         cell = row.getCell((short) 0);
         assertEquals("Lorem", cell.getRichStringCellValue().getString());
     }
-    
+
     // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull.
     public void testLoadStyles() throws Exception {
         XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "styles.xlsx").getAbsolutePath());
@@ -69,7 +70,7 @@
     // TODO filename string hard coded in XSSFWorkbook constructor in order to make ant test-ooxml target be successfull.
     public void testLoadPictures() throws Exception {
         XSSFWorkbook workbook = new XSSFWorkbook(new File(filename, "picture.xlsx").getAbsolutePath());
-        List<PictureData> pictures = workbook.getAllPictures();
+        List<XSSFPictureData> pictures = workbook.getAllPictures();
         assertEquals(1, pictures.size());
     }
 

Added: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java?rev=703490&view=auto
==============================================================================
--- poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java (added)
+++ poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java Fri Oct 10 07:54:32 2008
@@ -0,0 +1,70 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+package org.apache.poi.xssf.usermodel;
+
+import junit.framework.TestCase;
+import org.apache.poi.xssf.XSSFTestDataSamples;
+import org.apache.poi.POIXMLDocumentPart;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTDrawing;
+
+import java.util.List;
+import java.io.IOException;
+
+/**
+ * @author Yegor Kozlov
+ */
+public class TestXSSFDrawing extends TestCase {
+    public void testRead(){
+        XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("WithDrawing.xlsx");
+        XSSFSheet sheet = wb.getSheetAt(0);
+        //the sheet has one relationship and it is XSSFDrawing
+        List<POIXMLDocumentPart> rels = sheet.getRelations();
+        assertEquals(1, rels.size());
+        assertTrue(rels.get(0) instanceof XSSFDrawing);
+
+        XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
+        //sheet.createDrawingPatriarch() should return the same instance of XSSFDrawing
+        assertSame(drawing, sheet.createDrawingPatriarch());
+        String drawingId = drawing.getPackageRelationship().getId();
+
+        //there should be a relation to this drawing in the worksheet
+        assertTrue(sheet.getWorksheet().isSetDrawing());
+        assertEquals(drawingId, sheet.getWorksheet().getDrawing().getId());
+
+    }
+
+    public void testNew(){
+        XSSFWorkbook wb = new XSSFWorkbook();
+        XSSFSheet sheet = wb.createSheet();
+        //multiple calls of createDrawingPatriarch should return the same instance of XSSFDrawing
+        XSSFDrawing dr1 = sheet.createDrawingPatriarch();
+        XSSFDrawing dr2 = sheet.createDrawingPatriarch();
+        assertSame(dr1, dr2);
+
+        List<POIXMLDocumentPart> rels = sheet.getRelations();
+        assertEquals(1, rels.size());
+        assertTrue(rels.get(0) instanceof XSSFDrawing);
+
+        XSSFDrawing drawing = (XSSFDrawing)rels.get(0);
+        String drawingId = drawing.getPackageRelationship().getId();
+
+        //there should be a relation to this drawing in the worksheet
+        assertTrue(sheet.getWorksheet().isSetDrawing());
+        assertEquals(drawingId, sheet.getWorksheet().getDrawing().getId());
+
+    }
+}

Propchange: poi/branches/ooxml/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDrawing.java
------------------------------------------------------------------------------
    svn:executable = *



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