Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java @ 2020:4f7f781e4481
Improved area rendering workflow.
flys-artifacts/trunk@3475 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Tue, 20 Dec 2011 06:47:08 +0000 |
parents | 79b15491177a |
children | 7bc9293de4e6 |
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Tue Dec 20 06:39:20 2011 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/XYChartGenerator.java Tue Dec 20 06:47:08 2011 +0000 @@ -2,7 +2,13 @@ import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Paint; import java.awt.Stroke; +import java.awt.TexturePaint; + +import java.awt.geom.Rectangle2D; + +import java.awt.image.BufferedImage; import java.io.IOException; @@ -66,6 +72,7 @@ */ public abstract class XYChartGenerator extends ChartGenerator { + // TODO Consider storing the renderer here. private class AxisDataset { /** Symbolic integer, but also coding the priority (0 goes first). */ protected int axisSymbol; @@ -73,15 +80,11 @@ protected List<XYDataset> datasets; /** Range to use to include all given datasets. */ protected Range range; - /** List of datasets that are "area datasets" (these will be also - * present in the datasets list). */ - List<XYDataset> areaDatasets; /** Create AxisDataset. */ public AxisDataset(int symb) { this.axisSymbol = symb; datasets = new ArrayList<XYDataset>(); - areaDatasets = new ArrayList<XYDataset>(); } /** Merge (or create given range with range so far (if any). */ @@ -105,19 +108,13 @@ includeYRange(dataset); } - /** Add an area dataset. */ - public void addAreaDataset(XYSeries series1, XYSeries series2) { - XYSeriesCollection collection = new XYSeriesCollection(); - collection.addSeries(series1); - collection.addSeries(series2); - this.datasets.add(collection); - this.areaDatasets.add(collection); - // TODO include Range ... + public void addArea(StyledAreaSeriesCollection series) { + this.datasets.add(series); } /** True if to be renedered as area. */ public boolean isArea(XYSeriesCollection series) { - return areaDatasets.contains(series); + return (series instanceof StyledAreaSeriesCollection); } /** Adjust range to include given dataset. */ @@ -142,13 +139,16 @@ } + /** Override to make axis information available. */ protected YAxisWalker getYAxisWalker() { return new YAxisWalker() { + /** Get number of items. */ @Override public int length() { return 0; } + /** Get identifier for this index. */ @Override public String getId(int idx) { return null; @@ -436,8 +436,8 @@ * @param lower the lower curve to draw the area from. * @param upper the upper curve to draw the ara from. */ - public void addAreaSeries(Object lower, Object upper, int index, boolean visible) { - if (lower == null && upper == null) { + public void addAreaSeries(StyledAreaSeriesCollection area, int index, boolean visible) { + if (area == null) { logger.warn("Cannot yet render above/under curve."); return; } @@ -448,14 +448,16 @@ datasets.put(index, axisDataset); } - if (visible) - axisDataset.addAreaDataset((XYSeries) lower, (XYSeries) upper); + if (visible) { + axisDataset.addArea(area); + } else { // TODO only range merging. } //TODO range merging. } + /** * Add given series if visible, if not visible adjust ranges (such that * all points in data would be plotted once visible). @@ -786,6 +788,7 @@ } + /** Override to handle subtitle adding. */ protected void addSubtitles(JFreeChart chart) { // override this method in subclasses that need subtitles } @@ -863,17 +866,37 @@ LegendItemCollection lic = new LegendItemCollection(); LegendItemCollection anno = plot.getFixedLegendItems(); - XYLineAndShapeRenderer renderer = getRenderer(plot, idx); int retidx = idx; if (isArea) { - logger.debug("Registering an 'area'renderer."); - plot.setRenderer(retidx, new StableXYDifferenceRenderer()); - // TODO to legend entry - // TODO to styling - return retidx +1; + logger.debug("Registering an 'area'renderer at idx: " + idx); + StyledAreaSeriesCollection area = (StyledAreaSeriesCollection) series; + + StableXYDifferenceRenderer dRenderer = new StableXYDifferenceRenderer(); + if (area.getMode() == StyledAreaSeriesCollection.FILL_MODE.UNDER) { + dRenderer.setPositivePaint(createTransparentPaint()); + } + plot.setRenderer(idx, dRenderer); + + area.applyTheme(dRenderer); + + LegendItem legendItem = dRenderer.getLegendItem(idx, 0); + if (legendItem != null) { + lic.add(legendItem); + } + else { + logger.warn("Could not get LegentItem for renderer: " + + idx + ", series-idx " + 0); + } + if (anno != null) { + lic.addAll(anno); + } + plot.setFixedLegendItems(lic); + return retidx + 1; } + XYLineAndShapeRenderer renderer = getRenderer(plot, idx); + for (int s = 0, num = series.getSeriesCount(); s < num; s++) { XYSeries serie = series.getSeries(s); @@ -888,14 +911,15 @@ renderer.setSeriesShapesVisible(s, true); } - LegendItem li = renderer.getLegendItem(idx, s); - if (li != null) { - lic.add(li); + LegendItem legendItem = renderer.getLegendItem(idx, s); + if (legendItem != null) { + lic.add(legendItem); } else { logger.warn("Could not get LegentItem for renderer: " - + idx + ", series-idx " + s); + + idx + ", series-idx " + s); } + // TODO: why that? isnt renderer set per dataset not per series? retidx++; } @@ -911,10 +935,23 @@ } + /** Returns a transparently textured paint. */ + // TODO why not use a transparent color? + protected static Paint createTransparentPaint() { + BufferedImage texture = new BufferedImage( + 1, 1, BufferedImage.TYPE_4BYTE_ABGR); + + return new TexturePaint( + texture, new Rectangle2D.Double(0d, 0d, 0d, 0d)); + } + + /** * Get renderer, from plot or cloned default renderer otherwise. */ protected XYLineAndShapeRenderer getRenderer(XYPlot plot, int idx) { + // !TODO what if its a differencerenderer?! + logger.debug("getRenderer: " + idx); XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer(idx);