source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/properties/ListOfUsedTags.java@ 2711

Last change on this file since 2711 was 2711, checked in by stoecker, 14 years ago

fix bad line endings

  • Property svn:mime-type set to text/plain
File size: 4.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.dialogs.properties;
3
4import java.util.Collection;
5import java.util.Collections;
6import java.util.Map;
7import java.util.TreeMap;
8import java.util.TreeSet;
9import java.util.Map.Entry;
10
11import org.openstreetmap.josm.Main;
12import org.openstreetmap.josm.data.osm.DataSet;
13import org.openstreetmap.josm.data.osm.OsmPrimitive;
14import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
15import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
16import org.openstreetmap.josm.data.osm.event.DataSetListener;
17import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
18import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
19import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
20import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
21import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
22import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
23
24public class ListOfUsedTags implements DataSetListener {
25
26 final TreeMap<String, TreeSet<String>> allData = new TreeMap<String, TreeSet<String>>();
27 private boolean dirty;
28
29 public Collection<String> getUsedKeys() {
30 if (dirty) {
31 rebuild();
32 }
33 return allData.keySet();
34 }
35
36 /**
37 *
38 * @param key
39 * @return List of used values or empty list if key is not used
40 */
41 public Collection<String> getUsedValues(String key) {
42 if (dirty) {
43 rebuild();
44 }
45 Collection<String> values = allData.get(key);
46 if (values == null)
47 return Collections.emptyList();
48 else
49 return values;
50 }
51
52 public void rebuildNecessary() {
53 dirty = true;
54 }
55
56 private void rebuild() {
57 dirty = false;
58 allData.clear();
59 DataSet currentDataset = Main.main.getCurrentDataSet();
60 if (currentDataset != null) {
61 addPrimitives(currentDataset.allNonDeletedPrimitives());
62 }
63 }
64
65 private void addPrimitives(Collection<? extends OsmPrimitive> primitives) {
66 for (OsmPrimitive osm : primitives) {
67 addPrimitive(osm);
68 }
69 }
70
71 private void addPrimitive(OsmPrimitive primitive) {
72 for (Entry<String, String> entry: primitive.entrySet()) {
73 addKey(entry.getKey(), entry.getValue());
74 }
75 }
76
77 private void addKey(String key, String value) {
78 TreeSet<String> values = allData.get(key);
79 if (values == null) {
80 values = new TreeSet<String>();
81 allData.put(key, values);
82 }
83 values.add(value);
84 }
85
86 public void dataChanged(DataChangedEvent event) {
87 rebuild();
88 }
89
90 public void nodeMoved(NodeMovedEvent event) {/* ignored */}
91
92 public void otherDatasetChange(AbstractDatasetChangedEvent event) {/* ignored */}
93
94 public void primtivesAdded(PrimitivesAddedEvent event) {
95 addPrimitives(event.getPrimitives());
96 }
97
98 public void primtivesRemoved(PrimitivesRemovedEvent event) {
99 dirty = true;
100 }
101
102 public void relationMembersChanged(RelationMembersChangedEvent event) {/* ignored */}
103
104 public void tagsChanged(TagsChangedEvent event) {
105 Map<String, String> newKeys = event.getPrimitive().getKeys();
106 Map<String, String> oldKeys = event.getOriginalKeys();
107
108 if (!newKeys.keySet().containsAll(oldKeys.keySet())) {
109 // Some keys removed, might be the last instance of key, rebuild necessary
110 dirty = true;
111 } else {
112 for (Entry<String, String> oldEntry: oldKeys.entrySet()) {
113 if (!oldEntry.getValue().equals(newKeys.get(oldEntry.getKey()))) {
114 // Value changed, might be last instance of value, rebuild necessary
115 dirty = true;
116 return;
117 }
118 }
119 addPrimitive(event.getPrimitive());
120 }
121 }
122
123 public void wayNodesChanged(WayNodesChangedEvent event) {/* ignored */}
124}
Note: See TracBrowser for help on using the repository browser.