[2305] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
| 2 | package org.openstreetmap.josm.command;
|
---|
| 3 |
|
---|
[2844] | 4 | import static org.openstreetmap.josm.tools.I18n.trn;
|
---|
[2305] | 5 |
|
---|
| 6 | import java.util.ArrayList;
|
---|
| 7 | import java.util.Collection;
|
---|
[3262] | 8 | import java.util.HashSet;
|
---|
[2305] | 9 | import java.util.List;
|
---|
| 10 |
|
---|
| 11 | import javax.swing.JLabel;
|
---|
| 12 |
|
---|
[3703] | 13 | import org.openstreetmap.josm.data.osm.DataSet;
|
---|
[3257] | 14 | import org.openstreetmap.josm.data.osm.Node;
|
---|
[3440] | 15 | import org.openstreetmap.josm.data.osm.NodeData;
|
---|
[2305] | 16 | import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
---|
| 17 | import org.openstreetmap.josm.data.osm.PrimitiveData;
|
---|
[3660] | 18 | import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
---|
[2305] | 19 |
|
---|
[3703] | 20 | /**
|
---|
| 21 | * Add primitives to a data layer.
|
---|
| 22 | *
|
---|
| 23 | */
|
---|
[2305] | 24 | public class AddPrimitivesCommand extends Command {
|
---|
| 25 |
|
---|
[3703] | 26 | private List<PrimitiveData> data = new ArrayList<PrimitiveData>();
|
---|
[2305] | 27 |
|
---|
[3703] | 28 | // only filled on undo
|
---|
| 29 | private List<OsmPrimitive> createdPrimitives = null;
|
---|
| 30 |
|
---|
[2305] | 31 | public AddPrimitivesCommand(List<PrimitiveData> data) {
|
---|
| 32 | this.data.addAll(data);
|
---|
| 33 | }
|
---|
[3660] | 34 |
|
---|
| 35 | public AddPrimitivesCommand(List<PrimitiveData> data, OsmDataLayer layer) {
|
---|
| 36 | super(layer);
|
---|
| 37 | this.data.addAll(data);
|
---|
| 38 | }
|
---|
[2305] | 39 |
|
---|
[3440] | 40 | @SuppressWarnings("null")
|
---|
[2305] | 41 | @Override public boolean executeCommand() {
|
---|
[3703] | 42 | List<OsmPrimitive> newPrimitives;
|
---|
| 43 | if (createdPrimitives == null) { // first time execution
|
---|
| 44 | newPrimitives = new ArrayList<OsmPrimitive>(data.size());
|
---|
[2305] | 45 |
|
---|
[3703] | 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 | }
|
---|
[2305] | 60 |
|
---|
[3703] | 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 | }
|
---|
[3257] | 66 | }
|
---|
[3703] | 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);
|
---|
[3440] | 72 | }
|
---|
[3703] | 73 | newPrimitives = createdPrimitives;
|
---|
[2305] | 74 | }
|
---|
[3257] | 75 |
|
---|
[3703] | 76 | getLayer().data.setSelected(newPrimitives);
|
---|
[2305] | 77 | return true;
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | @Override public void undoCommand() {
|
---|
[3703] | 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 | }
|
---|
[2305] | 100 | }
|
---|
| 101 | }
|
---|
| 102 |
|
---|
[3262] | 103 | @Override public JLabel getDescription() {
|
---|
[3703] | 104 | int size = data != null ? data.size() : createdPrimitives.size();
|
---|
| 105 | return new JLabel(trn("Added {0} object", "Added {0} objects", size, size), null,
|
---|
[3440] | 106 | JLabel.HORIZONTAL
|
---|
[2305] | 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 |
|
---|
[3262] | 116 | @Override
|
---|
| 117 | public Collection<? extends OsmPrimitive> getParticipatingPrimitives() {
|
---|
[3703] | 118 | if (createdPrimitives != null)
|
---|
| 119 | return createdPrimitives;
|
---|
| 120 |
|
---|
[3262] | 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 | }
|
---|
[2305] | 130 | }
|
---|