source: josm/trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationNodeMap.java@ 1916

Last change on this file since 1916 was 1857, checked in by Gubaer, 15 years ago

replaced JOptionDialog.show... by OptionPaneUtil.show....
improved relation editor

File size: 4.4 KB
Line 
1package org.openstreetmap.josm.gui.dialogs.relation;
2
3import java.util.ArrayList;
4
5import org.openstreetmap.josm.data.osm.Node;
6import org.openstreetmap.josm.data.osm.RelationMember;
7import org.openstreetmap.josm.data.osm.Way;
8
9/**
10 * A mapping from Node positions to elements in a Relation (currently Nodes and Ways only)
11 *
12 * @author Christiaan Welvaart <cjw@time4t.net>
13 *
14 */
15public class RelationNodeMap {
16 private java.util.HashMap<Node, java.util.TreeSet<Integer>> points;
17 private java.util.HashMap<Node, Integer> nodes;
18 private java.util.Vector<Integer> remaining;
19 private ArrayList<RelationMember> members;
20
21 RelationNodeMap(ArrayList<RelationMember> members) {
22 int i;
23
24 this.members = members;
25 points = new java.util.HashMap<Node, java.util.TreeSet<Integer>>();
26 nodes = new java.util.HashMap<Node, Integer>();
27 remaining = new java.util.Vector<Integer>();
28
29 for (i = 0; i < members.size(); ++i) {
30 RelationMember m = members.get(i);
31 if (m.member.incomplete)
32 // throw an exception?
33 return;
34 add(i, m);
35 }
36 }
37
38 Integer find(Node node, int current) {
39 Integer result = null;
40
41 try {
42 result = nodes.get(node);
43 if (result == null) {
44 result = points.get(node).first();
45 if (members.get(current).member == members.get(result).member) {
46 result = points.get(node).last();
47 }
48 }
49 } catch (NullPointerException f) {
50 } catch (java.util.NoSuchElementException e) {
51 }
52
53 return result;
54 }
55
56 void add(int n, RelationMember m) {
57 if (m.member instanceof Way) {
58 Way w = (Way) m.member;
59 if (w.lastNode() == w.firstNode())
60 {
61 nodes.put(w.firstNode(), Integer.valueOf(n));
62 }
63 else
64 {
65 if (!points.containsKey(w.firstNode())) {
66 points.put(w.firstNode(), new java.util.TreeSet<Integer>());
67 }
68 points.get(w.firstNode()).add(Integer.valueOf(n));
69
70 if (!points.containsKey(w.lastNode())) {
71 points.put(w.lastNode(), new java.util.TreeSet<Integer>());
72 }
73 points.get(w.lastNode()).add(Integer.valueOf(n));
74 }
75 } else if (m.member instanceof Node) {
76 Node node = (Node) m.member;
77 nodes.put(node, Integer.valueOf(n));
78 } else {
79 remaining.add(Integer.valueOf(n));
80 }
81 }
82
83 boolean remove(int n, RelationMember a) {
84 boolean result;
85 if (a.member instanceof Way) {
86 Way w = (Way) a.member;
87 if (w.firstNode() == w.lastNode())
88 {
89 result = (nodes.remove(w.firstNode()) != null);
90 }
91 else
92 {
93 result = points.get(w.firstNode()).remove(n);
94 result &= points.get(w.lastNode()).remove(n);
95 }
96 } else {
97 result = (nodes.remove(a.member) != null);
98 }
99 return result;
100 }
101
102 void move(int from, int to) {
103 if (from != to) {
104 RelationMember b = members.get(from);
105 RelationMember a = members.get(to);
106
107 remove(to, b);
108 add(to, a);
109 }
110 }
111
112 // no node-mapped entries left
113 boolean isEmpty() {
114 return points.isEmpty() && nodes.isEmpty();
115 }
116
117 java.util.Vector<Integer> getRemaining() {
118 return remaining;
119 }
120
121 Integer pop() {
122 Node node = null;
123 Integer result = null;
124
125 if (!nodes.isEmpty()) {
126 node = nodes.keySet().iterator().next();
127 result = nodes.get(node);
128 nodes.remove(node);
129 } else if (!points.isEmpty()) {
130 for (java.util.TreeSet<Integer> set : points.values()) {
131 if (!set.isEmpty()) {
132 result = set.first();
133 Way w = (Way) members.get(result).member;
134 points.get(w.firstNode()).remove(result);
135 points.get(w.lastNode()).remove(result);
136 break;
137 }
138 }
139 }
140
141 return result;
142 }
143}
Note: See TracBrowser for help on using the repository browser.