This starts using the new Commands in DeleteAction and cleans it up a bit in the process.
--- core-dave/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java | 98 ++++------ 1 file changed, 46 insertions(+), 52 deletions(-) diff -puN src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java~deleteaction src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java --- core/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java~deleteaction 2008-05-03 12:08:45.000000000 -0700 +++ core-dave/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java 2008-05-03 12:08:45.000000000 -0700 @@ -166,69 +166,61 @@ public class DeleteAction extends MapMod if (selection.isEmpty()) return null; Collection<OsmPrimitive> del = new HashSet<OsmPrimitive>(selection); - Collection<Way> waysToBeChanged = new HashSet<Way>(); if (alsoDeleteNodesInWay) { - // Delete untagged nodes that are to be unreferenced. - Collection<OsmPrimitive> delNodes = new HashSet<OsmPrimitive>(); + // we need this additional collection because otherwise this throws + // ConcurrentModifificationExceptions + Collection<OsmPrimitive> delNodes = new HashSet<OsmPrimitive>(selection); for (OsmPrimitive osm : del) { - if (osm instanceof Way) { - for (Node n : ((Way)osm).nodes) { - if (!n.tagged) { - CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds, false); - n.visit(v); - v.data.removeAll(del); - if (v.data.isEmpty()) { - delNodes.add(n); - } - } - } + if (!(osm instanceof Way)) + continue; + for (Node n : ((Way)osm).nodes) { + if (n.tagged) + continue; + CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds, false); + n.visit(v); + v.data.removeAll(del); + if (v.data.isEmpty()) + delNodes.add(n); } } del.addAll(delNodes); } - for (OsmPrimitive osm : del) { CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds, false); osm.visit(v); for (OsmPrimitive ref : v.data) { - if (del.contains(ref)) continue; - if (ref instanceof Way) { - waysToBeChanged.add((Way) ref); - } else if (ref instanceof Relation) { + if (del.contains(ref)) + continue; + // we'll deal with ways in a second + if (ref instanceof Way) + continue; + if (ref instanceof Relation) { JOptionPane.showMessageDialog(Main.parent, tr("Cannot delete: Selection is used by relation")); return null; - } else { - return null; } + return null; } } Collection<Command> cmds = new LinkedList<Command>(); - for (Way w : waysToBeChanged) { - Way wnew = new Way(w); - wnew.nodes.removeAll(del); - if (wnew.nodes.size() < 2) { - del.add(w); - - CollectBackReferencesVisitor v = new CollectBackReferencesVisitor(Main.ds, false); - w.visit(v); - for (OsmPrimitive ref : v.data) { - if (del.contains(ref)) continue; - if (ref instanceof Relation) { - JOptionPane.showMessageDialog(Main.parent, - tr("Cannot delete: Selection is used by relation")); - } else { - return null; - } - } - } else { - cmds.add(new ChangeCommand(w, wnew)); + HashSet<Way> checkForDel = new HashSet<Way>(); + for (OsmPrimitive osm : del) { + if (!(osm instanceof Node)) + continue; + Node n = (Node)osm; + for (Way w : Main.ds.rl.waysUsingNode(n)) { + cmds.add(new RemoveNodeInWayCommand(w, n)); + checkForDel.add(w); } } + // we need to do this reverse lookup stuff elsewhere + // perhaps in way.mayDelete()? if (!del.isEmpty()) cmds.add(new DeleteCommand(del)); + if (!checkForDel.isEmpty()) + cmds.add(new ConditionalDeleteCommand(checkForDel)); return new SequenceCommand(tr("Delete"), cmds); } @@ -244,28 +236,30 @@ public class DeleteAction extends MapMod return new DeleteCommand(Collections.singleton(ws.way)); } - Way wnew = new Way(ws.way); - wnew.nodes.clear(); - if (n1.size() < 2) { - wnew.nodes.addAll(n2); - return new ChangeCommand(ws.way, wnew); + Collection<Command> cmds = new LinkedList<Command>(); + for (Node n : n2) + cmds.add(new AddNodeToWayCommand(ws.way, n)); + return new SequenceCommand(tr("delete way segment"), cmds); } else if (n2.size() < 2) { - wnew.nodes.addAll(n1); - return new ChangeCommand(ws.way, wnew); + Collection<Command> cmds = new LinkedList<Command>(); + for (Node n : n1) + cmds.add(new AddNodeToWayCommand(ws.way, n)); + // We might want to add a AddNodesToWayCommand instead of this... + return new SequenceCommand("add nodes", cmds); } else { Collection<Command> cmds = new LinkedList<Command>(); - wnew.nodes.addAll(n1); - cmds.add(new ChangeCommand(ws.way, wnew)); + for (Node n : n1) + cmds.add(new AddNodeToWayCommand(ws.way, n)); Way wnew2 = new Way(); - if (wnew.keys != null) { - wnew2.keys = new HashMap<String, String>(wnew.keys); + if (ws.way.keys != null) { + wnew2.keys = new HashMap<String, String>(ws.way.keys); wnew2.checkTagged(); wnew2.checkDirectionTagged(); } - wnew2.nodes.addAll(n2); + wnew2.addNodes(n2); cmds.add(new AddCommand(wnew2)); return new SequenceCommand(tr("Split way segment"), cmds); _ _______________________________________________ josm-dev mailing list josm-dev@openstreetmap.org http://lists.openstreetmap.org/cgi-bin/mailman/listinfo/josm-dev