Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDataset.java @ 9496:d8e753d0fdb9
stripedArea introduced for Assessment Scheme/Bewertungsschema
author | gernotbelger |
---|---|
date | Wed, 26 Sep 2018 15:48:05 +0200 |
parents | |
children | ef5754ba5573 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDataset.java Wed Sep 26 15:48:05 2018 +0200 @@ -0,0 +1,133 @@ +/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * This file is Free Software under the GNU AGPL (>=v3) + * and comes with ABSOLUTELY NO WARRANTY! Check out the + * documentation coming with Dive4Elements River for details. + */ +package org.dive4elements.river.jfree; + +import java.awt.Color; +import java.awt.Font; +import java.util.ArrayList; +import java.util.List; + +import org.dive4elements.artifacts.CallMeta; +import org.dive4elements.river.java2d.ShapeUtils; +import org.dive4elements.river.themes.ThemeDocument; +import org.jfree.chart.LegendItem; +import org.jfree.chart.LegendItemCollection; +import org.jfree.chart.plot.XYPlot; +import org.jfree.data.xy.XYSeries; +import org.jfree.data.xy.XYSeriesCollection; + +/** + * @author Domenico Nardi Tironi + */ +public class StripedAreaDataset extends XYSeriesCollection implements StyledXYDataset { + + public static final class Stripe { + + private final String label; + + private final Color color; + + private final double lower; + + private final double upper; + + public Stripe(final String label, final Color color, final double lower, final double upper) { + this.label = label; + this.color = color; + this.lower = lower; + this.upper = upper; + } + + public String getLabel() { + return this.label; + } + + public Color getColor() { + return this.color; + } + + public double getLower() { + return this.lower; + } + + public double getUpper() { + return this.upper; + } + + } + + private static final long serialVersionUID = 1L; + + private final List<Stripe> stripes = new ArrayList<>(); + + private final ThemeDocument theme; + + public StripedAreaDataset(final ThemeDocument theme) { + this.theme = theme; + } + + public void addStripe(final Stripe stripe) { + + this.stripes.add(stripe); + + final XYSeries stripeSeries = new XYSeries(stripe.getLabel()); + // REMARK: we need at least one item, so the renderer method is called + stripeSeries.add(Double.NaN, Double.NaN); + super.addSeries(stripeSeries); + } + + @Override + public void addSeries(final XYSeries series) { + throw new UnsupportedOperationException(); + } + + Stripe getStripe(final int series) { + return this.stripes.get(series); + } + + @Override + public void applyTheme(final CallMeta callMeta, final XYPlot plot, final int datasetIndex, final Font legendFont) { + + final StripedAreaDatasetRenderer renderer = createRenderer(); + + plot.setRenderer(datasetIndex, renderer); + + final LegendItemCollection newItems = new LegendItemCollection(); + final LegendItemCollection oldItems = plot.getFixedLegendItems(); + + final int seriesCount = getSeriesCount(); + for (int i = 0; i < seriesCount; i++) { + final LegendItem legendItem = renderer.getLegendItem(datasetIndex, i); + if (legendItem != null) { + legendItem.setLabelFont(legendFont); + newItems.add(legendItem); + } + } + + if (oldItems != null) + newItems.addAll(oldItems); + + plot.setFixedLegendItems(newItems); + } + + private StripedAreaDatasetRenderer createRenderer() { + + final int transparency = this.theme.parseAreaTransparency(); + + final StripedAreaDatasetRenderer renderer = new StripedAreaDatasetRenderer(); + for (int i = 0; i < this.stripes.size(); i++) { + + final Color alphaPaint = ShapeUtils.withAlpha(this.stripes.get(i).getColor(), transparency); + renderer.setSeriesPaint(i, alphaPaint); + } + + return renderer; + } +} \ No newline at end of file