Changeset 5630 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2012-12-24T15:13:33+01:00 (12 years ago)
- Location:
- trunk/src/org/openstreetmap/josm/gui/dialogs/relation
- Files:
-
- 4 added
- 3 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
r5297 r5630 27 27 import org.openstreetmap.josm.gui.MapView; 28 28 import org.openstreetmap.josm.gui.MapView.LayerChangeListener; 29 import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction; 29 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType; 30 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction; 30 31 import org.openstreetmap.josm.gui.layer.Layer; 31 32 import org.openstreetmap.josm.gui.layer.OsmDataLayer; -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
r4072 r5630 11 11 import javax.swing.JTable; 12 12 13 import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction; 13 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType; 14 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction; 14 15 import org.openstreetmap.josm.tools.ImageProvider; 15 16 -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
r5614 r5630 1 1 // License: GPL. For details, see LICENSE file. 2 2 package org.openstreetmap.josm.gui.dialogs.relation; 3 4 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.BACKWARD;5 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.FORWARD;6 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.NONE;7 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.ROUNDABOUT_LEFT;8 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.ROUNDABOUT_RIGHT;9 3 10 4 import java.util.ArrayList; … … 12 6 import java.util.Collection; 13 7 import java.util.Collections; 14 import java.util.Comparator;15 8 import java.util.EnumSet; 16 import java.util.HashMap;17 9 import java.util.HashSet; 18 10 import java.util.Iterator; 19 import java.util.LinkedList;20 11 import java.util.List; 21 import java.util.Map;22 12 import java.util.Set; 23 13 import java.util.concurrent.CopyOnWriteArrayList; … … 31 21 import org.openstreetmap.josm.Main; 32 22 import org.openstreetmap.josm.data.SelectionChangedListener; 33 import org.openstreetmap.josm.data.coor.EastNorth;34 23 import org.openstreetmap.josm.data.osm.DataSet; 35 import org.openstreetmap.josm.data.osm.Node;36 24 import org.openstreetmap.josm.data.osm.OsmPrimitive; 37 25 import org.openstreetmap.josm.data.osm.Relation; 38 26 import org.openstreetmap.josm.data.osm.RelationMember; 39 import org.openstreetmap.josm.data.osm.Way;40 27 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent; 41 28 import org.openstreetmap.josm.data.osm.event.DataChangedEvent; … … 48 35 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent; 49 36 import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel; 50 import org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction; 37 import org.openstreetmap.josm.gui.dialogs.relation.sort.RelationSorter; 38 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType; 39 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionTypeCalculator; 51 40 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 52 41 import org.openstreetmap.josm.gui.tagging.TaggingPreset; … … 66 55 private final PresetListPanel.PresetHandler presetHandler; 67 56 68 private final int UNCONNECTED = Integer.MIN_VALUE; 69 70 private static final Collection<AdditionalSorter> additionalSorters = new ArrayList<AdditionalSorter>(); 71 72 static { 73 additionalSorters.add(new AssociatedStreetSorter()); 74 } 57 private final WayConnectionTypeCalculator wayConnectionTypeCalculator = new WayConnectionTypeCalculator(); 58 private final RelationSorter relationSorter = new RelationSorter(); 75 59 76 60 /** … … 590 574 */ 591 575 public static boolean hasMembersReferringTo(Collection<RelationMember> members, Collection<OsmPrimitive> primitives) { 592 if (primitives == null || primitives.isEmpty()) {576 if (primitives == null || primitives.isEmpty()) 593 577 return false; 594 }595 578 HashSet<OsmPrimitive> referrers = new HashSet<OsmPrimitive>(); 596 579 for (RelationMember member : members) { … … 598 581 } 599 582 for (OsmPrimitive referred : primitives) { 600 if (referrers.contains(referred)) {583 if (referrers.contains(referred)) 601 584 return true; 602 }603 585 } 604 586 return false; … … 699 681 }*/ 700 682 701 /*702 * Sort a collection of relation members by the way they are linked.703 *704 * @param relationMembers collection of relation members705 * @return sorted collection of relation members706 */707 private List<RelationMember> sortMembers(List<RelationMember> relationMembers) {708 ArrayList<RelationMember> newMembers = new ArrayList<RelationMember>();709 710 // Sort members with custom mechanisms (relation-dependent)711 List<RelationMember> defaultMembers = new LinkedList<RelationMember>();712 Map<AdditionalSorter, List<RelationMember>> customMap = new HashMap<AdditionalSorter, List<RelationMember>>();713 714 // Dispatch members to correct sorters715 for (RelationMember m : relationMembers) {716 for (AdditionalSorter sorter : additionalSorters) {717 List<RelationMember> list = defaultMembers;718 if (sorter.acceptsMember(m)) {719 list = customMap.get(sorter);720 if (list == null) {721 customMap.put(sorter, list = new LinkedList<RelationMember>());722 }723 }724 list.add(m);725 }726 }727 728 // Sort members and add them to result729 for (AdditionalSorter s : customMap.keySet()) {730 newMembers.addAll(s.sortMembers(customMap.get(s)));731 }732 733 RelationNodeMap map = new RelationNodeMap(defaultMembers);734 // List of groups of linked members735 //736 ArrayList<LinkedList<Integer>> allGroups = new ArrayList<LinkedList<Integer>>();737 738 // current group of members that are linked among each other739 // Two successive members are always linked i.e. have a common node.740 //741 LinkedList<Integer> group;742 743 Integer first;744 while ((first = map.pop()) != null) {745 group = new LinkedList<Integer>();746 group.add(first);747 748 allGroups.add(group);749 750 Integer next = first;751 while ((next = map.popAdjacent(next)) != null) {752 group.addLast(next);753 }754 755 // The first element need not be in front of the list.756 // So the search goes in both directions757 //758 next = first;759 while ((next = map.popAdjacent(next)) != null) {760 group.addFirst(next);761 }762 }763 764 for (LinkedList<Integer> tmpGroup : allGroups) {765 for (Integer p : tmpGroup) {766 newMembers.add(defaultMembers.get(p));767 }768 }769 770 // Finally, add members that have not been sorted at all771 for (Integer i : map.getNotSortableMembers()) {772 newMembers.add(defaultMembers.get(i));773 }774 775 return newMembers;776 }777 683 778 684 /** … … 784 690 List<RelationMember> newMembers; 785 691 if (selectedMembers.size() <= 1) { 786 newMembers = sortMembers(members);692 newMembers = relationSorter.sortMembers(members); 787 693 sortedMembers = newMembers; 788 694 } else { 789 sortedMembers = sortMembers(selectedMembers);695 sortedMembers = relationSorter.sortMembers(selectedMembers); 790 696 List<Integer> selectedIndices = getSelectedIndices(); 791 697 newMembers = new ArrayList<RelationMember>(); … … 811 717 } 812 718 813 private Direction determineDirection(int ref_i, Direction ref_direction, int k) {814 return determineDirection(ref_i, ref_direction, k, false);815 }816 /**817 * Determines the direction of way k with respect to the way ref_i.818 * The way ref_i is assumed to have the direction ref_direction and819 * to be the predecessor of k.820 *821 * If both ways are not linked in any way, NONE is returned.822 *823 * Else the direction is given as follows:824 * Let the relation be a route of oneway streets, and someone travels them in the given order.825 * Direction is FORWARD if it is legal and BACKWARD if it is illegal to do so for the given way.826 *827 **/828 private Direction determineDirection(int ref_i, final Direction ref_direction, int k, boolean reversed) {829 if (ref_i < 0 || k < 0 || ref_i >= members.size() || k >= members.size())830 return NONE;831 if (ref_direction == NONE)832 return NONE;833 834 final RelationMember m_ref = members.get(ref_i);835 final RelationMember m = members.get(k);836 Way way_ref = null;837 Way way = null;838 839 if (m_ref.isWay()) {840 way_ref = m_ref.getWay();841 }842 if (m.isWay()) {843 way = m.getWay();844 }845 846 if (way_ref == null || way == null)847 return NONE;848 849 /** the list of nodes the way k can dock to */850 List<Node> refNodes= new ArrayList<Node>();851 852 switch (ref_direction) {853 case FORWARD:854 refNodes.add(way_ref.lastNode());855 break;856 case BACKWARD:857 refNodes.add(way_ref.firstNode());858 break;859 case ROUNDABOUT_LEFT:860 case ROUNDABOUT_RIGHT:861 refNodes = way_ref.getNodes();862 break;863 }864 865 if (refNodes == null)866 return NONE;867 868 for (Node n : refNodes) {869 if (n == null) {870 continue;871 }872 if (roundaboutType(k) != NONE) {873 for (Node nn : way.getNodes()) {874 if (n == nn)875 return roundaboutType(k);876 }877 } else if(isOneway(m)) {878 if (n == RelationNodeMap.firstOnewayNode(m) && !reversed) {879 if(isBackward(m))880 return BACKWARD;881 else882 return FORWARD;883 }884 if (n == RelationNodeMap.lastOnewayNode(m) && reversed) {885 if(isBackward(m))886 return FORWARD;887 else888 return BACKWARD;889 }890 } else {891 if (n == way.firstNode())892 return FORWARD;893 if (n == way.lastNode())894 return BACKWARD;895 }896 }897 return NONE;898 }899 900 /**901 * determine, if the way i is a roundabout and if yes, what type of roundabout902 */903 private Direction roundaboutType(int i) {904 RelationMember m = members.get(i);905 if (m == null || !m.isWay()) return NONE;906 Way w = m.getWay();907 return roundaboutType(w);908 }909 static Direction roundaboutType(Way w) {910 if (w != null &&911 "roundabout".equals(w.get("junction")) &&912 w.getNodesCount() < 200 &&913 w.getNodesCount() > 2 &&914 w.getNode(0) != null &&915 w.getNode(1) != null &&916 w.getNode(2) != null &&917 w.firstNode() == w.lastNode()) {918 /** do some simple determinant / cross pruduct test on the first 3 nodes919 to see, if the roundabout goes clock wise or ccw */920 EastNorth en1 = w.getNode(0).getEastNorth();921 EastNorth en2 = w.getNode(1).getEastNorth();922 EastNorth en3 = w.getNode(2).getEastNorth();923 if (en1 != null && en2 != null && en3 != null) {924 en1 = en1.sub(en2);925 en2 = en2.sub(en3);926 return en1.north() * en2.east() - en2.north() * en1.east() > 0 ? ROUNDABOUT_LEFT : ROUNDABOUT_RIGHT;927 }928 }929 return NONE;930 }931 719 932 720 WayConnectionType getWayConnection(int i) { 933 721 if (connectionType == null) { 934 updateLinks();722 connectionType = wayConnectionTypeCalculator.updateLinks(members); 935 723 } 936 724 return connectionType.get(i); … … 967 755 setSelectedMembersIdx(selectedIndices); 968 756 } 969 }970 971 /**972 * refresh the cache of member WayConnectionTypes973 */974 public void updateLinks() {975 connectionType = null;976 final List<WayConnectionType> con = new ArrayList<WayConnectionType>();977 978 for (int i=0; i<members.size(); ++i) {979 con.add(null);980 }981 982 firstGroupIdx=0;983 984 lastForwardWay = UNCONNECTED;985 lastBackwardWay = UNCONNECTED;986 onewayBeginning = false;987 WayConnectionType lastWct = null;988 989 for (int i=0; i<members.size(); ++i) {990 final RelationMember m = members.get(i);991 if (!m.isWay() || m.getWay() == null || m.getWay().isIncomplete()) {992 if(i > 0) {993 makeLoopIfNeeded(con, i-1);994 }995 con.set(i, new WayConnectionType());996 firstGroupIdx = i;997 continue;998 }999 1000 WayConnectionType wct = new WayConnectionType(false);1001 wct.linkPrev = i>0 && con.get(i-1) != null && con.get(i-1).isValid();1002 wct.direction = NONE;1003 1004 if(isOneway(m)){1005 if(lastWct != null && lastWct.isOnewayTail) {1006 wct.isOnewayHead = true;1007 }1008 if(lastBackwardWay == UNCONNECTED && lastForwardWay == UNCONNECTED){ //Beginning of new oneway1009 wct.isOnewayHead = true;1010 lastForwardWay = i-1;1011 lastBackwardWay = i-1;1012 onewayBeginning = true;1013 }1014 }1015 1016 if (wct.linkPrev) {1017 if(lastBackwardWay != UNCONNECTED && lastForwardWay != UNCONNECTED) {1018 wct = determineOnewayConnectionType(con, m, i, wct);1019 if(!wct.linkPrev) {1020 firstGroupIdx = i;1021 }1022 }1023 1024 if(!isOneway(m)) {1025 wct.direction = determineDirection(i-1, lastWct.direction, i);1026 wct.linkPrev = (wct.direction != NONE);1027 }1028 }1029 1030 if (!wct.linkPrev) {1031 wct.direction = determineDirectionOfFirst(i, m);1032 if(isOneway(m)){1033 wct.isOnewayLoopForwardPart = true;1034 lastForwardWay = i;1035 }1036 }1037 1038 wct.linkNext = false;1039 if(lastWct != null) {1040 lastWct.linkNext = wct.linkPrev;1041 }1042 con.set(i, wct);1043 lastWct = wct;1044 1045 if(!wct.linkPrev) {1046 if(i > 0) {1047 makeLoopIfNeeded(con, i-1);1048 }1049 firstGroupIdx = i;1050 }1051 }1052 makeLoopIfNeeded(con, members.size()-1);1053 connectionType = con;1054 757 } 1055 758 … … 1064 767 // } 1065 768 1066 private static Direction reverse(final Direction dir){1067 if(dir == FORWARD) return BACKWARD;1068 if(dir == BACKWARD) return FORWARD;1069 return dir;1070 }1071 1072 private static boolean isBackward(final RelationMember member){1073 return member.getRole().equals("backward");1074 }1075 1076 private static boolean isForward(final RelationMember member){1077 return member.getRole().equals("forward");1078 }1079 1080 public static boolean isOneway(final RelationMember member){1081 return isForward(member) || isBackward(member);1082 }1083 1084 int firstGroupIdx;1085 private void makeLoopIfNeeded(final List<WayConnectionType> con, final int i) {1086 boolean loop;1087 if (i == firstGroupIdx) { //is primitive loop1088 loop = determineDirection(i, FORWARD, i) == FORWARD;1089 } else {1090 loop = determineDirection(i, con.get(i).direction, firstGroupIdx) == con.get(firstGroupIdx).direction;1091 }1092 if (loop) {1093 for (int j=firstGroupIdx; j <= i; ++j) {1094 con.get(j).isLoop = true;1095 }1096 }1097 }1098 1099 private Direction determineDirectionOfFirst(final int i, final RelationMember m) {1100 if (roundaboutType(i) != NONE)1101 return roundaboutType(i);1102 1103 if (isOneway(m)){1104 if(isBackward(m)) return BACKWARD;1105 else return FORWARD;1106 } else { /** guess the direction and see if it fits with the next member */1107 if(determineDirection(i, FORWARD, i+1) != NONE) return FORWARD;1108 if(determineDirection(i, BACKWARD, i+1) != NONE) return BACKWARD;1109 }1110 return NONE;1111 }1112 1113 int lastForwardWay, lastBackwardWay;1114 boolean onewayBeginning;1115 private WayConnectionType determineOnewayConnectionType(final List<WayConnectionType> con,1116 RelationMember m, int i, final WayConnectionType wct) {1117 Direction dirFW = determineDirection(lastForwardWay, con.get(lastForwardWay).direction, i);1118 Direction dirBW = NONE;1119 if(onewayBeginning) {1120 if(lastBackwardWay < 0) {1121 dirBW = determineDirection(firstGroupIdx, reverse(con.get(firstGroupIdx).direction), i, true);1122 } else {1123 dirBW = determineDirection(lastBackwardWay, con.get(lastBackwardWay).direction, i, true);1124 }1125 1126 if(dirBW != NONE) {1127 onewayBeginning = false;1128 }1129 } else {1130 dirBW = determineDirection(lastBackwardWay, con.get(lastBackwardWay).direction, i, true);1131 }1132 1133 if(isOneway(m)) {1134 if(dirBW != NONE){1135 wct.direction = dirBW;1136 lastBackwardWay = i;1137 wct.isOnewayLoopBackwardPart = true;1138 }1139 if(dirFW != NONE){1140 wct.direction = dirFW;1141 lastForwardWay = i;1142 wct.isOnewayLoopForwardPart = true;1143 }1144 if(dirFW == NONE && dirBW == NONE) { //Not connected to previous1145 // unconnectPreviousLink(con, i, true);1146 // unconnectPreviousLink(con, i, false);1147 wct.linkPrev = false;1148 if(isOneway(m)){1149 wct.isOnewayHead = true;1150 lastForwardWay = i-1;1151 lastBackwardWay = i-1;1152 } else {1153 lastForwardWay = UNCONNECTED;1154 lastBackwardWay = UNCONNECTED;1155 }1156 onewayBeginning = true;1157 }1158 1159 if(dirFW != NONE && dirBW != NONE) { //End of oneway loop1160 if(i+1<members.size() && determineDirection(i, dirFW, i+1) != NONE) {1161 wct.isOnewayLoopBackwardPart = false;1162 dirBW = NONE;1163 wct.direction = dirFW;1164 } else {1165 wct.isOnewayLoopForwardPart = false;1166 dirFW = NONE;1167 wct.direction = dirBW;1168 }1169 1170 wct.isOnewayTail = true;1171 }1172 1173 } else {1174 lastForwardWay = UNCONNECTED;1175 lastBackwardWay = UNCONNECTED;1176 if(dirFW == NONE || dirBW == NONE) {1177 wct.linkPrev = false;1178 }1179 }1180 return wct;1181 }1182 1183 private static interface AdditionalSorter {1184 public boolean acceptsMember(RelationMember m);1185 public List<RelationMember> sortMembers(List<RelationMember> list);1186 }1187 1188 /**1189 * Class that sorts type=associatedStreet relation's houses.1190 */1191 private static class AssociatedStreetSorter implements AdditionalSorter {1192 1193 @Override1194 public boolean acceptsMember(RelationMember m) {1195 return m != null1196 && m.getRole() != null && m.getRole().equals("house")1197 && m.getMember() != null && m.getMember().get("addr:housenumber") != null;1198 }1199 1200 @Override1201 public List<RelationMember> sortMembers(List<RelationMember> list) {1202 Collections.sort(list, new Comparator<RelationMember>() {1203 @Override1204 public int compare(RelationMember a, RelationMember b) {1205 if (a == b || a.getMember() == b.getMember()) return 0;1206 String addrA = a.getMember().get("addr:housenumber").trim();1207 String addrB = b.getMember().get("addr:housenumber").trim();1208 if (addrA.equals(addrB)) return 0;1209 // Strip non-digits (from "1B" addresses for example)1210 String addrAnum = addrA.replaceAll("\\D+", "");1211 String addrBnum = addrB.replaceAll("\\D+", "");1212 // Compare only numbers1213 try {1214 Integer res = Integer.parseInt(addrAnum) - Integer.parseInt(addrBnum);1215 if (res != 0) return res;1216 } catch (NumberFormatException e) {1217 // Ignore NumberFormatException. If the number is not composed of digits, strings are compared next1218 }1219 // Same number ? Compare full strings1220 return addrA.compareTo(addrB);1221 }1222 });1223 return list;1224 }1225 }1226 769 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationNodeMap.java
r5627 r5630 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.dialogs.relation ;3 4 import static org.openstreetmap.josm.gui.dialogs.relation. WayConnectionType.Direction.NONE;2 package org.openstreetmap.josm.gui.dialogs.relation.sort; 3 4 import static org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction.NONE; 5 5 6 6 import java.util.ArrayList; … … 30 30 */ 31 31 public class RelationNodeMap { 32 32 33 private static class NodesWays{ 33 public Map<Node, Set<Integer>> nodes = new TreeMap<Node, Set<Integer>>();34 public Map<Integer, Set<Node>> ways = new TreeMap<Integer, Set<Node>>();35 public boolean oneWay;34 public final Map<Node, Set<Integer>> nodes = new TreeMap<Node, Set<Integer>>(); 35 public final Map<Integer, Set<Node>> ways = new TreeMap<Integer, Set<Node>>(); 36 public final boolean oneWay; 36 37 public NodesWays(boolean oneWay){ 37 38 this.oneWay = oneWay; … … 42 43 * the maps. (Need TreeMap for efficiency.) 43 44 */ 44 private NodesWays map = new NodesWays(false);45 private final NodesWays map = new NodesWays(false); 45 46 /* 46 47 * Maps for oneways (forward/backward roles) 47 48 */ 48 49 49 private NodesWays onewayMap = new NodesWays(true);50 private NodesWays onewayReverseMap = new NodesWays(true);50 private final NodesWays onewayMap = new NodesWays(true); 51 private final NodesWays onewayReverseMap = new NodesWays(true); 51 52 /* 52 53 * Used to keep track of what members are done. 53 54 */ 54 private Set<Integer> remaining;55 private Map<Integer, Set<Node>> remainingOneway = new TreeMap<Integer, Set<Node>>();;55 private final Set<Integer> remaining = new TreeSet<Integer>(); 56 private final Map<Integer, Set<Node>> remainingOneway = new TreeMap<Integer, Set<Node>>(); 56 57 57 58 /** 58 59 * All members that are incomplete or not a way 59 60 */ 60 private List<Integer> notSortable = new ArrayList<Integer>();61 private final List<Integer> notSortable = new ArrayList<Integer>(); 61 62 62 63 public static Node firstOnewayNode(RelationMember m){ … … 73 74 74 75 RelationNodeMap(List<RelationMember> members) { 75 map.nodes = new TreeMap<Node, Set<Integer>>();76 map.ways = new TreeMap<Integer, Set<Node>>();77 78 76 for (int i = 0; i < members.size(); ++i) { 79 77 RelationMember m = members.get(i); … … 84 82 85 83 Way w = m.getWay(); 86 if (( MemberTableModel.roundaboutType(w) != NONE)) {84 if ((RelationSortUtils.roundaboutType(w) != NONE)) { 87 85 for (Node nd : w.getNodes()) { 88 86 addPair(nd, i); 89 87 } 90 } else if( MemberTableModel.isOneway(m)) {88 } else if(RelationSortUtils.isOneway(m)) { 91 89 addNodeWayMap(firstOnewayNode(m), i); 92 90 addWayNodeMap(lastOnewayNode(m), i); … … 101 99 } 102 100 103 remaining = new TreeSet<Integer>();104 101 remaining.addAll(map.ways.keySet()); 105 102 … … 325 322 326 323 if (remainingOneway.isEmpty()) return null; 327 for(Integer i :remainingOneway.keySet()){ //find oneway, whic is connected to more than one way (is between two oneway loops)324 for(Integer i :remainingOneway.keySet()){ //find oneway, which is connected to more than one way (is between two oneway loops) 328 325 for(Node n : onewayReverseMap.ways.get(i)){ 329 326 if(onewayReverseMap.nodes.containsKey(n) && onewayReverseMap.nodes.get(n).size() > 1) { -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
r5627 r5630 1 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.dialogs.relation ;2 package org.openstreetmap.josm.gui.dialogs.relation.sort; 3 3 4 import static org.openstreetmap.josm.gui.dialogs.relation. WayConnectionType.Direction.NONE;4 import static org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType.Direction.NONE; 5 5 import static org.openstreetmap.josm.tools.I18n.tr; 6 6
Note:
See TracChangeset
for help on using the changeset viewer.