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

http://dive4elements.wald.intevation.org