Ticket #5590: multijoin2.patch

File multijoin2.patch, 4.4 KB (added by bilbo, 11 years ago)

Patch allowing "Join node to way" with multiple selected nodes

  • src/org/openstreetmap/josm/actions/JoinNodeWayAction.java

     
    1111import java.util.Collections;
    1212import java.util.HashMap;
    1313import java.util.HashSet;
     14import java.util.Iterator;
    1415import java.util.LinkedList;
    1516import java.util.List;
    1617import java.util.Map;
     
    3536    public void actionPerformed(ActionEvent e) {
    3637        if (!isEnabled())
    3738            return;
     39        boolean needRepaint = false;
    3840        Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected();
    39         if (sel.size() != 1 || !(sel.iterator().next() instanceof Node)) return;
    40         Node node = (Node) sel.iterator().next();
     41        if (sel.size() < 1) return;
    4142
    42         List<WaySegment> wss = Main.map.mapView.getNearestWaySegments(
    43                 Main.map.mapView.getPoint(node), OsmPrimitive.isSelectablePredicate);
    44         HashMap<Way, List<Integer>> insertPoints = new HashMap<Way, List<Integer>>();
    45         for (WaySegment ws : wss) {
    46             List<Integer> is;
    47             if (insertPoints.containsKey(ws.way)) {
    48                 is = insertPoints.get(ws.way);
    49             } else {
    50                 is = new ArrayList<Integer>();
    51                 insertPoints.put(ws.way, is);
    52             }
     43        Collection<Command> cmds = new LinkedList<Command>();
    5344
    54             if (ws.way.getNode(ws.lowerIndex) != node
    55                     && ws.way.getNode(ws.lowerIndex+1) != node) {
    56                 is.add(ws.lowerIndex);
     45        Iterator<OsmPrimitive> it = sel.iterator();
     46
     47        while (it.hasNext()) {
     48            OsmPrimitive nxt = it.next();
     49            if (nxt==null) break;
     50            if (!(nxt instanceof Node)) continue;
     51            Node node = (Node)nxt;
     52
     53            List<WaySegment> wss = Main.map.mapView.getNearestWaySegments(
     54                    Main.map.mapView.getPoint(node), OsmPrimitive.isSelectablePredicate);
     55            HashMap<Way, List<Integer>> insertPoints = new HashMap<Way, List<Integer>>();
     56            for (WaySegment ws : wss) {
     57                List<Integer> is;
     58                if (insertPoints.containsKey(ws.way)) {
     59                    is = insertPoints.get(ws.way);
     60                } else {
     61                    is = new ArrayList<Integer>();
     62                    insertPoints.put(ws.way, is);
     63                }
     64
     65                if (ws.way.getNode(ws.lowerIndex) != node
     66                        && ws.way.getNode(ws.lowerIndex+1) != node) {
     67                    is.add(ws.lowerIndex);
     68                }
    5769            }
    58         }
    5970
    60         Collection<Command> cmds = new LinkedList<Command>();
    61         for (Map.Entry<Way, List<Integer>> insertPoint : insertPoints.entrySet()) {
    62             List<Integer> is = insertPoint.getValue();
    63             if (is.size() == 0)
    64                 continue;
     71            for (Map.Entry<Way, List<Integer>> insertPoint : insertPoints.entrySet()) {
     72                List<Integer> is = insertPoint.getValue();
     73                if (is.size() == 0)
     74                    continue;
    6575
    66             Way w = insertPoint.getKey();
    67             List<Node> nodesToAdd = w.getNodes();
    68             pruneSuccsAndReverse(is);
    69             for (int i : is) {
    70                 nodesToAdd.add(i+1, node);
     76                Way w = insertPoint.getKey();
     77                List<Node> nodesToAdd = w.getNodes();
     78                pruneSuccsAndReverse(is);
     79                for (int i : is) {
     80                    nodesToAdd.add(i+1, node);
     81                }
     82                Way wnew = new Way(w);
     83                wnew.setNodes(nodesToAdd);
     84                cmds.add(new ChangeCommand(w, wnew));
    7185            }
    72             Way wnew = new Way(w);
    73             wnew.setNodes(nodesToAdd);
    74             cmds.add(new ChangeCommand(w, wnew));
    75         }
    7686
    77         if (cmds.size() == 0)
    78             return;
     87            if (cmds.size() == 0) continue;
     88            needRepaint = true;
     89            Main.main.undoRedo.add(new SequenceCommand(tr("Join Node and Line"), cmds));
     90            cmds = new LinkedList<Command>();
    7991
    80         Main.main.undoRedo.add(new SequenceCommand(tr("Join Node and Line"), cmds));
    81         Main.map.repaint();
     92        }
     93        if (needRepaint) Main.map.repaint();
    8294    }
    8395
    8496    private static void pruneSuccsAndReverse(List<Integer> is) {