felix@1151: package de.intevation.flys.exports; felix@1151: felix@1151: import org.apache.log4j.Logger; felix@1151: felix@1745: import org.jfree.chart.title.TextTitle; felix@1745: felix@1151: import org.jfree.chart.JFreeChart; felix@1931: import org.jfree.chart.axis.NumberAxis; felix@1170: import org.jfree.chart.plot.XYPlot; felix@1151: import org.jfree.data.xy.XYSeries; felix@1653: import org.jfree.data.Range; felix@1151: felix@1151: import org.w3c.dom.Document; felix@1151: felix@1151: import de.intevation.artifacts.Artifact; felix@1151: felix@1151: import de.intevation.artifactdatabase.state.Facet; felix@1151: felix@1151: import de.intevation.flys.artifacts.FLYSArtifact; felix@1151: import de.intevation.flys.artifacts.model.FacetTypes; felix@1151: import de.intevation.flys.artifacts.model.WKms; felix@1151: felix@1944: import de.intevation.artifactdatabase.state.ArtifactAndFacet; felix@1627: felix@1627: import de.intevation.flys.artifacts.model.WQKms; felix@1944: import de.intevation.flys.utils.DataUtil; felix@1700: import de.intevation.flys.utils.FLYSUtils; felix@1162: felix@1861: import de.intevation.flys.jfree.FLYSAnnotation; felix@1151: felix@1151: /** felix@1151: * An OutGenerator that generates w differences curves. felix@1151: */ felix@1151: public class WDifferencesCurveGenerator felix@1151: extends LongitudinalSectionGenerator felix@1151: implements FacetTypes felix@1151: { felix@1933: public static enum YAXIS { felix@1933: D(0), felix@1933: W(1), felix@1933: Q(2); felix@1933: protected int idx; felix@1933: private YAXIS(int c) { felix@1933: idx = c; felix@1933: } felix@1933: } felix@1933: felix@1151: /** The logger that is used in this generator. */ felix@1151: private static Logger logger = felix@1151: Logger.getLogger(WDifferencesCurveGenerator.class); felix@1151: felix@1701: /** Key for internationalized title of WDiff charts. */ felix@1701: public final static String I18N_WDIFF_TITLE = "chart.w_differences.title"; felix@1701: felix@1701: /** Default for internationalized title (when no translation found). */ felix@1701: public final static String I18N_WDIFF_TITLE_DEFAULT = "Differences"; felix@1701: felix@1701: /** Key for internationalized title of WDiff charts. */ felix@1701: public final static String I18N_WDIFF_2YAXIS_LABEL = felix@1701: "chart.w_differences.yaxis.second.label"; felix@1701: felix@1701: /** Default for label for second Y-Axis when no translation found. */ felix@1701: public final static String I18N_WDIFF_2YAXIS_LABEL_DEFAULT = "W [NN + m]"; felix@1701: felix@1701: public final static String I18N_WDIFF_SUBTITLE = felix@1701: "chart.w_differences.subtitle"; felix@1701: felix@1701: public final static String I18N_WDIFF_YAXIS_LABEL = felix@1701: "chart.w_differences.yaxis.label"; felix@1701: felix@1701: public final static String I18N_WDIFF_YAXIS_LABEL_DEFAULT = "m"; felix@1701: felix@1151: felix@1700: /** felix@1700: * Get internationalized title for chart. felix@1755: * @return internationalized Chart title. felix@1700: */ felix@1755: @Override felix@1700: public String getChartTitle() { felix@1701: return msg(I18N_WDIFF_TITLE, I18N_WDIFF_TITLE_DEFAULT); felix@1700: } felix@1151: felix@1151: felix@1151: /** felix@1700: * Get default value for the second Y-Axis' label (if no translation was felix@1700: * found). felix@1755: * @return default value for second y-axis label. felix@1151: */ felix@1151: @Override felix@1700: protected String get2YAxisDefaultLabel() { felix@1701: return I18N_WDIFF_2YAXIS_LABEL_DEFAULT; felix@1700: } felix@1700: felix@1700: felix@1700: /** felix@1700: * Gets key to look up internationalized String for the charts subtitle. felix@1700: * @return key to look up translated subtitle. felix@1700: */ felix@1700: @Override felix@1700: protected String getChartSubtitleKey() { felix@1701: return I18N_WDIFF_SUBTITLE; felix@1700: } felix@1700: felix@1700: felix@1700: /** felix@1700: * Get key for internationalization of the second Y-Axis' label. felix@1755: * @return internationalized second y-axis. felix@1700: */ felix@1700: @Override felix@1700: protected String get2YAxisLabelKey() { felix@1701: return I18N_WDIFF_2YAXIS_LABEL; felix@1700: } felix@1700: felix@1700: felix@1700: /** felix@1700: * Get internationalized label for the y axis. felix@1755: * @return internationalized label for y axos. felix@1700: */ felix@1700: @Override felix@1700: protected String getYAxisLabel() { felix@1700: FLYSArtifact flys = (FLYSArtifact) master; felix@1700: felix@1700: String unit = FLYSUtils.getRiver(flys).getWstUnit().getName(); felix@1700: felix@1700: return msg( felix@1701: I18N_WDIFF_YAXIS_LABEL, felix@1701: I18N_WDIFF_YAXIS_LABEL_DEFAULT, felix@1700: new Object[] { unit }); felix@1151: } felix@1151: felix@1151: felix@1151: /** felix@1151: * Add (themed) data for chart generation. felix@1151: */ ingo@1684: @Override ingo@1684: public void doOut( felix@1944: ArtifactAndFacet artifactAndFacet, felix@1944: Document attr, felix@1944: boolean visible ingo@1684: ) { felix@1944: String name = artifactAndFacet.getFacetName(); felix@1151: felix@1151: logger.debug("WDifferencesCurveGenerator.doOut: " + name); felix@1151: felix@1151: if (name == null) { felix@1151: logger.error("No facet name for doOut(). No output generated!"); felix@1151: return; felix@1151: } felix@1151: felix@1151: if (name.equals(W_DIFFERENCES)) { ingo@1684: doWDifferencesOut( felix@1944: (WKms) artifactAndFacet.getData(context), felix@1944: artifactAndFacet.getFacetDescription(), ingo@1684: attr, ingo@1684: visible); felix@1151: } felix@1627: else if (name.equals(LONGITUDINAL_W)) { felix@1944: doWOut((WQKms) artifactAndFacet.getData(context), felix@1944: artifactAndFacet.getFacetDescription(), attr, visible); felix@1627: } felix@1853: else if (name.equals(STATIC_WKMS) || name.equals(HEIGHTMARKS_POINTS)) { felix@1944: doWOut((WKms) artifactAndFacet.getData(context), felix@1944: artifactAndFacet.getFacetDescription(), attr, visible); felix@1733: } felix@1789: else if (name.equals(LONGITUDINAL_ANNOTATION)) { felix@1944: doAnnotations((FLYSAnnotation) artifactAndFacet.getData(context), felix@1944: artifactAndFacet.getFacet(), attr, visible); felix@1789: } felix@1695: else { felix@1151: logger.warn("Unknown facet name: " + name); felix@1151: return; felix@1151: } felix@1151: } felix@1151: felix@1170: felix@1640: /** felix@1640: * Add the waterlevel-curves (the "absolutes" from which felix@1640: * differences were calculated). felix@1695: * felix@1640: * @param wqkms The wqkms to add to the diagram. felix@1695: * @param theme The theme that contains styling information. felix@1640: */ ingo@1712: protected void doWOut( felix@1734: WKms wkms, felix@1944: String description, ingo@1712: Document theme, ingo@1712: boolean visible ingo@1712: ) { felix@1695: logger.debug("WDifferencesCurveGenerator.doWOut"); felix@1627: felix@1944: XYSeries series = new StyledXYSeries(description, theme); felix@1627: felix@1791: StyledSeriesBuilder.addPoints(series, wkms); felix@1733: felix@1733: // Note: the only difference in the super-implementation felix@1733: // (in LongitudinalSectionGenerator) is here (adds with felix@1733: // addFirstAxisSeries() . felix@1933: addAxisSeries(series, YAXIS.W.idx, visible); felix@1733: felix@1734: if (wkms instanceof WQKms) { felix@1734: if (needInvertAxis((WQKms) wkms)) { felix@1734: setInverted(true); felix@1734: } felix@1733: } felix@1733: } felix@1733: felix@1745: /** felix@1745: * Add (internationalized) subtitle to chart. felix@1745: * Overridden to avoid trying to access the range of masterartifact. felix@1745: * @see getChartSubtitleKey felix@1745: */ felix@1745: @Override felix@1745: protected void addSubtitles(JFreeChart chart) { felix@1745: felix@1745: // TODO i18n felix@1745: /* felix@1745: Object[] args = new Object[] { felix@1745: getRiverName() felix@1745: }; felix@1745: */ felix@1745: String subtitle = getRiverName(); felix@1745: chart.addSubtitle(new TextTitle(subtitle)); felix@1745: } felix@1745: felix@1733: felix@1151: /** felix@1151: * Add items to dataseries which describes the differences. felix@1151: */ ingo@1684: protected void doWDifferencesOut( felix@1944: WKms wkms, felix@1944: String description, felix@1944: Document theme, felix@1944: boolean visible ingo@1684: ) { felix@1151: logger.debug("WDifferencesCurveGenerator.doWDifferencesOut"); felix@1151: if (wkms == null) { felix@1151: logger.warn("No data to add to WDifferencesChart."); felix@1151: return; felix@1162: } felix@1162: felix@1944: XYSeries series = new StyledXYSeries(description, theme); felix@1162: felix@1162: if (logger.isDebugEnabled()) { felix@1162: if (wkms.size() > 0) { felix@1162: logger.debug("Generate series: " + series.getKey()); felix@1162: logger.debug("Start km: " + wkms.getKm(0)); felix@1791: logger.debug("End km: " + wkms.getKm(wkms.size()-1)); felix@1791: logger.debug("Values : " + wkms.size()); felix@1162: } felix@1151: } felix@1151: felix@1791: StyledSeriesBuilder.addPoints(series, wkms); felix@1151: felix@1933: addAxisSeries(series, YAXIS.D.idx, visible); sascha@1678: if (DataUtil.guessWaterIncreasing(wkms.allWs())) { felix@1162: setInverted(true); felix@1162: } felix@1151: } felix@1151: felix@1931: felix@1653: /** felix@1170: * felix@1170: */ felix@1170: @Override felix@1170: public JFreeChart generateChart() { felix@1170: JFreeChart chart = super.generateChart(); felix@1170: if (chart != null && chart.getPlot() != null) { felix@1170: XYPlot plot = (XYPlot) chart.getPlot(); felix@1170: plot.setRangeZeroBaselineVisible(true); felix@1170: } felix@1170: return chart; felix@1170: } felix@1170: felix@1943: felix@1170: /** felix@1151: * Get name of series (displayed in legend). felix@1151: * @return name of the series. felix@1151: */ felix@1151: protected String getSeriesName(WKms wqkms, String mode) { felix@1151: String name = wqkms.getName(); felix@1151: String prefix = (name != null && name.indexOf(mode) >= 0) felix@1151: ? null felix@1151: : mode; felix@1151: felix@1151: return (prefix != null && prefix.length() > 0) felix@1151: ? prefix + "(" + name +")" felix@1151: : name; felix@1151: } felix@1151: } felix@1151: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :