comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java @ 3162:0d8146989012

Added labeling for Q/W points FixingsKMChartService. flys-artifacts/trunk@4774 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 25 Jun 2012 11:38:33 +0000
parents
children 6d0567a8387d
comparison
equal deleted inserted replaced
3161:cd8d81b2824d 3162:0d8146989012
1 package de.intevation.flys.artifacts.services;
2
3 import de.intevation.flys.artifacts.model.fixings.QW;
4
5 import de.intevation.flys.java2d.ShapeUtils;
6
7 import de.intevation.flys.jfree.ShapeRenderer;
8
9 import java.awt.BasicStroke;
10 import java.awt.Color;
11 import java.awt.Paint;
12 import java.awt.Shape;
13
14 import java.awt.geom.Rectangle2D;
15
16 import java.text.DateFormat;
17 import java.text.SimpleDateFormat;
18
19 import java.util.ArrayList;
20 import java.util.Date;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.jfree.chart.LegendItem;
26 import org.jfree.chart.LegendItemCollection;
27
28 import org.jfree.chart.labels.XYItemLabelGenerator;
29
30 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
31
32 import org.jfree.data.xy.XYDataset;
33 import org.jfree.data.xy.XYSeries;
34 import org.jfree.data.xy.XYSeriesCollection;
35
36 public class QWSeriesCollection
37 extends XYSeriesCollection
38 implements XYItemLabelGenerator
39 {
40 public interface LabelGenerator {
41 String createLabel(QW qw);
42 } // interface LabelGenerator
43
44 public static class DateFormatLabelGenerator
45 implements LabelGenerator
46 {
47 protected DateFormat format;
48
49 public DateFormatLabelGenerator() {
50 this(new SimpleDateFormat("dd.MM.yyyy"));
51 }
52
53 public DateFormatLabelGenerator(DateFormat format) {
54 this.format = format;
55 }
56
57 @Override
58 public String createLabel(QW qw) {
59 Date date = qw.getDate();
60 return date != null ? format.format(date) : "";
61 }
62 } // class DateFormatLabelGenerator
63
64 public static final LabelGenerator SIMPLE_GENERATOR =
65 new DateFormatLabelGenerator();
66
67 protected Date minDate;
68 protected Date maxDate;
69
70 protected List<List<QW>> labels;
71
72 protected Rectangle2D area;
73
74 protected LabelGenerator labelGenerator;
75
76 protected Map<ShapeRenderer.Entry, Integer> knownShapes =
77 new HashMap<ShapeRenderer.Entry, Integer>();
78
79 public QWSeriesCollection() {
80 labels = new ArrayList<List<QW>>();
81 labelGenerator = SIMPLE_GENERATOR;
82 }
83
84 public QWSeriesCollection(LabelGenerator labelGenerator) {
85 this();
86 this.labelGenerator = labelGenerator;
87 }
88
89 protected static ShapeRenderer.Entry classify(QW qw) {
90 Shape shape = qw.getInterpolated()
91 ? ShapeUtils.INTERPOLATED_SHAPE
92 : ShapeUtils.MEASURED_SHAPE;
93
94 boolean filled = !qw.getInterpolated();
95
96 return new ShapeRenderer.Entry(
97 shape, Color.black, filled);
98 }
99
100 public void add(QW qw) {
101
102 ShapeRenderer.Entry key = classify(qw);
103
104 Integer seriesNo = knownShapes.get(key);
105
106 XYSeries series;
107
108 if (seriesNo == null) {
109 seriesNo = Integer.valueOf(getSeriesCount());
110 knownShapes.put(key, seriesNo);
111 series = new XYSeries(seriesNo, false);
112 addSeries(series);
113 labels.add(new ArrayList<QW>());
114 }
115 else {
116 series = getSeries(seriesNo);
117 }
118
119 series.add(qw.getQ(), qw.getW());
120
121 labels.get(seriesNo).add(qw);
122
123 extendDateRange(qw);
124 extendArea(qw);
125 }
126
127 protected void extendDateRange(QW qw) {
128 Date date = qw.getDate();
129 if (date != null) {
130 if (minDate == null) {
131 minDate = maxDate = date;
132 }
133 else {
134 if (date.compareTo(minDate) < 0) {
135 minDate = date;
136 }
137 if (date.compareTo(maxDate) > 0) {
138 maxDate = date;
139 }
140 }
141 }
142 }
143
144 protected void extendArea(QW qw) {
145 if (area == null) {
146 area = new Rectangle2D.Double(
147 qw.getQ(), qw.getW(), 0d, 0d);
148 }
149 else {
150 area.add(qw.getQ(), qw.getW());
151 }
152 }
153
154 public Rectangle2D getArea() {
155 return area;
156 }
157
158 public Date getMinDate() {
159 return minDate;
160 }
161
162 public Date getMaxDate() {
163 return maxDate;
164 }
165
166 public LabelGenerator getLabelGenerator() {
167 return labelGenerator;
168 }
169
170 @Override
171 public String generateLabel(XYDataset dataset, int series, int item) {
172 return labelGenerator.createLabel(labels.get(series).get(item));
173 }
174
175 public StandardXYItemRenderer createRenderer() {
176 StandardXYItemRenderer renderer = new ShapeRenderer(knownShapes);
177 renderer.setBaseItemLabelGenerator(this);
178 renderer.setBaseSeriesVisibleInLegend(false);
179 renderer.setBaseItemLabelsVisible(true);
180 return renderer;
181 }
182
183 public static final LegendItem legendItem(
184 String label,
185 Paint paint,
186 Shape shape,
187 boolean filled
188 ) {
189 BasicStroke stroke = new BasicStroke();
190 return new LegendItem(
191 label, // label
192 null, // description
193 null, // tooltip
194 null, // url
195 true, // shape visible
196 shape, // shape
197 filled, // shape filled
198 filled ? paint : Color.white, // fill paint
199 true, // shape outline
200 paint, // outline paint
201 stroke, // outline stroke
202 false, // line visible
203 shape, // line
204 stroke, // line stroke
205 Color.white);
206 }
207
208 public void addLegendItems(LegendItemCollection lic) {
209 for (ShapeRenderer.Entry entry: knownShapes.keySet()) {
210 // TODO: i18n
211 String label = entry.getFilled()
212 ? "gemessene Werte"
213 : "interpolierte Werte";
214 lic.add(legendItem(
215 label,
216 entry.getPaint(),
217 entry.getShape(),
218 entry.getFilled()));
219 }
220 }
221 }
222 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org