teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.exports.process; bjoern@4447: bjoern@4447: import org.apache.log4j.Logger; bjoern@4447: import org.jfree.data.xy.XYSeries; bjoern@4447: teichmann@5831: import org.dive4elements.artifactdatabase.state.ArtifactAndFacet; teichmann@5831: import org.dive4elements.artifacts.CallContext; aheinecke@7084: import org.dive4elements.river.artifacts.D4EArtifact; teichmann@5831: import org.dive4elements.river.artifacts.model.FacetTypes; teichmann@5831: import org.dive4elements.river.artifacts.model.WKms; teichmann@5831: import org.dive4elements.river.exports.StyledSeriesBuilder; teichmann@5831: import org.dive4elements.river.exports.XYChartGenerator; aheinecke@7067: import org.dive4elements.river.exports.DiagramGenerator; teichmann@5831: import org.dive4elements.river.jfree.StyledAreaSeriesCollection; teichmann@5831: import org.dive4elements.river.jfree.StyledXYSeries; teichmann@6905: import org.dive4elements.river.themes.ThemeDocument; aheinecke@7084: import org.dive4elements.river.utils.RiverUtils; bjoern@4447: bjoern@4447: /** felix@5800: * Add data to chart/generator. felix@5800: * bjoern@4447: * @author Björn Ricks bjoern@4447: */ aheinecke@7057: public class WOutProcessor extends DefaultProcessor { bjoern@4447: felix@5800: /** Private logger. */ bjoern@4447: private static final Logger logger = bjoern@4447: Logger.getLogger(WOutProcessor.class); bjoern@4447: aheinecke@7084: public static final String I18N_AXIS_LABEL = aheinecke@7084: "chart.longitudinal.section.yaxis.label"; aheinecke@7084: aheinecke@7084: public static final String I18N_AXIS_LABEL_DEFAULT = "W [NN + m]"; aheinecke@7084: bjoern@4447: @Override bjoern@4447: public void doOut( aheinecke@7067: DiagramGenerator generator, aheinecke@7075: ArtifactAndFacet bundle, aheinecke@7067: ThemeDocument theme, aheinecke@7067: boolean visible) { aheinecke@7067: CallContext context = generator.getCallContext(); aheinecke@7075: WKms wkms = (WKms) bundle.getData(context); aheinecke@7067: aheinecke@7067: logger.debug("doOut"); aheinecke@7067: aheinecke@7075: XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); aheinecke@7067: aheinecke@7067: StyledSeriesBuilder.addPoints(series, wkms); aheinecke@7067: generator.addAxisSeries(series, axisName, visible); aheinecke@7067: aheinecke@7067: // If a "band around the curve shall be drawn, add according area. aheinecke@7067: double bandWidth = theme.parseBandWidth(); aheinecke@7067: if (bandWidth > 0 ) { aheinecke@7067: XYSeries seriesDown = new StyledXYSeries( aheinecke@7075: "band " + bundle.getFacetDescription(), false, theme); aheinecke@7067: XYSeries seriesUp = new StyledXYSeries( aheinecke@7075: bundle.getFacetDescription()+"+/-"+bandWidth, false, theme); aheinecke@7067: StyledSeriesBuilder.addUpperBand(seriesUp, wkms, bandWidth); aheinecke@7067: StyledSeriesBuilder.addLowerBand(seriesDown, wkms, bandWidth); aheinecke@7067: aheinecke@7067: StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme); aheinecke@7067: area.addSeries(seriesUp); aheinecke@7067: area.addSeries(seriesDown); aheinecke@7067: area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN); aheinecke@7067: generator.addAreaSeries(area, axisName, visible); aheinecke@7067: } aheinecke@7067: aheinecke@7075: if (bundle.getFacetName().equals(FacetTypes.LONGITUDINAL_W) || aheinecke@7075: bundle.getFacetName().equals(FacetTypes.DISCHARGE_LONGITUDINAL_W) || aheinecke@7075: bundle.getFacetName().equals(FacetTypes.STATIC_WQKMS_W)) { aheinecke@7067: /* Only use W values to check if the diagram should be inverted aheinecke@7067: * see flys/issue1290 for details */ aheinecke@7081: generator.setInverted(wkms.guessRTLData()); aheinecke@7067: } aheinecke@7067: } aheinecke@7067: aheinecke@7067: @Override aheinecke@7067: public void doOut( bjoern@4447: XYChartGenerator generator, aheinecke@7075: ArtifactAndFacet bundle, teichmann@6905: ThemeDocument theme, felix@5341: boolean visible, felix@5341: int index) bjoern@4447: { bjoern@4447: CallContext context = generator.getCallContext(); aheinecke@7075: WKms wkms = (WKms) bundle.getData(context); bjoern@4447: bjoern@4447: logger.debug("doOut"); bjoern@4447: aheinecke@7075: XYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme); bjoern@4447: bjoern@4447: StyledSeriesBuilder.addPoints(series, wkms); bjoern@4447: generator.addAxisSeries(series, index, visible); bjoern@4447: bjoern@4447: // If a "band around the curve shall be drawn, add according area. teichmann@6905: double bandWidth = theme.parseBandWidth(); bjoern@4447: if (bandWidth > 0 ) { bjoern@4447: XYSeries seriesDown = new StyledXYSeries( aheinecke@7075: "band " + bundle.getFacetDescription(), false, theme); bjoern@4447: XYSeries seriesUp = new StyledXYSeries( aheinecke@7075: bundle.getFacetDescription()+"+/-"+bandWidth, false, theme); bjoern@4447: StyledSeriesBuilder.addUpperBand(seriesUp, wkms, bandWidth); bjoern@4447: StyledSeriesBuilder.addLowerBand(seriesDown, wkms, bandWidth); bjoern@4447: bjoern@4447: StyledAreaSeriesCollection area = new StyledAreaSeriesCollection(theme); bjoern@4447: area.addSeries(seriesUp); bjoern@4447: area.addSeries(seriesDown); bjoern@4447: area.setMode(StyledAreaSeriesCollection.FILL_MODE.BETWEEN); bjoern@4447: generator.addAreaSeries(area, index, visible); bjoern@4447: } bjoern@4447: aheinecke@7075: if (bundle.getFacetName().equals(FacetTypes.LONGITUDINAL_W) || aheinecke@7075: bundle.getFacetName().equals(FacetTypes.DISCHARGE_LONGITUDINAL_W) || aheinecke@7075: bundle.getFacetName().equals(FacetTypes.STATIC_WQKMS_W)) { aheinecke@6643: /* Only use W values to check if the diagram should be inverted aheinecke@6643: * see flys/issue1290 for details */ aheinecke@7081: generator.setInverted(wkms.guessRTLData()); aheinecke@6643: } bjoern@4447: } bjoern@4447: aheinecke@7084: @Override aheinecke@7084: public String getAxisLabel(DiagramGenerator generator) { aheinecke@7084: D4EArtifact flys = (D4EArtifact) generator.getMaster(); aheinecke@7084: aheinecke@7084: String unit = RiverUtils.getRiver(flys).getWstUnit().getName(); aheinecke@7084: aheinecke@7084: logger.debug("HALLO ANDRE LABEL"); aheinecke@7084: aheinecke@7084: return generator.msg( aheinecke@7084: I18N_AXIS_LABEL, aheinecke@7084: I18N_AXIS_LABEL_DEFAULT, aheinecke@7084: new Object[] { unit }); aheinecke@7084: } aheinecke@7084: bjoern@4447: /** felix@5341: * Returns true if facettype is longitutinal_section.w . bjoern@4447: */ bjoern@4447: @Override felix@5800: public boolean canHandle(String facetType) { felix@5800: if (facetType == null) { bjoern@4447: return false; bjoern@4447: } bjoern@4447: felix@5800: if (facetType.equals(FacetTypes.LONGITUDINAL_W) felix@5800: || facetType.equals(FacetTypes.STATIC_WKMS) felix@5800: || facetType.equals(FacetTypes.HEIGHTMARKS_POINTS) felix@5800: || facetType.equals(FacetTypes.STATIC_WQKMS) felix@5800: || facetType.equals(FacetTypes.STATIC_WQKMS_W) felix@5800: || facetType.equals(FacetTypes.DISCHARGE_LONGITUDINAL_W)) bjoern@4447: { bjoern@4447: return true; bjoern@4447: } bjoern@4447: return false; bjoern@4447: } bjoern@4447: } felix@5341: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :