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

Last change on this file since 12718 was 12718, checked in by Don-vip, 3 months 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: 4.0 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.Objects;
9
10import javax.swing.Icon;
11
12import org.openstreetmap.josm.data.osm.DataSet;
13import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
14import org.openstreetmap.josm.data.osm.OsmPrimitive;
15import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
16import org.openstreetmap.josm.data.osm.Way;
17import org.openstreetmap.josm.gui.layer.OsmDataLayer;
18import org.openstreetmap.josm.tools.CheckParameterUtil;
19import org.openstreetmap.josm.tools.ImageProvider;
20
21/**
22 * Command that basically replaces one OSM primitive by another of the same type.
23 *
24 * @since 93
25 */
26public class ChangeCommand extends Command {
27
28    private final OsmPrimitive osm;
29    private final OsmPrimitive newOsm;
30
31    /**
32     * Constructs a new {@code ChangeCommand} in the context of the current edit layer, if any.
33     * @param osm The existing primitive to modify
34     * @param newOsm The new primitive
35     */
36    public ChangeCommand(OsmPrimitive osm, OsmPrimitive newOsm) {
37        this.osm = osm;
38        this.newOsm = newOsm;
39        sanityChecks();
40    }
41
42    /**
43     * Constructs a new {@code ChangeCommand} in the context of a given data layer.
44     * @param layer The data layer
45     * @param osm The existing primitive to modify
46     * @param newOsm The new primitive
47     * @deprecated to be removed end of 2017. Use {@link #ChangeCommand(DataSet, OsmPrimitive, OsmPrimitive)} instead
48     */
49    @Deprecated
50    public ChangeCommand(OsmDataLayer layer, OsmPrimitive osm, OsmPrimitive newOsm) {
51        super(layer);
52        this.osm = osm;
53        this.newOsm = newOsm;
54        sanityChecks();
55    }
56
57    /**
58     * Constructs a new {@code ChangeCommand} in the context of a given data set.
59     * @param data The data set
60     * @param osm The existing primitive to modify
61     * @param newOsm The new primitive
62     * @since 11240
63     */
64    public ChangeCommand(DataSet data, OsmPrimitive osm, OsmPrimitive newOsm) {
65        super(data);
66        this.osm = osm;
67        this.newOsm = newOsm;
68        sanityChecks();
69    }
70
71    private void sanityChecks() {
72        CheckParameterUtil.ensureParameterNotNull(osm, "osm");
73        CheckParameterUtil.ensureParameterNotNull(newOsm, "newOsm");
74        if (newOsm instanceof Way && ((Way) newOsm).getNodesCount() == 0) {
75            // Do not allow to create empty ways (see #7465)
76            throw new IllegalArgumentException(tr("New way {0} has 0 nodes", newOsm));
77        }
78    }
79
80    @Override
81    public boolean executeCommand() {
82        super.executeCommand();
83        osm.cloneFrom(newOsm);
84        osm.setModified(true);
85        return true;
86    }
87
88    @Override
89    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
90        modified.add(osm);
91    }
92
93    @Override
94    public String getDescriptionText() {
95        String msg;
96        switch(OsmPrimitiveType.from(osm)) {
97        case NODE: msg = marktr("Change node {0}"); break;
98        case WAY: msg = marktr("Change way {0}"); break;
99        case RELATION: msg = marktr("Change relation {0}"); break;
100        default: throw new AssertionError();
101        }
102        return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
103    }
104
105    @Override
106    public Icon getDescriptionIcon() {
107        return ImageProvider.get(osm.getDisplayType());
108    }
109
110    @Override
111    public int hashCode() {
112        return Objects.hash(super.hashCode(), osm, newOsm);
113    }
114
115    @Override
116    public boolean equals(Object obj) {
117        if (this == obj) return true;
118        if (obj == null || getClass() != obj.getClass()) return false;
119        if (!super.equals(obj)) return false;
120        ChangeCommand that = (ChangeCommand) obj;
121        return Objects.equals(osm, that.osm) &&
122                Objects.equals(newOsm, that.newOsm);
123    }
124}
Note: See TracBrowser for help on using the repository browser.