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    }