source: josm/trunk/src/org/openstreetmap/josm/command/MoveCommand.java@ 5299

Last change on this file since 5299 was 4918, checked in by simon04, 12 years ago

fix #7370 - Refactor Command.getDescription

  • Property svn:eol-style set to native
File size: 4.4 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.command;
3
4import static org.openstreetmap.josm.tools.I18n.trn;
5
6import java.util.Collection;
7import java.util.Collections;
8import java.util.Iterator;
9import java.util.LinkedList;
10import java.util.List;
11import javax.swing.Icon;
12
13import javax.swing.JLabel;
14
15import org.openstreetmap.josm.data.coor.EastNorth;
16import org.openstreetmap.josm.data.coor.LatLon;
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.data.osm.visitor.AllNodesVisitor;
20import org.openstreetmap.josm.data.projection.Projections;
21import org.openstreetmap.josm.tools.ImageProvider;
22
23/**
24 * MoveCommand moves a set of OsmPrimitives along the map. It can be moved again
25 * to collect several MoveCommands into one command.
26 *
27 * @author imi
28 */
29public class MoveCommand extends Command {
30 /**
31 * The objects that should be moved.
32 */
33 private Collection<Node> nodes = new LinkedList<Node>();
34 /**
35 * x difference movement. Coordinates are in northern/eastern
36 */
37 private double x;
38 /**
39 * y difference movement. Coordinates are in northern/eastern
40 */
41 private double y;
42
43 /**
44 * Small helper for holding the interesting part of the old data state of the
45 * objects.
46 */
47 public static class OldState {
48 LatLon latlon;
49 boolean modified;
50 }
51
52 /**
53 * List of all old states of the objects.
54 */
55 private List<OldState> oldState = new LinkedList<OldState>();
56
57 public MoveCommand(OsmPrimitive osm, double x, double y) {
58 this(Collections.singleton(osm), x, y);
59 }
60
61 public MoveCommand(Node node, LatLon position) {
62 this(Collections.singleton((OsmPrimitive) node), node.getEastNorth().sub(Projections.project(position)));
63 }
64
65 public MoveCommand(Collection<OsmPrimitive> objects, EastNorth offset) {
66 this(objects, offset.getX(), offset.getY());
67 }
68
69 /**
70 * Create a MoveCommand and assign the initial object set and movement vector.
71 */
72 public MoveCommand(Collection<OsmPrimitive> objects, double x, double y) {
73 super();
74 this.x = x;
75 this.y = y;
76 this.nodes = AllNodesVisitor.getAllNodes(objects);
77 for (Node n : this.nodes) {
78 OldState os = new OldState();
79 os.latlon = new LatLon(n.getCoor());
80 os.modified = n.isModified();
81 oldState.add(os);
82 }
83 }
84
85 /**
86 * Move the same set of objects again by the specified vector. The vectors
87 * are added together and so the resulting will be moved to the previous
88 * vector plus this one.
89 *
90 * The move is immediately executed and any undo will undo both vectors to
91 * the original position the objects had before first moving.
92 */
93 public void moveAgain(double x, double y) {
94 for (Node n : nodes) {
95 n.setEastNorth(n.getEastNorth().add(x, y));
96 }
97 this.x += x;
98 this.y += y;
99 }
100
101 public void moveAgainTo(double x, double y) {
102 moveAgain(x - this.x, y - this.y);
103 }
104
105 @Override public boolean executeCommand() {
106 for (Node n : nodes) {
107 // in case #3892 happens again
108 if (n == null)
109 throw new AssertionError("null detected in node list");
110 if (n.getEastNorth() == null)
111 throw new AssertionError(n.get3892DebugInfo());
112
113 n.setEastNorth(n.getEastNorth().add(x, y));
114 n.setModified(true);
115 }
116 return true;
117 }
118
119 @Override public void undoCommand() {
120 Iterator<OldState> it = oldState.iterator();
121 for (Node n : nodes) {
122 OldState os = it.next();
123 n.setCoor(os.latlon);
124 n.setModified(os.modified);
125 }
126 }
127
128 @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
129 for (OsmPrimitive osm : nodes) {
130 modified.add(osm);
131 }
132 }
133
134 @Override
135 public String getDescriptionText() {
136 return trn("Move {0} node", "Move {0} nodes", nodes.size(), nodes.size());
137 }
138
139 @Override
140 public Icon getDescriptionIcon() {
141 return ImageProvider.get("data", "node");
142 }
143
144 @Override
145 public Collection<Node> getParticipatingPrimitives() {
146 return nodes;
147 }
148}
Note: See TracBrowser for help on using the repository browser.