# HG changeset patch # User Ingo Weinzierl # Date 1331807403 0 # Node ID bece6f604899b96205718026677fcb9eb5088250 # Parent 8cd6358eb7f8c7627a0a0d4fa1bf66f35c6a98c1 Removed references to Range and replaced those with references to Bounds in ChartGenerators. flys-artifacts/trunk@4143 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/ChangeLog Thu Mar 15 10:30:03 2012 +0000 @@ -1,3 +1,27 @@ +2012-03-15 Ingo Weinzierl + + * src/main/java/de/intevation/flys/exports/ChartHelper.java: Added a new + method that returns the Bounds for a given XYDataset. Based on the + concrete type of the XYDataset, the call is dispatched to a more specific + method. + + * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: + Removed the whole "range" stuff and some methods that are implemented in + upper classes. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Removed the + setXRange() and setYRange() methods. In our own code, we will use Bounds + instead of JFreeChart's Range instances to save range/bounds information. + This is necessary to save information which is not not from type double + (which is the case in Timeseries charts). + + * src/main/java/de/intevation/flys/exports/XYChartGenerator.java: Replaced + usage of Range with Bounds in the whole class. + + * src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java, + src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java: + Adapted the method signature of zoom() and zoomX(). + 2012-03-14 Ingo Weinzierl * src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java: diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Thu Mar 15 10:30:03 2012 +0000 @@ -53,6 +53,7 @@ import de.intevation.flys.artifacts.FLYSArtifact; import de.intevation.flys.artifacts.resources.Resources; import de.intevation.flys.jfree.Bounds; +import de.intevation.flys.jfree.DoubleBounds; import de.intevation.flys.jfree.EnhancedLineAndShapeRenderer; import de.intevation.flys.jfree.StableXYDifferenceRenderer; import de.intevation.flys.jfree.StyledAreaSeriesCollection; @@ -178,25 +179,6 @@ protected abstract Series getSeriesOf(XYDataset dataset, int idx); - - /** - * This method is used to set the range of the X axis at index axis. - * - * @param axis The index of an X axis. - * @param range The new range for the X axis at index axis. - */ - protected abstract void setXRange(int axis, Range range); - - - /** - * This method is used to set the range of the Y axis at index axis. - * - * @param axis The index of an Y axis. - * @param range The new range for the Y axis at index axis. - */ - protected abstract void setYRange(int axis, Range range); - - /** * Returns the default title of a chart. * @@ -240,7 +222,17 @@ * @param idx The index of the X axis that should be comined with * range. */ - protected abstract void combineXRanges(Range range, int idx); + protected abstract void combineXBounds(Bounds bounds, int idx); + + + /** + * Combines the ranges of the Y axis at index idx. + * + * @param range A new range. + * @param idx The index of the Y axis that should be comined with + * range. + */ + protected abstract void combineYBounds(Bounds bounds, int index); /** @@ -861,9 +853,9 @@ AxisDataset axisDataset = getAxisDataset(idx); - Range[] xyRanges = ChartHelper.getRanges(dataset); + Bounds[] xyBounds = ChartHelper.getBounds(dataset); - if (xyRanges == null) { + if (xyBounds == null) { logger.warn("Skip XYDataset for Axis (invalid ranges): " + idx); return; } @@ -871,21 +863,15 @@ if (visible) { if (logger.isDebugEnabled()) { logger.debug("Add new AxisDataset at index: " + idx); - logger.debug("X extent: " + xyRanges[0]); - logger.debug("Y extent: " + xyRanges[1]); + logger.debug("X extent: " + xyBounds[0]); + logger.debug("Y extent: " + xyBounds[1]); } axisDataset.addDataset(dataset); - combineXRanges(xyRanges[0], 0); } - else { - combineXRanges(xyRanges[0], 0); - // TODO - // Expand y range provided by 'timeseries' to have a proper range - // set which includes all data. - // iw: I am not sure if we still need this - } + combineXBounds(xyBounds[0], 0); + combineYBounds(xyBounds[1], idx); } @@ -1129,7 +1115,7 @@ Range.expandToInclude(axisDataset.getRange(), 0d)); } - setYRange(axisIndex, expandPointRange(axisDataset.getRange())); + setYBounds(axisIndex, expandPointRange(axisDataset.getRange())); // Add contained datasets, mapping to axis. for (XYDataset dataset: axisDataset.getDatasets()) { @@ -1280,11 +1266,19 @@ * * @param Range to be expanded if upper == lower bound. */ - private Range expandPointRange(Range range) { - if (range != null && range.getLowerBound() == range.getUpperBound()) { - return ChartHelper.expandRange(range, 5); + private Bounds expandPointRange(Range range) { + if (range == null) { + return null; } - return range; + else if (range.getLowerBound() == range.getUpperBound()) { + double hi = range.getUpperBound(); + double lo = range.getLowerBound(); + double add = (hi - lo) / 100 * 5; + + return new DoubleBounds(lo-add, hi+add); + } + + return new DoubleBounds(range.getLowerBound(), range.getUpperBound()); } diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/ChartHelper.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartHelper.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartHelper.java Thu Mar 15 10:30:03 2012 +0000 @@ -2,6 +2,7 @@ import org.jfree.data.Range; import org.jfree.data.xy.XYDataset; +import org.jfree.data.xy.XYSeriesCollection; import org.jfree.data.time.RegularTimePeriod; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.time.TimeSeries; @@ -29,7 +30,7 @@ * * @return an array with x and y ranges. */ - public static Range[] getRanges(XYDataset dataset) { + public static Bounds[] getBounds(XYSeriesCollection dataset) { int seriesCount = dataset != null ? dataset.getSeriesCount() : 0; if (seriesCount == 0) { @@ -75,11 +76,27 @@ } return foundValue - ? new Range[] { new Range(minX, maxX), new Range(minY, maxY) } + ? new Bounds[] { + new DoubleBounds(minX, maxX), + new DoubleBounds(minY, maxY) } : null; } + public static Bounds[] getBounds(XYDataset dataset) { + if (dataset instanceof XYSeriesCollection) { + return getBounds((XYSeriesCollection) dataset); + } + else if(dataset instanceof TimeSeriesCollection) { + return getBounds((TimeSeriesCollection) dataset); + } + else { + logger.warn("Unknown XYDataset instance: " + dataset.getClass()); + return null; + } + } + + public static Bounds[] getBounds(TimeSeriesCollection collection) { int seriesCount = collection != null ? collection.getSeriesCount() : 0; diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/DischargeCurveGenerator.java Thu Mar 15 10:30:03 2012 +0000 @@ -24,6 +24,7 @@ import de.intevation.flys.artifacts.model.WQKms; import de.intevation.flys.utils.FLYSUtils; +import de.intevation.flys.jfree.Bounds; import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StyledXYSeries; @@ -115,8 +116,8 @@ /* TODO is this one really needed? */ @Override - protected boolean zoomX(XYPlot plot, ValueAxis axis, Range range, Range x) { - boolean zoomin = super.zoom(plot, axis, range, x); + protected boolean zoomX(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { + boolean zoomin = super.zoom(plot, axis, bounds, x); if (!zoomin) { axis.setLowerBound(0d); diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/DurationCurveGenerator.java Thu Mar 15 10:30:03 2012 +0000 @@ -20,6 +20,7 @@ import de.intevation.flys.artifacts.model.WQDay; import de.intevation.flys.artifacts.resources.Resources; +import de.intevation.flys.jfree.Bounds; import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StyledXYSeries; @@ -148,8 +149,8 @@ @Override - protected boolean zoomX(XYPlot plot, ValueAxis axis, Range range, Range x) { - boolean zoomin = super.zoom(plot, axis, range, x); + protected boolean zoomX(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { + boolean zoomin = super.zoom(plot, axis, bounds, x); if (!zoomin) { axis.setLowerBound(0d); @@ -167,8 +168,8 @@ * values on its own. */ @Override - protected boolean zoomY(XYPlot plot, ValueAxis axis, Range range, Range x) { - boolean zoomin = super.zoom(plot, axis, range, x); + protected boolean zoomY(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { + boolean zoomin = super.zoom(plot, axis, bounds, x); if (!zoomin && axis instanceof IdentifiableNumberAxis) { String id = ((IdentifiableNumberAxis) axis).getId(); diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/TimeseriesChartGenerator.java Thu Mar 15 10:30:03 2012 +0000 @@ -130,9 +130,9 @@ public static final int AXIS_SPACE = 5; - protected Map xRanges; + protected Map xBounds; - protected Map yRanges; + protected Map yBounds; @@ -142,8 +142,8 @@ public TimeseriesChartGenerator() { super(); - xRanges = new HashMap(); - yRanges = new HashMap(); + xBounds = new HashMap(); + yBounds = new HashMap(); } @@ -183,34 +183,6 @@ } - // TODO DECLARE IN UPPER CLASS AND ADD OVERRIDE ANNOTATION - protected Bounds getXRange(int axis) { - return xRanges.get(Integer.valueOf(axis)); - } - - - @Override - // TODO setXRange should always await a Bounds instance! - // TODO SHOULD BE REMOVED WHEN DEFINED IN UPPER CLASS - protected void setXRange(int axis, Range range) { - // do nothing here, we will use setXRange(int, Bounds) now - } - - - @Override - // TODO setYRange should always await a Bounds instance! - protected void setYRange(int axis, Range range) { - if (range == null) { - logger.warn("Range is null!"); - return; - } - - setYBounds(Integer.valueOf(axis), new DoubleBounds( - range.getLowerBound(), - range.getUpperBound())); - } - - /** * This method creates new instances of TimeseriesAxisDataset. * @@ -223,52 +195,10 @@ } - // TODO THIS SHOULD BE DONE IN AN UPPER CLASS! @Override - public void addAxisDataset(XYDataset dataset, int idx, boolean visible) { - if (dataset == null || idx < 0) { - return; - } - - AxisDataset axisDataset = getAxisDataset(idx); - - Bounds[] bounds = ChartHelper.getBounds((TimeSeriesCollection)dataset); - - if (bounds == null) { - logger.warn("Skip XYDataset for Axis (invalid ranges): " + idx); - return; - } - - if (visible) { - if (logger.isDebugEnabled()) { - logger.debug("Add new AxisDataset at index: " + idx); - logger.debug("X extent: " + bounds[0]); - logger.debug("Y extent: " + bounds[1]); - } - - axisDataset.addDataset(dataset); - } - - combineXRanges(bounds[0], 0); - combineYRanges(bounds[1], idx); - } - - - /** - * Effect: extend range of x axis to include given limits. - * @param range the given ("minimal") range. - * @param index index of axis to be merged. - */ - @Override - protected void combineXRanges(Range range, int index) { - throw new RuntimeException( - "TimeseriesChartGenerator.combineXRanges is not implemented!"); - } - - - protected void combineXRanges(Bounds bounds, int index) { + protected void combineXBounds(Bounds bounds, int index) { if (bounds != null) { - Bounds old = getXRange(index); + Bounds old = getXBounds(index); if (old != null) { bounds = bounds.combine(old); @@ -279,7 +209,8 @@ } - protected void combineYRanges(Bounds bounds, int index) { + @Override + protected void combineYBounds(Bounds bounds, int index) { if (bounds != null) { Bounds old = getYBounds(index); @@ -311,25 +242,27 @@ @Override public Bounds getXBounds(int axis) { - return xRanges.get(axis); + return xBounds.get(axis); } @Override protected void setXBounds(int axis, Bounds bounds) { - xRanges.put(axis, bounds); + xBounds.put(axis, bounds); } @Override public Bounds getYBounds(int axis) { - return yRanges.get(axis); + return yBounds.get(axis); } @Override protected void setYBounds(int axis, Bounds bounds) { - yRanges.put(axis, bounds); + if (bounds != null) { + yBounds.put(axis, bounds); + } } @@ -415,7 +348,7 @@ protected void adaptZoom(XYPlot plot) { logger.debug("Adapt zoom of Timeseries chart."); - zoomX(plot, plot.getDomainAxis(), getXRange(0), getDomainAxisRange()); + zoomX(plot, plot.getDomainAxis(), getXBounds(0), getDomainAxisRange()); Bounds valueAxisBounds = getValueAxisRange(); diff -r 8cd6358eb7f8 -r bece6f604899 flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Wed Mar 14 15:12:45 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Thu Mar 15 10:30:03 2012 +0000 @@ -42,6 +42,7 @@ import de.intevation.artifactdatabase.state.Facet; import de.intevation.flys.jfree.Bounds; +import de.intevation.flys.jfree.DoubleBounds; import de.intevation.flys.jfree.FLYSAnnotation; import de.intevation.flys.jfree.StickyAxisAnnotation; import de.intevation.flys.jfree.CollisionFreeXYTextAnnotation; @@ -173,6 +174,8 @@ protected abstract YAxisWalker getYAxisWalker(); + public static final int AXIS_SPACE = 5; + /** The logger that is used in this generator. */ private static Logger logger = Logger.getLogger(XYChartGenerator.class); @@ -180,17 +183,17 @@ protected List annotations; /** The max X range to include all X values of all series for each axis. */ - protected Map xRanges; + protected Map xBounds; /** The max Y range to include all Y values of all series for each axis. */ - protected Map yRanges; + protected Map yBounds; public XYChartGenerator() { super(); - xRanges = new HashMap(); - yRanges = new HashMap(); + xBounds = new HashMap(); + yBounds = new HashMap(); } @@ -247,18 +250,6 @@ @Override - protected void setXRange(int axis, Range range) { - xRanges.put(Integer.valueOf(axis), range); - } - - - @Override - protected void setYRange(int axis, Range range) { - yRanges.put(Integer.valueOf(axis), range); - } - - - @Override protected AxisDataset createAxisDataset(int idx) { logger.debug("Create new XYAxisDataset for index: " + idx); return new XYAxisDataset(idx); @@ -358,24 +349,57 @@ /** * Effect: extend range of x axis to include given limits. + * * @param range the given ("minimal") range. * @param index index of axis to be merged. */ - protected void combineXRanges(Range range, int index) { - - if (range == null - || Double.isNaN(range.getLowerBound()) - || Double.isNaN(range.getUpperBound())) { + @Override + protected void combineXBounds(Bounds bounds, int index) { + if (!(bounds instanceof DoubleBounds)) { + logger.warn("Unsupported Bounds type: " + bounds.getClass()); return; } - Range old = xRanges.get(index); + DoubleBounds dBounds = (DoubleBounds) bounds; + + if (dBounds == null + || Double.isNaN((Double) dBounds.getLower()) + || Double.isNaN((Double) dBounds.getUpper())) { + return; + } + + Bounds old = getXBounds(index); if (old != null) { - range = Range.combine(old, range); + dBounds = (DoubleBounds) dBounds.combine(old); } - xRanges.put(index, range); + setXBounds(index, dBounds); + } + + + @Override + protected void combineYBounds(Bounds bounds, int index) { + if (!(bounds instanceof DoubleBounds)) { + logger.warn("Unsupported Bounds type: " + bounds.getClass()); + return; + } + + DoubleBounds dBounds = (DoubleBounds) bounds; + + if (dBounds == null + || Double.isNaN((Double) dBounds.getLower()) + || Double.isNaN((Double) dBounds.getUpper())) { + return; + } + + Bounds old = getYBounds(index); + + if (old != null) { + dBounds = (DoubleBounds) dBounds.combine(old); + } + + setYBounds(index, dBounds); } @@ -412,11 +436,16 @@ private void preparePointRanges(XYPlot plot) { for (int i = 0, num = plot.getDomainAxisCount(); i < num; i++) { logger.debug("Check whether to expand a x axis."); - Integer key = Integer.valueOf(i); - Range r = xRanges.get(key); - if (r != null && r.getLowerBound() == r.getUpperBound()) { - setXRange(key, ChartHelper.expandRange(r, 5)); + Integer key = Integer.valueOf(i); + Bounds b = getXBounds(key); + + if (b != null && b.getLower() == b.getUpper()) { + double lo = (Double) b.getLower(); + double hi = (Double) b.getUpper(); + double add = (hi - lo) / 100 * 5; + + setXBounds(key, new DoubleBounds(lo-add, hi+add)); } } } @@ -444,7 +473,7 @@ xAxis.setRange(fixedXRange); } else { - zoomX(plot, xAxis, xRanges.get(0), xrange); + zoomX(plot, xAxis, getXBounds(0), xrange); } for (int i = 0, num = plot.getRangeAxisCount(); i < num; i++) { @@ -466,7 +495,7 @@ } logger.debug("Prepare zoom settings for y axis at index: " + i); - zoomY(plot, yaxis, yRanges.get(Integer.valueOf(i)), yrange); + zoomY(plot, yaxis, getYBounds(Integer.valueOf(i)), yrange); } } @@ -537,13 +566,13 @@ } - protected boolean zoomX(XYPlot plot, ValueAxis axis, Range range, Range x) { - return zoom(plot, axis, range, x); + protected boolean zoomX(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { + return zoom(plot, axis, bounds, x); } - protected boolean zoomY(XYPlot plot, ValueAxis axis, Range range, Range x) { - return zoom(plot, axis, range, x); + protected boolean zoomY(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { + return zoom(plot, axis, bounds, x); } @@ -557,29 +586,37 @@ * * @return true, if a zoom range was specified, otherwise false. */ - protected boolean zoom(XYPlot plot, ValueAxis axis, Range range, Range x) { + protected boolean zoom(XYPlot plot, ValueAxis axis, Bounds bounds, Range x) { - if (range == null) { + if (bounds == null) { return false; } if (x != null) { - double min = range.getLowerBound(); - double max = range.getUpperBound(); + double min = bounds.getLower().doubleValue(); + double max = bounds.getUpper().doubleValue(); + + if (logger.isDebugEnabled()) { + logger.debug("Minimum is: " + min); + logger.debug("Maximum is: " + max); + logger.debug("Lower zoom is: " + x.getLowerBound()); + logger.debug("Upper zoom is: " + x.getUpperBound()); + } + double diff = max > min ? max - min : min - max; - Range computed = new Range( + DoubleBounds computed = new DoubleBounds( min + x.getLowerBound() * diff, min + x.getUpperBound() * diff); - axis.setRangeWithMargins(computed); + computed.applyBounds(axis, AXIS_SPACE); logger.debug("Zoom axis to: " + computed); return true; } - axis.setRangeWithMargins(range); + bounds.applyBounds(axis, AXIS_SPACE); return false; } @@ -596,52 +633,48 @@ public Range[] getRangesForAxis(int index) { logger.debug("getRangesForAxis " + index); - Range rx = xRanges.get(Integer.valueOf(0)); - Range ry = yRanges.get(Integer.valueOf(index)); + Bounds rx = getXBounds(Integer.valueOf(0)); + Bounds ry = getYBounds(Integer.valueOf(index)); if (rx == null) { logger.warn("Range for x axis not set." + " Using default values: 0 - 1."); - rx = new Range(0, 1); + rx = new DoubleBounds(0, 1); } if (ry == null) { logger.warn("Range for y" + index + " axis not set. Using default values: 0 - 1."); - ry = new Range(0, 1); + ry = new DoubleBounds(0, 1); } - return new Range[] {rx, ry}; + + return new Range[] { + new Range(rx.getLower().doubleValue(), rx.getUpper().doubleValue()), + new Range(ry.getLower().doubleValue(), ry.getUpper().doubleValue()) + }; } @Override public Bounds getXBounds(int axis) { - // TODO IMPLEMENT ME - throw new RuntimeException( - "XYChartGenerator.getXBounds(int) not implemented"); + return xBounds.get(axis); } @Override protected void setXBounds(int axis, Bounds bounds) { - // TODO IMPLEMENT ME - throw new RuntimeException( - "XYChartGenerator.setXBounds(int,Bounds) not implemented"); + xBounds.put(axis, bounds); } @Override public Bounds getYBounds(int axis) { - // TODO IMPLEMENT ME - throw new RuntimeException( - "XYChartGenerator.getYBounds(int) not implemented"); + return yBounds.get(axis); } @Override protected void setYBounds(int axis, Bounds bounds) { - // TODO IMPLEMENT ME - throw new RuntimeException( - "XYChartGenerator.setYBounds(int,Bounds) not implemented"); + yBounds.put(axis, bounds); }