Ticket #5552: deleteSpeed.diff

File deleteSpeed.diff, 1.8 KB (added by extropy, 15 years ago)
  • src/org/openstreetmap/josm/data/osm/Way.java

     
    55
    66import java.util.ArrayList;
    77import java.util.Arrays;
    8 import java.util.Collection;
    98import java.util.List;
     9import java.util.Set;
    1010
    1111import org.openstreetmap.josm.Main;
    1212import org.openstreetmap.josm.data.osm.visitor.Visitor;
     
    293293        }
    294294    }
    295295
    296     public void removeNodes(Collection<? extends OsmPrimitive> selection) {
     296    public void removeNodes(Set<? extends OsmPrimitive> selection) {
    297297        if (isIncomplete()) return;
    298298        boolean locked = writeLock();
    299299        try {
    300             for(OsmPrimitive p : selection) {
    301                 if (p instanceof Node) {
    302                     removeNode((Node)p);
     300
     301            //test if there is anything to remove
     302            int nodesToRemove = 0;
     303            for (Node n: nodes) {
     304                nodesToRemove ++;
     305            }
     306
     307            if (nodesToRemove > 0) {
     308
     309                boolean closed = (lastNode() == firstNode() && selection.contains(lastNode()));
     310                List<Node> copy = new ArrayList<Node>(this.getNodesCount() - nodesToRemove);
     311
     312                for (Node n: nodes) {
     313                    if (!selection.contains(n)) {
     314                        copy.add(n);
     315                    }
    303316                }
     317
     318                int i = copy.size();
     319                if (closed && i > 2) {
     320                    copy.add(copy.get(0));
     321                } else if (i >= 2 && i <= 3 && copy.get(0) == copy.get(i-1)) {
     322                    copy.remove(i-1);
     323                }
     324                setNodes(copy);
    304325            }
    305326        } finally {
    306327            writeUnlock(locked);