Ticket #5703: addnodesbug.patch

File addnodesbug.patch, 5.1 KB (added by bastiK, 13 years ago)
  • src/org/openstreetmap/josm/command/AddPrimitivesCommand.java

     
    1010
    1111import javax.swing.JLabel;
    1212
     13import org.openstreetmap.josm.data.osm.DataSet;
    1314import org.openstreetmap.josm.data.osm.Node;
    1415import org.openstreetmap.josm.data.osm.NodeData;
    1516import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    1819
    1920public class AddPrimitivesCommand extends Command {
    2021
    21     private final List<PrimitiveData> data = new ArrayList<PrimitiveData>();
     22    private List<PrimitiveData> data = new ArrayList<PrimitiveData>();
    2223
     24    // only filled on undo
     25    private List<OsmPrimitive> createdPrimitives = null;
     26
    2327    public AddPrimitivesCommand(List<PrimitiveData> data) {
    2428        this.data.addAll(data);
    2529    }
     
    3135
    3236    @SuppressWarnings("null")
    3337    @Override public boolean executeCommand() {
     38        List<OsmPrimitive> newPrimitives;
     39        if (createdPrimitives == null) { // first time execution
     40            newPrimitives = new ArrayList<OsmPrimitive>(data.size());
    3441
    35         List<OsmPrimitive> createdPrimitives = new ArrayList<OsmPrimitive>(data.size());
     42            for (PrimitiveData pd:data) {
     43                OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
     44                boolean created = primitive == null;
     45                if (created) {
     46                    primitive = pd.getType().newInstance(pd.getUniqueId(), true);
     47                }
     48                if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates
     49                    primitive.load(pd);
     50                }
     51                if (created) {
     52                    getLayer().data.addPrimitive(primitive);
     53                }
     54                newPrimitives.add(primitive);
     55            }
    3656
    37         for (PrimitiveData pd:data) {
    38             OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
    39             boolean created = primitive == null;
    40             if (created) {
    41                 primitive = pd.getType().newInstance(pd.getUniqueId(), true);
     57            //Then load ways and relations
     58            for (int i=0; i<newPrimitives.size(); i++) {
     59                if (!(newPrimitives.get(i) instanceof Node)) {
     60                    newPrimitives.get(i).load(data.get(i));
     61                }
    4262            }
    43             if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates
    44                 primitive.load(pd);
     63        } else { // redo
     64            // When redoing this command, we have to add the same objects, otherwise
     65            // a subsequent command (e.g. MoveCommand) cannot be redone.
     66            for (OsmPrimitive osm : createdPrimitives) {
     67                getLayer().data.addPrimitive(osm);
    4568            }
    46             if (created) {
    47                 getLayer().data.addPrimitive(primitive);
    48             }
    49             createdPrimitives.add(primitive);
     69            newPrimitives = createdPrimitives;
    5070        }
    5171
    52         //Then load ways and relations
    53         for (int i=0; i<createdPrimitives.size(); i++) {
    54             if (!(createdPrimitives.get(i) instanceof Node)) {
    55                 createdPrimitives.get(i).load(data.get(i));
    56             }
    57         }
    58 
    59         getLayer().data.setSelected(createdPrimitives);
     72        getLayer().data.setSelected(newPrimitives);
    6073        return true;
    6174    }
    6275
    6376    @Override public void undoCommand() {
    64         for (PrimitiveData p:data) {
    65             getLayer().data.removePrimitive(p);
     77        DataSet ds = getLayer().data;
     78       
     79        if (createdPrimitives == null) {
     80            createdPrimitives = new ArrayList<OsmPrimitive>(data.size());
     81           
     82            for (PrimitiveData p : data) {
     83                createdPrimitives.add(ds.getPrimitiveById(p));
     84            }
     85            createdPrimitives = PurgeCommand.topoSort(createdPrimitives);
     86           
     87            for (PrimitiveData p : data) {
     88                ds.removePrimitive(p);
     89            }
     90            data = null;
     91           
     92        } else {
     93            for (OsmPrimitive osm : createdPrimitives) {
     94                ds.removePrimitive(osm);
     95            }
    6696        }
    6797    }
    6898
    6999    @Override public JLabel getDescription() {
    70         return new JLabel(trn("Added {0} object", "Added {0} objects", data.size(), data.size()), null,
     100        int size = data != null ? data.size() : createdPrimitives.size();
     101        return new JLabel(trn("Added {0} object", "Added {0} objects", size, size), null,
    71102                JLabel.HORIZONTAL
    72103        );
    73104    }
     
    80111
    81112    @Override
    82113    public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
     114        if (createdPrimitives != null)
     115            return createdPrimitives;
     116       
    83117        Collection<OsmPrimitive> prims = new HashSet<OsmPrimitive>();
    84118        for (PrimitiveData d : data) {
    85119            OsmPrimitive osm = getLayer().data.getPrimitiveById(d);