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@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@1111: public static final String I18N_CHART_TITLE_DEFAULT = "Querschnittt"; felix@1111: public static final String I18N_XAXIS_LABEL_DEFAULT = "m"; felix@1111: public static final String I18N_YAXIS_LABEL_DEFAULT = "W [NN + m]"; felix@1111: felix@1111: felix@1111: protected boolean inverted; felix@1111: felix@1111: felix@1111: /** Trivial Constructor. */ felix@1111: public CrossSectionGenerator() { felix@1111: super(); felix@1111: } felix@1111: felix@1111: felix@1111: protected String getChartTitle() { felix@1111: return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT); felix@1111: } felix@1111: felix@1111: public boolean isInverted() { felix@1111: return inverted; felix@1111: } felix@1111: felix@1111: public void setInverted(boolean inverted) { felix@1111: this.inverted = inverted; felix@1111: } felix@1111: felix@1111: @Override felix@1111: protected void addSubtitles(JFreeChart chart) { felix@1111: double[] dist = getRange(); felix@1111: felix@1111: Object[] args = new Object[] { felix@1111: getRiverName(), felix@1111: dist[0], felix@1111: dist[1] felix@1111: }; felix@1111: felix@1111: //String subtitle = msg(I18N_CHART_SUBTITLE, "", args); felix@1111: String subtitle = "bogus"; felix@1111: chart.addSubtitle(new TextTitle(subtitle)); felix@1111: } felix@1111: felix@1111: @Override felix@1111: public JFreeChart generateChart() { felix@1111: JFreeChart c = super.generateChart(); felix@1111: XYPlot p = (XYPlot) c.getPlot(); felix@1111: felix@1111: return c; felix@1111: } felix@1111: felix@1111: felix@1111: protected String getXAxisLabel() { felix@1111: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); felix@1111: } felix@1111: felix@1111: 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: invertXAxis(plot.getDomainAxis()); felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1111: * This method overrides the XYChartGenerators zoomY method to include the 0 felix@1111: * 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@1111: * This method inverts the x-axis based on the kilometer information of the felix@1111: * selected river. If the head of the river is at kilometer 0, the axis is felix@1111: * not inverted, otherwise it is. felix@1111: * felix@1111: * @param xaxis The domain axis. felix@1111: */ felix@1111: protected void invertXAxis(ValueAxis xaxis) { felix@1111: felix@1111: if (inverted) { felix@1111: logger.debug("Invert X-Axis."); felix@1111: xaxis.setInverted(true); felix@1111: } felix@1111: } felix@1111: felix@1111: felix@1116: /** 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@1111: doCrossSectionOut(f.getData(artifact, context), attr); felix@1111: } 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@1116: * Do cross sections out. felix@1111: * felix@1116: * @param theme Theme for the data series. felix@1111: */ felix@1111: protected void doCrossSectionOut(Object o, Document theme) { felix@1116: logger.debug("CrossSectionGenerator.doCrossSectionOut"); felix@1111: felix@1116: XYSeries series = new StyledXYSeries("bogus", theme); felix@1116: // Add increadibly sophisticated values. felix@1116: series.add(4, 4); felix@1116: series.add(5, 14); felix@1116: addFirstAxisSeries(series); felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1111: * Get name of series (displayed in legend). felix@1111: * @return name of the series. felix@1111: */ felix@1111: protected String getSeriesName(WQKms wqkms, String mode) { felix@1111: String name = wqkms.getName(); felix@1111: String prefix = name != null && name.indexOf(mode) >= 0 ? null : mode; felix@1111: felix@1111: return prefix != null && prefix.length() > 0 felix@1111: ? prefix + "(" + name +")" felix@1111: : name; felix@1111: } felix@1111: } felix@1111: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : felix@1111: