001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.command;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collection;
007
008import javax.swing.Icon;
009import javax.swing.JOptionPane;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.data.conflict.Conflict;
013import org.openstreetmap.josm.data.osm.OsmPrimitive;
014import org.openstreetmap.josm.gui.DefaultNameFormatter;
015import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016import org.openstreetmap.josm.tools.ImageProvider;
017
018public class ConflictAddCommand extends Command {
019    private Conflict<? extends OsmPrimitive> conflict;
020
021    public ConflictAddCommand(OsmDataLayer layer, Conflict<? extends OsmPrimitive> conflict) {
022        super(layer);
023        this.conflict  = conflict;
024    }
025
026    protected void warnBecauseOfDoubleConflict() {
027        JOptionPane.showMessageDialog(
028                Main.parent,
029                tr("<html>Layer ''{0}'' already has a conflict for object<br>"
030                        + "''{1}''.<br>"
031                        + "This conflict cannot be added.</html>",
032                        getLayer().getName(),
033                        conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance())
034                ),
035                tr("Double conflict"),
036                JOptionPane.ERROR_MESSAGE
037        );
038    }
039    @Override public boolean executeCommand() {
040        try {
041            getLayer().getConflicts().add(conflict);
042        } catch(IllegalStateException e) {
043            e.printStackTrace();
044            warnBecauseOfDoubleConflict();
045        }
046        return true;
047    }
048
049    @Override public void undoCommand() {
050        if (! Main.map.mapView.hasLayer(getLayer())) {
051            Main.warn(tr("Layer ''{0}'' does not exist any more. Cannot remove conflict for object ''{1}''.",
052                    getLayer().getName(),
053                    conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance())
054            ));
055            return;
056        }
057        getLayer().getConflicts().remove(conflict);
058    }
059
060    @Override public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
061        // nothing to fill
062    }
063
064    @Override
065    public String getDescriptionText() {
066        return tr("Add conflict for ''{0}''",
067                conflict.getMy().getDisplayName(DefaultNameFormatter.getInstance()));
068    }
069
070    @Override
071    public Icon getDescriptionIcon() {
072        return ImageProvider.get(conflict.getMy().getDisplayType());
073    }
074}