001 // License: GPL. Copyright 2007 by Immanuel Scholz and others
002 package org.openstreetmap.josm.command;
003
004 import static org.openstreetmap.josm.tools.I18n.marktr;
005 import static org.openstreetmap.josm.tools.I18n.tr;
006
007 import java.util.Collection;
008
009 import javax.swing.Icon;
010
011 import org.openstreetmap.josm.data.osm.OsmPrimitive;
012 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
013 import org.openstreetmap.josm.gui.DefaultNameFormatter;
014 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
015 import org.openstreetmap.josm.tools.ImageProvider;
016
017 /**
018 * Command that basically replaces one OSM primitive by another of the
019 * same type.
020 *
021 * @author Imi
022 */
023 public class ChangeCommand extends Command {
024
025 private final OsmPrimitive osm;
026 private final OsmPrimitive newOsm;
027
028
029 public ChangeCommand(OsmPrimitive osm, OsmPrimitive newOsm) {
030 super();
031 this.osm = osm;
032 this.newOsm = newOsm;
033 }
034
035 public ChangeCommand(OsmDataLayer layer, OsmPrimitive osm, OsmPrimitive newOsm) {
036 super(layer);
037 this.osm = osm;
038 this.newOsm = newOsm;
039 }
040
041 @Override public boolean executeCommand() {
042 super.executeCommand();
043 osm.cloneFrom(newOsm);
044 osm.setModified(true);
045 return true;
046 }
047
048 @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
049 modified.add(osm);
050 }
051
052 @Override
053 public String getDescriptionText() {
054 String msg = "";
055 switch(OsmPrimitiveType.from(osm)) {
056 case NODE: msg = marktr("Change node {0}"); break;
057 case WAY: msg = marktr("Change way {0}"); break;
058 case RELATION: msg = marktr("Change relation {0}"); break;
059 }
060 return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
061 }
062
063 @Override
064 public Icon getDescriptionIcon() {
065 return ImageProvider.get(osm.getDisplayType());
066 }
067 }