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

Last change on this file since 5266 was 5170, checked in by Don-vip, 12 years ago

cleanup svn:mime-type properties preventing Java sources from being viewed as such on Trac

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