aheinecke@7034: /* Copyright (C) 2013 by Bundesanstalt für Gewässerkunde aheinecke@7034: * Software engineering by Intevation GmbH aheinecke@7034: * aheinecke@7034: * XYDatasethis file is Free Software under the GNU AGPL (>=v3) aheinecke@7034: * and comes with ABSOLUXYDatasetELY NO WARRANTY! Check out the aheinecke@7034: * documentation coming with Dive4Elements River for details. aheinecke@7034: */ aheinecke@7034: aheinecke@7034: package org.dive4elements.river.jfree; aheinecke@7034: aheinecke@7034: import java.util.List; aheinecke@7034: import java.util.ArrayList; aheinecke@7034: aheinecke@7034: import org.jfree.data.Range; aheinecke@7034: import org.jfree.data.RangeInfo; aheinecke@7034: import org.jfree.data.xy.XYDataset; aheinecke@7034: import org.jfree.data.xy.XYSeries; aheinecke@7034: import org.jfree.data.xy.XYSeriesCollection; aheinecke@7034: import org.jfree.data.time.TimeSeriesCollection; aheinecke@7034: aheinecke@7034: import org.apache.log4j.Logger; aheinecke@7034: aheinecke@7034: /** aheinecke@7034: * Axis datasets. aheinecke@7034: */ aheinecke@7034: public class AxisDataset aheinecke@7034: { teichmann@8202: private static Logger log = Logger.getLogger(AxisDataset.class); aheinecke@7034: aheinecke@7034: /** Symbolic integer, but also coding the priority (0 goes first). */ aheinecke@7034: protected int axisSymbol; aheinecke@7034: aheinecke@7034: /** List of assigned datasets (in order). */ aheinecke@7034: protected List datasets; aheinecke@7034: aheinecke@7034: /** Range to use to include all given datasets. */ aheinecke@7034: protected Range range; aheinecke@7034: aheinecke@7034: /** Index of axis in plot. */ aheinecke@7034: protected int plotAxisIndex; aheinecke@7034: aheinecke@7034: protected boolean rangeDirty; aheinecke@7034: aheinecke@7034: /** Create AxisDataset. */ aheinecke@7034: public AxisDataset(int symb) { aheinecke@7034: axisSymbol = symb; aheinecke@7034: datasets = new ArrayList(); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Add a dataset to internal list for this axis. */ aheinecke@7034: public void addDataset(XYDataset dataset) { aheinecke@7034: datasets.add(dataset); aheinecke@7034: rangeDirty = true; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Add a dataset. */ aheinecke@7034: public void addDataset(XYSeries series) { aheinecke@7034: addDataset(new XYSeriesCollection(series)); aheinecke@7034: } aheinecke@7034: aheinecke@7034: public void setRange(Range val) { aheinecke@7034: range = val; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Get Range for the range axis of this dataset. */ aheinecke@7034: public Range getRange() { aheinecke@7034: if (range != null && !rangeDirty) { aheinecke@7034: return range; aheinecke@7034: } aheinecke@7034: /* Calculate the min / max of all series */ aheinecke@7034: for (XYDataset dataset: datasets) { aheinecke@7034: Range newRange = null; aheinecke@7034: if (dataset instanceof StyledAreaSeriesCollection) { aheinecke@7034: /* We do not include areas in the range calculation because aheinecke@7034: * they are used with very large / small values to draw areas aheinecke@7034: * with axis boundaries */ aheinecke@7034: continue; aheinecke@7034: } else if (dataset instanceof RangeInfo) { aheinecke@7034: /* The usual case for most series */ aheinecke@7034: newRange = ((RangeInfo) dataset).getRangeBounds(false); aheinecke@7034: } else if (dataset instanceof TimeSeriesCollection) { aheinecke@7034: /* Lalala <3 Jfreechart's class hirarchy */ tom@8856: newRange = ((TimeSeriesCollection)dataset) tom@8856: .getRangeBounds(false); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /* Now we only expand as we also only add new data */ aheinecke@7034: if (range == null) { aheinecke@7034: range = newRange; aheinecke@7034: } else { aheinecke@7038: range = Range.combine(range, newRange); aheinecke@7034: } aheinecke@7034: } aheinecke@7034: rangeDirty = false; aheinecke@7034: return range; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Get Array of Datasets. */ aheinecke@7034: public XYDataset[] getDatasets() { aheinecke@7034: return datasets.toArray(new XYDataset[datasets.size()]); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** True if to be rendered as area. */ aheinecke@7034: public boolean isArea(XYDataset series) { aheinecke@7034: return (series instanceof StyledAreaSeriesCollection); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** True if no datasets given. */ aheinecke@7034: public boolean isEmpty() { aheinecke@7034: return datasets.isEmpty(); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Set the 'real' axis index that this axis is mapped to. */ aheinecke@7034: public void setPlotAxisIndex(int axisIndex) { aheinecke@7034: plotAxisIndex = axisIndex; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Get the 'real' axis index that this axis is mapped to. */ aheinecke@7034: public int getPlotAxisIndex() { aheinecke@7034: return plotAxisIndex; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Add a Dataset that describes an area. */ aheinecke@7034: public void addArea(StyledAreaSeriesCollection series) { aheinecke@7034: addDataset(series); aheinecke@7034: } aheinecke@7034: aheinecke@7034: }