source: josm/trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyles.java@ 2864

Last change on this file since 2864 was 2626, checked in by jttt, 15 years ago

Fixed some of the warnings found by FindBugs

  • Property svn:eol-style set to native
File size: 10.7 KB
Line 
1package org.openstreetmap.josm.gui.mappaint;
2
3import java.util.Collection;
4import java.util.Collections;
5import java.util.HashMap;
6import java.util.Iterator;
7import java.util.LinkedList;
8import java.util.List;
9import java.util.Map.Entry;
10
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.data.osm.Node;
13import org.openstreetmap.josm.data.osm.OsmPrimitive;
14import org.openstreetmap.josm.data.osm.OsmUtils;
15import org.openstreetmap.josm.data.osm.Way;
16
17public class ElemStyles
18{
19 public static class StyleSet {
20 private HashMap<String, IconElemStyle> icons;
21 private HashMap<String, LineElemStyle> lines;
22 private HashMap<String, AreaElemStyle> areas;
23 private HashMap<String, LineElemStyle> modifiers;
24 private LinkedList<IconElemStyle> iconsList;
25 private LinkedList<LineElemStyle> linesList;
26 private LinkedList<AreaElemStyle> areasList;
27 private LinkedList<LineElemStyle> modifiersList;
28 public StyleSet()
29 {
30 icons = new HashMap<String, IconElemStyle>();
31 lines = new HashMap<String, LineElemStyle>();
32 modifiers = new HashMap<String, LineElemStyle>();
33 areas = new HashMap<String, AreaElemStyle>();
34 iconsList = new LinkedList<IconElemStyle>();
35 linesList = new LinkedList<LineElemStyle>();
36 modifiersList = new LinkedList<LineElemStyle>();
37 areasList = new LinkedList<AreaElemStyle>();
38 }
39 private IconElemStyle getNode(OsmPrimitive primitive)
40 {
41 IconElemStyle ret = null;
42 for (Entry<String, String> entry:primitive.entrySet()) {
43 String key = entry.getKey();
44 String val = entry.getValue();
45 IconElemStyle style;
46 if((style = icons.get("n" + key + "=" + val)) != null)
47 {
48 if(ret == null || style.priority > ret.priority) {
49 ret = style;
50 }
51 }
52 if((style = icons.get("b" + key + "=" + OsmUtils.getNamedOsmBoolean(val))) != null)
53 {
54 if(ret == null || style.priority > ret.priority) {
55 ret = style;
56 }
57 }
58 if((style = icons.get("x" + key)) != null)
59 {
60 if(ret == null || style.priority > ret.priority) {
61 ret = style;
62 }
63 }
64 }
65 for(IconElemStyle s : iconsList)
66 {
67 if((ret == null || s.priority > ret.priority) && s.check(primitive)) {
68 ret = s;
69 }
70 }
71 return ret;
72 }
73 private ElemStyle get(OsmPrimitive primitive, boolean noclosed)
74 {
75 AreaElemStyle retArea = null;
76 LineElemStyle retLine = null;
77 String linestring = null;
78 HashMap<String, LineElemStyle> over = new HashMap<String, LineElemStyle>();
79 for (Entry<String, String> entry:primitive.entrySet()) {
80 String key = entry.getKey();
81 String val = entry.getValue();
82 AreaElemStyle styleArea;
83 LineElemStyle styleLine;
84 String idx = "n" + key + "=" + val;
85 if((styleArea = areas.get(idx)) != null && (retArea == null
86 || styleArea.priority > retArea.priority) && (!noclosed
87 || !styleArea.closed)) {
88 retArea = styleArea;
89 }
90 if((styleLine = lines.get(idx)) != null && (retLine == null
91 || styleLine.priority > retLine.priority))
92 {
93 retLine = styleLine;
94 linestring = idx;
95 }
96 if((styleLine = modifiers.get(idx)) != null) {
97 over.put(idx, styleLine);
98 }
99 idx = "b" + key + "=" + OsmUtils.getNamedOsmBoolean(val);
100 if((styleArea = areas.get(idx)) != null && (retArea == null
101 || styleArea.priority > retArea.priority) && (!noclosed
102 || !styleArea.closed)) {
103 retArea = styleArea;
104 }
105 if((styleLine = lines.get(idx)) != null && (retLine == null
106 || styleLine.priority > retLine.priority))
107 {
108 retLine = styleLine;
109 linestring = idx;
110 }
111 if((styleLine = modifiers.get(idx)) != null) {
112 over.put(idx, styleLine);
113 }
114 idx = "x" + key;
115 if((styleArea = areas.get(idx)) != null && (retArea == null
116 || styleArea.priority > retArea.priority) && (!noclosed
117 || !styleArea.closed)) {
118 retArea = styleArea;
119 }
120 if((styleLine = lines.get(idx)) != null && (retLine == null
121 || styleLine.priority > retLine.priority))
122 {
123 retLine = styleLine;
124 linestring = idx;
125 }
126 if((styleLine = modifiers.get(idx)) != null) {
127 over.put(idx, styleLine);
128 }
129 }
130 for(AreaElemStyle s : areasList)
131 {
132 if((retArea == null || s.priority > retArea.priority)
133 && (!noclosed || !s.closed) && s.check(primitive)) {
134 retArea = s;
135 }
136 }
137 for(LineElemStyle s : linesList)
138 {
139 if((retLine == null || s.priority > retLine.priority)
140 && s.check(primitive)) {
141 retLine = s;
142 }
143 }
144 for(LineElemStyle s : modifiersList)
145 {
146 if(s.check(primitive)) {
147 over.put(s.getCode(), s);
148 }
149 }
150 over.remove(linestring);
151 if(over.size() != 0 && retLine != null)
152 {
153 List<LineElemStyle> s = new LinkedList<LineElemStyle>(over.values());
154 Collections.sort(s);
155 retLine = new LineElemStyle(retLine, s);
156 }
157 if(retArea != null)
158 {
159 if(retLine != null)
160 return new AreaElemStyle(retArea, retLine);
161 else
162 return retArea;
163 }
164 return retLine;
165 }
166
167 public ElemStyle get(OsmPrimitive osm)
168 {
169 return (!osm.hasKeys()) ? null :
170 ((osm instanceof Node) ? getNode(osm) : get(osm,
171 osm instanceof Way && !((Way)osm).isClosed()));
172 }
173
174 public ElemStyle getArea(Way osm)
175 {
176 if(osm.hasKeys())
177 {
178 /* force area mode also for unclosed ways */
179 ElemStyle style = get(osm, false);
180 if(style != null && style instanceof AreaElemStyle)
181 return style;
182 }
183 return null;
184 }
185
186 public IconElemStyle getIcon(OsmPrimitive osm)
187 {
188 return osm.hasKeys() ? getNode(osm): null;
189 }
190
191 public boolean isArea(OsmPrimitive o)
192 {
193 if(o.hasKeys() && !(o instanceof Node))
194 {
195 boolean noclosed = o instanceof Way && !((Way)o).isClosed();
196 Iterator<String> iterator = o.keySet().iterator();
197 while(iterator.hasNext())
198 {
199 String key = iterator.next();
200 String val = o.get(key);
201 AreaElemStyle s = areas.get("n" + key + "=" + val);
202 if(s == null || (s.closed && noclosed)) {
203 s = areas.get("b" + key + "=" + OsmUtils.getNamedOsmBoolean(val));
204 }
205 if(s == null || (s.closed && noclosed)) {
206 s = areas.get("x" + key);
207 }
208 if(s != null && !(s.closed && noclosed))
209 return true;
210 }
211 for(AreaElemStyle s : areasList)
212 {
213 if(!(s.closed && noclosed) && s.check(o))
214 return true;
215 }
216 }
217 return false;
218 }
219
220 public boolean hasAreas()
221 {
222 return areas.size() > 0;
223 }
224 }
225
226 HashMap<String, StyleSet> styleSet;
227 public ElemStyles()
228 {
229 styleSet = new HashMap<String, StyleSet>();
230 }
231
232 public void add(String name, Rule r, Collection<Rule> rules, LineElemStyle style)
233 {
234 if(rules != null)
235 {
236 style.rules = rules;
237 getStyleSet(name, true).linesList.add(style);
238 }
239 else
240 {
241 String key = r.getKey();
242 style.code = key;
243 getStyleSet(name, true).lines.put(key, style);
244 }
245 }
246
247 public void addModifier(String name, Rule r, Collection<Rule> rules, LineElemStyle style)
248 {
249 if(rules != null)
250 {
251 style.rules = rules;
252 getStyleSet(name, true).modifiersList.add(style);
253 }
254 else
255 {
256 String key = r.getKey();
257 style.code = key;
258 getStyleSet(name, true).modifiers.put(key, style);
259 }
260 }
261
262 public void add(String name, Rule r, Collection<Rule> rules, AreaElemStyle style)
263 {
264 if(rules != null)
265 {
266 style.rules = rules;
267 getStyleSet(name, true).areasList.add(style);
268 }
269 else
270 {
271 String key = r.getKey();
272 style.code = key;
273 getStyleSet(name, true).areas.put(key, style);
274 }
275 }
276
277 public void add(String name, Rule r, Collection<Rule> rules, IconElemStyle style)
278 {
279 if(rules != null)
280 {
281 style.rules = rules;
282 getStyleSet(name, true).iconsList.add(style);
283 }
284 else
285 {
286 String key = r.getKey();
287 style.code = key;
288 getStyleSet(name, true).icons.put(key, style);
289 }
290 }
291
292 private StyleSet getStyleSet(String name, boolean create)
293 {
294 if(name == null) {
295 name = Main.pref.get("mappaint.style", "standard");
296 }
297
298 StyleSet s = styleSet.get(name);
299 if(create && s == null)
300 {
301 s = new StyleSet();
302 styleSet.put(name, s);
303 }
304 return s;
305 }
306
307 /* called from class users, never return null */
308 public StyleSet getStyleSet()
309 {
310 return getStyleSet(null, false);
311 }
312
313 public Collection<String> getStyleNames()
314 {
315 return styleSet.keySet();
316 }
317}
Note: See TracBrowser for help on using the repository browser.