ingo@1115: /* ingo@1115: * Copyright (c) 2010 by Intevation GmbH ingo@1115: * ingo@1115: * This program is free software under the LGPL (>=v2.1) ingo@1115: * Read the file LGPL.txt coming with the software for details ingo@1115: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1115: */ ingo@1115: ingo@617: package de.intevation.gnv.chart; ingo@617: ingo@617: import java.util.Locale; ingo@617: ingo@617: import org.apache.log4j.Logger; ingo@617: ingo@617: import org.jfree.chart.ChartFactory; ingo@617: import org.jfree.chart.ChartTheme; ingo@617: import org.jfree.chart.JFreeChart; ingo@617: ingo@1107: import org.jfree.chart.axis.NumberAxis; ingo@1107: import org.jfree.chart.axis.TickUnitSource; ingo@1107: ingo@617: import org.jfree.chart.plot.PlotOrientation; ingo@617: import org.jfree.chart.plot.XYPlot; ingo@617: sascha@623: import org.jfree.chart.renderer.xy.XYBarRenderer; ingo@617: ingo@617: /** ingo@767: * This abstract class defines some methods to adjust chart settings after its ingo@767: * creation. ingo@767: * ingo@767: * @author Ingo Weinzierl ingo@617: */ ingo@617: public abstract class AbstractHistogram ingo@617: implements Chart ingo@617: { ingo@767: /** ingo@767: * Logger used for logging with Apache log4j. ingo@767: */ ingo@617: private Logger logger = Logger.getLogger(AbstractHistogram.class); ingo@617: ingo@767: /** ingo@767: * JFreeChart chart stored at this place after chart creation. ingo@767: */ ingo@617: protected JFreeChart chart; ingo@767: ingo@767: /** ingo@767: * Labels used for chart title, subtitle, axis description. ingo@767: */ ingo@617: protected ChartLabels labels; ingo@767: ingo@767: /** ingo@767: * Theme which is used to adjust the styling of this chart. ingo@767: */ ingo@617: protected ChartTheme theme; ingo@767: ingo@767: /** ingo@767: * Raw data which should be displayed in the chart. ingo@767: */ ingo@617: protected Object[] data; ingo@617: ingo@767: /** ingo@767: * Locale object used for i18n support. ingo@767: */ ingo@617: protected Locale locale; ingo@617: ingo@617: ingo@767: /** ingo@767: * Constructor for creating histogram charts. ingo@767: * ingo@767: * @param labels See {@link #labels} ingo@767: * @param data See {@link #data} ingo@767: * @param theme See {@link #theme} ingo@767: */ ingo@617: public AbstractHistogram( ingo@617: ChartLabels labels, Object[] data, ChartTheme theme ingo@617: ) { ingo@617: this.labels = labels; ingo@617: this.data = data; ingo@617: this.theme = theme; ingo@617: } ingo@617: ingo@617: ingo@767: /** ingo@767: * @see de.intevation.gnv.chart.Chart#generateChart() ingo@767: */ ingo@617: public JFreeChart generateChart() { ingo@617: ingo@617: if (chart != null) ingo@617: return chart; ingo@617: ingo@617: chart = ChartFactory.createHistogram( ingo@617: labels.getTitle(), ingo@617: labels.getDomainAxisLabel(), ingo@617: labels.getRangeAxisLabel(), ingo@617: null, ingo@617: PlotOrientation.VERTICAL, ingo@617: true, ingo@617: false, ingo@617: false); ingo@617: ingo@617: applyDatasets(); ingo@617: ingo@617: theme.apply(chart); ingo@617: adjustPlot(); ingo@1107: adjustDomainAxis(chart); ingo@1107: adjustRangeAxis(chart); ingo@617: ingo@617: return chart; ingo@617: } ingo@617: ingo@617: ingo@767: /** ingo@767: * Method to do some changes in plot settings. ingo@767: */ ingo@617: protected void adjustPlot() { ingo@617: XYPlot plot = (XYPlot) chart.getPlot(); ingo@617: XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); ingo@617: ingo@617: renderer.setShadowVisible(false); ingo@617: renderer.setSeriesVisibleInLegend(0, false); ingo@617: } ingo@617: ingo@617: ingo@1107: protected void adjustDomainAxis(JFreeChart chart) { ingo@1107: XYPlot plot = (XYPlot) chart.getPlot(); ingo@1107: NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis(); ingo@1107: ingo@1107: TickUnitSource tus = domainAxis.createStandardTickUnits(locale); ingo@1107: domainAxis.setStandardTickUnits(tus); ingo@1107: } ingo@1107: ingo@1107: ingo@1107: protected void adjustRangeAxis(JFreeChart chart) { ingo@1107: XYPlot plot = (XYPlot) chart.getPlot(); ingo@1107: NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); ingo@1107: ingo@1107: TickUnitSource tus = rangeAxis.createStandardTickUnits(locale); ingo@1107: rangeAxis.setStandardTickUnits(tus); ingo@1107: } ingo@1107: ingo@1107: ingo@1107: ingo@1107: ingo@767: /** ingo@767: * This method needs to be implemented by subclasses and should add valid ingo@767: * HistogramDataset objects to the created chart. It is called ingo@767: * by {@link #generateChart} after chart creation. ingo@767: */ ingo@617: protected abstract void applyDatasets(); ingo@617: } ingo@617: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :