create changelog entry
[debian/openrocket] / android-libraries / achartengine / src / org / achartengine / chart / CombinedXYChart.java
1 /**\r
2  * Copyright (C) 2009 - 2012 SC 4ViewSoft SRL\r
3  *  \r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *  \r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *  \r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 package org.achartengine.chart;\r
17 \r
18 import java.util.List;\r
19 \r
20 import org.achartengine.model.XYMultipleSeriesDataset;\r
21 import org.achartengine.model.XYSeries;\r
22 import org.achartengine.renderer.SimpleSeriesRenderer;\r
23 import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
24 import org.achartengine.renderer.XYMultipleSeriesRenderer.Orientation;\r
25 \r
26 import android.graphics.Canvas;\r
27 import android.graphics.Paint;\r
28 \r
29 /**\r
30  * The combined XY chart rendering class.\r
31  */\r
32 public class CombinedXYChart extends XYChart {\r
33   /** The embedded XY charts. */\r
34   private XYChart[] mCharts;\r
35   /** The supported charts for being combined. */\r
36   private Class[] xyChartTypes = new Class[] { TimeChart.class, LineChart.class,\r
37       CubicLineChart.class, BarChart.class, BubbleChart.class, ScatterChart.class,\r
38       RangeBarChart.class, RangeStackedBarChart.class };\r
39 \r
40   /**\r
41    * Builds a new combined XY chart instance.\r
42    * \r
43    * @param dataset the multiple series dataset\r
44    * @param renderer the multiple series renderer\r
45    * @param types the XY chart types\r
46    */\r
47   public CombinedXYChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer,\r
48       String[] types) {\r
49     super(dataset, renderer);\r
50     int length = types.length;\r
51     mCharts = new XYChart[length];\r
52     for (int i = 0; i < length; i++) {\r
53       try {\r
54         mCharts[i] = getXYChart(types[i]);\r
55       } catch (Exception e) {\r
56         // ignore\r
57       }\r
58       if (mCharts[i] == null) {\r
59         throw new IllegalArgumentException("Unknown chart type " + types[i]);\r
60       } else {\r
61         XYMultipleSeriesDataset newDataset = new XYMultipleSeriesDataset();\r
62         newDataset.addSeries(dataset.getSeriesAt(i));\r
63         XYMultipleSeriesRenderer newRenderer = new XYMultipleSeriesRenderer();\r
64         // TODO: copy other parameters here\r
65         newRenderer.setBarSpacing(renderer.getBarSpacing());\r
66         newRenderer.setPointSize(renderer.getPointSize());\r
67         int scale = dataset.getSeriesAt(i).getScaleNumber();\r
68         if (renderer.isMinXSet(scale)) {\r
69           newRenderer.setXAxisMin(renderer.getXAxisMin(scale));\r
70         }\r
71         if (renderer.isMaxXSet(scale)) {\r
72           newRenderer.setXAxisMax(renderer.getXAxisMax(scale));\r
73         }\r
74         if (renderer.isMinYSet(scale)) {\r
75           newRenderer.setYAxisMin(renderer.getYAxisMin(scale));\r
76         }\r
77         if (renderer.isMaxYSet(scale)) {\r
78           newRenderer.setYAxisMax(renderer.getYAxisMax(scale));\r
79         }\r
80         newRenderer.addSeriesRenderer(renderer.getSeriesRendererAt(i));\r
81         mCharts[i].setDatasetRenderer(newDataset, newRenderer);\r
82       }\r
83     }\r
84   }\r
85 \r
86   /**\r
87    * Returns a chart instance based on the provided type.\r
88    * \r
89    * @param type the chart type\r
90    * @return an instance of a chart implementation\r
91    * @throws IllegalAccessException\r
92    * @throws InstantiationException\r
93    */\r
94   private XYChart getXYChart(String type) throws IllegalAccessException, InstantiationException {\r
95     XYChart chart = null;\r
96     int length = xyChartTypes.length;\r
97     for (int i = 0; i < length && chart == null; i++) {\r
98       XYChart newChart = (XYChart) xyChartTypes[i].newInstance();\r
99       if (type.equals(newChart.getChartType())) {\r
100         chart = newChart;\r
101       }\r
102     }\r
103     return chart;\r
104   }\r
105 \r
106   /**\r
107    * The graphical representation of a series.\r
108    * \r
109    * @param canvas the canvas to paint to\r
110    * @param paint the paint to be used for drawing\r
111    * @param points the array of points to be used for drawing the series\r
112    * @param seriesRenderer the series renderer\r
113    * @param yAxisValue the minimum value of the y axis\r
114    * @param seriesIndex the index of the series currently being drawn\r
115    * @param startIndex the start index of the rendering points\r
116    */\r
117   public void drawSeries(Canvas canvas, Paint paint, float[] points,\r
118       SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) {\r
119     mCharts[seriesIndex].setScreenR(getScreenR());\r
120     mCharts[seriesIndex].setCalcRange(getCalcRange(mDataset.getSeriesAt(seriesIndex)\r
121         .getScaleNumber()), 0);\r
122     mCharts[seriesIndex].drawSeries(canvas, paint, points, seriesRenderer, yAxisValue, 0,\r
123         startIndex);\r
124   }\r
125 \r
126   @Override\r
127   protected ClickableArea[] clickableAreasForPoints(float[] points, double[] values,\r
128       float yAxisValue, int seriesIndex, int startIndex) {\r
129     return mCharts[seriesIndex].clickableAreasForPoints(points, values, yAxisValue, 0, startIndex);\r
130   }\r
131 \r
132   @Override\r
133   protected void drawSeries(XYSeries series, Canvas canvas, Paint paint, List<Float> pointsList,\r
134       SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, Orientation or,\r
135       int startIndex) {\r
136     mCharts[seriesIndex].setScreenR(getScreenR());\r
137     mCharts[seriesIndex].setCalcRange(getCalcRange(mDataset.getSeriesAt(seriesIndex)\r
138         .getScaleNumber()), 0);\r
139     mCharts[seriesIndex].drawSeries(series, canvas, paint, pointsList, seriesRenderer, yAxisValue,\r
140         0, or, startIndex);\r
141   }\r
142 \r
143   /**\r
144    * Returns the legend shape width.\r
145    * \r
146    * @param seriesIndex the series index\r
147    * @return the legend shape width\r
148    */\r
149   public int getLegendShapeWidth(int seriesIndex) {\r
150     return mCharts[seriesIndex].getLegendShapeWidth(0);\r
151   }\r
152 \r
153   /**\r
154    * The graphical representation of the legend shape.\r
155    * \r
156    * @param canvas the canvas to paint to\r
157    * @param renderer the series renderer\r
158    * @param x the x value of the point the shape should be drawn at\r
159    * @param y the y value of the point the shape should be drawn at\r
160    * @param seriesIndex the series index\r
161    * @param paint the paint to be used for drawing\r
162    */\r
163   public void drawLegendShape(Canvas canvas, SimpleSeriesRenderer renderer, float x, float y,\r
164       int seriesIndex, Paint paint) {\r
165     mCharts[seriesIndex].drawLegendShape(canvas, renderer, x, y, 0, paint);\r
166   }\r
167 \r
168   /**\r
169    * Returns the chart type identifier.\r
170    * \r
171    * @return the chart type\r
172    */\r
173   public String getChartType() {\r
174     return "Combined";\r
175   }\r
176 \r
177 }\r