Ticket #5703: addnodesbug.patch
File addnodesbug.patch, 5.1 KB (added by , 13 years ago) |
---|
-
src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
10 10 11 11 import javax.swing.JLabel; 12 12 13 import org.openstreetmap.josm.data.osm.DataSet; 13 14 import org.openstreetmap.josm.data.osm.Node; 14 15 import org.openstreetmap.josm.data.osm.NodeData; 15 16 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 18 19 19 20 public class AddPrimitivesCommand extends Command { 20 21 21 private finalList<PrimitiveData> data = new ArrayList<PrimitiveData>();22 private List<PrimitiveData> data = new ArrayList<PrimitiveData>(); 22 23 24 // only filled on undo 25 private List<OsmPrimitive> createdPrimitives = null; 26 23 27 public AddPrimitivesCommand(List<PrimitiveData> data) { 24 28 this.data.addAll(data); 25 29 } … … 31 35 32 36 @SuppressWarnings("null") 33 37 @Override public boolean executeCommand() { 38 List<OsmPrimitive> newPrimitives; 39 if (createdPrimitives == null) { // first time execution 40 newPrimitives = new ArrayList<OsmPrimitive>(data.size()); 34 41 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 } 36 56 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 } 42 62 } 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); 45 68 } 46 if (created) { 47 getLayer().data.addPrimitive(primitive); 48 } 49 createdPrimitives.add(primitive); 69 newPrimitives = createdPrimitives; 50 70 } 51 71 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); 60 73 return true; 61 74 } 62 75 63 76 @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 } 66 96 } 67 97 } 68 98 69 99 @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, 71 102 JLabel.HORIZONTAL 72 103 ); 73 104 } … … 80 111 81 112 @Override 82 113 public Collection<? extends OsmPrimitive> getParticipatingPrimitives() { 114 if (createdPrimitives != null) 115 return createdPrimitives; 116 83 117 Collection<OsmPrimitive> prims = new HashSet<OsmPrimitive>(); 84 118 for (PrimitiveData d : data) { 85 119 OsmPrimitive osm = getLayer().data.getPrimitiveById(d);