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

Revision 5170, 4.4 KB checked in by Don-vip, 6 weeks ago (diff)

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

  • Property svn:eol-style set to native
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.