annotate artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffYearProcessor.java @ 8472:3f505fba522f

(issue1772) Use 0.001km tolarance instead of 0.1 to find matching km. There is no sense to use a define here. I will not write static final double NULLPOINTNULLNULLONE=0.001 if i just want to use that value and not any other value which may make sense in some other place. Using hardcoded values can have its merits and makes the code easier to read.
author Andre Heinecke <andre.heinecke@intevation.de>
date Tue, 18 Nov 2014 15:24:40 +0100
parents e4606eae8ea5
children 5dea205ea3e7
rev   line source
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
2 * Software engineering by Intevation GmbH
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
3 *
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
6 * documentation coming with Dive4Elements River for details.
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
7 */
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
8
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
9 package org.dive4elements.river.exports.process;
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
10
7892
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
11 import java.util.Map;
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
12
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
13 import org.apache.log4j.Logger;
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
14 import org.dive4elements.artifactdatabase.state.ArtifactAndFacet;
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
15 import org.dive4elements.artifacts.CallContext;
7808
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
16 import org.dive4elements.river.artifacts.D4EArtifact;
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
17 import org.dive4elements.river.artifacts.access.RiverAccess;
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
18 import org.dive4elements.river.artifacts.context.RiverContext;
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
19 import org.dive4elements.river.artifacts.model.FacetTypes;
7808
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
20 import org.dive4elements.river.artifacts.model.ZoomScale;
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
21 import org.dive4elements.river.artifacts.resources.Resources;
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
22 import org.dive4elements.river.exports.StyledSeriesBuilder;
7092
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
23 import org.dive4elements.river.exports.DiagramGenerator;
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
24 import org.dive4elements.river.jfree.StyledXYSeries;
6905
1b35b2ddfc28 Artifacts: Introduce ThemeDocument & make stuff compileable again. THIS BREAKS THE SYSTEM! TODO: Move ThemeUtils into ThemeDocument.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 6863
diff changeset
25 import org.dive4elements.river.themes.ThemeDocument;
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
26
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
27
7058
5c07024cdc24 Fix indention / line length
Andre Heinecke <aheinecke@intevation.de>
parents: 7057
diff changeset
28 public class BedDiffYearProcessor
5c07024cdc24 Fix indention / line length
Andre Heinecke <aheinecke@intevation.de>
parents: 7057
diff changeset
29 extends DefaultProcessor implements FacetTypes {
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
30
8202
e4606eae8ea5 sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents: 8078
diff changeset
31 private final static Logger log =
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
32 Logger.getLogger(BedDiffYearProcessor.class);
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
33
6778
cbe9ac4380a5 issue1439: Show line segments for points that have gaps on both sides. Small refac.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6771
diff changeset
34 protected static double GAP_TOLERANCE = 0.101d;
cbe9ac4380a5 issue1439: Show line segments for points that have gaps on both sides. Small refac.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 6771
diff changeset
35
7892
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
36 protected String yAxisLabel;
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
37
7146
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
38 public static final String I18N_AXIS_LABEL =
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
39 "chart.beddifference.yaxis.label.diff";
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
40 public static final String I18N_AXIS_LABEL_DEFAULT =
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
41 "delta S [cm]";
7808
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
42 public static final String I18N_SUBTITLE_RADIUS =
ea6b441b4872 Calculate the zoom dependent radius and add the informations to chart subtitle.
Raimund Renkert <rrenkert@intevation.de>
parents: 7727
diff changeset
43 "chart.subtitle.radius";
7146
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
44
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
45 @Override
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
46 public void doOut(
7092
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
47 DiagramGenerator generator,
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
48 ArtifactAndFacet bundle,
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
49 ThemeDocument theme,
7985
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
50 boolean visible
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
51 ) {
7092
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
52 CallContext context = generator.getCallContext();
7892
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
53 Map<String, String> metaData =
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
54 bundle.getFacet().getMetaData(bundle.getArtifact(), context);
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
55 yAxisLabel = metaData.get("Y");
8001
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
56
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
57 setSubtitleRadius(generator, bundle, context);
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
58
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
59 Object data = bundle.getData(context);
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
60 if (data == null) {
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
61 return;
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
62 }
5277483044d9 Fixed NPE when loading folders from datacage.
Raimund Renkert <rrenkert@intevation.de>
parents: 7991
diff changeset
63
7985
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
64 if (!(data instanceof double[][])) {
8202
e4606eae8ea5 sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents: 8078
diff changeset
65 log.error("Can't process " + data.getClass().getName() + " objects");
7092
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
66 return;
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
67 }
7985
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
68 double[][] bData = (double[][]) data;
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
69
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
70 StyledXYSeries series = new StyledXYSeries(bundle.getFacetDescription(), theme);
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
71 series.putMetaData(metaData, bundle.getArtifact(), context);
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
72 StyledSeriesBuilder.addPointsFactorY(series,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
73 bData,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
74 false,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
75 GAP_TOLERANCE,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
76 100d);
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
77
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
78 generator.addAxisSeries(series, axisName, visible);
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
79
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
80 return;
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
81 }
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
82
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
83 private void setSubtitleRadius(
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
84 DiagramGenerator generator,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
85 ArtifactAndFacet bundle,
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
86 CallContext context
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
87 ) {
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
88 Double start = (Double)context.getContextValue("startkm");
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
89 Double end = (Double)context.getContextValue("endkm");
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
90 if (start != null && end != null) {
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
91 D4EArtifact artifact = (D4EArtifact)bundle.getArtifact();
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
92 RiverContext fc = (RiverContext)context.globalContext();
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
93 // Adaptive smoothing, based on zoom factor/diagram extents.
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
94 ZoomScale scales = (ZoomScale)fc.get("zoomscale");
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
95 RiverAccess access = new RiverAccess((D4EArtifact)artifact);
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
96 String river = access.getRiverName();
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
97
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
98 double radius = scales.getRadius(river, start, end);
8078
a403dbdb9e81 Added $RADIUS zoom scale sub title logic to other diagrams.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 8001
diff changeset
99 context.putContextValue("radius", radius);
7985
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
100 generator.addSubtitle(Resources.getMsg(
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
101 context.getMeta(),
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
102 I18N_SUBTITLE_RADIUS,
8078
a403dbdb9e81 Added $RADIUS zoom scale sub title logic to other diagrams.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 8001
diff changeset
103 new Object[] { "$RADIUS" }));
7985
10debf4b82be Split bed differences facet into data specific facets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7892
diff changeset
104 }
7092
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
105 }
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
106
6563262052ab Add DiagramGenerator doOut function
Andre Heinecke <aheinecke@intevation.de>
parents: 7075
diff changeset
107 @Override
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
108 public boolean canHandle(String facetType) {
7705
f1257717fa4b (issue1594) Move Bed differences absolute height into the correct processor
Andre Heinecke <aheinecke@intevation.de>
parents: 7683
diff changeset
109 return BED_DIFFERENCE_YEAR.equals(facetType) // from BedDifferencesYear
7683
28758f51f1b2 issue1594/issue1603: Put bed_differences to correct axis.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 7146
diff changeset
110 || BED_DIFFERENCE_YEAR_FILTERED.equals(facetType); // from BedDifferencesYear
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
111 }
7146
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
112
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
113 @Override
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
114 public String getAxisLabel(DiagramGenerator generator) {
7892
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
115 if (yAxisLabel != null && !yAxisLabel.isEmpty()) {
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
116 return generator.msg(yAxisLabel, I18N_AXIS_LABEL_DEFAULT);
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
117 }
7146
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
118 return generator.msg(
7892
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
119 I18N_AXIS_LABEL,
e844be34a606 Add metadata to chart series and datasets.
Raimund Renkert <rrenkert@intevation.de>
parents: 7808
diff changeset
120 I18N_AXIS_LABEL_DEFAULT);
7146
414794d0a50d Add label for bed difference axis
Andre Heinecke <aheinecke@intevation.de>
parents: 7092
diff changeset
121 }
6570
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
122 }
6435b3d7fb52 Refactored BedDifferenceYearGenerator to use new BedDiffYearProcessor.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
diff changeset
123 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org