Ticket #270: deletenodefromway.patch

File deletenodefromway.patch, 2.6 KB (added by dean@…, 13 years ago)

Final patch to delete a node from a way

  • src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java

    diff -uar josm/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java josm2/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
    old new  
    1010import java.util.Collection;
    1111import java.util.Collections;
    1212import java.util.HashSet;
     13import java.util.LinkedList;
    1314import java.util.Map.Entry;
    1415
    1516import javax.swing.JOptionPane;
     
    133134         *
    134135         * If deleting a node which is part of exactly two segments, and both segments
    135136         * have no conflicting keys, join them and remove the node.
     137         * If the two segments are part of the same way, remove the deleted segment
     138         * from the way.
    136139         *
    137140         * @param selection The objects to delete.
    138141         * @param msgBox Whether a message box for errors should be shown
     
    180183                        seg1 = seg2;
    181184                        seg2 = s;
    182185                }
    183                 for (Way w : Main.ds.ways)
    184                         if (!w.deleted && (w.segments.contains(seg1) || w.segments.contains(seg2)))
    185                                 return tr("Used in a way.");
    186186                if (seg1.from == seg2.from || seg1.to == seg2.to)
    187187                        return tr("Wrong direction of segments.");
    188188                for (Entry<String, String> e : seg1.entrySet())
    189189                        if (seg2.keySet().contains(e.getKey()) && !seg2.get(e.getKey()).equals(e.getValue()))
    190190                                return tr("Conflicting keys");
     191                ArrayList<Way> ways = new ArrayList<Way>(2);
     192                for (Way w : Main.ds.ways)
     193                        if (!w.deleted)
     194                                if ((w.segments.contains(seg1) && !w.segments.contains(seg2)) || (!w.segments.contains(seg1) && w.segments.contains(seg2)))
     195                                        return tr("Conflicting ways");
     196                                else if (w.segments.contains(seg1) && w.segments.contains(seg2))
     197                                        ways.add(w);
    191198                Segment s = new Segment(seg1);
    192199                s.to = seg2.to;
    193200                if (s.keys == null)
    194201                        s.keys = seg2.keys;
    195202                else if (seg2.keys != null)
    196203                        s.keys.putAll(seg2.keys);
    197                 Command[] cmds = new Command[]{
    198                         new ChangeCommand(seg1, s),
    199                         new DeleteCommand(Arrays.asList(new OsmPrimitive[]{n, seg2}))};
    200                 Main.main.editLayer().add(new SequenceCommand(tr("Delete Node"), Arrays.asList(cmds)));
     204                Collection<Command> cmds = new LinkedList<Command>();
     205                for (Way w : ways) {
     206                        Way copy = new Way(w);
     207                        copy.segments.remove(seg2);
     208                        cmds.add(new ChangeCommand(w, copy));
     209                }
     210                cmds.add(new ChangeCommand(seg1, s));
     211                cmds.add(new DeleteCommand(Arrays.asList(new OsmPrimitive[]{n, seg2})));
     212                Main.main.editLayer().add(new SequenceCommand(tr("Delete Node"), cmds));
    201213                return null;
    202214    }
    203215}