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

Last change on this file since 1930 was 1921, checked in by Gubaer, 15 years ago

applied patch #3149 by cjw: Exception when using sort button in edit relations dialog

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 {
33 remaining.add(Integer.valueOf(i));
34 }
35 else
36 {
37 add(i, m);
38 }
39 }
40 }
41
42 Integer find(Node node, int current) {
43 Integer result = null;
44
45 try {
46 result = nodes.get(node);
47 if (result == null) {
48 result = points.get(node).first();
49 if (members.get(current).member == members.get(result).member) {
50 result = points.get(node).last();
51 }
52 }
53 } catch (NullPointerException f) {
54 } catch (java.util.NoSuchElementException e) {
55 }
56
57 return result;
58 }
59
60 void add(int n, RelationMember m) {
61 if (m.member instanceof Way) {
62 Way w = (Way) m.member;
63 if (w.lastNode() == w.firstNode())
64 {
65 nodes.put(w.firstNode(), Integer.valueOf(n));
66 }
67 else
68 {
69 if (!points.containsKey(w.firstNode())) {
70 points.put(w.firstNode(), new java.util.TreeSet<Integer>());
71 }
72 points.get(w.firstNode()).add(Integer.valueOf(n));
73
74 if (!points.containsKey(w.lastNode())) {
75 points.put(w.lastNode(), new java.util.TreeSet<Integer>());
76 }
77 points.get(w.lastNode()).add(Integer.valueOf(n));
78 }
79 } else if (m.member instanceof Node) {
80 Node node = (Node) m.member;
81 nodes.put(node, Integer.valueOf(n));
82 } else {
83 remaining.add(Integer.valueOf(n));
84 }
85 }
86
87 boolean remove(int n, RelationMember a) {
88 boolean result;
89 if (a.member instanceof Way) {
90 Way w = (Way) a.member;
91 if (w.firstNode() == w.lastNode())
92 {
93 result = (nodes.remove(w.firstNode()) != null);
94 }
95 else
96 {
97 result = points.get(w.firstNode()).remove(n);
98 result &= points.get(w.lastNode()).remove(n);
99 }
100 } else {
101 result = (nodes.remove(a.member) != null);
102 }
103 return result;
104 }
105
106 void move(int from, int to) {
107 if (from != to) {
108 RelationMember b = members.get(from);
109 RelationMember a = members.get(to);
110
111 remove(to, b);
112 add(to, a);
113 }
114 }
115
116 // no node-mapped entries left
117 boolean isEmpty() {
118 return points.isEmpty() && nodes.isEmpty();
119 }
120
121 java.util.Vector<Integer> getRemaining() {
122 return remaining;
123 }
124
125 Integer pop() {
126 Node node = null;
127 Integer result = null;
128
129 if (!nodes.isEmpty()) {
130 node = nodes.keySet().iterator().next();
131 result = nodes.get(node);
132 nodes.remove(node);
133 } else if (!points.isEmpty()) {
134 for (java.util.TreeSet<Integer> set : points.values()) {
135 if (!set.isEmpty()) {
136 result = set.first();
137 Way w = (Way) members.get(result).member;
138 points.get(w.firstNode()).remove(result);
139 points.get(w.lastNode()).remove(result);
140 break;
141 }
142 }
143 }
144
145 return result;
146 }
147}
Note: See TracBrowser for help on using the repository browser.