Mercurial > dive4elements > river
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" })); } }