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 2011/05/20 10:22:54 UTC

svn commit: r1125275 [1/2] - in /poi/trunk/src: documentation/content/xdocs/ examples/src/org/apache/poi/xssf/usermodel/examples/ java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/ss/usermodel/ java/org/apache/poi/ss/usermodel/charts/ java/org/ap...

Author: yegor
Date: Fri May 20 08:22:53 2011
New Revision: 1125275

URL: http://svn.apache.org/viewvc?rev=1125275&view=rev
Log:
Bugzilla 51196: Initial support for Spreadsheet Chart API

Added:
    poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ScatterChart.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/Chart.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrossBetween.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrosses.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisOrientation.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisPosition.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxis.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartData.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartDataFactory.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartLegend.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/LegendPosition.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartData.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartSerie.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ValueAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFGraphicFrame.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartAxis.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartDataFactory.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartLegend.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFScatterChartData.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFValueAxis.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFChartAxis.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFChartLegend.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFScatterChartData.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFValueAxis.java
Modified:
    poi/trunk/src/documentation/content/xdocs/status.xml
    poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java
    poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java
    poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
    poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
    poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFChart.java

Modified: poi/trunk/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/trunk/src/documentation/content/xdocs/status.xml?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/documentation/content/xdocs/status.xml (original)
+++ poi/trunk/src/documentation/content/xdocs/status.xml Fri May 20 08:22:53 2011
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.8-beta3" date="2011-??-??">
+           <action dev="poi-developers" type="add">51196 - Initial support for Spreadsheet Chart API</action>
            <action dev="poi-developers" type="add">Add support for OOXML Agile Encryption</action>
            <action dev="poi-developers" type="add">51160 - Initial version of SXSSF, a low memory foortprint API to produce xlsx files</action>
            <action dev="poi-developers" type="fix">51171 - Improved performance of opening large .xls files</action>

Added: poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ScatterChart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ScatterChart.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ScatterChart.java (added)
+++ poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/ScatterChart.java Fri May 20 08:22:53 2011
@@ -0,0 +1,82 @@
+/*
+ *  ====================================================================
+ *    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.examples;
+
+import java.io.FileOutputStream;
+import java.util.Date;
+
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.*;
+import org.apache.poi.ss.usermodel.charts.*;
+import org.apache.poi.xssf.usermodel.*;
+import org.apache.poi.xssf.usermodel.charts.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
+
+/**
+ * Illustrates how to create a simple scatter chart.
+ */
+public class ScatterChart {
+
+	public static void main(String[]args) throws Exception {
+		Workbook wb = new XSSFWorkbook();
+		CreationHelper creationHelper = wb.getCreationHelper();
+		Sheet sheet = wb.createSheet("new sheet");
+		final int NUM_OF_ROWS = 3;
+		final int NUM_OF_COLUMNS = 10;
+
+		// Create a row and put some cells in it. Rows are 0 based.
+		Row row;
+		Cell cell;
+		for (int rowIndex = 0; rowIndex < NUM_OF_ROWS; rowIndex++) {
+			row = sheet.createRow((short)rowIndex);
+			for (int colIndex = 0; colIndex < NUM_OF_COLUMNS; colIndex++) {
+				cell = row.createCell((short)colIndex);
+				cell.setCellValue(colIndex * (rowIndex + 1));
+			}
+		}
+
+		Drawing drawing = sheet.createDrawingPatriarch();
+		ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, 10, 15);
+
+		Chart chart = drawing.createChart(anchor);
+		ChartLegend legend = chart.getOrCreateLegend();
+		legend.setPosition(LegendPosition.RIGHT);
+
+		ScatterChartData data = chart.getChartDataFactory().createScatterChartData();
+
+		ValueAxis bottomAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.BOTTOM);
+		ValueAxis leftAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.LEFT);
+
+		ScatterChartSerie firstSerie = data.addSerie();
+		firstSerie.setXValues(sheet, new CellRangeAddress(0, 0, NUM_OF_COLUMNS + 1, NUM_OF_COLUMNS + 1));
+		firstSerie.setYValues(sheet, new CellRangeAddress(1, 1, NUM_OF_COLUMNS + 1, NUM_OF_COLUMNS + 1));
+
+		ScatterChartSerie secondSerie = data.addSerie();
+		secondSerie.setXValues(sheet, new CellRangeAddress(0, 0, NUM_OF_COLUMNS + 1, NUM_OF_COLUMNS + 1));
+		secondSerie.setYValues(sheet, new CellRangeAddress(2, 2, NUM_OF_COLUMNS + 1, NUM_OF_COLUMNS + 1));
+
+		chart.plot(data, bottomAxis, leftAxis);
+
+		// Write the output to a file
+		FileOutputStream fileOut = new FileOutputStream("ooxml-scatter-chart.xlsx");
+		wb.write(fileOut);
+		fileOut.close();
+	}
+}

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=1125275&r1=1125274&r2=1125275&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 Fri May 20 08:22:53 2011
@@ -25,6 +25,7 @@ import org.apache.poi.ddf.EscherComplexP
 import org.apache.poi.ddf.EscherOptRecord;
 import org.apache.poi.ddf.EscherProperty;
 import org.apache.poi.hssf.record.EscherAggregate;
+import org.apache.poi.ss.usermodel.Chart;
 import org.apache.poi.util.StringUtil;
 import org.apache.poi.ss.usermodel.Drawing;
 import org.apache.poi.ss.usermodel.ClientAnchor;
