aheinecke@7034: /* Copyright (C) 2013 by Bundesanstalt für Gewässerkunde aheinecke@7034: * Software engineering by Intevation GmbH aheinecke@7034: * tom@8858: * This file is Free Software under the GNU AGPL (>=v3) tom@8858: * and comes with ABSOLUTELY 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: gernotbelger@9496: import java.util.ArrayList; aheinecke@7034: import java.util.List; aheinecke@7034: aheinecke@7034: import org.jfree.data.Range; aheinecke@7034: import org.jfree.data.RangeInfo; gernotbelger@9496: import org.jfree.data.time.TimeSeriesCollection; aheinecke@7034: import org.jfree.data.xy.XYDataset; aheinecke@7034: aheinecke@7034: /** aheinecke@7034: * Axis datasets. aheinecke@7034: */ gernotbelger@9496: public class AxisDataset { aheinecke@7034: aheinecke@7034: /** List of assigned datasets (in order). */ gernotbelger@9555: private final List datasets = new ArrayList<>(); aheinecke@7034: aheinecke@7034: /** Range to use to include all given datasets. */ gernotbelger@9555: private Range range; aheinecke@7034: gernotbelger@9555: private boolean rangeDirty; aheinecke@7034: aheinecke@7034: /** Add a dataset to internal list for this axis. */ gernotbelger@9496: public void addDataset(final XYDataset dataset) { gernotbelger@9496: this.datasets.add(dataset); gernotbelger@9496: this.rangeDirty = true; aheinecke@7034: } aheinecke@7034: gernotbelger@9496: public void setRange(final Range val) { gernotbelger@9496: this.range = val; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Get Range for the range axis of this dataset. */ aheinecke@7034: public Range getRange() { gernotbelger@9496: if (this.range != null && !this.rangeDirty) { gernotbelger@9496: return this.range; aheinecke@7034: } aheinecke@7034: /* Calculate the min / max of all series */ gernotbelger@9496: for (final XYDataset dataset : this.datasets) { aheinecke@7034: Range newRange = null; aheinecke@7034: if (dataset instanceof StyledAreaSeriesCollection) { gernotbelger@8885: final StyledAreaSeriesCollection areaSeries = (StyledAreaSeriesCollection) dataset; gernotbelger@9496: if (areaSeries.shouldCalculateRange()) gernotbelger@8885: newRange = areaSeries.getRangeBounds(false); gernotbelger@8885: else { gernotbelger@9496: /* gernotbelger@9496: * For most area themes, we do not include areas in the range calculation because gernotbelger@8885: * they are used with very large / small values to draw areas gernotbelger@9496: * with axis boundaries gernotbelger@9496: */ gernotbelger@8885: continue; gernotbelger@8885: } 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 */ gernotbelger@9496: newRange = ((TimeSeriesCollection) dataset).getRangeBounds(false); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /* Now we only expand as we also only add new data */ gernotbelger@9496: if (this.range == null) { gernotbelger@9496: this.range = newRange; aheinecke@7034: } else { gernotbelger@9496: this.range = Range.combine(this.range, newRange); aheinecke@7034: } aheinecke@7034: } gernotbelger@9496: this.rangeDirty = false; gernotbelger@9496: return this.range; aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** Get Array of Datasets. */ aheinecke@7034: public XYDataset[] getDatasets() { gernotbelger@9496: return this.datasets.toArray(new XYDataset[this.datasets.size()]); aheinecke@7034: } aheinecke@7034: aheinecke@7034: /** True if no datasets given. */ aheinecke@7034: public boolean isEmpty() { gernotbelger@9496: return this.datasets.isEmpty(); aheinecke@7034: } gernotbelger@9496: }