Mercurial > dive4elements > river
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 } |