]> source.dussan.org Git - poi.git/commitdiff
Bug 54676: added new chart axis type: Category axis
authorCédric Walter <cedricwalter@apache.org>
Fri, 22 Nov 2013 17:45:00 +0000 (17:45 +0000)
committerCédric Walter <cedricwalter@apache.org>
Fri, 22 Nov 2013 17:45:00 +0000 (17:45 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1544612 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/ss/usermodel/charts/ChartAxisFactory.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFChart.java
src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java [new file with mode: 0644]
src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java [new file with mode: 0644]

index 8bf32b2b8cfb6f22fd30fde3b47dcc14842defc2..87eff04cf583b61080f4ee50c96816dd12ec2d15 100644 (file)
@@ -23,13 +23,19 @@ import org.apache.poi.util.Beta;
  * A factory for different chart axis.
  *
  * @author Roman Kashitsyn
+ * @author Martin Andersson
  */
 @Beta
 public interface ChartAxisFactory {
-       
+
        /**
         * @return new value axis
         */
        ValueAxis createValueAxis(AxisPosition pos);
 
+       /**
+        * @return new category axis.
+        */
+       ChartAxis createCategoryAxis(AxisPosition pos);
+
 }
index 348d903f042e010e4a5711cab79f00e5237a1bb6..bc5c6707dd22c60796f2c5cdbe5d0cc01173f1a5 100644 (file)
@@ -33,6 +33,7 @@ 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.XSSFCategoryAxis;
 import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory;
 import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis;
 import org.apache.poi.xssf.usermodel.charts.XSSFValueAxis;
@@ -43,6 +44,7 @@ import org.apache.poi.ss.usermodel.charts.AxisPosition;
 import org.apache.xmlbeans.XmlException;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlOptions;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTChartSpace;
 import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle;
@@ -59,6 +61,7 @@ import org.w3c.dom.Text;
  * Represents a SpreadsheetML Chart
  * @author Nick Burch
  * @author Roman Kashitsyn
+ * @author Martin Andersson
  */
 public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartAxisFactory {
 
@@ -212,6 +215,18 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
                return valueAxis;
        }
 
+       public XSSFCategoryAxis createCategoryAxis(AxisPosition pos) {
+               long id = axis.size() + 1;
+               XSSFCategoryAxis categoryAxis = new XSSFCategoryAxis(this, id, pos);
+               if (axis.size() == 1) {
+                       ChartAxis ax = axis.get(0);
+                       ax.crossAxis(categoryAxis);
+                       categoryAxis.crossAxis(ax);
+               }
+               axis.add(categoryAxis);
+               return categoryAxis;
+       }
+
        public List<? extends XSSFChartAxis> getAxis() {
                if (axis.isEmpty() && hasAxis()) {
                        parseAxis();
@@ -287,9 +302,16 @@ public final class XSSFChart extends POIXMLDocumentPart implements Chart, ChartA
 
        private void parseAxis() {
                // TODO: add other axis types
+               parseCategoryAxis();
                parseValueAxis();
        }
 
+       private void parseCategoryAxis() {
+               for (CTCatAx catAx : chart.getPlotArea().getCatAxList()) {
+                       axis.add(new XSSFCategoryAxis(this, catAx));
+               }
+       }
+
        private void parseValueAxis() {
                for (CTValAx valAx : chart.getPlotArea().getValAxList()) {
                        axis.add(new XSSFValueAxis(this, valAx));
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/charts/XSSFCategoryAxis.java
new file mode 100644 (file)
index 0000000..d8193a5
--- /dev/null
@@ -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.charts;
+
+import org.apache.poi.ss.usermodel.charts.AxisCrosses;
+import org.apache.poi.ss.usermodel.charts.AxisOrientation;
+import org.apache.poi.ss.usermodel.charts.AxisPosition;
+import org.apache.poi.ss.usermodel.charts.ChartAxis;
+import org.apache.poi.util.Beta;
+import org.apache.poi.xssf.usermodel.XSSFChart;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxPos;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTCatAx;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTCrosses;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumFmt;
+import org.openxmlformats.schemas.drawingml.x2006.chart.CTScaling;
+import org.openxmlformats.schemas.drawingml.x2006.chart.STTickLblPos;
+
+/**
+ * Category axis type.
+ *
+ * @author Martin Andersson
+ */
+@Beta
+public class XSSFCategoryAxis extends XSSFChartAxis {
+
+       private CTCatAx ctCatAx;
+
+       public XSSFCategoryAxis(XSSFChart chart, long id, AxisPosition pos) {
+               super(chart);
+               createAxis(id, pos);
+       }
+
+       public XSSFCategoryAxis(XSSFChart chart, CTCatAx ctCatAx) {
+               super(chart);
+               this.ctCatAx = ctCatAx;
+       }
+
+       public long getId() {
+               return ctCatAx.getAxId().getVal();
+       }
+
+       protected CTAxPos getCTAxPos() {
+               return ctCatAx.getAxPos();
+       }
+
+       protected CTNumFmt getCTNumFmt() {
+               if (ctCatAx.isSetNumFmt()) {
+                       return ctCatAx.getNumFmt();
+               }
+               return ctCatAx.addNewNumFmt();
+       }
+
+       protected CTScaling getCTScaling() {
+               return ctCatAx.getScaling();
+       }
+
+       protected CTCrosses getCTCrosses() {
+               return ctCatAx.getCrosses();
+       }
+
+       public void crossAxis(ChartAxis axis) {
+               ctCatAx.getCrossAx().setVal(axis.getId());
+       }
+
+       private void createAxis(long id, AxisPosition pos) {
+               ctCatAx = chart.getCTChart().getPlotArea().addNewCatAx();
+               ctCatAx.addNewAxId().setVal(id);
+               ctCatAx.addNewAxPos();
+               ctCatAx.addNewScaling();
+               ctCatAx.addNewCrosses();
+               ctCatAx.addNewCrossAx();
+               ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);
+
+               setPosition(pos);
+               setOrientation(AxisOrientation.MIN_MAX);
+               setCrosses(AxisCrosses.AUTO_ZERO);
+       }
+}
diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/charts/TestXSSFCategoryAxis.java
new file mode 100644 (file)
index 0000000..64ce92b
--- /dev/null
@@ -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.xssf.usermodel.charts;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.ss.usermodel.charts.*;
+import org.apache.poi.xssf.usermodel.*;
+
+public final class TestXSSFCategoryAxis extends TestCase {
+       public void testAccessMethods() throws Exception {
+               XSSFWorkbook wb = new XSSFWorkbook();
+               XSSFSheet sheet = wb.createSheet();
+               XSSFDrawing drawing = sheet.createDrawingPatriarch();
+               XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 10, 30);
+               XSSFChart chart = drawing.createChart(anchor);
+               XSSFCategoryAxis axis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
+
+               axis.setCrosses(AxisCrosses.AUTO_ZERO);
+               assertEquals(axis.getCrosses(), AxisCrosses.AUTO_ZERO);
+
+               assertEquals(chart.getAxis().size(), 1);
+       }
+}