@@ -160,7 +161,7 @@ public final class HSSFPatriarch impleme
     /**
      * YK: used to create autofilters
      *
-     * @see org.apache.poi.hssf.usermodel.HSSFSheet#setAutoFilter(int, int, int, int)
+     * @see org.apache.poi.hssf.usermodel.HSSFSheet#setAutoFilter(org.apache.poi.ss.util.CellRangeAddress)
      */
      HSSFSimpleShape createComboBox(HSSFAnchor anchor)
      {
@@ -276,4 +277,27 @@ public final class HSSFPatriarch impleme
     protected EscherAggregate _getBoundAggregate() {
         return _boundAggregate;
     }
+
+    /**
+     * Creates a new client anchor and sets the top-left and bottom-right
+     * coordinates of the anchor.
+     *
+     * @param dx1  the x coordinate in EMU within the first cell.
+     * @param dy1  the y coordinate in EMU within the first cell.
+     * @param dx2  the x coordinate in EMU within the second cell.
+     * @param dy2  the y coordinate in EMU 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.
+     * @return the newly created client anchor
+     */
+    public HSSFClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2){
+        return new HSSFClientAnchor(dx1, dy1, dx2, dy2, (short)col1, row1, (short)col2, row2);
+    }
+
+	public Chart createChart(ClientAnchor anchor) {
+		throw new RuntimeException("NotImplemented");
+	}
+
 }

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/Chart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Chart.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Chart.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Chart.java Fri May 20 08:22:53 2011
@@ -0,0 +1,66 @@
+/* ====================================================================
+   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.ss.usermodel;
+
+import java.util.List;
+
+import org.apache.poi.ss.usermodel.charts.ChartData;
+import org.apache.poi.ss.usermodel.charts.ChartAxis;
+import org.apache.poi.ss.usermodel.charts.ChartLegend;
+import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
+import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
+
+/**
+ * High level representation of a chart.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface Chart {
+	
+	/**
+	 * @return an appropriate ChartDataFactory implementation
+	 */
+	ChartDataFactory getChartDataFactory();
+
+	/**
+	 * @return an appropriate ChartAxisFactory implementation
+	 */
+	ChartAxisFactory getChartAxisFactory();
+
+	/**
+	 * @return chart legend instance
+	 */
+	ChartLegend getOrCreateLegend();
+
+	/**
+	 * Delete current chart legend.
+	 */
+	void deleteLegend();
+
+	/**
+	 * @return list of all chart axis
+	 */
+	List<? extends ChartAxis> getAxis();
+
+	/**
+	 * Plots specified data on the chart.
+	 *
+	 * @param data a data to plot
+	 */
+	void plot(ChartData data, ChartAxis... axis);
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/Drawing.java Fri May 20 08:22:53 2011
@@ -17,10 +17,51 @@
 package org.apache.poi.ss.usermodel;
 
 /**
+ * High level representation of spreadsheet drawing.
  * @author Yegor Kozlov
+ * @author Roman Kashitsyn
  */
 public interface Drawing {
-    Picture createPicture(ClientAnchor anchor, int pictureIndex);
+	/**
+	 * 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.
+	 *
+	 * @return the newly created picture.
+	 */
+	Picture createPicture(ClientAnchor anchor, int pictureIndex);
 
-    Comment createCellComment(ClientAnchor anchor);
+	/**
+	 * Creates a comment.
+	 * @param anchor the client anchor describes how this comment is attached
+	 *               to the sheet.
+	 * @return the newly created comment.
+	 */
+	Comment createCellComment(ClientAnchor anchor);
+
+	/**
+	 * Creates a chart.
+	 * @param anchor the client anchor describes how this chart is attached to
+	 *               the sheet.
+	 * @return the newly created chart
+	 */
+	Chart createChart(ClientAnchor anchor);
+
+	/**
+	 * Creates a new client anchor and sets the top-left and bottom-right
+	 * coordinates of the anchor.
+	 *
+	 * @param dx1  the x coordinate in EMU within the first cell.
+	 * @param dy1  the y coordinate in EMU within the first cell.
+	 * @param dx2  the x coordinate in EMU within the second cell.
+	 * @param dy2  the y coordinate in EMU 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.
+	 * @return the newly created client anchor
+	 */
+	ClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2, int col1, int row1, int col2, int row2);
 }

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrossBetween.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrossBetween.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrossBetween.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrossBetween.java Fri May 20 08:22:53 2011
@@ -0,0 +1,36 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ *  Specifies the possible crossing states of an axis.
+ *
+ * @author Roman Kashitsyn
+ */
+public enum AxisCrossBetween {
+	/**
+	 * Specifies the value axis shall cross the category axis
+	 * between data markers.
+	 */
+	BETWEEN,
+	/**
+	 * Specifies the value axis shall cross the category axis at
+	 * the midpoint of a category.
+	 */
+	MIDPOINT_CATEGORY
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrosses.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrosses.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrosses.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisCrosses.java Fri May 20 08:22:53 2011
@@ -0,0 +1,40 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * Specifies the possible crossing points for an axis.
+ *
+ * @author Roman Kashitsyn
+ */
+public enum AxisCrosses {
+	/**
+	 * The category axis crosses at the zero point of the value axis (if
+	 * possible), or the minimum value (if the minimum is greater than zero) or
+	 * the maximum (if the maximum is less than zero).
+	 */
+	AUTO_ZERO,
+	/**
+	 * The axis crosses at the maximum value.
+	 */
+	MIN,
+	/**
+	 * Axis crosses at the minimum value of the chart.
+	 */
+	MAX
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisOrientation.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisOrientation.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisOrientation.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisOrientation.java Fri May 20 08:22:53 2011
@@ -0,0 +1,36 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * Specifies the possible ways to place a picture on a data point, series, wall, or floor.
+ *
+ * @author Roman Kashitsyn
+ */
+public enum AxisOrientation {
+	/**
+	 * Specifies that the values on the axis shall be reversed
+	 * so they go from maximum to minimum.
+	 */
+	MAX_MIN,
+	/**
+	 * Specifies that the axis values shall be in the usual
+	 * order, minimum to maximum.
+	 */
+	MIN_MAX
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisPosition.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisPosition.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisPosition.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/AxisPosition.java Fri May 20 08:22:53 2011
@@ -0,0 +1,30 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * Enumeration of all possible axis positions.
+ *
+ * @author Roman Kashitsyn
+ */
+public enum AxisPosition {
+	BOTTOM,
+	LEFT,
+	RIGHT,
+	TOP
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxis.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxis.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxis.java Fri May 20 08:22:53 2011
@@ -0,0 +1,123 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * High level representation of chart axis.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface ChartAxis {
+	
+	/**
+	 * @return axis id
+	 */
+	long getId();
+
+	/**
+	 * @return axis position
+	 */
+	AxisPosition getPosition();
+
+	/**
+	 * @param position new axis position
+	 */
+	void setPosition(AxisPosition position);
+
+	/**
+	 * @return axis number format
+	 */
+	String getNumberFormat();
+
+	/**
+	 * @param format axis number format
+	 */
+	void setNumberFormat(String format);
+
+	/**
+	 * @return true if log base is defined, false otherwise
+	 */
+	boolean isSetLogBase();
+
+	/**
+	 * @param logBase a number between 2 and 1000 (inclusive)
+	 * @throws IllegalArgumentException if log base not within allowed range
+	 */
+	void setLogBase(double logBase);
+
+	/**
+	 * @return axis log base or 0.0 if not set
+	 */
+	double getLogBase();
+
+	/**
+	 * @return true if minimum value is defined, false otherwise
+	 */
+	boolean isSetMinimum();
+
+	/**
+	 * @return axis minimum or 0.0 if not set
+	 */
+	double getMinimum();
+
+	/**
+	 * @param min axis minimum
+	 */
+	void setMinimum(double min);
+
+	/**
+	 * @return true if maximum value is defined, false otherwise
+	 */
+	boolean isSetMaximum();
+
+	/**
+	 * @return axis maximum or 0.0 if not set
+	 */
+	double getMaximum();
+
+	/**
+	 * @param max axis maximum
+	 */
+	void setMaximum(double max);
+
+	/**
+	 * @return axis orientation
+	 */
+	AxisOrientation getOrientation();
+
+	/**
+	 * @param axis orientation
+	 */
+	void setOrientation(AxisOrientation orientation);
+
+	/**
+	 * @param crosses axis cross type
+	 */
+	void setCrosses(AxisCrosses crosses);
+
+	/**
+	 * @return axis cross type
+	 */
+	AxisCrosses getCrosses();
+
+	/**
+	 * Declare this axis cross another axis.
+	 * @param axis that this axis should cross
+	 */
+	void crossAxis(ChartAxis axis);
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java Fri May 20 08:22:53 2011
@@ -0,0 +1,34 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+import org.apache.poi.ss.usermodel.Chart;
+
+/**
+ * A factory for different chart axis.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface ChartAxisFactory {
+	
+	/**
+	 * @return new value axis
+	 */
+	ValueAxis createValueAxis(AxisPosition pos);
+
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartData.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartData.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartData.java Fri May 20 08:22:53 2011
@@ -0,0 +1,36 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+import org.apache.poi.ss.usermodel.Chart;
+
+/**
+ * A base for all chart data types.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface ChartData {
+
+	/**
+	 * Fills a chart with data specified by implementation.
+	 *
+	 * @param chart a chart to fill in
+	 * @param axis chart axis to use
+	 */
+	void fillChart(Chart chart, ChartAxis... axis);
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartDataFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartDataFactory.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartDataFactory.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartDataFactory.java Fri May 20 08:22:53 2011
@@ -0,0 +1,32 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * A factory for different chart data types.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface ChartDataFactory {
+	
+	/**
+	 * @return an appropriate ScatterChartData instance
+	 */
+	ScatterChartData createScatterChartData();
+
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartLegend.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartLegend.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartLegend.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ChartLegend.java Fri May 20 08:22:53 2011
@@ -0,0 +1,37 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * High level representation of chart legend.
+ *
+ * @author Roman Kashitsyn
+ */
+public interface ChartLegend {
+	
+	/**
+	 * @return legend position
+	 */
+	LegendPosition getPosition();
+
+	/**
+	 * @param position new legend position
+	 */
+	void setPosition(LegendPosition position);
+
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/LegendPosition.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/LegendPosition.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/LegendPosition.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/LegendPosition.java Fri May 20 08:22:53 2011
@@ -0,0 +1,31 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * Enumeration of all possible chart legend positions.
+ *
+ * @author Roman Kashitsyn
+ */
+public enum LegendPosition {
+	BOTTOM,
+	LEFT,
+	RIGHT,
+	TOP,
+	TOP_RIGHT
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartData.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartData.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartData.java Fri May 20 08:22:53 2011
@@ -0,0 +1,35 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+import java.util.List;
+
+/**
+ * @author Roman Kashitsyn
+ */
+public interface ScatterChartData extends ChartData {
+	/**
+	 * @return a new scatter chart serie
+	 */
+	ScatterChartSerie addSerie();
+
+	/**
+	 * @return list of all series
+	 */
+	List<? extends ScatterChartSerie> getSeries();
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartSerie.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartSerie.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartSerie.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ScatterChartSerie.java Fri May 20 08:22:53 2011
@@ -0,0 +1,41 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
+
+/**
+ * @author Roman Kashitsyn
+ */
+public interface ScatterChartSerie {
+
+	/**
+	 * @param sheet a sheet to take range from
+	 * @param address a column or a row with values
+	 */
+	void setXValues(Sheet sheet, CellRangeAddress address);
+	
+	/**'
+	 * @param sheet a sheet to take range from
+	 * @param address a column or a row with values
+	 */
+	void setYValues(Sheet sheet, CellRangeAddress address);
+
+}

Added: poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ValueAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ValueAxis.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ValueAxis.java (added)
+++ poi/trunk/src/java/org/apache/poi/ss/usermodel/charts/ValueAxis.java Fri May 20 08:22:53 2011
@@ -0,0 +1,34 @@
+/* ====================================================================
+   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.ss.usermodel.charts;
+
+/**
+ * @author Roman Kashitsyn
+ */
+public interface ValueAxis extends ChartAxis {
+
+	/**
+	 * @return cross between type
+	 */
+	AxisCrossBetween getCrossBetween();
+
+	/**
+	 * @param crossBetween cross between type
+	 */
+	void setCrossBetween(AxisCrossBetween crossBetween);
+}

Modified: poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/util/CellRangeAddress.java Fri May 20 08:22:53 2011
@@ -80,10 +80,24 @@ public class CellRangeAddress extends Ce
      *         like single cell references (e.g. 'A1' instead of 'A1:A1').
      */
     public String formatAsString() {
+        return formatAsString(null, false);
+    }
+
+    /**
+     * @return the text format of this range using specified sheet name.
+     */
+    public String formatAsString(String sheetName, boolean useAbsoluteAddress) {
         StringBuffer sb = new StringBuffer();
-        CellReference cellRefFrom = new CellReference(getFirstRow(), getFirstColumn());
-        CellReference cellRefTo = new CellReference(getLastRow(), getLastColumn());
+        if (sheetName != null) {
+            sb.append(sheetName);
+            sb.append("!");
+        }
+        CellReference cellRefFrom = new CellReference(getFirstRow(), getFirstColumn(),
+                useAbsoluteAddress, useAbsoluteAddress);
+        CellReference cellRefTo = new CellReference(getLastRow(), getLastColumn(),
+                useAbsoluteAddress, useAbsoluteAddress);
         sb.append(cellRefFrom.formatAsString());
+
         //for a single-cell reference return A1 instead of A1:A1
         if(!cellRefFrom.equals(cellRefTo)){
             sb.append(':');

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java Fri May 20 08:22:53 2011
@@ -21,11 +21,24 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+
+import javax.xml.namespace.QName;
 
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.util.Internal;
+import org.apache.poi.ss.usermodel.Chart;
+import org.apache.poi.ss.usermodel.charts.ChartAxis;
+import org.apache.poi.ss.usermodel.charts.ChartAxisFactory;
+import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory;
+import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis;
+import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis;
+import org.apache.poi.xssf.usermodel.charts.XSSFChartLegend;
+import org.apache.poi.ss.usermodel.charts.ChartData;
+import org.apache.poi.ss.usermodel.charts.AxisPosition;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
@@ -33,115 +46,265 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
 import org.openxmlformats.schemas.drawingml.x2006.chart.ChartSpaceDocument;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTLayout;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTManualLayout;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTPrintSettings;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutTarget;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STLayoutMode;
 import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.Text;
 
 /**
  * Represents a SpreadsheetML Chart
+ * @author Nick Burch
+ * @author Roman Kashitsyn
  */
-public final class XSSFChart extends POIXMLDocumentPart {
-    /**
-     * Root element of the SpreadsheetML Chart part
-     */
-    private CTChartSpace chartSpace;
-    /**
-     * The Chart within that
-     */
-    private CTChart chart;
-
-    /**
-     * Create a new SpreadsheetML chart
-     */
-    protected XSSFChart() {
-        super();
-        createChart();
-    }
-
-    /**
-     * Construct a SpreadsheetML chart from a package part
-     *
-     * @param part the package part holding the chart data,
-     * the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
-     * @param rel  the package relationship holding this chart,
-     * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
-     */
-    protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
-        super(part, rel);
-        
-        chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream()).getChartSpace(); 
-        chart = chartSpace.getChart();
-    }
-
-    /**
-     * Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects
-     *
-     * @return a new CTChartSpace bean
-     */
-    private void createChart() {
-        chartSpace = CTChartSpace.Factory.newInstance();
-        chart = chartSpace.addNewChart();
-    }
-
-    /**
-     * Return the underlying CTChartSpace bean, the root element of the SpreadsheetML Chart part.
-     *
-     * @return the underlying CTChartSpace bean
-     */
-    @Internal
-    public CTChartSpace getCTChartSpace(){
-        return chartSpace;
-    }
-
-    /**
-     * Return the underlying CTChart bean, within the Chart Space
-     *
-     * @return the underlying CTChart bean
-     */
-    @Internal
-    public CTChart getCTChart(){
-        return chart;
-    }
-
-    @Override
-    protected void commit() throws IOException {
-        XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
-
-        Map<String, String> map = new HashMap<String, String>();
-        map.put(XSSFDrawing.NAMESPACE_A, "a");
-        map.put(STRelationshipId.type.getName().getNamespaceURI(), "r");
-        xmlOptions.setSaveSuggestedPrefixes(map);
-
-        PackagePart part = getPackagePart();
-        OutputStream out = part.getOutputStream();
-        chartSpace.save(out, xmlOptions);
-        out.close();
-    }
-    
-    /**
-     * Returns the title, or null if none is set
-     */
-    public XSSFRichTextString getTitle() {
-       if(! chart.isSetTitle()) {
-          return null;
-       }
-       
-       // TODO Do properly
-       CTTitle title = chart.getTitle();
-       
-       StringBuffer text = new StringBuffer();
-       XmlObject[] t = title
-           .selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
-       for (int m = 0; m < t.length; m++) {
-          NodeList kids = t[m].getDomNode().getChildNodes();
-          for (int n = 0; n < kids.getLength(); n++) {
-             if (kids.item(n) instanceof Text) {
-                text.append(kids.item(n).getNodeValue());
-             }
-          }
-       }
-       
-       return new XSSFRichTextString(text.toString());
-    }
+public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory {
+
+	/**
+	 * Parent graphic frame.
+	 */
+	private XSSFGraphicFrame frame;
+
+	/**
+	 * Root element of the SpreadsheetML Chart part
+	 */
+	private CTChartSpace chartSpace;
+	/**
+	 * The Chart within that
+	 */
+	private CTChart chart;
+
+	List<XSSFChartAxis> axis;
+
+	/**
+	 * Create a new SpreadsheetML chart
+	 */
+	protected XSSFChart() {
+		super();
+		axis = new ArrayList<XSSFChartAxis>();
+		createChart();
+	}
+
+	/**
+	 * Construct a SpreadsheetML chart from a package part
+	 *
+	 * @param part the package part holding the chart data,
+	 * the content type must be <code>application/vnd.openxmlformats-officedocument.drawingml.chart+xml</code>
+	 * @param rel  the package relationship holding this chart,
+	 * the relationship type must be http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart
+	 */
+	protected XSSFChart(PackagePart part, PackageRelationship rel) throws IOException, XmlException {
+		super(part, rel);
+
+		chartSpace = ChartSpaceDocument.Factory.parse(part.getInputStream()).getChartSpace(); 
+		chart = chartSpace.getChart();
+	}
+
+	/**
+	 * Construct a new CTChartSpace bean. By default, it's just an empty placeholder for chart objects
+	 *
+	 * @return a new CTChartSpace bean
+	 */
+	private void createChart() {
+		chartSpace = CTChartSpace.Factory.newInstance();
+		chart = chartSpace.addNewChart();
+		CTPlotArea plotArea = chart.addNewPlotArea();
+		CTLayout layout = plotArea.addNewLayout();
+		CTManualLayout manualLayout = layout.addNewManualLayout();
+		manualLayout.addNewLayoutTarget().setVal(STLayoutTarget.INNER);
+		manualLayout.addNewXMode().setVal(STLayoutMode.EDGE);
+		manualLayout.addNewYMode().setVal(STLayoutMode.EDGE);
+		manualLayout.addNewX().setVal(0);
+		manualLayout.addNewY().setVal(0);
+		manualLayout.addNewW().setVal(0.65);
+		manualLayout.addNewH().setVal(0.8);
+		chart.addNewPlotVisOnly().setVal(true);
+		CTPrintSettings printSettings = chartSpace.addNewPrintSettings();
+		printSettings.addNewHeaderFooter();
+
+		CTPageMargins pageMargins = printSettings.addNewPageMargins();
+		pageMargins.setB(0.75);
+		pageMargins.setL(0.70);
+		pageMargins.setR(0.70);
+		pageMargins.setT(0.75);
+		pageMargins.setHeader(0.30);
+		pageMargins.setFooter(0.30);
+		printSettings.addNewPageSetup();
+	}
+
+	/**
+	 * Return the underlying CTChartSpace bean, the root element of the SpreadsheetML Chart part.
+	 *
+	 * @return the underlying CTChartSpace bean
+	 */
+	@Internal
+	public CTChartSpace getCTChartSpace(){
+		return chartSpace;
+	}
+
+	/**
+	 * Return the underlying CTChart bean, within the Chart Space
+	 *
+	 * @return the underlying CTChart bean
+	 */
+	@Internal
+	public CTChart getCTChart(){
+		return chart;
+	}
+
+	@Override
+	protected void commit() throws IOException {
+		XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
+
+		/*
+		   Saved chart space must have the following namespaces set:
+		   <c:chartSpace
+		      xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"
+		      xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
+		      xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
+		 */
+		xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));
+		Map<String, String> map = new HashMap<String, String>();
+		map.put(XSSFDrawing.NAMESPACE_A, "a");
+		map.put(XSSFDrawing.NAMESPACE_C, "c");
+		map.put(STRelationshipId.type.getName().getNamespaceURI(), "r");
+		xmlOptions.setSaveSuggestedPrefixes(map);
+
+		PackagePart part = getPackagePart();
+		OutputStream out = part.getOutputStream();
+		chartSpace.save(out, xmlOptions);
+		out.close();
+	}
+
+	/**
+	 * Returns the parent graphic frame.
+	 * @return the graphic frame this chart belongs to
+	 */
+	public XSSFGraphicFrame getGraphicFrame() {
+		return frame;
+	}
+
+	/**
+	 * Sets the parent graphic frame.
+	 */
+	protected void setGraphicFrame(XSSFGraphicFrame frame) {
+		this.frame = frame;
+	}
+
+	public XSSFChartDataFactory getChartDataFactory() {
+		return XSSFChartDataFactory.getInstance();
+	}
+
+	public XSSFChart getChartAxisFactory() {
+		return this;
+	}
+
+	public void plot(ChartData data, ChartAxis... axis) {
+		data.fillChart(this, axis);
+	}
+
+	public XSSFValueAxis createValueAxis(AxisPosition pos) {
+		long id = axis.size() + 1;
+		XSSFValueAxis valueAxis = new XSSFValueAxis(this, id, pos);
+		if (axis.size() == 1) {
+			ChartAxis ax = axis.get(0);
+			ax.crossAxis(valueAxis);
+			valueAxis.crossAxis(ax);
+		}
+		axis.add(valueAxis);
+		return valueAxis;
+	}
+
+	public List<? extends XSSFChartAxis> getAxis() {
+		return axis;
+	}
+
+	/**
+	 * Sets the width ratio of the chart.
+	 * Chart width is ratio multiplied by parent frame width.
+	 * @param ratio a number between 0 and 1.
+	 */
+	public void setWidthRatio(double ratio) {
+		chart.getPlotArea().getLayout().getManualLayout().getW().setVal(ratio);
+	}
+
+	/**
+	 * @return relative chart width
+	 */
+	public double getWidthRatio() {
+		return chart.getPlotArea().getLayout().getManualLayout().getW().getVal();
+	}
+
+	/**
+	 * Sets the height ratio of the chart.
+	 * Chart height is ratio multiplied by parent frame height.
+	 * @param ratio a number between 0 and 1.
+	 */
+	public void setHeightRatio(double ratio) {
+		chart.getPlotArea().getLayout().getManualLayout().getH().setVal(ratio);
+	}
+
+	/**
+	 * @return relative chart height
+	 */
+	public double getHeightRatio() {
+		return chart.getPlotArea().getLayout().getManualLayout().getH().getVal();
+	}
+
+	/**
+	 * @return true if only visible cells will be present on the chart,
+	 *         false otherwise
+	 */
+	public boolean isPlotOnlyVisibleCells() {
+		return chart.getPlotVisOnly().getVal();
+	}
+
+	/**
+	 * @param plotVisOnly a flag specifying if only visible cells should be
+	 *        present on the chart
+	 */
+	public void setPlotOnlyVisibleCells(boolean plotVisOnly) {
+		chart.getPlotVisOnly().setVal(plotVisOnly);
+	}
+
+	/**
+	 * Returns the title, or null if none is set
+	 */
+	public XSSFRichTextString getTitle() {
+		if(! chart.isSetTitle()) {
+			return null;
+		}
+
+		// TODO Do properly
+		CTTitle title = chart.getTitle();
+
+		StringBuffer text = new StringBuffer();
+		XmlObject[] t = title
+			.selectPath("declare namespace a='"+XSSFDrawing.NAMESPACE_A+"' .//a:t");
+		for (int m = 0; m < t.length; m++) {
+			NodeList kids = t[m].getDomNode().getChildNodes();
+			for (int n = 0; n < kids.getLength(); n++) {
+				if (kids.item(n) instanceof Text) {
+					text.append(kids.item(n).getNodeValue());
+				}
+			}
+		}
+
+		return new XSSFRichTextString(text.toString());
+	}
+
+	public XSSFChartLegend getOrCreateLegend() {
+		return new XSSFChartLegend(this);
+	}
+
+	public void deleteLegend() {
+		if (chart.isSetLegend()) {
+			chart.unsetLegend();
+		}
+	}
 
 }

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java Fri May 20 08:22:53 2011
@@ -44,6 +44,7 @@ import org.openxmlformats.schemas.drawin
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTShape;
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;
 import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.STEditAs;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGraphicalObjectFrame;
 import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
 
 /**
@@ -57,8 +58,10 @@ public final class XSSFDrawing extends P
      */
     private CTDrawing drawing;
     private boolean isNew;
+    private long numOfGraphicFrames = 0L;
     
     protected static final String NAMESPACE_A = "http://schemas.openxmlformats.org/drawingml/2006/main";
+    protected static final String NAMESPACE_C = "http://schemas.openxmlformats.org/drawingml/2006/chart";
 
     /**
      * Create a new SpreadsheetML drawing
@@ -125,6 +128,11 @@ public final class XSSFDrawing extends P
         out.close();
     }
 
+	public XSSFClientAnchor createAnchor(int dx1, int dy1, int dx2, int dy2,
+			int col1, int row1, int col2, int row2) {
+		return new XSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2);
+	}
+
     /**
      * Constructs a textbox under the drawing.
      *
@@ -169,6 +177,31 @@ public final class XSSFDrawing extends P
         return createPicture((XSSFClientAnchor)anchor, pictureIndex);
     }
 
+	/**
+	 * Creates a chart.
+	 * @param anchor the client anchor describes how this chart is attached to
+	 *               the sheet.
+	 * @return the newly created chart
+	 * @see org.apache.poi.xssf.usermodel.XSSFDrawing#createChart(ClientAnchor)
+	 */
+    public XSSFChart createChart(XSSFClientAnchor anchor) {
+        int chartNumber = getPackagePart().getPackage().
+            getPartsByContentType(XSSFRelation.CHART.getContentType()).size() + 1;
+
+        XSSFChart chart = (XSSFChart) createRelationship(
+                XSSFRelation.CHART, XSSFFactory.getInstance(), chartNumber);
+        String chartRelId = chart.getPackageRelationship().getId();
+
+        XSSFGraphicFrame frame = createGraphicFrame(anchor);
+        frame.setChart(chart, chartRelId);
+
+        return chart;
+    }
+
+	public XSSFChart createChart(ClientAnchor anchor) {
+		return createChart((XSSFClientAnchor)anchor);
+	}
+
     /**
      * Add the indexed picture to this drawing relations
      *
@@ -240,13 +273,12 @@ public final class XSSFDrawing extends P
         return shape;
     }
 
-    /**
-     * Creates a cell comment.
-     *
-     * @param anchor    the client anchor describes how this comment is attached
-     *                  to the sheet.
-     * @return  the newly created comment.
-     */
+	/**
+	 * Creates a comment.
+	 * @param anchor the client anchor describes how this comment is attached
+	 *               to the sheet.
+	 * @return the newly created comment.
+	 */
     public XSSFComment createCellComment(ClientAnchor anchor) {
         XSSFClientAnchor ca = (XSSFClientAnchor)anchor;
         XSSFSheet sheet = (XSSFSheet)getParent();
@@ -266,6 +298,26 @@ public final class XSSFDrawing extends P
         shape.setRow(ca.getRow1());
         return shape;
     }
+
+    /**
+     * Creates a new graphic frame.
+     *
+     * @param anchor    the client anchor describes how this frame is attached
+     *                  to the sheet
+     * @return  the newly created graphic frame
+     */
+    private XSSFGraphicFrame createGraphicFrame(XSSFClientAnchor anchor) {
+        CTTwoCellAnchor ctAnchor = createTwoCellAnchor(anchor);
+        CTGraphicalObjectFrame ctGraphicFrame = ctAnchor.addNewGraphicFrame();
+        ctGraphicFrame.set(XSSFGraphicFrame.prototype());
+
+        long frameId = numOfGraphicFrames++;
+        XSSFGraphicFrame graphicFrame = new XSSFGraphicFrame(this, ctGraphicFrame);
+        graphicFrame.setAnchor(anchor);
+        graphicFrame.setId(frameId);
+        graphicFrame.setName("Diagramm" + frameId);
+        return graphicFrame;
+    }
     
     /**
      * Returns all charts in this drawing.

Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFGraphicFrame.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFGraphicFrame.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFGraphicFrame.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFGraphicFrame.java Fri May 20 08:22:53 2011
@@ -0,0 +1,189 @@
+/*
+ *  ====================================================================
+ *    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 javax.xml.namespace.QName;
+
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.util.Internal;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlCursor;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGraphicalObjectFrame;
+import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTGraphicalObjectFrameNonVisual;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
+import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
+import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
+
+/**
+ * Represents DrawingML GraphicalObjectFrame.
+ *
+ * @author Roman Kashitsyn
+ */
+public final class XSSFGraphicFrame {
+
+	private static CTGraphicalObjectFrame prototype = null;
+
+	private CTGraphicalObjectFrame graphicFrame;
+	private XSSFDrawing drawing;
+	private XSSFClientAnchor anchor;
+
+	/**
+	 * Construct a new XSSFGraphicFrame object.
+	 *
+	 * @param drawing the XSSFDrawing that owns this frame
+	 * @param ctGraphicFrame the XML bean that stores this frame content
+	 */
+	protected XSSFGraphicFrame(XSSFDrawing drawing, CTGraphicalObjectFrame ctGraphicFrame) {
+		this.drawing = drawing;
+		this.graphicFrame = ctGraphicFrame;
+	}
+
+	@Internal
+	public CTGraphicalObjectFrame getCTGraphicalObjectFrame() {
+		return graphicFrame;
+	}
+
+	/**
+	 * Initialize default structure of a new graphic frame
+	 */
+	protected static CTGraphicalObjectFrame prototype() {
+		if (prototype == null) {
+			CTGraphicalObjectFrame graphicFrame = CTGraphicalObjectFrame.Factory.newInstance();
+
+			CTGraphicalObjectFrameNonVisual nvGraphic = graphicFrame.addNewNvGraphicFramePr();
+			CTNonVisualDrawingProps props = nvGraphic.addNewCNvPr();
+			props.setId(0);
+			props.setName("Diagramm 1");
+			nvGraphic.addNewCNvGraphicFramePr();
+
+			CTTransform2D transform = graphicFrame.addNewXfrm();
+			CTPositiveSize2D extPoint = transform.addNewExt();
+			CTPoint2D offPoint = transform.addNewOff();
+
+			extPoint.setCx(0);
+			extPoint.setCy(0);
+			offPoint.setX(0);
+			offPoint.setY(0);
+
+			CTGraphicalObject graphic = graphicFrame.addNewGraphic();
+
+			prototype = graphicFrame;
+		}
+		return prototype;
+	}
+
+	/**
+	 * Sets the frame macro.
+	 */
+	public void setMacro(String macro) {
+		graphicFrame.setMacro(macro);
+	}
+
+	/**
+	 * Sets the frame name.
+	 */
+	public void setName(String name) {
+		getNonVisualProperties().setName(name);
+	}
+
+	/**
+	 * Returns the frame name.
+	 * @return name of the frame
+	 */
+	public String getName() {
+		return getNonVisualProperties().getName();
+	}
+
+	private CTNonVisualDrawingProps getNonVisualProperties() {
+		CTGraphicalObjectFrameNonVisual nvGraphic = graphicFrame.getNvGraphicFramePr();
+		return nvGraphic.getCNvPr();
+	}
+
+	/**
+	 * Attaches frame to an anchor.
+	 */
+	protected void setAnchor(XSSFClientAnchor anchor) {
+		this.anchor = anchor;
+	}
+
+	/**
+	 * Returns the frame anchor.
+	 * @return the anchor this frame is attached to
+	 */
+	public XSSFClientAnchor getAnchor() {
+		return anchor;
+	}
+
+	/**
+	 * Assign a DrawingML chart to the graphic frame.
+	 */
+	protected void setChart(XSSFChart chart, String relId) {
+		CTGraphicalObjectData data = graphicFrame.getGraphic().addNewGraphicData();
+		appendChartElement(data, relId);
+		chart.setGraphicFrame(this);
+		return;
+	}
+
+	/**
+	 * Gets the frame id.
+	 */
+	public long getId() {
+		return graphicFrame.getNvGraphicFramePr().getCNvPr().getId();
+	}
+
+	/**
+	 * Sets the frame id.
+	 */
+	protected void setId(long id) {
+		graphicFrame.getNvGraphicFramePr().getCNvPr().setId(id);
+	}
+
+	/**
+	 * The low level code to insert {@code <c:chart>} tag into
+	 * {@code<a:graphicData>}.
+	 *
+	 * Here is the schema (ECMA-376):
+	 * <pre>
+	 * {@code
+	 * <complexType name="CT_GraphicalObjectData">
+	 *   <sequence>
+	 *     <any minOccurs="0" maxOccurs="unbounded" processContents="strict"/>
+	 *   </sequence>
+	 *   <attribute name="uri" type="xsd:token"/>
+	 * </complexType>
+	 * }
+	 * </pre>
+	 */
+	private void appendChartElement(CTGraphicalObjectData data, String id) {
+		String r_namespaceUri = STRelationshipId.type.getName().getNamespaceURI();
+		String c_namespaceUri = XSSFDrawing.NAMESPACE_C;
+		XmlCursor cursor = data.newCursor();
+		cursor.toNextToken();
+		cursor.beginElement(new QName(c_namespaceUri, "chart", "c"));
+		cursor.insertAttributeWithValue(new QName(r_namespaceUri, "id", "r"), id);
+		cursor.dispose();
+		data.setUri(c_namespaceUri);
+	}
+
+}

Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java?rev=1125275&r1=1125274&r2=1125275&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRelation.java Fri May 20 08:22:53 2011
@@ -90,12 +90,12 @@ public final class XSSFRelation extends 
 			"/xl/worksheets/sheet#.xml",
 			XSSFSheet.class
 	);
-   public static final XSSFRelation CHARTSHEET = new XSSFRelation(
-            "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
-            "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",
-            "/xl/chartsheets/sheet#.xml",
-            XSSFChartSheet.class
-   );
+	public static final XSSFRelation CHARTSHEET = new XSSFRelation(
+			"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
+			"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet",
+			"/xl/chartsheets/sheet#.xml",
+			XSSFChartSheet.class
+	);
 	public static final XSSFRelation SHARED_STRINGS = new XSSFRelation(
 			"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
 			"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",

Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartAxis.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartAxis.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartAxis.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartAxis.java Fri May 20 08:22:53 2011
@@ -0,0 +1,223 @@
+/* ====================================================================
+   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.charts;
+
+import org.apache.poi.ss.usermodel.charts.ChartAxis;
+import org.apache.poi.ss.usermodel.charts.AxisPosition;
+import org.apache.poi.ss.usermodel.charts.AxisOrientation;
+import org.apache.poi.ss.usermodel.charts.AxisCrosses;
+import org.apache.poi.xssf.usermodel.XSSFChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTOrientation;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTLogBase;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STCrosses;
+
+/**
+ * Base class for all axis types.
+ *
+ * @author Roman Kashitsyn
+ */
+public abstract class XSSFChartAxis implements ChartAxis {
+
+	protected XSSFChart chart;
+
+	private static final double MIN_LOG_BASE = 2.0;
+	private static final double MAX_LOG_BASE = 1000.0;
+
+	protected XSSFChartAxis(XSSFChart chart) {
+		this.chart = chart;
+	}
+
+	public AxisPosition getPosition() {
+		return toAxisPosition(getCTAxPos());
+	}
+
+	public void setPosition(AxisPosition position) {
+		getCTAxPos().setVal(fromAxisPosition(position));
+	}
+
+	public void setNumberFormat(String format) {
+		getCTNumFmt().setFormatCode(format);
+		getCTNumFmt().setSourceLinked(true);
+	}
+
+	public String getNumberFormat() {
+		return getCTNumFmt().getFormatCode();
+	}
+
+	public boolean isSetLogBase() {
+		return getCTScaling().isSetLogBase();
+	}
+
+	public void setLogBase(double logBase) {
+		if (logBase < MIN_LOG_BASE ||
+			MAX_LOG_BASE < logBase) {
+			throw new IllegalArgumentException("Axis log base must be between 2 and 1000 (inclusive), got: " + logBase);
+		}
+		CTScaling scaling = getCTScaling();
+		if (scaling.isSetLogBase()) {
+			scaling.getLogBase().setVal(logBase);
+		} else {
+			scaling.addNewLogBase().setVal(logBase);
+		}
+	}
+
+	public double getLogBase() {
+		CTLogBase logBase = getCTScaling().getLogBase();
+		if (logBase != null) {
+			return logBase.getVal();
+		}
+		return 0.0;
+	}
+
+	public boolean isSetMinimum() {
+		return getCTScaling().isSetMin();
+	}
+
+	public void setMinimum(double min) {
+		CTScaling scaling = getCTScaling();
+		if (scaling.isSetMin()) {
+			scaling.getMin().setVal(min);
+		} else {
+			scaling.addNewMin().setVal(min);
+		}
+	}
+
+	public double getMinimum() {
+		CTScaling scaling = getCTScaling();
+		if (scaling.isSetMin()) {
+			return scaling.getMin().getVal();
+		} else {
+			return 0.0;
+		}
+	}
+
+	public boolean isSetMaximum() {
+		return getCTScaling().isSetMax();
+	}
+
+	public void setMaximum(double max) {
+		CTScaling scaling = getCTScaling();
+		if (scaling.isSetMax()) {
+			scaling.getMax().setVal(max);
+		} else {
+			scaling.addNewMax().setVal(max);
+		}
+	}
+
+	public double getMaximum() {
+		CTScaling scaling = getCTScaling();
+		if (scaling.isSetMax()) {
+			return scaling.getMax().getVal();
+		} else {
+			return 0.0;
+		}
+	}
+
+	public AxisOrientation getOrientation() {
+		return toAxisOrientation(getCTScaling().getOrientation());
+	}
+
+	public void setOrientation(AxisOrientation orientation) {
+		CTScaling scaling = getCTScaling();
+		STOrientation.Enum stOrientation = fromAxisOrientation(orientation);
+		if (scaling.isSetOrientation()) {
+			scaling.getOrientation().setVal(stOrientation);
+		} else {
+			getCTScaling().addNewOrientation().setVal(stOrientation);
+		}
+	}
+
+	public AxisCrosses getCrosses() {
+		return toAxisCrosses(getCTCrosses());
+	}
+
+	public void setCrosses(AxisCrosses crosses) {
+		getCTCrosses().setVal(fromAxisCrosses(crosses));
+	}
+
+	protected abstract CTAxPos getCTAxPos();
+	protected abstract CTNumFmt getCTNumFmt();
+	protected abstract CTScaling getCTScaling();
+	protected abstract CTCrosses getCTCrosses();
+
+	private static STOrientation.Enum fromAxisOrientation(AxisOrientation orientation) {
+		switch (orientation) {
+			case MIN_MAX: return STOrientation.MIN_MAX;
+			case MAX_MIN: return STOrientation.MAX_MIN;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private static AxisOrientation toAxisOrientation(CTOrientation ctOrientation) {
+		switch (ctOrientation.getVal().intValue()) {
+			case STOrientation.INT_MIN_MAX: return AxisOrientation.MIN_MAX;
+			case STOrientation.INT_MAX_MIN: return AxisOrientation.MAX_MIN;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private static STCrosses.Enum fromAxisCrosses(AxisCrosses crosses) {
+		switch (crosses) {
+			case AUTO_ZERO: return STCrosses.AUTO_ZERO;
+			case MIN: return STCrosses.MIN;
+			case MAX: return STCrosses.MAX;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private static AxisCrosses toAxisCrosses(CTCrosses ctCrosses) {
+		switch (ctCrosses.getVal().intValue()) {
+			case STCrosses.INT_AUTO_ZERO: return AxisCrosses.AUTO_ZERO;
+			case STCrosses.INT_MAX: return AxisCrosses.MAX;
+			case STCrosses.INT_MIN: return AxisCrosses.MIN;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private static STAxPos.Enum fromAxisPosition(AxisPosition position) {
+		switch (position) {
+			case BOTTOM: return STAxPos.B;
+			case LEFT: return STAxPos.L;
+			case RIGHT: return STAxPos.R;
+			case TOP: return STAxPos.T;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private static AxisPosition toAxisPosition(CTAxPos ctAxPos) {
+		switch (ctAxPos.getVal().intValue()) {
+			case STAxPos.INT_B: return AxisPosition.BOTTOM;
+			case STAxPos.INT_L: return AxisPosition.LEFT;
+			case STAxPos.INT_R: return AxisPosition.RIGHT;
+			case STAxPos.INT_T: return AxisPosition.TOP;
+			default: return AxisPosition.BOTTOM;
+		}
+	}
+}

Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartDataFactory.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartDataFactory.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartDataFactory.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartDataFactory.java Fri May 20 08:22:53 2011
@@ -0,0 +1,50 @@
+/* ====================================================================
+   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.charts;
+
+import org.apache.poi.ss.usermodel.charts.*;
+
+/**
+ * @author Roman Kashitsyn
+ */
+public class XSSFChartDataFactory implements ChartDataFactory {
+
+	private static XSSFChartDataFactory instance;
+
+	private XSSFChartDataFactory() {
+		super();
+	}
+
+	/**
+	 * @return new scatter chart data instance
+	 */
+	public XSSFScatterChartData createScatterChartData() {
+		return new XSSFScatterChartData();
+	}
+
+	/**
+	 * @return factory instance
+	 */
+	public static XSSFChartDataFactory getInstance() {
+		if (instance == null) {
+			instance = new XSSFChartDataFactory();
+		}
+		return instance;
+	}
+
+}

Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartLegend.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartLegend.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartLegend.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFChartLegend.java Fri May 20 08:22:53 2011
@@ -0,0 +1,101 @@
+/* ====================================================================
+   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.charts;
+
+import org.apache.poi.util.Internal;
+import org.apache.poi.ss.usermodel.charts.ChartLegend;
+import org.apache.poi.ss.usermodel.charts.LegendPosition;
+import org.apache.poi.xssf.usermodel.XSSFChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegendPos;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STLegendPos;
+
+/**
+ * Represents a SpreadsheetML chart legend
+ * @author Roman Kashitsyn
+ */
+public final class XSSFChartLegend implements ChartLegend {
+
+	/**
+	 * Underlaying CTLagend bean
+	 */
+	private CTLegend legend;
+
+	/**
+	 * Create a new SpreadsheetML chart legend
+	 */
+	public XSSFChartLegend(XSSFChart chart) {
+		CTChart ctChart = chart.getCTChart();
+		this.legend = (ctChart.isSetLegend()) ?
+			ctChart.getLegend() :
+			ctChart.addNewLegend();
+	}
+
+	/**
+	 * Return the underlying CTLegend bean.
+	 *
+	 * @return the underlying CTLegend bean
+	 */
+	@Internal
+	public CTLegend getCTLegend(){
+		return legend;
+	}
+
+	public void setPosition(LegendPosition position) {
+		if (!legend.isSetLegendPos()) {
+			legend.addNewLegendPos();
+		}
+		legend.getLegendPos().setVal(fromLegendPosition(position));
+	}
+
+	/*
+	 * According to ECMA-376 default position is RIGHT.
+	 */
+	public LegendPosition getPosition() {
+		if (legend.isSetLegendPos()) {
+			return toLegendPosition(legend.getLegendPos());
+		} else {
+			return LegendPosition.RIGHT;
+		}
+	}
+
+	private STLegendPos.Enum fromLegendPosition(LegendPosition position) {
+		switch (position) {
+			case BOTTOM: return STLegendPos.B;
+			case LEFT: return STLegendPos.L;
+			case RIGHT: return STLegendPos.R;
+			case TOP: return STLegendPos.T;
+			case TOP_RIGHT: return STLegendPos.TR;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+
+	private LegendPosition toLegendPosition(CTLegendPos ctLegendPos) {
+		switch (ctLegendPos.getVal().intValue()) {
+			case STLegendPos.INT_B: return LegendPosition.BOTTOM;
+			case STLegendPos.INT_L: return LegendPosition.LEFT;
+			case STLegendPos.INT_R: return LegendPosition.RIGHT;
+			case STLegendPos.INT_T: return LegendPosition.TOP;
+			case STLegendPos.INT_TR: return LegendPosition.TOP_RIGHT;
+			default:
+				throw new IllegalArgumentException();
+		}
+	}
+}

Added: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFScatterChartData.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFScatterChartData.java?rev=1125275&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFScatterChartData.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFScatterChartData.java Fri May 20 08:22:53 2011
@@ -0,0 +1,147 @@
+/* ====================================================================
+   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.charts;
+
+import java.util.List;
+import java.util.ArrayList;
+
+import org.apache.poi.ss.usermodel.Chart;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.usermodel.charts.ScatterChartData;
+import org.apache.poi.ss.usermodel.charts.ScatterChartSerie;
+import org.apache.poi.ss.usermodel.charts.ChartDataFactory;
+import org.apache.poi.ss.usermodel.charts.ChartAxis;
+
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterStyle;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTScatterSer;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumRef;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STScatterStyle;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STCrosses;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STCrossBetween;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STOrientation;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STAxPos;
+
+import org.apache.poi.xssf.usermodel.XSSFChart;
+
+/**
+ * Represents DrawingML scatter chart.
+ *
+ * @author Roman Kashitsyn
+ */
+public class XSSFScatterChartData implements ScatterChartData {
+
+	/**
+	 * List of all data series.
+	 */
+	private List<Serie> series;
+
+	public XSSFScatterChartData() {
+		series = new ArrayList<Serie>();
+	}
+
+	public static class Serie implements ScatterChartSerie {
+		private int id;
+		private int order;
+		private boolean useCache;
+		private Sheet xSheet;
+		private Sheet ySheet;
+		private CellRangeAddress xAddress;
+		private CellRangeAddress yAddress;
+
+		public Serie(int id, int order) {
+			super();
+			this.id = id;
+			this.order = order;
+			this.useCache = false;
+		}
+
+		public void setXValues(Sheet sheet, CellRangeAddress address) {
+			this.xSheet = sheet;
+			this.xAddress = address;
+		}
+
+		public void setYValues(Sheet sheet, CellRangeAddress address) {
+			this.ySheet = sheet;
+			this.yAddress = address;
+		}
+
+		/**
+		 * @param useCache if true, cached results will be added on plot
+		 */
+		public void setUseCache(boolean useCache) {
+			this.useCache = useCache;
+		}
+
+		protected void addToChart(CTScatterChart ctScatterChart) {
+			CTScatterSer scatterSer = ctScatterChart.addNewSer();
+			scatterSer.addNewIdx().setVal(this.id);
+			scatterSer.addNewOrder().setVal(this.order);
+
+			CTAxDataSource xVal = scatterSer.addNewXVal();
+			CTNumRef numRef = xVal.addNewNumRef();
+			numRef.setF(xAddress.formatAsString(xSheet.getSheetName(), true));
+
+			CTNumDataSource yVal = scatterSer.addNewYVal();
+			numRef = yVal.addNewNumRef();
+			numRef.setF(yAddress.formatAsString(ySheet.getSheetName(), true));
+		}
+	}
+
+	public XSSFScatterChartData.Serie addSerie() {
+		int numOfSeries = series.size();
+		Serie newSerie = new Serie(numOfSeries, numOfSeries);
+		series.add(newSerie);
+		return newSerie;
+	}
+
+	public void fillChart(Chart chart, ChartAxis... axis) {
+		if (!(chart instanceof XSSFChart)) {
+			throw new IllegalArgumentException("Chart must be instance of XSSFChart");
+		}
+
+		XSSFChart xssfChart = (XSSFChart) chart;
+		CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea();
+		CTScatterChart scatterChart = plotArea.addNewScatterChart();
+		addStyle(scatterChart);
+
+		for (Serie s : series) {
+			s.addToChart(scatterChart);
+		}
+
+		for (ChartAxis ax : axis) {
+			scatterChart.addNewAxId().setVal(ax.getId());
+		}
+	}
+
+	public List<? extends Serie> getSeries() {
+		return series;
+	}
+
+	private void addStyle(CTScatterChart ctScatterChart) {
+		CTScatterStyle scatterStyle = ctScatterChart.addNewScatterStyle();
+		scatterStyle.setVal(STScatterStyle.LINE_MARKER);
+	}
+}



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