diff artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java @ 8730:cb33de3434a8

(issue1754) Proper subtitle handling for Radius This deduplicates the subtitle and zoom / radius calculation code by moving it out of the processors. Doing this fixes cases where the subtitle would be removed when a the according filtered facet was removed although it should still have shown the Range for example. Range is now also added as a subtitle for the difference diagrams. This adds some tasty hack (with cheese) to determine wether or not the user has set the subtitle. See the comment in getChartSubtitlePure in LongitudinalSectionGenerator2 for details.
author Andre Heinecke <andre.heinecke@intevation.de>
date Thu, 30 Apr 2015 13:06:51 +0200
parents 68827654ea7a
children bccc476e78eb
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java	Thu Apr 30 13:02:37 2015 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/LongitudinalSectionGenerator2.java	Thu Apr 30 13:06:51 2015 +0200
@@ -15,11 +15,16 @@
 import org.dive4elements.river.jfree.DoubleBounds;
 import org.dive4elements.river.themes.ThemeDocument;
 import org.dive4elements.river.artifacts.model.FacetTypes;
+import org.dive4elements.river.artifacts.access.RiverAccess;
+import org.dive4elements.river.artifacts.model.ZoomScale;
+import org.dive4elements.river.artifacts.context.RiverContext;
+import org.dive4elements.river.artifacts.resources.Resources;
 
 import org.jfree.data.Range;
 
 import java.util.List;
 import java.util.ArrayList;
+import java.util.HashSet;
 
 import org.apache.log4j.Logger;
 
@@ -48,13 +53,57 @@
     public static final String I18N_CHART_LOCATION_SUBTITLE =
         "chart.longitudinal.section.locsubtitle";
 
+    public static final String I18N_CHART_DISTANCE_SUBTITLE =
+        "chart.longitudinal.section.subtitle";
+
+    public static final String I18N_SUBTITLE_RADIUS =
+        "chart.subtitle.radius";
+
+    @Override
+    protected String getChartSubtitlePure() {
+        ChartSettings chartSettings = getChartSettings();
+
+        String titleBeforeParts = null;
+
+        if (subTitleParts != null && !subTitleParts.isEmpty()) {
+            // This is needed here to determine the initial
+            // subtitle before the processing happens to distinguis
+            // between that subtitle and a subtitle set by the user.
+            //
+            // The underlying problem is that getChartSubtitle is called
+            // to build the chart settings way before the facets are processed.
+            // So we have to figure out somehow if the user modified the title
+            // in the chartsettings or if it was just put there because it
+            // was the default.
+
+            HashSet<String> buf = subTitleParts;
+            subTitleParts = null;
+            titleBeforeParts = getDefaultChartSubtitle();
+            subTitleParts = buf;
+        }
+
+
+        if (chartSettings != null) {
+            String userTitle = getChartSubtitle(chartSettings);
+            if (userTitle != null && !userTitle.equals(titleBeforeParts)) {
+                // set by the user. use this.
+                log.debug("Using user subtitle: " + userTitle);
+                return userTitle;
+            }
+        }
+        log.debug("Using default subtitle: " + getDefaultChartSubtitle());
+        return getDefaultChartSubtitle();
+    }
+
+
     @Override
     public String getDefaultChartSubtitle() {
         double[] dist = getRange();
+
         String parts = "";
         if (subTitleParts != null && !subTitleParts.isEmpty()) {
              for (String p : subTitleParts) {
-                 parts += ", " + p;
+                 parts += " " + p;
              }
         }
         if (dist == null || dist.length != 2 ||
@@ -67,8 +116,8 @@
             Object [] args = new Object[] {getRiverName(), dist[1]};
             return msg(I18N_CHART_LOCATION_SUBTITLE, "", args) + parts;
         }
-
-        return super.getDefaultChartSubtitle();
+        Object [] args = new Object[] {getRiverName(), dist[0], dist[1]};
+        return msg(I18N_CHART_DISTANCE_SUBTITLE, "", args) + parts;
     }
 
     protected void calculateRadius() {
@@ -107,9 +156,21 @@
         }
         log.debug("startkm for Radius is: " + candidate.getLowerBound() +
                   " endkm: " + candidate.getUpperBound());
+
+        // This might not be neccessary if every facet uses only the
+        // radius and does not do its own zoomscale calculation.
         context.putContextValue("startkm", candidate.getLowerBound());
         context.putContextValue("endkm", candidate.getUpperBound());
         context.putContextValue("bounds_defined", true);
+
+        RiverContext fc = (RiverContext)context.globalContext();
+        ZoomScale scales = (ZoomScale)fc.get("zoomscale");
+        RiverAccess access = new RiverAccess((D4EArtifact)getMaster());
+        String river = access.getRiverName();
+
+        double radius = scales.getRadius(river, candidate.getLowerBound(),
+                                         candidate.getUpperBound());
+        context.putContextValue("radius", radius);
     }
 
     @Override
@@ -130,8 +191,21 @@
         }
 
         calculateRadius(); // This calculates the real start and end km's
+
+        boolean haveVisibleFiltered = false;
         for (SuperBundle superbundle: postOutAF) {
             super.doOut(superbundle.bundle, superbundle.theme, superbundle.visible);
+            if (!haveVisibleFiltered) {
+                haveVisibleFiltered = superbundle.visible;
+            }
+        }
+        if (haveVisibleFiltered) {
+            log.debug("Adding radius subtitle.");
+
+            addSubtitle(Resources.getMsg(
+                        getCallContext().getMeta(),
+                        I18N_SUBTITLE_RADIUS,
+                        new Object[] { "$RADIUS" }));
         }
     }
 

http://dive4elements.wald.intevation.org