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) {

http://dive4elements.wald.intevation.org