create changelog entry
[debian/openrocket] / android-libraries / achartengine / src / org / achartengine / chart / LineChart.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 org.achartengine.model.XYMultipleSeriesDataset;\r
19 import org.achartengine.renderer.SimpleSeriesRenderer;\r
20 import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
21 import org.achartengine.renderer.XYSeriesRenderer;\r
22 \r
23 import android.graphics.Canvas;\r
24 import android.graphics.Paint;\r
25 import android.graphics.Paint.Style;\r
26 import android.graphics.RectF;\r
27 \r
28 /**\r
29  * The line chart rendering class.\r
30  */\r
31 public class LineChart extends XYChart {\r
32   /** The constant to identify this chart type. */\r
33   public static final String TYPE = "Line";\r
34   /** The legend shape width. */\r
35   private static final int SHAPE_WIDTH = 30;\r
36   /** The scatter chart to be used to draw the data points. */\r
37   private ScatterChart pointsChart;\r
38 \r
39   LineChart() {\r
40   }\r
41 \r
42   /**\r
43    * Builds a new line chart instance.\r
44    * \r
45    * @param dataset the multiple series dataset\r
46    * @param renderer the multiple series renderer\r
47    */\r
48   public LineChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) {\r
49     super(dataset, renderer);\r
50     pointsChart = new ScatterChart(dataset, renderer);\r
51   }\r
52 \r
53   /**\r
54    * Sets the series and the renderer.\r
55    * \r
56    * @param dataset the series dataset\r
57    * @param renderer the series renderer\r
58    */\r
59   protected void setDatasetRenderer(XYMultipleSeriesDataset dataset,\r
60       XYMultipleSeriesRenderer renderer) {\r
61     super.setDatasetRenderer(dataset, renderer);\r
62     pointsChart = new ScatterChart(dataset, renderer);\r
63   }\r
64 \r
65   /**\r
66    * The graphical representation of a series.\r
67    * \r
68    * @param canvas the canvas to paint to\r
69    * @param paint the paint to be used for drawing\r
70    * @param points the array of points to be used for drawing the series\r
71    * @param seriesRenderer the series renderer\r
72    * @param yAxisValue the minimum value of the y axis\r
73    * @param seriesIndex the index of the series currently being drawn\r
74    * @param startIndex the start index of the rendering points\r
75    */\r
76   public void drawSeries(Canvas canvas, Paint paint, float[] points,\r
77       SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) {\r
78     int length = points.length;\r
79     XYSeriesRenderer renderer = (XYSeriesRenderer) seriesRenderer;\r
80     float lineWidth = paint.getStrokeWidth();\r
81     paint.setStrokeWidth(renderer.getLineWidth());\r
82     if (renderer.isFillBelowLine()) {\r
83       paint.setColor(renderer.getFillBelowLineColor());\r
84       int pLength = points.length;\r
85       float[] fillPoints = new float[pLength + 4];\r
86       System.arraycopy(points, 0, fillPoints, 0, length);\r
87       fillPoints[0] = points[0] + 1;\r
88       fillPoints[length] = fillPoints[length - 2];\r
89       fillPoints[length + 1] = yAxisValue;\r
90       fillPoints[length + 2] = fillPoints[0];\r
91       fillPoints[length + 3] = fillPoints[length + 1];\r
92       for (int i = 0; i < length + 4; i += 2) {\r
93         if (fillPoints[i + 1] < 0) {\r
94           fillPoints[i + 1] = 0;\r
95         }\r
96       }\r
97       paint.setStyle(Style.FILL);\r
98       drawPath(canvas, fillPoints, paint, true);\r
99     }\r
100     paint.setColor(seriesRenderer.getColor());\r
101     paint.setStyle(Style.STROKE);\r
102     drawPath(canvas, points, paint, false);\r
103     paint.setStrokeWidth(lineWidth);\r
104   }\r
105 \r
106   @Override\r
107   protected ClickableArea[] clickableAreasForPoints(float[] points, double[] values,\r
108       float yAxisValue, int seriesIndex, int startIndex) {\r
109     int length = points.length;\r
110     ClickableArea[] ret = new ClickableArea[length / 2];\r
111     for (int i = 0; i < length; i += 2) {\r
112       int selectableBuffer = mRenderer.getSelectableBuffer();\r
113       ret[i / 2] = new ClickableArea(new RectF(points[i] - selectableBuffer, points[i + 1]\r
114           - selectableBuffer, points[i] + selectableBuffer, points[i + 1] + selectableBuffer),\r
115           values[i], values[i + 1]);\r
116     }\r
117     return ret;\r
118   }\r
119 \r
120   /**\r
121    * Returns the legend shape width.\r
122    * \r
123    * @param seriesIndex the series index\r
124    * @return the legend shape width\r
125    */\r
126   public int getLegendShapeWidth(int seriesIndex) {\r
127     return SHAPE_WIDTH;\r
128   }\r
129 \r
130   /**\r
131    * The graphical representation of the legend shape.\r
132    * \r
133    * @param canvas the canvas to paint to\r
134    * @param renderer the series renderer\r
135    * @param x the x value of the point the shape should be drawn at\r
136    * @param y the y value of the point the shape should be drawn at\r
137    * @param seriesIndex the series index\r
138    * @param paint the paint to be used for drawing\r
139    */\r
140   public void drawLegendShape(Canvas canvas, SimpleSeriesRenderer renderer, float x, float y,\r
141       int seriesIndex, Paint paint) {\r
142     canvas.drawLine(x, y, x + SHAPE_WIDTH, y, paint);\r
143     if (isRenderPoints(renderer)) {\r
144       pointsChart.drawLegendShape(canvas, renderer, x + 5, y, seriesIndex, paint);\r
145     }\r
146   }\r
147 \r
148   /**\r
149    * Returns if the chart should display the points as a certain shape.\r
150    * \r
151    * @param renderer the series renderer\r
152    */\r
153   public boolean isRenderPoints(SimpleSeriesRenderer renderer) {\r
154     return ((XYSeriesRenderer) renderer).getPointStyle() != PointStyle.POINT;\r
155   }\r
156 \r
157   /**\r
158    * Returns the scatter chart to be used for drawing the data points.\r
159    * \r
160    * @return the data points scatter chart\r
161    */\r
162   public ScatterChart getPointsChart() {\r
163     return pointsChart;\r
164   }\r
165 \r
166   /**\r
167    * Returns the chart type identifier.\r
168    * \r
169    * @return the chart type\r
170    */\r
171   public String getChartType() {\r
172     return TYPE;\r
173   }\r
174 \r
175 }\r