001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.command.conflict;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.util.Collection;
007import java.util.List;
008
009import javax.swing.Icon;
010
011import org.openstreetmap.josm.Main;
012import org.openstreetmap.josm.data.osm.OsmPrimitive;
013import org.openstreetmap.josm.data.osm.Relation;
014import org.openstreetmap.josm.data.osm.RelationMember;
015import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016import org.openstreetmap.josm.tools.ImageProvider;
017
018/**
019 * Represents the resolution of conflicts in the member list of two {@link Relation}s.
020 *
021 */
022public class RelationMemberConflictResolverCommand extends ConflictResolveCommand {
023    /** my relation */
024    private final Relation my;
025    /** their relation */
026    private final Relation their;
027    /** the list of merged nodes. This becomes the list of news of my way after the
028     *  command is executed
029     */
030    private final List<RelationMember> mergedMembers;
031
032    /**
033     *
034     * @param my my relation
035     * @param their their relation
036     * @param mergedMembers the list of merged relation members
037     */
038    public RelationMemberConflictResolverCommand(Relation my, Relation their, List<RelationMember> mergedMembers) {
039        this.my = my;
040        this.their = their;
041        this.mergedMembers = mergedMembers;
042    }
043
044    @Override
045    public String getDescriptionText() {
046        return tr("Resolve conflicts in member list of relation {0}", my.getId());
047    }
048
049    @Override
050    public Icon getDescriptionIcon() {
051        return ImageProvider.get("data", "object");
052    }
053
054    @Override
055    public boolean executeCommand() {
056        // remember the current state of 'my' way
057        //
058        super.executeCommand();
059
060        // replace the list of members of 'my' relation by the list of merged members
061        //
062        my.setMembers(mergedMembers);
063
064        return true;
065    }
066
067    @Override
068    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
069            Collection<OsmPrimitive> added) {
070        modified.add(my);
071    }
072
073    @Override
074    public void undoCommand() {
075        OsmDataLayer layer = getLayer();
076        if (! Main.map.mapView.hasLayer(layer)) {
077            Main.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
078                    this.toString(),
079                    layer.toString()
080            ));
081            return;
082        }
083
084        Main.map.mapView.setActiveLayer(layer);
085        OsmDataLayer editLayer = Main.main.getEditLayer();
086
087        // restore the former state
088        //
089        super.undoCommand();
090
091        // restore a conflict if necessary
092        //
093        if (!editLayer.getConflicts().hasConflictForMy(my)) {
094            editLayer.getConflicts().add(my,their);
095        }
096    }
097}