ingo@392: package de.intevation.flys.exports; ingo@392: import org.apache.log4j.Logger; ingo@392: felix@1083: import java.util.ArrayList; felix@1083: import java.util.List; felix@1083: ingo@392: import org.w3c.dom.Document; ingo@392: felix@1092: import java.awt.Color; ingo@414: import org.jfree.chart.JFreeChart; felix@1092: import org.jfree.chart.annotations.XYAnnotation; ingo@414: import org.jfree.chart.title.TextTitle; felix@1092: import org.jfree.chart.plot.XYPlot; ingo@923: import org.jfree.data.xy.XYSeries; felix@1092: import org.jfree.data.xy.XYSeriesCollection; ingo@414: ingo@392: import de.intevation.artifacts.Artifact; ingo@392: ingo@695: import de.intevation.artifactdatabase.state.Facet; ingo@695: ingo@696: import de.intevation.flys.artifacts.FLYSArtifact; felix@1089: import de.intevation.flys.artifacts.model.NamedDouble; ingo@696: import de.intevation.flys.artifacts.model.FacetTypes; ingo@393: import de.intevation.flys.artifacts.model.WQKms; felix@1085: felix@1083: import de.intevation.flys.jfree.StickyAxisAnnotation; ingo@393: felix@1092: import de.intevation.flys.utils.ThemeUtil; felix@1092: ingo@392: ingo@392: /** ingo@392: * An OutGenerator that generates discharge curves. ingo@392: * ingo@392: * @author Ingo Weinzierl ingo@392: */ ingo@696: public class ComputedDischargeCurveGenerator ingo@696: extends DischargeCurveGenerator ingo@696: implements FacetTypes ingo@696: { felix@1081: /** The logger used in this generator. */ ingo@392: private static Logger logger = ingo@392: Logger.getLogger(ComputedDischargeCurveGenerator.class); ingo@392: ingo@392: ingo@408: public static final String I18N_CHART_TITLE = ingo@408: "chart.computed.discharge.curve.title"; ingo@408: ingo@414: public static final String I18N_CHART_SUBTITLE = ingo@414: "chart.computed.discharge.curve.subtitle"; ingo@414: ingo@408: public static final String I18N_YAXIS_LABEL = ingo@408: "chart.computed.discharge.curve.yaxis.label"; ingo@408: ingo@408: public static final String I18N_CHART_TITLE_DEFAULT = "Abflusskurve"; ingo@408: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; felix@1092: public static final String I18N_MAINVALUES_Q_LABEL = "Q (Haupt- und Extremwerte)"; felix@1092: public static final String I18N_MAINVALUES_W_LABEL = "W (Haupt- und Extremwerte)"; ingo@408: felix@1089: /** List of Annotations (specifically, Main Values). */ felix@1089: protected List annotations; felix@1085: felix@1092: /** Pseudo-Dataseries to have a legend for annotations. */ felix@1092: protected XYSeriesCollection pseudoAnnotationData = null; felix@1092: felix@1085: // TODO Let theme pass through to annotations-facets. felix@1083: felix@1083: felix@1083: /** Trivial Constructor. */ felix@1083: public ComputedDischargeCurveGenerator () { felix@1083: super(); felix@1089: annotations= new ArrayList(); felix@1083: } felix@1083: ingo@408: ingo@392: @Override ingo@400: protected String getChartTitle() { ingo@408: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); ingo@400: } ingo@400: ingo@400: ingo@400: @Override ingo@414: protected void addSubtitles(JFreeChart chart) { ingo@414: double[] dist = getRange(); ingo@414: ingo@414: Object[] args = new Object[] { ingo@414: getRiverName(), ingo@414: dist[0] ingo@414: }; ingo@414: ingo@414: String subtitle = msg(I18N_CHART_SUBTITLE, "", args); ingo@414: chart.addSubtitle(new TextTitle(subtitle)); ingo@414: } ingo@414: ingo@414: ingo@414: @Override ingo@400: protected String getYAxisLabel() { ingo@408: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); ingo@400: } ingo@400: ingo@400: ingo@400: @Override ingo@695: public void doOut(Artifact artifact, Facet facet, Document attr) { felix@1081: String name = (facet != null) ? facet.getName() : null; ingo@393: ingo@696: logger.debug("ComputedDischargeCurveGenerator.doOut: " + name); ingo@393: felix@1085: if (name == null) { felix@1085: logger.warn("Broken facet in computed discharge out generation."); felix@1085: return; felix@1085: } felix@1085: ingo@696: FLYSArtifact flys = (FLYSArtifact) artifact; ingo@696: Facet f = flys.getNativeFacet(facet); ingo@696: felix@1083: if (name.equals(COMPUTED_DISCHARGE_Q)) { ingo@924: doQOut((WQKms) f.getData(artifact, context), attr); ingo@696: } felix@1085: else if (name.equals(COMPUTED_DISCHARGE_MAINVALUES_Q)) { felix@1089: doMainValueQAnnotations(f.getData(artifact, context), attr); felix@1085: } felix@1085: else if (name.equals(COMPUTED_DISCHARGE_MAINVALUES_W)) { felix@1089: doMainValueWAnnotations(f.getData(artifact, context), attr); felix@1083: } ingo@696: else { ingo@696: logger.warn("Unknown facet type for computed discharge: " + name); ingo@696: return; ingo@696: } ingo@696: } ingo@696: ingo@696: felix@1083: /** felix@1085: * Store W MainValues as annotations for later plotting. felix@1083: */ felix@1085: protected void doMainValueWAnnotations(Object o, Document theme) { felix@1085: logger.debug("ComputedDischargeCurveGenerator set W MainValues."); felix@1092: if (pseudoAnnotationData == null) { felix@1092: pseudoAnnotationData = new XYSeriesCollection(); felix@1092: } felix@1092: felix@1092: Color color = ThemeUtil.parseLineColorField(theme); felix@1092: if (color == null) { felix@1092: color = Color.black; felix@1092: } felix@1092: felix@1089: List mainValuesW = (List) o; felix@1089: for (NamedDouble mv: mainValuesW) { felix@1089: float pos = (float) mv.getValue(); felix@1089: String text = mv.getName(); felix@1089: StickyAxisAnnotation ta = new StickyAxisAnnotation(text, pos, felix@1089: StickyAxisAnnotation.SimpleAxis.Y_AXIS); felix@1092: ta.setPaint(color); felix@1089: this.annotations.add(ta); felix@1089: } felix@1092: String label = msg(I18N_MAINVALUES_W_LABEL, I18N_MAINVALUES_W_LABEL, null); felix@1092: pseudoAnnotationData.addSeries(new StyledXYSeries(label, theme)); felix@1085: } felix@1085: felix@1085: felix@1085: /** felix@1085: * Store Q MainValues as annotations for later plotting. felix@1085: */ felix@1085: protected void doMainValueQAnnotations(Object o, Document theme) { felix@1085: logger.debug("ComputedDischargeCurveGenerator set Q MainValues."); felix@1092: felix@1092: Color color = ThemeUtil.parseLineColorField(theme); felix@1092: if (color == null) { felix@1092: color = Color.black; felix@1092: } felix@1092: felix@1092: if (pseudoAnnotationData == null) { felix@1092: pseudoAnnotationData = new XYSeriesCollection(); felix@1092: } felix@1092: felix@1089: List mainValuesQ = (List) o; felix@1089: for (NamedDouble mv: mainValuesQ) { felix@1089: float pos = (float) mv.getValue(); felix@1089: String text = mv.getName(); felix@1089: StickyAxisAnnotation ta = new StickyAxisAnnotation(text, pos); felix@1092: ta.setPaint(color); felix@1089: this.annotations.add(ta); felix@1089: } felix@1092: String label = msg(I18N_MAINVALUES_Q_LABEL, I18N_MAINVALUES_Q_LABEL, null); felix@1092: pseudoAnnotationData.addSeries(new StyledXYSeries(label, theme)); felix@1083: } felix@1083: felix@1083: felix@1083: /** Generate Chart with annotations. */ felix@1083: @Override felix@1083: public JFreeChart generateChart() { felix@1083: JFreeChart c = super.generateChart(); felix@1083: XYPlot p = (XYPlot) c.getPlot(); felix@1089: redoAnnotations(p); felix@1083: return c; felix@1083: } felix@1083: felix@1083: felix@1083: /** felix@1083: * Recalculate some annotation positions and add them to plot. felix@1083: * Annotations represent MainValues. felix@1083: * @param plot Plot to add annotations to. felix@1083: */ felix@1089: protected void redoAnnotations(XYPlot plot) { felix@1083: plot.clearAnnotations(); felix@1089: felix@1089: for (XYAnnotation a: annotations) { felix@1089: plot.addAnnotation(a, false); felix@1083: } felix@1083: } felix@1083: felix@1083: felix@1083: /** felix@1083: * Add Q-Series to plot. felix@1083: * @param wqkms actual data felix@1083: * @param theme theme to use. felix@1083: */ ingo@924: protected void doQOut(WQKms wqkms, Document theme) { ingo@393: int size = wqkms.size(); ingo@393: ingo@393: double[] res = new double[3]; ingo@393: ingo@924: XYSeries series = new StyledXYSeries(getSeriesName(wqkms), theme); ingo@393: for (int i = 0; i < size; i++) { ingo@393: res = wqkms.get(i, res); ingo@923: series.add(res[1], res[0]); ingo@393: } ingo@393: ingo@923: addFirstAxisSeries(series); ingo@393: } ingo@393: felix@1092: /** felix@1092: * Add datasets to plot. felix@1092: * @param plot plot to add datasets to. felix@1092: * @todo merge with LongitudinalSectionGenerator/superclass. felix@1092: */ felix@1092: @Override felix@1092: protected void addDatasets(XYPlot plot) { felix@1092: super.addDatasets(plot); felix@1092: if (pseudoAnnotationData != null) { felix@1092: plot.setDataset(2, pseudoAnnotationData); felix@1092: } felix@1092: } felix@1092: ingo@456: protected String getSeriesName(WQKms wqkms) { ingo@456: Object[] args = new Object[] { ingo@456: getRiverName(), ingo@456: wqkms.getName() ingo@456: }; ingo@456: ingo@456: return msg( ingo@456: "chart.computed.discharge.curve.curve.label", ingo@456: "", ingo@456: args); ingo@456: } ingo@392: } ingo@392: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :