view 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 source
/** 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;
    }
}

http://dive4elements.wald.intevation.org