felix@1111: package de.intevation.flys.exports; felix@1111: felix@2042: import java.util.List; felix@2042: felix@1111: import org.apache.log4j.Logger; felix@1111: felix@1111: import org.jfree.chart.JFreeChart; felix@1111: import org.jfree.chart.title.TextTitle; felix@1116: import org.jfree.data.xy.XYSeries; felix@1111: felix@1111: import org.w3c.dom.Document; felix@1111: ingo@2074: import de.intevation.artifacts.DataProvider; ingo@2074: felix@1944: import de.intevation.artifactdatabase.state.ArtifactAndFacet; felix@1111: felix@1111: import de.intevation.flys.artifacts.model.FacetTypes; felix@2042: import de.intevation.flys.artifacts.model.CrossSectionFacet; ingo@2074: import de.intevation.flys.jfree.StyledXYSeries; felix@1111: sascha@2126: import de.intevation.flys.model.FastCrossSectionLine; sascha@2120: felix@1111: /** felix@1111: * An OutGenerator that generates cross section graphs. felix@1111: */ felix@1111: public class CrossSectionGenerator felix@2104: extends LongitudinalSectionGenerator//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: ingo@2052: @Override ingo@2052: protected YAxisWalker getYAxisWalker() { ingo@2052: return new YAxisWalker() { ingo@2052: @Override ingo@2052: public int length() { ingo@2052: return 1; ingo@2052: } ingo@2052: ingo@2052: /** Get identifier for this index. */ ingo@2052: @Override ingo@2052: public String getId(int idx) { ingo@2052: return "W"; ingo@2052: } ingo@2052: }; ingo@2052: } ingo@2052: ingo@2052: felix@1125: /** felix@1125: * Get localized chart title. felix@1125: */ ingo@2048: @Override felix@2104: public String getDefaultChartTitle() { 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@1111: @Override ingo@1989: protected String getChartSubtitle() { ingo@2048: // XXX NOTE: overriding this method disables ChartSettings subtitle! ingo@2048: return getDefaultChartSubtitle(); ingo@2048: } ingo@2048: ingo@2048: ingo@2048: @Override ingo@2048: protected String getDefaultChartSubtitle() { felix@2042: List providers = felix@2042: context.getDataProvider(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA); felix@2042: double km = 0d; felix@2042: if (providers.size() > 0) { sascha@2120: FastCrossSectionLine csl = (FastCrossSectionLine) providers.get(0). felix@2042: provideData(CrossSectionFacet.BLACKBOARD_CS_MASTER_DATA, felix@2042: null, context); sascha@2120: km = csl.getKm(); felix@2042: } felix@1111: felix@1111: Object[] args = new Object[] { felix@1111: getRiverName(), felix@2042: km felix@1111: }; felix@1111: ingo@1989: return msg(I18N_CHART_SUBTITLE, "", args); ingo@1989: } ingo@1989: ingo@1989: ingo@1989: @Override ingo@1989: protected void addSubtitles(JFreeChart chart) { ingo@1989: String subtitle = getChartSubtitle(); felix@1111: chart.addSubtitle(new TextTitle(subtitle)); felix@1111: } felix@1111: felix@1111: ingo@2051: @Override ingo@2051: protected String getDefaultXAxisLabel() { felix@1111: return msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT); felix@1111: } felix@1111: felix@1111: ingo@2051: @Override ingo@2051: protected String getDefaultYAxisLabel(int pos) { felix@1111: return msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT); felix@1111: } felix@1111: felix@1111: felix@1111: /** felix@1116: * Let one facet do its job. felix@1116: */ ingo@1684: public void doOut( felix@1944: ArtifactAndFacet artifactFacet, felix@1944: Document attr, felix@1944: boolean visible ingo@1684: ) { felix@1944: String name = artifactFacet.getFacetName(); 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: if (name.equals(CROSS_SECTION)) { ingo@1684: doCrossSectionOut( felix@1944: artifactFacet.getData(context), felix@1944: artifactFacet.getFacetDescription(), ingo@1684: attr, ingo@1684: visible); felix@1111: } felix@1122: else if (name.equals(CROSS_SECTION_WATER_LINE)) { ingo@1684: doCrossSectionWaterLineOut( felix@1944: artifactFacet.getData(context), felix@1944: artifactFacet.getFacetDescription(), ingo@1684: attr, ingo@1684: visible); felix@1122: } felix@2020: else if (FacetTypes.IS.AREA(name)) { felix@2006: doArea(artifactFacet.getData(context), felix@2006: artifactFacet.getFacetDescription(), felix@2006: attr, felix@2006: visible); felix@2006: } felix@1111: else { felix@1111: logger.warn("CrossSection.doOut: Unknown facet name: " + name); felix@1111: return; felix@1111: } felix@1111: } felix@1111: felix@2020: felix@2104: /** Look up the axis identifier for a given facet type. */ felix@2104: public int axisIdxForFacet(String facetName) { felix@2104: // TODO Where to add thid axis too. felix@2104: return 0; felix@2006: } felix@1111: felix@2020: 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: */ ingo@1684: protected void doCrossSectionWaterLineOut( ingo@1684: Object o, ingo@1684: String seriesName, ingo@1684: Document theme, ingo@1684: boolean visible ingo@1684: ) { felix@1122: logger.debug("CrossSectionGenerator.doCrossSectionWaterLineOut"); felix@1141: sascha@1741: // DO NOT SORT DATA! This destroys the gaps indicated by NaNs sascha@1741: XYSeries series = new StyledXYSeries(seriesName, false, theme); felix@1122: felix@1791: StyledSeriesBuilder.addPoints(series, (double [][]) o); felix@1791: felix@1931: addAxisSeries(series, 0, visible); 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: */ ingo@1684: protected void doCrossSectionOut( ingo@1684: Object o, ingo@1684: String seriesName, ingo@1684: Document theme, ingo@1684: boolean visible ingo@1684: ) { felix@1116: logger.debug("CrossSectionGenerator.doCrossSectionOut"); felix@1111: felix@1141: XYSeries series = new StyledXYSeries(seriesName, theme); felix@1122: felix@1791: StyledSeriesBuilder.addPoints(series, (double [][]) o); felix@1791: felix@1931: addAxisSeries(series, 0, visible); felix@1111: } felix@1111: } felix@1111: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :