Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java @ 2005:79b15491177a
Added simple area registering functions.
flys-artifacts/trunk@3447 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Fri, 16 Dec 2011 14:42:10 +0000 |
parents | e71719483546 |
children | 4f7f781e4481 |
comparison
equal
deleted
inserted
replaced
2004:94c4dd5aaf20 | 2005:79b15491177a |
---|---|
36 import org.jfree.data.xy.XYDataset; | 36 import org.jfree.data.xy.XYDataset; |
37 | 37 |
38 import org.jfree.ui.RectangleInsets; | 38 import org.jfree.ui.RectangleInsets; |
39 | 39 |
40 import de.intevation.artifactdatabase.state.Facet; | 40 import de.intevation.artifactdatabase.state.Facet; |
41 import de.intevation.flys.jfree.StableXYDifferenceRenderer; | |
41 import de.intevation.artifactdatabase.state.Section; | 42 import de.intevation.artifactdatabase.state.Section; |
42 import de.intevation.artifactdatabase.state.Settings; | 43 import de.intevation.artifactdatabase.state.Settings; |
44 | |
43 | 45 |
44 import de.intevation.flys.exports.ChartExportHelper; | 46 import de.intevation.flys.exports.ChartExportHelper; |
45 import de.intevation.flys.jfree.FLYSAnnotation; | 47 import de.intevation.flys.jfree.FLYSAnnotation; |
46 import de.intevation.flys.jfree.StickyAxisAnnotation; | 48 import de.intevation.flys.jfree.StickyAxisAnnotation; |
47 | 49 |
69 protected int axisSymbol; | 71 protected int axisSymbol; |
70 /** List of assigned datasets (in order). */ | 72 /** List of assigned datasets (in order). */ |
71 protected List<XYDataset> datasets; | 73 protected List<XYDataset> datasets; |
72 /** Range to use to include all given datasets. */ | 74 /** Range to use to include all given datasets. */ |
73 protected Range range; | 75 protected Range range; |
76 /** List of datasets that are "area datasets" (these will be also | |
77 * present in the datasets list). */ | |
78 List<XYDataset> areaDatasets; | |
74 | 79 |
75 /** Create AxisDataset. */ | 80 /** Create AxisDataset. */ |
76 public AxisDataset(int symb) { | 81 public AxisDataset(int symb) { |
77 this.axisSymbol = symb; | 82 this.axisSymbol = symb; |
78 datasets = new ArrayList<XYDataset>(); | 83 datasets = new ArrayList<XYDataset>(); |
84 areaDatasets = new ArrayList<XYDataset>(); | |
79 } | 85 } |
80 | 86 |
81 /** Merge (or create given range with range so far (if any). */ | 87 /** Merge (or create given range with range so far (if any). */ |
82 private void mergeRanges(Range subRange) { | 88 private void mergeRanges(Range subRange) { |
83 // Avoid merging NaNs, as they take min/max place forever. | 89 // Avoid merging NaNs, as they take min/max place forever. |
97 public void addDataset(XYSeries dataset) { | 103 public void addDataset(XYSeries dataset) { |
98 this.datasets.add(new XYSeriesCollection(dataset)); | 104 this.datasets.add(new XYSeriesCollection(dataset)); |
99 includeYRange(dataset); | 105 includeYRange(dataset); |
100 } | 106 } |
101 | 107 |
108 /** Add an area dataset. */ | |
109 public void addAreaDataset(XYSeries series1, XYSeries series2) { | |
110 XYSeriesCollection collection = new XYSeriesCollection(); | |
111 collection.addSeries(series1); | |
112 collection.addSeries(series2); | |
113 this.datasets.add(collection); | |
114 this.areaDatasets.add(collection); | |
115 // TODO include Range ... | |
116 } | |
117 | |
118 /** True if to be renedered as area. */ | |
119 public boolean isArea(XYSeriesCollection series) { | |
120 return areaDatasets.contains(series); | |
121 } | |
122 | |
102 /** Adjust range to include given dataset. */ | 123 /** Adjust range to include given dataset. */ |
103 public void includeYRange(XYSeries dataset) { | 124 public void includeYRange(XYSeries dataset) { |
104 mergeRanges(new Range(dataset.getMinY(), dataset.getMaxY())); | 125 mergeRanges(new Range(dataset.getMinY(), dataset.getMaxY())); |
105 } | 126 } |
106 | 127 |
107 /** True if no datasets given. */ | 128 /** True if no datasets given. */ |
108 public boolean isEmpty() { | 129 public boolean isEmpty() { |
109 return this.datasets.isEmpty(); | 130 return this.datasets.isEmpty(); |
110 } | 131 } |
111 | 132 } // class AxisDataset |
112 } | |
113 | 133 |
114 | 134 |
115 /** | 135 /** |
116 * A mini interface that allows to walk over the YAXIS enums defined in | 136 * A mini interface that allows to walk over the YAXIS enums defined in |
117 * subclasses. | 137 * subclasses. |
360 */ | 380 */ |
361 public void debugAxis(XYPlot plot) { | 381 public void debugAxis(XYPlot plot) { |
362 logger.debug("..............."); | 382 logger.debug("..............."); |
363 for (int i = 0; i < plot.getRangeAxisCount(); i++) { | 383 for (int i = 0; i < plot.getRangeAxisCount(); i++) { |
364 if (plot.getRangeAxis(i) == null) | 384 if (plot.getRangeAxis(i) == null) |
365 logger.debug("Axis #" + i + " == null"); | 385 logger.debug("Range-Axis #" + i + " == null"); |
366 else { | 386 else { |
367 logger.debug("Axis " + i + " != null [" + | 387 logger.debug("Range-Axis " + i + " != null [" + |
368 plot.getRangeAxis(i).getRange().getLowerBound() + | 388 plot.getRangeAxis(i).getRange().getLowerBound() + |
369 " " + plot.getRangeAxis(i).getRange().getUpperBound() + | 389 " " + plot.getRangeAxis(i).getRange().getUpperBound() + |
370 "]"); | 390 "]"); |
371 } | 391 } |
372 | 392 |
398 | 418 |
399 // Add contained datasets, mapping to axis. | 419 // Add contained datasets, mapping to axis. |
400 for (XYDataset dataset: axisDataset.datasets) { | 420 for (XYDataset dataset: axisDataset.datasets) { |
401 plot.setDataset(datasetIndex, dataset); | 421 plot.setDataset(datasetIndex, dataset); |
402 plot.mapDatasetToRangeAxis(datasetIndex, axisIndex); | 422 plot.mapDatasetToRangeAxis(datasetIndex, axisIndex); |
403 applyThemes(plot, (XYSeriesCollection) dataset, datasetIndex); | 423 applyThemes(plot, (XYSeriesCollection) dataset, |
424 datasetIndex, | |
425 axisDataset.isArea((XYSeriesCollection)dataset)); | |
404 datasetIndex++; | 426 datasetIndex++; |
405 } | 427 } |
406 axisIndex++; | 428 axisIndex++; |
407 } | 429 } |
408 } | 430 } |
409 } | 431 } |
410 | 432 |
433 | |
434 /** | |
435 * Registers an area to be drawn. | |
436 * @param lower the lower curve to draw the area from. | |
437 * @param upper the upper curve to draw the ara from. | |
438 */ | |
439 public void addAreaSeries(Object lower, Object upper, int index, boolean visible) { | |
440 if (lower == null && upper == null) { | |
441 logger.warn("Cannot yet render above/under curve."); | |
442 return; | |
443 } | |
444 AxisDataset axisDataset = datasets.get(index); | |
445 | |
446 if (axisDataset == null) { | |
447 axisDataset = new AxisDataset(index); | |
448 datasets.put(index, axisDataset); | |
449 } | |
450 | |
451 if (visible) | |
452 axisDataset.addAreaDataset((XYSeries) lower, (XYSeries) upper); | |
453 else { | |
454 // TODO only range merging. | |
455 } | |
456 //TODO range merging. | |
457 } | |
411 | 458 |
412 /** | 459 /** |
413 * Add given series if visible, if not visible adjust ranges (such that | 460 * Add given series if visible, if not visible adjust ranges (such that |
414 * all points in data would be plotted once visible). | 461 * all points in data would be plotted once visible). |
415 * @param series the dataseries to include in plot. | 462 * @param series the dataseries to include in plot. |
426 if (axisDataset == null) { | 473 if (axisDataset == null) { |
427 axisDataset = new AxisDataset(index); | 474 axisDataset = new AxisDataset(index); |
428 datasets.put(index, axisDataset); | 475 datasets.put(index, axisDataset); |
429 } | 476 } |
430 | 477 |
431 logger.debug("Series-extent x " + series.getMinX() + " : " + series.getMaxX() | 478 logger.debug("addAxisSeries: extent X " + series.getMinX() + " : " + series.getMaxX() |
432 + " extend y " + series.getMinY() + " : " + series.getMaxY()); | 479 + " extent y " + series.getMinY() + " : " + series.getMaxY()); |
433 | 480 |
434 if (visible) { | 481 if (visible) { |
435 axisDataset.addDataset(series); | 482 axisDataset.addDataset(series); |
436 } | 483 } |
437 else { | 484 else { |
801 | 848 |
802 | 849 |
803 /** | 850 /** |
804 * @param idx "index" of dataset/series (first dataset to be drawn has | 851 * @param idx "index" of dataset/series (first dataset to be drawn has |
805 * index 0), correlates with renderer index. | 852 * index 0), correlates with renderer index. |
853 * @param isArea true if the series describes an area and shall be rendered | |
854 * as such. | |
806 * @return idx increased by number of items addded. | 855 * @return idx increased by number of items addded. |
807 */ | 856 */ |
808 protected int applyThemes(XYPlot plot, XYSeriesCollection series, int idx) { | 857 protected int applyThemes( |
858 XYPlot plot, | |
859 XYSeriesCollection series, | |
860 int idx, | |
861 boolean isArea | |
862 ) { | |
809 LegendItemCollection lic = new LegendItemCollection(); | 863 LegendItemCollection lic = new LegendItemCollection(); |
810 LegendItemCollection anno = plot.getFixedLegendItems(); | 864 LegendItemCollection anno = plot.getFixedLegendItems(); |
811 | 865 |
812 XYLineAndShapeRenderer renderer = getRenderer(plot, idx); | 866 XYLineAndShapeRenderer renderer = getRenderer(plot, idx); |
813 int retidx = idx; | 867 int retidx = idx; |
868 | |
869 if (isArea) { | |
870 logger.debug("Registering an 'area'renderer."); | |
871 plot.setRenderer(retidx, new StableXYDifferenceRenderer()); | |
872 // TODO to legend entry | |
873 // TODO to styling | |
874 return retidx +1; | |
875 } | |
814 | 876 |
815 for (int s = 0, num = series.getSeriesCount(); s < num; s++) { | 877 for (int s = 0, num = series.getSeriesCount(); s < num; s++) { |
816 XYSeries serie = series.getSeries(s); | 878 XYSeries serie = series.getSeries(s); |
817 | 879 |
818 if (serie instanceof StyledXYSeries) { | 880 if (serie instanceof StyledXYSeries) { |