ingo@2233: package de.intevation.flys.exports;
ingo@2233:
ingo@2238: import java.awt.Color;
ingo@2238:
ingo@2238: import java.util.ArrayList;
ingo@2238: import java.util.HashMap;
ingo@2238: import java.util.List;
ingo@2238: import java.util.Map;
ingo@2233:
ingo@2233: import org.apache.log4j.Logger;
ingo@2233:
ingo@2238: import org.jfree.chart.ChartFactory;
ingo@2233: import org.jfree.chart.JFreeChart;
ingo@2233: import org.jfree.chart.axis.NumberAxis;
ingo@2238: import org.jfree.chart.plot.XYPlot;
ingo@2238:
ingo@2238: import org.jfree.data.Range;
ingo@2238: import org.jfree.data.time.TimeSeriesCollection;
ingo@2238: import org.jfree.data.xy.XYDataset;
ingo@2233:
ingo@2233:
ingo@2233: /**
ingo@2233: * @author Ingo Weinzierl
ingo@2233: */
ingo@2233: public abstract class TimeseriesChartGenerator extends ChartGenerator {
ingo@2233:
ingo@2238:
ingo@2238: /**
ingo@2238: * Inner class TimeseriesAxisDataset stores TimeSeriesCollection.
ingo@2238: */
ingo@2238: public class TimeseriesAxisDataset implements AxisDataset {
ingo@2238:
ingo@2238: protected int axisSymbol;
ingo@2238:
ingo@2238: protected List datasets;
ingo@2238:
ingo@2238: protected Range range;
ingo@2238:
ingo@2238: protected int plotAxisIndex;
ingo@2238:
ingo@2238:
ingo@2238: public TimeseriesAxisDataset(int axisSymbol) {
ingo@2238: this.axisSymbol = axisSymbol;
ingo@2238: this.datasets = new ArrayList();
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: @Override
ingo@2238: public void addDataset(XYDataset dataset) {
ingo@2238: if (!(dataset instanceof TimeSeriesCollection)) {
ingo@2238: logger.warn("Skip non TimeSeriesCollection dataset.");
ingo@2238: return;
ingo@2238: }
ingo@2238:
ingo@2238: TimeSeriesCollection tsc = (TimeSeriesCollection) dataset;
ingo@2238:
ingo@2238: datasets.add(tsc);
ingo@2238: mergeRanges(tsc);
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: @Override
ingo@2238: public boolean isEmpty() {
ingo@2238: return datasets.isEmpty();
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: protected void mergeRanges(TimeSeriesCollection dataset) {
ingo@2238: logger.debug("Range after merging: " + range);
ingo@2238:
ingo@2238: Range[] xyRanges = ChartHelper.getRanges(dataset);
ingo@2238: range = Range.combine(range, xyRanges[1]);
ingo@2238:
ingo@2238: logger.debug("Range after merging: " + range);
ingo@2238: }
ingo@2238:
ingo@2238: } // end of TimeseriesAxisDataset class
ingo@2238:
ingo@2238:
ingo@2238:
ingo@2233: private static final Logger logger =
ingo@2233: Logger.getLogger(TimeseriesChartGenerator.class);
ingo@2233:
ingo@2233:
ingo@2238: protected Map xRanges;
ingo@2238:
ingo@2238:
ingo@2238:
ingo@2238: /**
ingo@2238: * The default constructor that initializes internal datastructures.
ingo@2238: */
ingo@2238: public TimeseriesChartGenerator() {
ingo@2238: super();
ingo@2238:
ingo@2238: xRanges = new HashMap();
ingo@2238: }
ingo@2238:
ingo@2233:
ingo@2233:
ingo@2233: @Override
ingo@2234: public JFreeChart generateChart() {
ingo@2233: logger.info("Generate Timeseries Chart.");
ingo@2233:
ingo@2238: JFreeChart chart = ChartFactory.createTimeSeriesChart(
ingo@2238: getChartTitle(),
ingo@2238: getXAxisLabel(),
ingo@2238: getYAxisLabel(0),
ingo@2238: null,
ingo@2238: true,
ingo@2238: false,
ingo@2238: false);
ingo@2238:
ingo@2233: logger.warn("TODO: IMPLEMENT ME!");
ingo@2234:
ingo@2238: XYPlot plot = (XYPlot) chart.getPlot();
ingo@2238:
ingo@2238: chart.setBackgroundPaint(Color.WHITE);
ingo@2238: plot.setBackgroundPaint(Color.WHITE);
ingo@2238:
ingo@2238: addSubtitles(chart);
ingo@2238: addDatasets(plot);
ingo@2238:
ingo@2238: return chart;
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: /**
ingo@2238: * This method creates new instances of TimeseriesAxisDataset.
ingo@2238: *
ingo@2238: * @param idx The symbol for the new TimeseriesAxisDataset.
ingo@2238: */
ingo@2238: @Override
ingo@2238: protected AxisDataset createAxisDataset(int idx) {
ingo@2238: logger.debug("Create a new AxisDataset for index: " + idx);
ingo@2238: return new TimeseriesAxisDataset(idx);
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: /**
ingo@2238: * Effect: extend range of x axis to include given limits.
ingo@2238: * @param range the given ("minimal") range.
ingo@2238: * @param index index of axis to be merged.
ingo@2238: */
ingo@2238: @Override
ingo@2238: protected void combineXRanges(Range range, int index) {
ingo@2238: if (range != null) {
ingo@2238: Range old = xRanges.get(index);
ingo@2238:
ingo@2238: if (old != null) {
ingo@2238: range = Range.combine(old, range);
ingo@2238: }
ingo@2238:
ingo@2238: xRanges.put(index, range);
ingo@2238: }
ingo@2238: }
ingo@2238:
ingo@2238:
ingo@2238: protected void addDatasets(XYPlot plot) {
ingo@2238: logger.warn("TODO: IMPLEMENT ME!");
ingo@2233: }
ingo@2233: }
ingo@2233: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :