gernotbelger@9496: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9496: * Software engineering by gernotbelger@9496: * Björnsen Beratende Ingenieure GmbH gernotbelger@9496: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9496: * gernotbelger@9496: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9496: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9496: * documentation coming with Dive4Elements River for details. gernotbelger@9496: */ gernotbelger@9496: package org.dive4elements.river.jfree; gernotbelger@9496: gernotbelger@9496: import java.awt.Color; gernotbelger@9496: import java.util.ArrayList; gernotbelger@9496: import java.util.List; gernotbelger@9496: gernotbelger@9555: import org.dive4elements.artifactdatabase.state.Facet; gernotbelger@9496: import org.dive4elements.artifacts.CallMeta; gernotbelger@9555: import org.dive4elements.river.exports.LegendAggregator; gernotbelger@9496: import org.dive4elements.river.java2d.ShapeUtils; gernotbelger@9496: import org.dive4elements.river.themes.ThemeDocument; gernotbelger@9496: import org.jfree.chart.LegendItem; gernotbelger@9496: import org.jfree.chart.plot.XYPlot; gernotbelger@9496: import org.jfree.data.xy.XYSeries; gernotbelger@9496: import org.jfree.data.xy.XYSeriesCollection; gernotbelger@9496: gernotbelger@9496: /** gernotbelger@9496: * @author Domenico Nardi Tironi gernotbelger@9496: */ gernotbelger@9496: public class StripedAreaDataset extends XYSeriesCollection implements StyledXYDataset { gernotbelger@9496: gernotbelger@9496: public static final class Stripe { gernotbelger@9496: gernotbelger@9496: private final String label; gernotbelger@9496: gernotbelger@9496: private final Color color; gernotbelger@9496: gernotbelger@9496: private final double lower; gernotbelger@9496: gernotbelger@9496: private final double upper; gernotbelger@9496: gernotbelger@9496: public Stripe(final String label, final Color color, final double lower, final double upper) { gernotbelger@9496: this.label = label; gernotbelger@9496: this.color = color; gernotbelger@9496: this.lower = lower; gernotbelger@9496: this.upper = upper; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: public String getLabel() { gernotbelger@9496: return this.label; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: public Color getColor() { gernotbelger@9496: return this.color; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: public double getLower() { gernotbelger@9496: return this.lower; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: public double getUpper() { gernotbelger@9496: return this.upper; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: private static final long serialVersionUID = 1L; gernotbelger@9496: gernotbelger@9496: private final List stripes = new ArrayList<>(); gernotbelger@9496: gernotbelger@9555: /** gernotbelger@9555: * A 'type' that allows to categorize themes by it. Tyically this is simply the facet-name of the originating gernotbelger@9555: * {@link Facet}. gernotbelger@9555: */ gernotbelger@9555: private final String themeType; gernotbelger@9555: gernotbelger@9496: private final ThemeDocument theme; gernotbelger@9496: gernotbelger@9555: public StripedAreaDataset(final String themeType, final ThemeDocument theme) { gernotbelger@9555: this.themeType = themeType; gernotbelger@9496: this.theme = theme; gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: public void addStripe(final Stripe stripe) { gernotbelger@9496: gernotbelger@9496: this.stripes.add(stripe); gernotbelger@9496: gernotbelger@9496: final XYSeries stripeSeries = new XYSeries(stripe.getLabel()); gernotbelger@9496: // REMARK: we need at least one item, so the renderer method is called gernotbelger@9496: stripeSeries.add(Double.NaN, Double.NaN); gernotbelger@9496: super.addSeries(stripeSeries); gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: @Override gernotbelger@9496: public void addSeries(final XYSeries series) { gernotbelger@9496: throw new UnsupportedOperationException(); gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: Stripe getStripe(final int series) { gernotbelger@9496: return this.stripes.get(series); gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: @Override gernotbelger@9555: public void applyTheme(final CallMeta callMeta, final XYPlot plot, final LegendAggregator legendBuilder, final int datasetIndex) { gernotbelger@9496: gernotbelger@9496: final StripedAreaDatasetRenderer renderer = createRenderer(); gernotbelger@9496: gernotbelger@9496: plot.setRenderer(datasetIndex, renderer); gernotbelger@9496: gernotbelger@9496: final int seriesCount = getSeriesCount(); gernotbelger@9496: for (int i = 0; i < seriesCount; i++) { gernotbelger@9496: final LegendItem legendItem = renderer.getLegendItem(datasetIndex, i); gernotbelger@9555: if (legendItem != null) gernotbelger@9555: legendBuilder.addLegendItem(this.themeType, legendItem); gernotbelger@9496: } gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: private StripedAreaDatasetRenderer createRenderer() { gernotbelger@9496: gernotbelger@9496: final int transparency = this.theme.parseAreaTransparency(); gernotbelger@9496: gernotbelger@9496: final StripedAreaDatasetRenderer renderer = new StripedAreaDatasetRenderer(); gernotbelger@9496: for (int i = 0; i < this.stripes.size(); i++) { gernotbelger@9496: gernotbelger@9496: final Color alphaPaint = ShapeUtils.withAlpha(this.stripes.get(i).getColor(), transparency); gernotbelger@9496: renderer.setSeriesPaint(i, alphaPaint); gernotbelger@9496: } gernotbelger@9496: gernotbelger@9496: return renderer; gernotbelger@9496: } gernotbelger@9555: gernotbelger@9555: @Override gernotbelger@9555: public void applyAggregatedLegendTheme(final LegendItem item, final ThemeDocument legendTheme) { gernotbelger@9555: /* not implemented at the moment */ gernotbelger@9555: } gernotbelger@9496: }