source: josm/trunk/src/org/openstreetmap/josm/command/AddCommand.java@ 12718

Last change on this file since 12718 was 12718, checked in by Don-vip, 7 years ago

see #13036 - see #15229 - see #15182 - make Commands depends only on a DataSet, not a Layer. This removes a lot of GUI dependencies

  • Property svn:eol-style set to native
File size: 3.9 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.command;
3
4import static org.openstreetmap.josm.tools.I18n.marktr;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.util.Collection;
8import java.util.Collections;
9import java.util.Objects;
10
11import javax.swing.Icon;
12
13import org.openstreetmap.josm.data.osm.DataSet;
14import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
15import org.openstreetmap.josm.data.osm.OsmPrimitive;
16import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
17import org.openstreetmap.josm.data.osm.Way;
18import org.openstreetmap.josm.gui.layer.OsmDataLayer;
19import org.openstreetmap.josm.tools.ImageProvider;
20
21/**
22 * A command that adds an osm primitive to a dataset. Keys cannot be added this way.
23 *
24 * See {@link ChangeCommand} for comments on relation back references.
25 *
26 * @author imi
27 */
28public class AddCommand extends Command {
29
30 /**
31 * The primitive to add to the dataset.
32 */
33 private final OsmPrimitive osm;
34
35 /**
36 * Creates the command and specify the element to add in the context of the current edit layer, if any.
37 * @param osm The primitive to add
38 */
39 public AddCommand(OsmPrimitive osm) {
40 this.osm = Objects.requireNonNull(osm, "osm");
41 }
42
43 /**
44 * Creates the command and specify the element to add in the context of the given data layer.
45 * @param layer The data layer. Must not be {@code null}
46 * @param osm The primitive to add
47 * @deprecated to be removed end of 2017. Use {@link #AddCommand(DataSet, OsmPrimitive)} instead
48 */
49 @Deprecated
50 public AddCommand(OsmDataLayer layer, OsmPrimitive osm) {
51 super(layer);
52 this.osm = Objects.requireNonNull(osm, "osm");
53 }
54
55 /**
56 * Creates the command and specify the element to add in the context of the given data set.
57 * @param data The data set. Must not be {@code null}
58 * @param osm The primitive to add
59 * @since 11240
60 */
61 public AddCommand(DataSet data, OsmPrimitive osm) {
62 super(data);
63 this.osm = Objects.requireNonNull(osm, "osm");
64 }
65
66 protected static final void checkNodeStyles(OsmPrimitive osm) {
67 if (osm instanceof Way) {
68 // Fix #10557 - node icon not updated after undoing/redoing addition of a way
69 ((Way) osm).clearCachedNodeStyles();
70 }
71 }
72
73 @Override
74 public boolean executeCommand() {
75 getAffectedDataSet().addPrimitive(osm);
76 osm.setModified(true);
77 checkNodeStyles(osm);
78 return true;
79 }
80
81 @Override
82 public void undoCommand() {
83 getAffectedDataSet().removePrimitive(osm);
84 checkNodeStyles(osm);
85 }
86
87 @Override
88 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
89 added.add(osm);
90 }
91
92 @Override
93 public String getDescriptionText() {
94 String msg;
95 switch(OsmPrimitiveType.from(osm)) {
96 case NODE: msg = marktr("Add node {0}"); break;
97 case WAY: msg = marktr("Add way {0}"); break;
98 case RELATION: msg = marktr("Add relation {0}"); break;
99 default: /* should not happen */msg = ""; break;
100 }
101 return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
102 }
103
104 @Override
105 public Icon getDescriptionIcon() {
106 return ImageProvider.get(osm.getDisplayType());
107 }
108
109 @Override
110 public Collection<OsmPrimitive> getParticipatingPrimitives() {
111 return Collections.singleton(osm);
112 }
113
114 @Override
115 public int hashCode() {
116 return Objects.hash(super.hashCode(), osm);
117 }
118
119 @Override
120 public boolean equals(Object obj) {
121 if (this == obj) return true;
122 if (obj == null || getClass() != obj.getClass()) return false;
123 if (!super.equals(obj)) return false;
124 AddCommand that = (AddCommand) obj;
125 return Objects.equals(osm, that.osm);
126 }
127}
Note: See TracBrowser for help on using the repository browser.