001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.command;
003
004import static org.openstreetmap.josm.tools.I18n.marktr;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.util.Collection;
008import java.util.Collections;
009
010import javax.swing.Icon;
011
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
014import org.openstreetmap.josm.gui.DefaultNameFormatter;
015import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016import org.openstreetmap.josm.tools.ImageProvider;
017
018/**
019 * A command that adds an osm primitive to a dataset. Keys cannot be added this
020 * way.
021 *
022 * See {@link ChangeCommand} for comments on relation back references.
023 *
024 * @author imi
025 */
026public class AddCommand extends Command {
027
028    /**
029     * The primitive to add to the dataset.
030     */
031    private final OsmPrimitive osm;
032
033    /**
034     * Create the command and specify the element to add.
035     */
036    public AddCommand(OsmPrimitive osm) {
037        super();
038        this.osm = osm;
039    }
040
041    /**
042     * Create the command and specify the element to add.
043     */
044    public AddCommand(OsmDataLayer layer, OsmPrimitive osm) {
045        super(layer);
046        this.osm = osm;
047    }
048
049    @Override public boolean executeCommand() {
050        getLayer().data.addPrimitive(osm);
051        osm.setModified(true);
052        return true;
053    }
054
055    @Override public void undoCommand() {
056        getLayer().data.removePrimitive(osm);
057    }
058
059    @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
060        added.add(osm);
061    }
062
063    @Override
064    public String getDescriptionText() {
065        String msg;
066        switch(OsmPrimitiveType.from(osm)) {
067        case NODE: msg = marktr("Add node {0}"); break;
068        case WAY: msg = marktr("Add way {0}"); break;
069        case RELATION: msg = marktr("Add relation {0}"); break;
070        default: /* should not happen */msg = ""; break;
071        }
072        return tr(msg, osm.getDisplayName(DefaultNameFormatter.getInstance()));
073    }
074
075    @Override
076    public Icon getDescriptionIcon() {
077        return ImageProvider.get(osm.getDisplayType());
078    }
079
080    @Override
081    public Collection<OsmPrimitive> getParticipatingPrimitives() {
082        return Collections.singleton(osm);
083    }
084}