/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.plugin.jfreereport.reportcharts; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.StandardXYToolTipGenerator; import org.jfree.chart.labels.XYToolTipGenerator; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StackedXYAreaRenderer2; import org.jfree.chart.renderer.xy.XYAreaRenderer2; import org.jfree.chart.urls.StandardXYURLGenerator; import org.jfree.chart.urls.XYURLGenerator; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; import org.pentaho.plugin.jfreereport.reportcharts.backport.ExtTimeTableXYDataset; public class XYAreaChartExpression extends XYLineChartExpression { private static final long serialVersionUID = -8475649582680588912L; public XYAreaChartExpression() { } public static JFreeChart createTimeSeriesChart( final String title, final String timeAxisLabel, final String valueAxisLabel, final XYDataset dataset, final boolean legend, final boolean tooltips, final boolean urls, final boolean stacked ) { final ValueAxis timeAxis = new DateAxis( timeAxisLabel ); timeAxis.setLowerMargin( 0.02 ); // reduce the default margins timeAxis.setUpperMargin( 0.02 ); final NumberAxis valueAxis = new NumberAxis( valueAxisLabel ); valueAxis.setAutoRangeIncludesZero( false ); // override default final XYPlot plot = new XYPlot( dataset, timeAxis, valueAxis, null ); XYToolTipGenerator toolTipGenerator = null; if ( tooltips ) { toolTipGenerator = StandardXYToolTipGenerator.getTimeSeriesInstance(); } XYURLGenerator urlGenerator = null; if ( urls ) { urlGenerator = new StandardXYURLGenerator(); } final XYAreaRenderer2 renderer; if ( stacked ) { renderer = new StackedXYAreaRenderer2(); } else { renderer = new XYAreaRenderer2(); } renderer.setBaseToolTipGenerator( toolTipGenerator ); renderer.setURLGenerator( urlGenerator ); plot.setRenderer( renderer ); return new JFreeChart( title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend ); } protected JFreeChart computeXYChart( final XYDataset xyDataset ) { final JFreeChart chart; if ( xyDataset instanceof TimeSeriesCollection ) { if ( isStacked() ) { final ExtTimeTableXYDataset tableXYDataset = convertToTable( xyDataset ); chart = createTimeSeriesChart( computeTitle(), getDomainTitle(), getRangeTitle(), tableXYDataset, isShowLegend(), false, false, isStacked() ); } else { chart = createTimeSeriesChart( computeTitle(), getDomainTitle(), getRangeTitle(), xyDataset, isShowLegend(), false, false, isStacked() ); } } else { final PlotOrientation orientation = computePlotOrientation(); if ( isStacked() ) { chart = createStackedXYAreaChart( computeTitle(), getDomainTitle(), getRangeTitle(), xyDataset, orientation, isShowLegend(), false, false ); } else { chart = ChartFactory.createXYAreaChart( computeTitle(), getDomainTitle(), getRangeTitle(), xyDataset, orientation, isShowLegend(), false, false ); } } configureLogarithmicAxis( chart.getXYPlot() ); return chart; } /** * Creates a stacked XY area plot. The chart object returned by this method uses an {@link * org.jfree.chart.plot.XYPlot} instance as the plot, with a {@link org.jfree.chart.axis.NumberAxis} for the domain * axis, a {@link org.jfree.chart.axis.NumberAxis} as the range axis, and a {@link * org.jfree.chart.renderer.xy.StackedXYAreaRenderer2} as the renderer. * * @param title the chart title (<code>null</code> permitted). * @param xAxisLabel a label for the X-axis (<code>null</code> permitted). * @param yAxisLabel a label for the Y-axis (<code>null</code> permitted). * @param dataset the dataset for the chart (<code>null</code> permitted). * @param orientation the plot orientation (horizontal or vertical) (<code>null</code> NOT permitted). * @param legend a flag specifying whether or not a legend is required. * @param tooltips configure chart to generate tool tips? * @param urls configure chart to generate URLs? * @return A stacked XY area chart. */ protected static JFreeChart createStackedXYAreaChart( final String title, final String xAxisLabel, final String yAxisLabel, final XYDataset dataset, final PlotOrientation orientation, final boolean legend, final boolean tooltips, final boolean urls ) { if ( orientation == null ) { throw new IllegalArgumentException( "Null 'orientation' argument." ); } final NumberAxis xAxis = new NumberAxis( xAxisLabel ); xAxis.setAutoRangeIncludesZero( false ); xAxis.setLowerMargin( 0.0 ); xAxis.setUpperMargin( 0.0 ); final NumberAxis yAxis = new NumberAxis( yAxisLabel ); XYToolTipGenerator toolTipGenerator = null; if ( tooltips ) { toolTipGenerator = new StandardXYToolTipGenerator(); } XYURLGenerator urlGenerator = null; if ( urls ) { urlGenerator = new StandardXYURLGenerator(); } final StackedXYAreaRenderer2 renderer = new StackedXYAreaRenderer2( toolTipGenerator, urlGenerator ); renderer.setOutline( true ); final XYPlot plot = new XYPlot( dataset, xAxis, yAxis, renderer ); plot.setOrientation( orientation ); plot.setRangeAxis( yAxis ); // forces recalculation of the axis range return new JFreeChart( title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend ); } }