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 :