diff gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java @ 540:80630520e25a

merged gnv-artifacts/0.4
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:13:49 +0200
parents 92d7a8cd1ef1
children 79401c871da4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/chart/VerticalCrossSectionChart.java	Fri Sep 28 12:13:49 2012 +0200
@@ -0,0 +1,223 @@
+package de.intevation.gnv.chart;
+
+import de.intevation.gnv.jfreechart.PolygonDataset;
+import de.intevation.gnv.jfreechart.PolygonPlot;
+import de.intevation.gnv.jfreechart.PolygonRenderer;
+import de.intevation.gnv.jfreechart.PolygonSeries;
+
+import de.intevation.gnv.math.AttributedXYColumns;
+
+import de.intevation.gnv.raster.Palette;
+
+import java.awt.Color;
+import java.awt.Paint;
+
+import java.text.NumberFormat;
+
+import java.util.HashSet;
+import java.util.Locale;
+import java.util.Map;
+
+import org.jfree.chart.JFreeChart;
+
+import org.jfree.chart.axis.NumberAxis;
+import org.jfree.chart.axis.SymbolAxis;
+import org.jfree.chart.axis.ValueAxis;
+
+import org.jfree.chart.plot.PlotOrientation;
+
+import org.jfree.chart.renderer.LookupPaintScale;
+
+import org.jfree.chart.title.PaintScaleLegend;
+import org.jfree.chart.title.TextTitle;
+
+import org.jfree.ui.RectangleEdge;
+import org.jfree.ui.RectangleInsets;
+
+/**
+ * @author Ingo Weinzierl      (ingo.weinzierl@intevation.de)
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class VerticalCrossSectionChart
+implements   Chart
+{
+    public static final class PalettePaintLookup
+    implements PolygonRenderer.PaintLookup
+    {
+        private Palette             palette;
+        private Map<Integer, Paint> special;
+
+        public PalettePaintLookup(Palette palette) {
+            this(palette, null);
+        }
+
+        public PalettePaintLookup(
+            Palette             palette, 
+            Map<Integer, Paint> special
+        ) {
+            this.palette = palette;
+            this.special = special;
+        }
+
+        public Paint getPaint(int index) {
+            if (special != null) {
+                Paint paint = special.get(index);
+                if (paint != null) {
+                    return paint;
+                }
+            }
+            return index < 0
+                ? Color.black
+                : palette.getColor(index);
+        }
+    } // class PalettePaintLookup
+
+    public static class LocalizedLabelGenerator
+    extends             PolygonRenderer.DefaultLabelGenerator
+    {
+        protected NumberFormat format;
+
+        public LocalizedLabelGenerator() {
+        }
+
+        public LocalizedLabelGenerator(NumberFormat format) {
+            this.format = format;
+        }
+
+        protected String toString(Object label) {
+            return label instanceof Number
+                ? format.format(((Number)label).doubleValue())
+                : super.toString(label);
+        }
+    } // class LocalizedLabelGenerator
+
+    protected JFreeChart chart;
+
+    protected AttributedXYColumns columns;
+    protected Map<Integer, Paint> special;
+    protected Palette             palette;
+    protected Locale              locale;
+    protected ChartLabels         labels;
+
+    public VerticalCrossSectionChart() {
+    }
+
+    public VerticalCrossSectionChart(
+        AttributedXYColumns columns,
+        Palette             palette,
+        Locale              locale,
+        ChartLabels         labels
+    ) {
+        this(columns, palette, null, locale, labels);
+    }
+
+    public VerticalCrossSectionChart(
+        AttributedXYColumns columns,
+        Palette             palette,
+        Map<Integer, Paint> special,
+        Locale              locale,
+        ChartLabels         labels
+    ) {
+        this.columns = columns;
+        this.palette = palette;
+        this.special = special;
+        this.locale  = locale;
+        this.labels  = labels;
+    }
+
+    protected JFreeChart createChart() {
+
+        boolean legendB  = false;
+        boolean tooltips = false;
+        boolean urls     = false;
+
+        PlotOrientation po  = PlotOrientation.HORIZONTAL;
+        PolygonDataset data = columns.getPolygonDataset();
+
+        HashSet<Integer> usedColors = new HashSet<Integer>();
+
+        for (int i = data.getSeriesCount()-1; i >= 0; --i) {
+            PolygonSeries ps = data.getSeries(i);
+            Integer fill = (Integer)ps.getAttribute("fill");
+            if (fill != null
+            && (special != null && !special.containsKey(fill))) {
+                usedColors.add(fill);
+            }
+        }
+
+        NumberFormat format = NumberFormat.getInstance(locale);
+        format.setMinimumFractionDigits(0);
+        format.setMaximumFractionDigits(2);
+
+        PolygonRenderer renderer = new PolygonRenderer(
+            new PalettePaintLookup(palette, special),
+            new LocalizedLabelGenerator(format));
+
+        ValueAxis domainAxis = new NumberAxis(this.labels.getDomainAxisLabel());
+        ValueAxis rangeAxis  = new NumberAxis(this.labels.getRangeAxisLabel());
+
+        PolygonPlot plot = new PolygonPlot(
+            data,
+            renderer,
+            domainAxis,
+            rangeAxis,
+            null);
+
+        plot.setOutlinePaint(Color.WHITE);
+
+        String [] labels = new String[usedColors.size()];
+
+        int colors = palette.getSize();
+        LookupPaintScale lookupPaint =
+            new LookupPaintScale(-0.5d, labels.length-0.5d, Color.white);
+
+        Color color = null;
+
+        for (int i = 0, j = labels.length-1; i < colors && j >= 0; i++) {
+            if (usedColors.contains(i)) {
+                Palette.Entry entry = palette.getEntryByIndex(i);
+                color     = entry.getColor();
+                labels[j] = entry.getDescription();
+                lookupPaint.add(j-0.5d, color);
+                --j;
+            }
+        }
+
+        JFreeChart chart = new JFreeChart(
+            this.labels.getTitle(),
+            JFreeChart.DEFAULT_TITLE_FONT,
+            plot,
+            legendB);
+
+        chart.removeLegend();
+        chart.addSubtitle(new TextTitle(this.labels.getSubtitle()));
+
+        SymbolAxis scale = new SymbolAxis(this.labels.getParameterName(), labels);
+        scale.setRange(-1.5d, labels.length+0.5d);
+        scale.setGridBandsVisible(false);
+        scale.setPlot(plot);
+
+        PaintScaleLegend legend = new PaintScaleLegend(
+            lookupPaint, scale);
+        legend.setMargin(new RectangleInsets(3d, 10d, 3d, 10d));
+        legend.setPosition(RectangleEdge.LEFT);
+        legend.setAxisOffset(5d);
+
+        chart.addSubtitle(legend);
+
+        return chart;
+    }
+
+    public JFreeChart generateChart() {
+        if (chart == null) {
+            chart = createChart();
+        }
+
+        return chart;
+    }
+
+    public void setBackgroundPaint(Paint paint) {
+        chart.setBackgroundPaint(paint);
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org