felix@1111: package de.intevation.flys.exports; felix@1111: felix@1111: import org.apache.log4j.Logger; felix@1111: felix@1111: import org.jfree.chart.JFreeChart; felix@1111: import org.jfree.chart.axis.NumberAxis; felix@1111: import org.jfree.chart.axis.ValueAxis; felix@1111: import org.jfree.chart.plot.XYPlot; felix@1111: import org.jfree.chart.title.TextTitle; felix@1111: import org.jfree.data.Range; felix@1116: import org.jfree.data.xy.XYSeries; felix@1111: felix@1111: import org.w3c.dom.Document; felix@1111: felix@1111: import de.intevation.artifacts.Artifact; felix@1111: felix@1111: import de.intevation.artifactdatabase.state.Facet; felix@1111: felix@1111: import de.intevation.flys.artifacts.FLYSArtifact; felix@1141: import de.intevation.flys.artifacts.WINFOArtifact; felix@1111: felix@1111: import de.intevation.flys.artifacts.model.FacetTypes; felix@1111: import de.intevation.flys.artifacts.model.WQKms; felix@1111: felix@1111: felix@1111: /** felix@1111: * An OutGenerator that generates cross section graphs. felix@1111: */ felix@1111: public class CrossSectionGenerator felix@1111: extends XYChartGenerator felix@1111: implements FacetTypes felix@1111: { felix@1111: /** The logger that is used in this generator. */ felix@1111: private static Logger logger = felix@1111: Logger.getLogger(CrossSectionGenerator.class); felix@1111: felix@1111: public static final String I18N_CHART_TITLE = felix@1111: "chart.cross_section.title"; felix@1111: felix@1111: public static final String I18N_CHART_SUBTITLE = felix@1111: "chart.cross_section.subtitle"; felix@1111: felix@1111: public static final String I18N_XAXIS_LABEL = felix@1111: "chart.cross_section.xaxis.label"; felix@1111: felix@1111: public static final String I18N_YAXIS_LABEL = felix@1111: "chart.cross_section.yaxis.label"; felix@1111: felix@1125: public static final String I18N_CHART_TITLE_DEFAULT = "Querprofildiagramm"; felix@1125: public static final String I18N_XAXIS_LABEL_DEFAULT = "Abstand [m]"; felix@1125: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; felix@1111: felix@1111: felix@1111: /** Trivial Constructor. */ felix@1111: public CrossSectionGenerator() { felix@1111: super(); felix@1111: } felix@1111: felix@1111: felix@1125: /** felix@1125: * Get localized chart title. felix@1125: */ felix@1111: protected String getChartTitle() { felix@1125: // TODO get river etc for localized heading felix@1141: Object[] i18n_msg_args = new Object[] { felix@1141: getRiverName() felix@1141: }; felix@1141: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT, i18n_msg_args); felix@1111: } felix@1111: felix@1111: felix@1125: /** felix@1125: * Add localized subtitle to chart. felix@1125: */ felix@1111: @Override felix@1111: protected void addSubtitles(JFreeChart chart) { felix@1125: double[] dist = getRange(); felix@1111: felix@1111: Object[] args = new Object[] { felix@1111: getRiverName(), felix@1141: getKm() felix@1111: }; felix@1111: felix@1125: String subtitle = msg(I18N_CHART_SUBTITLE, "", args); felix@1111: chart.addSubtitle(new TextTitle(subtitle)); felix@1111: } felix@1111: felix@1111: felix@1125: /** felix@1125: * Get localized X Axis label. felix@1125: */ felix@1111: protected String getXAxisLabel() { felix@1111: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); felix@1111: } felix@1111: felix@1111: felix@1125: /** felix@1141: * Get cross_section.km data from artifact. felix@1141: */ felix@1141: protected Double getKm() { felix@1141: try { felix@1141: WINFOArtifact winfo = (WINFOArtifact) master; felix@1142: return winfo.getCrossSectionSnapKm(); felix@1141: } felix@1141: catch (Exception e) { felix@1141: logger.error("Cannot convert cross_section.km to double"); felix@1141: return 0.0d; felix@1141: } felix@1141: } felix@1141: felix@1141: felix@1141: /** felix@1125: * Get localized Y Axis label. felix@1125: */ felix@1111: protected String getYAxisLabel() { felix@1111: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); felix@1111: } felix@1111: felix@1111: felix@1111: protected void adjustAxes(XYPlot plot) { felix@1111: super.adjustAxes(plot); felix@1111: felix@1111: NumberAxis qAxis = new NumberAxis( felix@1111: msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT)); felix@1111: felix@1111: plot.setRangeAxis(1, qAxis); felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1125: * Overrides XYChartGenerators.zoomY() to include the 0 value on the Q axis. felix@1111: */ felix@1111: @Override felix@1111: protected boolean zoomY(XYPlot plot, ValueAxis axis, Range range, Range x) { felix@1111: if (plot.getRangeAxisIndex(axis) == 1) { felix@1111: // we want the Q axis to start at 0 if no zooming has been done felix@1111: range = new Range(0d, range.getUpperBound()); felix@1111: } felix@1111: felix@1111: return super.zoomY(plot, axis, range, x); felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1116: * Let one facet do its job. felix@1116: */ felix@1111: public void doOut(Artifact artifact, Facet facet, Document attr) { felix@1111: String name = facet.getName(); felix@1111: felix@1111: logger.debug("CrossSectionGenerator.doOut: " + name); felix@1111: felix@1111: if (name == null) { felix@1111: logger.error("No facet name for doOut(). No output generated!"); felix@1111: return; felix@1111: } felix@1111: felix@1111: FLYSArtifact flys = (FLYSArtifact) artifact; felix@1111: Facet f = flys.getNativeFacet(facet); felix@1111: felix@1111: if (f == null) { felix@1111: return; felix@1111: } felix@1111: felix@1111: if (name.equals(CROSS_SECTION)) { felix@1141: doCrossSectionOut(f.getData(artifact, context), f.getDescription(), attr); felix@1111: } felix@1122: else if (name.equals(CROSS_SECTION_WATER_LINE)) { felix@1141: doCrossSectionWaterLineOut(f.getData(artifact, context), f.getDescription(), attr); felix@1122: } felix@1111: else { felix@1111: logger.warn("CrossSection.doOut: Unknown facet name: " + name); felix@1111: return; felix@1111: } felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1122: * Do cross sections waterline out. felix@1122: * felix@1141: * @param seriesName name of the data (line) to display in legend. felix@1122: * @param theme Theme for the data series. felix@1122: */ felix@1141: protected void doCrossSectionWaterLineOut(Object o, String seriesName, Document theme) { felix@1122: logger.debug("CrossSectionGenerator.doCrossSectionWaterLineOut"); felix@1141: felix@1141: XYSeries series = new StyledXYSeries(seriesName, theme); felix@1122: felix@1122: double[][] a = (double [][]) o; felix@1122: double [] pxs = a[0]; felix@1122: for (int i = 0; i < pxs.length; i++) { felix@1122: series.add (a[0][i], a[1][i]); felix@1122: } felix@1122: addFirstAxisSeries(series); felix@1122: } felix@1122: felix@1122: felix@1122: /** felix@1116: * Do cross sections out. felix@1111: * felix@1141: * @param seriesName name of the data (line) to display in legend. felix@1116: * @param theme Theme for the data series. felix@1111: */ felix@1141: protected void doCrossSectionOut(Object o, String seriesName, Document theme) { felix@1116: logger.debug("CrossSectionGenerator.doCrossSectionOut"); felix@1111: felix@1141: XYSeries series = new StyledXYSeries(seriesName, theme); felix@1122: felix@1122: double[][] a = (double [][]) o; felix@1122: double [] pxs = a[0]; felix@1122: for (int i = 0; i < pxs.length; i++) { felix@1122: series.add (a[0][i], a[1][i]); felix@1122: } felix@1116: addFirstAxisSeries(series); felix@1111: } felix@1111: } felix@1111: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :