source: josm/trunk/src/org/openstreetmap/josm/command/UndeletePrimitivesCommand.java@ 3172

Last change on this file since 3172 was 3083, checked in by bastiK, 14 years ago

added svn:eol-style=native to source files

  • Property svn:eol-style set to native
File size: 4.9 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.Collections;
9import java.util.List;
10import java.util.ListIterator;
11
12import javax.swing.JLabel;
13import javax.swing.tree.DefaultMutableTreeNode;
14import javax.swing.tree.MutableTreeNode;
15
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.data.osm.Relation;
20import org.openstreetmap.josm.data.osm.RelationMember;
21import org.openstreetmap.josm.data.osm.Way;
22import org.openstreetmap.josm.tools.ImageProvider;
23
24/**
25 * Represents a command for undeleting an {@see OsmPrimitive} which was deleted on the server.
26 * The command remembers the former node id and sets the node id to 0. This turns
27 * the node into a new node which can be uploaded to the server.
28 *
29 */
30public class UndeletePrimitivesCommand extends ConflictResolveCommand {
31 //static private final Logger logger = Logger.getLogger(UndeletePrimitivesCommand.class.getName());
32
33 /** the node to undelete */
34 private final List<OsmPrimitive> toUndelete = new ArrayList<OsmPrimitive>();
35 /** primitives that replaced undeleted primitives */
36 private final List<OsmPrimitive> replacedPrimitives = new ArrayList<OsmPrimitive>();
37
38 /**
39 * constructor
40 * @param node the node to undelete
41 */
42 public UndeletePrimitivesCommand(OsmPrimitive node) {
43 toUndelete.add(node);
44 }
45
46 /**
47 * constructor
48 * @param node the node to undelete
49 */
50 public UndeletePrimitivesCommand(OsmPrimitive ... toUndelete) {
51 for (int i=0; i < toUndelete.length; i++) {
52 this.toUndelete.add(toUndelete[i]);
53 }
54 }
55
56 /**
57 * constructor
58 * @param node the node to undelete
59 */
60 public UndeletePrimitivesCommand(Collection<OsmPrimitive> toUndelete) {
61 this.toUndelete.addAll(toUndelete);
62 }
63
64 @Override
65 public MutableTreeNode description() {
66 return new DefaultMutableTreeNode(
67 new JLabel(
68 trn("Undelete {0} primitive", "Undelete {0} primitives", toUndelete.size(), toUndelete.size()),
69 ImageProvider.get("data", "object"),
70 JLabel.HORIZONTAL
71 )
72 );
73 }
74
75 @Override
76 public boolean executeCommand() {
77 super.executeCommand();
78
79 replacedPrimitives.clear();
80 for(OsmPrimitive primitive: toUndelete) {
81 if(getLayer().getConflicts().hasConflictForMy(primitive)) {
82 rememberConflict(getLayer().getConflicts().getConflictForMy(primitive));
83 getLayer().getConflicts().remove(primitive);
84 }
85 OsmPrimitive prim;
86 switch (primitive.getType()) {
87 case NODE:
88 prim = new Node((Node)primitive, true);
89 break;
90 case WAY:
91 prim = new Way((Way)primitive, true);
92 break;
93 case RELATION:
94 prim = new Relation((Relation)primitive, true);
95 break;
96 default:
97 throw new AssertionError();
98 }
99 replacedPrimitives.add(prim);
100 replacePrimitive(getLayer().data, primitive, prim);
101 }
102 return true;
103 }
104
105 private void replacePrimitive(DataSet dataSet, OsmPrimitive oldPrim, OsmPrimitive newPrim) {
106 dataSet.addPrimitive(newPrim);
107 for (OsmPrimitive referrer: oldPrim.getReferrers()) {
108 if (referrer instanceof Way) {
109 Way w = (Way)referrer;
110 List<Node> nodes = w.getNodes();
111 Collections.replaceAll(nodes, (Node)oldPrim, (Node)newPrim);
112 w.setNodes(nodes);
113 w.setModified(true);
114 } else if (referrer instanceof Relation) {
115 Relation r = (Relation)referrer;
116 List<RelationMember> members = r.getMembers();
117 ListIterator<RelationMember> it = members.listIterator();
118 while (it.hasNext()) {
119 RelationMember rm = it.next();
120 if (rm.getMember() == oldPrim) {
121 it.set(new RelationMember(rm.getRole(), newPrim));
122 }
123 }
124 r.setMembers(members);
125 r.setModified(true);
126 }
127 }
128 dataSet.removePrimitive(oldPrim);
129 }
130
131 @Override
132 public void undoCommand() {
133 for (int i=0; i<toUndelete.size(); i++) {
134 replacePrimitive(getLayer().data, replacedPrimitives.get(i), toUndelete.get(i));
135 }
136 super.undoCommand();
137 }
138
139 @Override
140 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
141 Collection<OsmPrimitive> added) {
142 }
143}
Note: See TracBrowser for help on using the repository browser.