diff artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java @ 9496:d8e753d0fdb9

stripedArea introduced for Assessment Scheme/Bewertungsschema
author gernotbelger
date Wed, 26 Sep 2018 15:48:05 +0200
parents 094ed9d1f2ad
children 853f2dafc16e
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java	Tue Sep 25 16:43:51 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/AbstractChartGenerator.java	Wed Sep 26 15:48:05 2018 +0200
@@ -12,11 +12,7 @@
 import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Font;
-import java.awt.Paint;
 import java.awt.Stroke;
-import java.awt.TexturePaint;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.text.DateFormat;
@@ -38,7 +34,6 @@
 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
 import org.dive4elements.artifactdatabase.state.Settings;
 import org.dive4elements.artifacts.Artifact;
-import org.dive4elements.artifacts.ArtifactCollection;
 import org.dive4elements.artifacts.ArtifactNamespaceContext;
 import org.dive4elements.artifacts.CallContext;
 import org.dive4elements.artifacts.CallMeta;
@@ -56,12 +51,10 @@
 import org.dive4elements.river.jfree.DoubleBounds;
 import org.dive4elements.river.jfree.EnhancedLineAndShapeRenderer;
 import org.dive4elements.river.jfree.RiverAnnotation;
-import org.dive4elements.river.jfree.StableXYDifferenceRenderer;
 import org.dive4elements.river.jfree.Style;
-import org.dive4elements.river.jfree.StyledAreaSeriesCollection;
 import org.dive4elements.river.jfree.StyledSeries;
+import org.dive4elements.river.jfree.StyledXYDataset;
 import org.dive4elements.river.themes.ThemeDocument;
-import org.dive4elements.river.utils.Formatter;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.LegendItem;
 import org.jfree.chart.LegendItemCollection;
@@ -478,7 +471,7 @@
         addMetadataSubtitle(chart);
 
         /* add the real chart title, but as subtitle after the metadata */
-        final String chartTitle =  getChartTitle(this.context);
+        final String chartTitle = getChartTitle(this.context);
         if (chartTitle != null) {
             final TextTitle title = new TextTitle(chartTitle, JFreeChart.DEFAULT_TITLE_FONT);
             chart.addSubtitle(title);
@@ -487,7 +480,6 @@
         addSubtitles(this.context, chart);
     }
 
-
     /**
      * Adds a metadata sub-title to the chart if it gets exported
      */
@@ -503,7 +495,7 @@
 
         final TextTitle subtitle = new TextTitle(text, titleFont);
         subtitle.setHorizontalAlignment(HorizontalAlignment.LEFT);
-        subtitle.setMargin(new RectangleInsets(10,10,10,10));
+        subtitle.setMargin(new RectangleInsets(10, 10, 10, 10));
 
         chart.addSubtitle(subtitle);
     }
@@ -517,9 +509,6 @@
             return Collections.emptyList();
         }
 
-        final CollectionCallContext ccc = (CollectionCallContext) this.context;
-        final ArtifactCollection collection = ccc.getCollection();
-
         final List<String> subtitles = new ArrayList<>();
 
         /* version */
@@ -817,7 +806,7 @@
                         plot.setDataset(datasetIndex, dataset);
                         plot.mapDatasetToRangeAxis(datasetIndex, axisIndex);
 
-                        applyThemes(plot, dataset, datasetIndex, axisDataset.isArea(dataset));
+                        applyThemes(plot, dataset, datasetIndex);
 
                         datasetIndex++;
                     }
@@ -839,18 +828,21 @@
     protected abstract NumberAxis createYAxis(final int index);
 
     /**
-     * @param idx
+     * @param datasetIndex
      *            "index" of dataset/series (first dataset to be drawn has
      *            index 0), correlates with renderer index.
      * @param isArea
      *            true if the series describes an area and shall be rendered
      *            as such.
      */
