view artifacts/src/main/java/org/dive4elements/river/jfree/StripedAreaDataset.java @ 9555:ef5754ba5573

Implemented legend aggregation based on type of themes. Added theme-editor style configuration for aggregated legend entries. Only configured themes get aggregated.
author gernotbelger
date Tue, 23 Oct 2018 16:26:48 +0200
parents d8e753d0fdb9
children
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.util.ArrayList;
import java.util.List;

import org.dive4elements.artifactdatabase.state.Facet;
import org.dive4elements.artifacts.CallMeta;
import org.dive4elements.river.exports.LegendAggregator;
import org.dive4elements.river.java2d.ShapeUtils;
import org.dive4elements.river.themes.ThemeDocument;
import org.jfree.chart.LegendItem;
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<>();

    /**
     * A 'type' that allows to categorize themes by it. Tyically this is simply the facet-name of the originating
     * {@link Facet}.
     */
    private final String themeType;

    private final ThemeDocument theme;

    public StripedAreaDataset(final String themeType, final ThemeDocument theme) {
        this.themeType = themeType;
        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 LegendAggregator legendBuilder, final int datasetIndex) {

        final StripedAreaDatasetRenderer renderer = createRenderer();

        plot.setRenderer(datasetIndex, renderer);

        final int seriesCount = getSeriesCount();
        for (int i = 0; i < seriesCount; i++) {
            final LegendItem legendItem = renderer.getLegendItem(datasetIndex, i);
            if (legendItem != null)
                legendBuilder.addLegendItem(this.themeType, legendItem);
        }
    }

    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;
    }

    @Override
    public void applyAggregatedLegendTheme(final LegendItem item, final ThemeDocument legendTheme) {
        /* not implemented at the moment */
    }
}

http://dive4elements.wald.intevation.org