/*
* 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) 2009 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.extensions.legacy.charts;
import java.util.Locale;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.SpiderWebPlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYAreaRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.xy.DefaultIntervalXYDataset;
import org.jfree.data.xy.DefaultXYZDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYZDataset;
import org.jfree.util.TableOrder;
import org.pentaho.plugin.jfreereport.reportcharts.AbstractChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.AreaChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.BarChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.BarLineChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.BubbleChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.ExtendedXYLineChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.LineChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.MultiPieChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.PieChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.RadarChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.RingChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.ScatterPlotChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.WaterfallChartExpressions;
import org.pentaho.plugin.jfreereport.reportcharts.XYAreaChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.XYBarChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.XYLineChartExpression;
import org.pentaho.plugin.jfreereport.reportcharts.XYAreaLineChartExpression;
import org.pentaho.reporting.engine.classic.core.AttributeNames;
import org.pentaho.reporting.engine.classic.core.Element;
import org.pentaho.reporting.engine.classic.core.filter.types.ContentFieldType;
import org.pentaho.reporting.engine.classic.core.filter.types.ElementTypeUtils;
import org.pentaho.reporting.engine.classic.core.function.Expression;
import org.pentaho.reporting.engine.classic.core.function.ExpressionRuntime;
import org.pentaho.reporting.engine.classic.core.metadata.ElementMetaData;
import org.pentaho.reporting.engine.classic.core.metadata.ElementTypeRegistry;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleKeys;
/**
* Todo: Document Me
*
* @author Thomas Morgner
*/
public class LegacyChartType extends ContentFieldType
{
private transient ElementMetaData elementType;
public LegacyChartType()
{
}
public ElementMetaData getMetaData()
{
if (elementType == null)
{
elementType = ElementTypeRegistry.getInstance().getElementType("legacy-chart");
}
return elementType;
}
public Object getDesignValue(final ExpressionRuntime runtime, final Element element)
{
final Expression theExpression =
element.getAttributeExpression(AttributeNames.Core.NAMESPACE, AttributeNames.Core.VALUE);
return createChart(theExpression);
}
private XYZDataset createXYZDataset()
{
final DefaultXYZDataset xyzDataset = new DefaultXYZDataset();
final double bs = 3;
xyzDataset.addSeries("First", new double[][]{{1, 2, 3}, {2, 1, 3}, {0.1 * bs, 0.2 * bs, 0.1 * bs}});// NON-NLS
xyzDataset.addSeries("Second", new double[][]{{1, 2, 3}, {3, 0, 1}, {0.2 * bs, 0.1 * bs, 0.15 * bs}});// NON-NLS
return xyzDataset;
}
private PieDataset createPieDataset()
{
final DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("Part 1", 23);// NON-NLS
dataset.setValue("Part 2", 35);// NON-NLS
dataset.setValue("Part 3", 42);// NON-NLS
return dataset;
}
private XYDataset createIntervalXYDataset()
{
final DefaultIntervalXYDataset dataset = new DefaultIntervalXYDataset();
dataset.addSeries("First",
new double[][]{{1, 2, 3}, {3, 1, 2}, {1, 2, 1}, {4, 4, 4}, {3, 3, 3}, {4, 4, 4},});// NON-NLS
// dataset.addSeries("Second", new double[][]{{1, 2, 3}, {3, 0, 1}, {1, 2,
// 3}, {3, 0, 1}, {1, 2, 3}, {3, 0, 1}, });//NON-NLS
return dataset;
}
private CategoryDataset createDataset()
{
final String series1 = "First";// NON-NLS
final String series2 = "Second";// NON-NLS
final String series3 = "Third";// NON-NLS
final String category1 = "Category 1";// NON-NLS
final String category2 = "Category 2";// NON-NLS
final String category3 = "Category 3";// NON-NLS
final String category4 = "Category 4";// NON-NLS
final String category5 = "Category 5";// NON-NLS
final DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(1D, series1, category1);
dataset.addValue(5D, series1, category2);
dataset.addValue(4D, series1, category3);
dataset.addValue(8D, series1, category4);
dataset.addValue(7D, series1, category5);
dataset.addValue(3D, series2, category1);
dataset.addValue(4D, series2, category2);
dataset.addValue(3D, series2, category3);
dataset.addValue(5D, series2, category4);
dataset.addValue(4D, series2, category5);
dataset.addValue(1D, series3, category1);
dataset.addValue(3D, series3, category2);
dataset.addValue(2D, series3, category3);
dataset.addValue(3D, series3, category4);
dataset.addValue(2D, series3, category5);
return dataset;
}
public Object getValue(final ExpressionRuntime runtime, final Element element)
{
if (runtime == null)
{
throw new NullPointerException("Runtime must never be null.");
}
if (element == null)
{
throw new NullPointerException("Element must never be null.");
}
final Object value = ElementTypeUtils.queryStaticValue(element);
if (value != null)
{
final Object filteredValue = filter(runtime, element, value);
if (filteredValue != null)
{
return filteredValue;
}
}
final Object nullValue = element.getAttribute(AttributeNames.Core.NAMESPACE, AttributeNames.Core.NULL_VALUE);
return filter(runtime, element, nullValue);
}
public void configureDesignTimeDefaults(final Element element, final Locale locale)
{
final AbstractChartExpression theExpression = new BarChartExpression();
element.setAttributeExpression(AttributeNames.Core.NAMESPACE, AttributeNames.Core.VALUE, theExpression);
element.getStyle().setStyleProperty(ElementStyleKeys.MIN_WIDTH, new Float(280));
element.getStyle().setStyleProperty(ElementStyleKeys.MIN_HEIGHT, new Float(190));
}
private JFreeChart createChart(final Expression aExpression)
{
if (aExpression instanceof BarLineChartExpression)
{
final CategoryAxis catAxis = new CategoryAxis("Category");// NON-NLS
final NumberAxis barsAxis = new NumberAxis("Value");// NON-NLS
final NumberAxis linesAxis = new NumberAxis("Value2");// NON-NLS
final CategoryPlot plot = new CategoryPlot(createDataset(), catAxis, barsAxis, new BarRenderer());
plot.setRenderer(1, new LineAndShapeRenderer());
// add lines dataset and axis to plot
plot.setDataset(1, createDataset());
plot.setRangeAxis(1, linesAxis);
// map lines to second axis
plot.mapDatasetToRangeAxis(1, 1);
// set rendering order
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
// set location of second axis
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
return new JFreeChart("Bar Line Chart", plot);
}
if (aExpression instanceof RingChartExpression)
{
return ChartFactory.createRingChart("Ring Chart", createPieDataset(), true, false, false);// NON-NLS
}
if (aExpression instanceof AreaChartExpression)
{
return ChartFactory.createAreaChart("Area Chart", "Category", "Value", createDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof BarChartExpression)
{
return ChartFactory.createBarChart("Bar Chart", "Category", "Value", createDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof LineChartExpression)
{
return ChartFactory.createLineChart("Line Chart", "Category", "Value", createDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof MultiPieChartExpression)
{
return ChartFactory.createMultiplePieChart("Multi Pie Chart", createDataset(), TableOrder.BY_COLUMN, true, false,
false);// NON-NLS
}
if (aExpression instanceof PieChartExpression)
{
return ChartFactory.createPieChart("Pie Chart", createPieDataset(), true, false, false);// NON-NLS
}
if (aExpression instanceof WaterfallChartExpressions)
{
return ChartFactory.createWaterfallChart("Bar Chart", "Category", "Value", createDataset(),
PlotOrientation.HORIZONTAL, true, false, false);// NON-NLS
}
if (aExpression instanceof BubbleChartExpression)
{
return ChartFactory.createBubbleChart("Bubble Chart", "X", "Y", createXYZDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof ExtendedXYLineChartExpression)
{
return ChartFactory.createXYLineChart("XY Line Chart", "X", "Y", createXYZDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof ScatterPlotChartExpression)
{
return ChartFactory.createScatterPlot("Scatter Chart", "X", "Y", createXYZDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof XYAreaLineChartExpression)
{
final NumberAxis catAxis = new NumberAxis("Range");// NON-NLS
final NumberAxis barsAxis = new NumberAxis("Value");// NON-NLS
final NumberAxis linesAxis = new NumberAxis("Value2");// NON-NLS
final XYPlot plot = new XYPlot(createXYZDataset(), catAxis, barsAxis, new XYAreaRenderer());
plot.setRenderer(1, new XYLineAndShapeRenderer());
// add lines dataset and axis to plot
plot.setDataset(1, createXYZDataset());
plot.setRangeAxis(1, linesAxis);
// map lines to second axis
plot.mapDatasetToRangeAxis(1, 1);
// set rendering order
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
// set location of second axis
plot.setRangeAxisLocation(1, AxisLocation.BOTTOM_OR_RIGHT);
return new JFreeChart("XY Area Line Chart", plot);// NON-NLS
}
if (aExpression instanceof XYAreaChartExpression)
{
return ChartFactory.createXYAreaChart("XY Area Chart", "X", "Y", createXYZDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof XYBarChartExpression)
{
return XYBarChartExpression.createXYBarChart("XY Bar Chart", "X", false, "Y", createIntervalXYDataset(),
PlotOrientation.VERTICAL, true, false, false);// NON-NLS
}
if (aExpression instanceof XYLineChartExpression)
{
return ChartFactory.createXYLineChart("XY Line Chart", "X", "Y", createXYZDataset(), PlotOrientation.VERTICAL,
true, false, false);// NON-NLS
}
if (aExpression instanceof RadarChartExpression)
{
final SpiderWebPlot plot = new SpiderWebPlot(createDataset());
return new JFreeChart("Radar Chart", JFreeChart.DEFAULT_TITLE_FONT, plot, true);
}
return null;
}
}