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

Last change on this file since 2657 was 2657, checked in by jttt, 14 years ago

Cache list of used tags in properties dialog (faster adding of keys in large datasets)

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