-    private void applyThemes(final XYPlot plot, final XYDataset series, final int idx, final boolean isArea) {
-        if (isArea)
-            applyAreaTheme(plot, (StyledAreaSeriesCollection) series, idx);
+    private void applyThemes(final XYPlot plot, final XYDataset dataset, final int datasetIndex) {
+
+        final Font legendFont = createLegendLabelFont();
+
+        if (dataset instanceof StyledXYDataset)
+            ((StyledXYDataset) dataset).applyTheme(this.context.getMeta(), plot, datasetIndex, legendFont);
         else
-            applyLineTheme(plot, series, idx);
+            applyLineTheme(plot, dataset, datasetIndex, legendFont);
     }
 
     /**
@@ -883,12 +875,8 @@
      * @return a new instance of EnhancedLineAndShapeRenderer.
      */
     private XYLineAndShapeRenderer createRenderer(final XYPlot plot, final int idx) {
-        log.debug("Create EnhancedLineAndShapeRenderer for idx: " + idx);
-
         final EnhancedLineAndShapeRenderer r = new EnhancedLineAndShapeRenderer(true, false);
-
         r.setPlot(plot);
-
         return r;
     }
 
@@ -903,15 +891,14 @@
      *            The XYDataset which needs to support Series objects.
      * @param idx
      *            The index of the renderer / dataset.
+     * @param legendFont2
      */
-    private void applyLineTheme(final XYPlot plot, final XYDataset dataset, final int idx) {
+    private void applyLineTheme(final XYPlot plot, final XYDataset dataset, final int idx, final Font legendFont) {
         log.debug("Apply LineTheme for dataset at index: " + idx);
 
         final LegendItemCollection lic = new LegendItemCollection();
         final LegendItemCollection anno = plot.getFixedLegendItems();
 
-        final Font legendFont = createLegendLabelFont();
-
         final XYLineAndShapeRenderer renderer = createRenderer(plot, idx);
 
         for (int s = 0, num = dataset.getSeriesCount(); s < num; s++) {
@@ -951,64 +938,6 @@
         plot.setRenderer(idx, renderer);
     }
 
-    /**
-     * @param plot
-     *            The plot.
-     * @param area
-     *            A StyledAreaSeriesCollection object.
-     * @param idx
-     *            The index of the dataset.
-     */
-    private final void applyAreaTheme(final XYPlot plot, final StyledAreaSeriesCollection area, final int idx) {
-        final LegendItemCollection lic = new LegendItemCollection();
-        final LegendItemCollection anno = plot.getFixedLegendItems();
-
-        final Font legendFont = createLegendLabelFont();
-
-        log.debug("Registering an 'area'renderer at idx: " + idx);
-
-        final StableXYDifferenceRenderer dRenderer = new StableXYDifferenceRenderer();
-
-        if (area.getMode() == StyledAreaSeriesCollection.FILL_MODE.UNDER) {
-            dRenderer.setPositivePaint(createTransparentPaint());
-        }
-
-        plot.setRenderer(idx, dRenderer);
-
-        area.applyTheme(dRenderer);
-
-        // i18n
-        dRenderer.setAreaLabelNumberFormat(Formatter.getFormatter(this.context.getMeta(), 2, 4));
-
-        dRenderer.setAreaLabelTemplate(Resources.getMsg(this.context.getMeta(), "area.label.template", "Area=%sm2"));
-
-        final LegendItem legendItem = dRenderer.getLegendItem(idx, 0);
-        if (legendItem != null) {
-            legendItem.setLabelFont(legendFont);
-            lic.add(legendItem);
-        } else {
-            log.warn("Could not get LegentItem for renderer: " + idx + ", series-idx " + 0);
-        }
-
-        if (anno != null) {
-            lic.addAll(anno);
-        }
-
-        plot.setFixedLegendItems(lic);
-    }
-
-    /**
-     * Returns a transparently textured paint.
-     *
-     * @return a transparently textured paint.
-     */
-    private static Paint createTransparentPaint() {
-        // TODO why not use a transparent color?
-        final BufferedImage texture = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
-
-        return new TexturePaint(texture, new Rectangle2D.Double(0d, 0d, 0d, 0d));
-    }
-
     private void preparePDFContext(final CallContext context) {
         final int[] dimension = getExportDimension();
 
@@ -1069,21 +998,27 @@
 
         final Bounds[] xyBounds = ChartHelper.getBounds(dataset);
 
-        if (xyBounds == null) {
-            log.warn("Skip XYDataset for Axis (invalid ranges): " + idx);
-            return;
-        }
+        // if (xyBounds == null) {
+        // log.warn("Skip XYDataset for Axis (invalid ranges): " + idx);
+        // return;
+        // }
 
         if (visible) {
             if (log.isDebugEnabled()) {
                 log.debug("Add new AxisDataset at index: " + idx);
-                log.debug("X extent: " + xyBounds[0]);
-                log.debug("Y extent: " + xyBounds[1]);
+                if (xyBounds != null) {
+                    log.debug("X extent: " + xyBounds[0]);
+                    log.debug("Y extent: " + xyBounds[1]);
+                }
             }
 
             axisDataset.addDataset(dataset);
         }
 
+        /* No range merging, for areas extending to infinity this causes problems. */
+        if (xyBounds == null || StyledSeriesBuilder.isBigDoubleValue(xyBounds[1].getLower()) || StyledSeriesBuilder.isBigDoubleValue(xyBounds[1].getLower()))
+            return;
+
         combineXBounds(xyBounds[0], 0);
         combineYBounds(xyBounds[1], idx);
     }

http://dive4elements.wald.intevation.org