source: josm/trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java@ 3734

Last change on this file since 3734 was 3703, checked in by bastiK, 13 years ago

fixed #5703 - Redoing move after paste doesn't work correctly

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain
File size: 4.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.command;
3
4import static org.openstreetmap.josm.tools.I18n.trn;
5
6import java.util.ArrayList;
7import java.util.Collection;
8import java.util.HashSet;
9import java.util.List;
10
11import javax.swing.JLabel;
12
13import org.openstreetmap.josm.data.osm.DataSet;
14import org.openstreetmap.josm.data.osm.Node;
15import org.openstreetmap.josm.data.osm.NodeData;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.data.osm.PrimitiveData;
18import org.openstreetmap.josm.gui.layer.OsmDataLayer;
19
20/**
21 * Add primitives to a data layer.
22 *
23 */
24public class AddPrimitivesCommand extends Command {
25
26 private List<PrimitiveData> data = new ArrayList<PrimitiveData>();
27
28 // only filled on undo
29 private List<OsmPrimitive> createdPrimitives = null;
30
31 public AddPrimitivesCommand(List<PrimitiveData> data) {
32 this.data.addAll(data);
33 }
34
35 public AddPrimitivesCommand(List<PrimitiveData> data, OsmDataLayer layer) {
36 super(layer);
37 this.data.addAll(data);
38 }
39
40 @SuppressWarnings("null")
41 @Override public boolean executeCommand() {
42 List<OsmPrimitive> newPrimitives;
43 if (createdPrimitives == null) { // first time execution
44 newPrimitives = new ArrayList<OsmPrimitive>(data.size());
45
46 for (PrimitiveData pd : data) {
47 OsmPrimitive primitive = getLayer().data.getPrimitiveById(pd);
48 boolean created = primitive == null;
49 if (created) {
50 primitive = pd.getType().newInstance(pd.getUniqueId(), true);
51 }
52 if (pd instanceof NodeData) { // Load nodes immediately because they can't be added to dataset without coordinates
53 primitive.load(pd);
54 }
55 if (created) {
56 getLayer().data.addPrimitive(primitive);
57 }
58 newPrimitives.add(primitive);
59 }
60
61 //Then load ways and relations
62 for (int i=0; i<newPrimitives.size(); i++) {
63 if (!(newPrimitives.get(i) instanceof Node)) {
64 newPrimitives.get(i).load(data.get(i));
65 }
66 }
67 } else { // redo
68 // When redoing this command, we have to add the same objects, otherwise
69 // a subsequent command (e.g. MoveCommand) cannot be redone.
70 for (OsmPrimitive osm : createdPrimitives) {
71 getLayer().data.addPrimitive(osm);
72 }
73 newPrimitives = createdPrimitives;
74 }
75
76 getLayer().data.setSelected(newPrimitives);
77 return true;
78 }
79
80 @Override public void undoCommand() {
81 DataSet ds = getLayer().data;
82
83 if (createdPrimitives == null) {
84 createdPrimitives = new ArrayList<OsmPrimitive>(data.size());
85
86 for (PrimitiveData p : data) {
87 createdPrimitives.add(ds.getPrimitiveById(p));
88 }
89 createdPrimitives = PurgeCommand.topoSort(createdPrimitives);
90
91 for (PrimitiveData p : data) {
92 ds.removePrimitive(p);
93 }
94 data = null;
95
96 } else {
97 for (OsmPrimitive osm : createdPrimitives) {
98 ds.removePrimitive(osm);
99 }
100 }
101 }
102
103 @Override public JLabel getDescription() {
104 int size = data != null ? data.size() : createdPrimitives.size();
105 return new JLabel(trn("Added {0} object", "Added {0} objects", size, size), null,
106 JLabel.HORIZONTAL
107 );
108 }
109
110 @Override
111 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
112 Collection<OsmPrimitive> added) {
113 // Does nothing because we don't want to create OsmPrimitives.
114 }
115
116 @Override
117 public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
118 if (createdPrimitives != null)
119 return createdPrimitives;
120
121 Collection<OsmPrimitive> prims = new HashSet<OsmPrimitive>();
122 for (PrimitiveData d : data) {
123 OsmPrimitive osm = getLayer().data.getPrimitiveById(d);
124 if (osm == null)
125 throw new RuntimeException();
126 prims.add(osm);
127 }
128 return prims;
129 }
130}
Note: See TracBrowser for help on using the repository browser.