--- /dev/null
+/**\r
+ * Copyright (C) 2009 - 2012 SC 4ViewSoft SRL\r
+ * \r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package org.achartengine.chart;\r
+\r
+import org.achartengine.model.XYMultipleSeriesDataset;\r
+import org.achartengine.renderer.SimpleSeriesRenderer;\r
+import org.achartengine.renderer.XYMultipleSeriesRenderer;\r
+import org.achartengine.renderer.XYSeriesRenderer;\r
+\r
+import android.graphics.Canvas;\r
+import android.graphics.Paint;\r
+import android.graphics.Paint.Style;\r
+import android.graphics.RectF;\r
+\r
+/**\r
+ * The line chart rendering class.\r
+ */\r
+public class LineChart extends XYChart {\r
+ /** The constant to identify this chart type. */\r
+ public static final String TYPE = "Line";\r
+ /** The legend shape width. */\r
+ private static final int SHAPE_WIDTH = 30;\r
+ /** The scatter chart to be used to draw the data points. */\r
+ private ScatterChart pointsChart;\r
+\r
+ LineChart() {\r
+ }\r
+\r
+ /**\r
+ * Builds a new line chart instance.\r
+ * \r
+ * @param dataset the multiple series dataset\r
+ * @param renderer the multiple series renderer\r
+ */\r
+ public LineChart(XYMultipleSeriesDataset dataset, XYMultipleSeriesRenderer renderer) {\r
+ super(dataset, renderer);\r
+ pointsChart = new ScatterChart(dataset, renderer);\r
+ }\r
+\r
+ /**\r
+ * Sets the series and the renderer.\r
+ * \r
+ * @param dataset the series dataset\r
+ * @param renderer the series renderer\r
+ */\r
+ protected void setDatasetRenderer(XYMultipleSeriesDataset dataset,\r
+ XYMultipleSeriesRenderer renderer) {\r
+ super.setDatasetRenderer(dataset, renderer);\r
+ pointsChart = new ScatterChart(dataset, renderer);\r
+ }\r
+\r
+ /**\r
+ * The graphical representation of a series.\r
+ * \r
+ * @param canvas the canvas to paint to\r
+ * @param paint the paint to be used for drawing\r
+ * @param points the array of points to be used for drawing the series\r
+ * @param seriesRenderer the series renderer\r
+ * @param yAxisValue the minimum value of the y axis\r
+ * @param seriesIndex the index of the series currently being drawn\r
+ * @param startIndex the start index of the rendering points\r
+ */\r
+ public void drawSeries(Canvas canvas, Paint paint, float[] points,\r
+ SimpleSeriesRenderer seriesRenderer, float yAxisValue, int seriesIndex, int startIndex) {\r
+ int length = points.length;\r
+ XYSeriesRenderer renderer = (XYSeriesRenderer) seriesRenderer;\r
+ float lineWidth = paint.getStrokeWidth();\r
+ paint.setStrokeWidth(renderer.getLineWidth());\r
+ if (renderer.isFillBelowLine()) {\r
+ paint.setColor(renderer.getFillBelowLineColor());\r
+ int pLength = points.length;\r
+ float[] fillPoints = new float[pLength + 4];\r
+ System.arraycopy(points, 0, fillPoints, 0, length);\r
+ fillPoints[0] = points[0] + 1;\r
+ fillPoints[length] = fillPoints[length - 2];\r
+ fillPoints[length + 1] = yAxisValue;\r
+ fillPoints[length + 2] = fillPoints[0];\r
+ fillPoints[length + 3] = fillPoints[length + 1];\r
+ for (int i = 0; i < length + 4; i += 2) {\r
+ if (fillPoints[i + 1] < 0) {\r
+ fillPoints[i + 1] = 0;\r
+ }\r
+ }\r
+ paint.setStyle(Style.FILL);\r
+ drawPath(canvas, fillPoints, paint, true);\r
+ }\r
+ paint.setColor(seriesRenderer.getColor());\r
+ paint.setStyle(Style.STROKE);\r
+ drawPath(canvas, points, paint, false);\r
+ paint.setStrokeWidth(lineWidth);\r
+ }\r
+\r
+ @Override\r
+ protected ClickableArea[] clickableAreasForPoints(float[] points, double[] values,\r
+ float yAxisValue, int seriesIndex, int startIndex) {\r
+ int length = points.length;\r
+ ClickableArea[] ret = new ClickableArea[length / 2];\r
+ for (int i = 0; i < length; i += 2) {\r
+ int selectableBuffer = mRenderer.getSelectableBuffer();\r
+ ret[i / 2] = new ClickableArea(new RectF(points[i] - selectableBuffer, points[i + 1]\r
+ - selectableBuffer, points[i] + selectableBuffer, points[i + 1] + selectableBuffer),\r
+ values[i], values[i + 1]);\r
+ }\r
+ return ret;\r
+ }\r
+\r
+ /**\r
+ * Returns the legend shape width.\r
+ * \r
+ * @param seriesIndex the series index\r
+ * @return the legend shape width\r
+ */\r
+ public int getLegendShapeWidth(int seriesIndex) {\r
+ return SHAPE_WIDTH;\r
+ }\r
+\r
+ /**\r
+ * The graphical representation of the legend shape.\r
+ * \r
+ * @param canvas the canvas to paint to\r
+ * @param renderer the series renderer\r
+ * @param x the x value of the point the shape should be drawn at\r
+ * @param y the y value of the point the shape should be drawn at\r
+ * @param seriesIndex the series index\r
+ * @param paint the paint to be used for drawing\r
+ */\r
+ public void drawLegendShape(Canvas canvas, SimpleSeriesRenderer renderer, float x, float y,\r
+ int seriesIndex, Paint paint) {\r
+ canvas.drawLine(x, y, x + SHAPE_WIDTH, y, paint);\r
+ if (isRenderPoints(renderer)) {\r
+ pointsChart.drawLegendShape(canvas, renderer, x + 5, y, seriesIndex, paint);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Returns if the chart should display the points as a certain shape.\r
+ * \r
+ * @param renderer the series renderer\r
+ */\r
+ public boolean isRenderPoints(SimpleSeriesRenderer renderer) {\r
+ return ((XYSeriesRenderer) renderer).getPointStyle() != PointStyle.POINT;\r
+ }\r
+\r
+ /**\r
+ * Returns the scatter chart to be used for drawing the data points.\r
+ * \r
+ * @return the data points scatter chart\r
+ */\r
+ public ScatterChart getPointsChart() {\r
+ return pointsChart;\r
+ }\r
+\r
+ /**\r
+ * Returns the chart type identifier.\r
+ * \r
+ * @return the chart type\r
+ */\r
+ public String getChartType() {\r
+ return TYPE;\r
+ }\r
+\r
+}\r