annotate artifacts/src/main/java/org/dive4elements/river/exports/LegendAggregator.java @ 9555:ef5754ba5573

Implemented legend aggregation based on type of themes. Added theme-editor style configuration for aggregated legend entries. Only configured themes get aggregated.
author gernotbelger
date Tue, 23 Oct 2018 16:26:48 +0200
parents
children f8308db94634
rev   line source
9555
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
2 * Software engineering by
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
3 * Björnsen Beratende Ingenieure GmbH
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
5 *
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
6 * This file is Free Software under the GNU AGPL (>=v3)
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
8 * documentation coming with Dive4Elements River for details.
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
9 */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
10 package org.dive4elements.river.exports;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
11
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
12 import java.awt.Font;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
13 import java.awt.Paint;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
14 import java.awt.Shape;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
15 import java.awt.Stroke;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
16 import java.util.AbstractMap.SimpleEntry;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
17 import java.util.ArrayList;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
18 import java.util.HashMap;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
19 import java.util.HashSet;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
20 import java.util.IdentityHashMap;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
21 import java.util.Iterator;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
22 import java.util.List;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
23 import java.util.Map;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
24 import java.util.Map.Entry;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
25 import java.util.Set;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
26
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
27 import org.dive4elements.artifacts.CallContext;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
28 import org.dive4elements.river.artifacts.context.RiverContext;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
29 import org.dive4elements.river.artifacts.resources.Resources;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
30 import org.dive4elements.river.jfree.StyledSeries;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
31 import org.dive4elements.river.jfree.StyledXYDataset;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
32 import org.dive4elements.river.themes.Theme;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
33 import org.dive4elements.river.themes.ThemeDocument;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
34 import org.dive4elements.river.themes.ThemeFactory;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
35 import org.jfree.chart.LegendItem;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
36 import org.jfree.chart.LegendItemCollection;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
37 import org.jfree.chart.plot.XYPlot;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
38 import org.jfree.data.general.Dataset;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
39 import org.jfree.data.xy.XYSeries;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
40 import org.jfree.data.xy.XYSeriesCollection;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
41 import org.w3c.dom.Document;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
42
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
43 /**
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
44 * Builds and adds legend entries to the plot.
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
45 *
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
46 * @author Gernot Belger
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
47 */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
48 public class LegendAggregator {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
49
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
50 private static final String NULL_THEME_TYPE = ""; //$NON-NLS-1$
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
51
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
52 private static final String I10N_MERGED = "legend.aggregator.merged"; //$NON-NLS-1$
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
53
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
54 private final List<Map.Entry<LegendItem, String>> legendItems = new ArrayList<>();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
55
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
56 private final Map<String, List<LegendItem>> itemsPerThemeType = new HashMap<>();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
57
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
58 private final Font labelFont;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
59
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
60 private final int aggregationThreshold;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
61
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
62 public LegendAggregator(final int aggregationThreshold, final Font labelFont) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
63 this.aggregationThreshold = aggregationThreshold;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
64 this.labelFont = labelFont;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
65 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
66
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
67 public void addLegendItem(final String themeType, final LegendItem item) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
68
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
69 item.setLabelFont(this.labelFont);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
70
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
71 this.legendItems.add(new SimpleEntry<>(item, themeType));
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
72
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
73 final List<LegendItem> perThemeType = getItemsPerThemeType(themeType);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
74 perThemeType.add(item);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
75 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
76
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
77 private List<LegendItem> getItemsPerThemeType(final String themeType) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
78
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
79 final String key = themeType == null ? NULL_THEME_TYPE : themeType;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
80
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
81 if (!this.itemsPerThemeType.containsKey(key))
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
82 this.itemsPerThemeType.put(key, new ArrayList<LegendItem>());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
83
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
84 return this.itemsPerThemeType.get(key);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
85 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
86
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
87 /**
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
88 * Apply the gathered items to the plot. Use only once.
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
89 */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
90 public void apply(final CallContext context, final XYPlot plot) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
91
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
92 final LegendItemCollection aggregatedItems = new LegendItemCollection();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
93
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
94 /* marker set for types that are already aggregated */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
95 final Set<String> aggregatedTypes = new HashSet<>();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
96
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
97 for (final Entry<LegendItem, String> entry : this.legendItems) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
98
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
99 final LegendItem item = entry.getKey();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
100 final String themeType = entry.getValue();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
101
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
102 /* ignore already aggregated items */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
103 if (aggregatedTypes.contains(themeType))
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
104 continue;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
105
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
106 /* aggregate known types if count over threshold */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
107 final Theme legendTheme = getLegendTheme(context, themeType);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
108
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
109 if (legendTheme != null && getItemsPerThemeType(themeType).size() > this.aggregationThreshold) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
110
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
111 final String labelDescription = Resources.getMsg(context.getMeta(), legendTheme.getDescription());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
112 final String labelMerged = Resources.getMsg(context.getMeta(), I10N_MERGED);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
113 final String label = String.format("%s (%s)", labelDescription, labelMerged);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
114
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
115 final List<LegendItem> items = findDistinctItems(getItemsPerThemeType(themeType));
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
116 /* add items for each distinct shape, only the last one gets the label */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
117 for (final Iterator<LegendItem> iterator = items.iterator(); iterator.hasNext();) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
118
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
119 final LegendItem legendItem = iterator.next();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
120 final String itemLabel = iterator.hasNext() ? "," : label;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
121
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
122 /* create and add aggregated item(s) */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
123 final LegendItem aggregatedItem = createAggregatedItem(legendItem, legendTheme, itemLabel);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
124 aggregatedItems.add(aggregatedItem);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
125 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
126
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
127 /* mark as handles */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
128 aggregatedTypes.add(themeType);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
129
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
130 } else {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
131 /* simply add normal items */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
132 aggregatedItems.add(item);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
133 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
134 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
135
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
136 plot.setFixedLegendItems(aggregatedItems);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
137
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
138 this.itemsPerThemeType.clear();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
139 this.legendItems.clear();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
140 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
141
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
142 /**
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
143 * Extract distinct items, curently only those that are different regarding their shape
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
144 */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
145 private List<LegendItem> findDistinctItems(final List<LegendItem> items) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
146
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
147 // HACKY: we hash by unique shape, because we know that the used shapes are cashed in a static cache.
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
148 final Map<Shape, LegendItem> shapeMap = new IdentityHashMap<>();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
149
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
150 for (final LegendItem item : items) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
151
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
152 final Shape shape = item.isShapeVisible() ? item.getShape() : null;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
153 if (!shapeMap.containsKey(shape))
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
154 shapeMap.put(shape, item);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
155 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
156
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
157 return new ArrayList<>(shapeMap.values());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
158 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
159
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
160 private LegendItem createAggregatedItem(final LegendItem item, final Theme legendTheme, final String label) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
161 /* clone properties from current item */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
162 final String description = item.getDescription();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
163 final String tooltipText = item.getToolTipText();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
164 final String urlText = item.getURLText();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
165 final boolean shapeVisible = item.isShapeVisible();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
166 final Shape shape = item.getShape();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
167 final boolean shapeFilled = item.isShapeFilled();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
168 final Paint fillPaint = item.getFillPaint();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
169 final boolean shapeOutlineVisible = item.isShapeOutlineVisible();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
170 final Paint outlinePaint = item.getOutlinePaint();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
171 final Stroke outlineStroke = item.getOutlineStroke();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
172 final boolean lineVisible = item.isLineVisible();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
173 final Shape line = item.getLine();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
174 final Stroke lineStroke = item.getLineStroke();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
175 final Paint linePaint = item.getLinePaint();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
176 final LegendItem aggregatedItem = new LegendItem(label, description, tooltipText, urlText, shapeVisible, shape, shapeFilled, fillPaint,
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
177 shapeOutlineVisible, outlinePaint, outlineStroke, lineVisible, line, lineStroke, linePaint);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
178
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
179 aggregatedItem.setDataset(item.getDataset());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
180 aggregatedItem.setDatasetIndex(item.getDatasetIndex());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
181 aggregatedItem.setFillPaintTransformer(item.getFillPaintTransformer());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
182 aggregatedItem.setLabelFont(item.getLabelFont());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
183 aggregatedItem.setLabelPaint(item.getLabelPaint());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
184 aggregatedItem.setSeriesIndex(item.getSeriesIndex());
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
185
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
186 /* let styled dataset apply specific theme configuration */
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
187 applyThemeToLegend(aggregatedItem, legendTheme);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
188
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
189 return aggregatedItem;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
190 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
191
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
192 private void applyThemeToLegend(final LegendItem item, final Theme legendTheme) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
193
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
194 final Dataset dataset = item.getDataset();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
195 if (dataset == null)
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
196 return;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
197
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
198 final Document xml = legendTheme.toXML();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
199 final ThemeDocument themeDocument = new ThemeDocument(xml);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
200
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
201 if (dataset instanceof StyledXYDataset) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
202 final StyledXYDataset styledDataset = (StyledXYDataset) dataset;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
203 styledDataset.applyAggregatedLegendTheme(item, themeDocument);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
204 return;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
205 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
206
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
207 if (dataset instanceof XYSeriesCollection) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
208
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
209 final int seriesIndex = item.getSeriesIndex();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
210
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
211 final XYSeriesCollection seriesCollection = (XYSeriesCollection) dataset;
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
212 if (seriesIndex >= 0 && seriesIndex < seriesCollection.getSeriesCount()) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
213 final XYSeries series = seriesCollection.getSeries(seriesIndex);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
214
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
215 if (series instanceof StyledSeries) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
216 ((StyledSeries) series).applyAggregatedLegendTheme(item, themeDocument);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
217 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
218 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
219 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
220 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
221
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
222 private Theme getLegendTheme(final CallContext context, final String themeType) {
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
223
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
224 final RiverContext flysContext = context instanceof RiverContext ? (RiverContext) context : (RiverContext) context.globalContext();
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
225
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
226 return ThemeFactory.getLegendTheme(flysContext, themeType);
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
227 }
ef5754ba5573 Implemented legend aggregation based on type of themes.
gernotbelger
parents:
diff changeset
228 }

http://dive4elements.wald.intevation.org