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;
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 * Represent a command for resolving conflicts in the member lists of two
020 * {@link Relation}s.
021 *
022 */
023public class RelationMemberConflictResolverCommand extends Command {
024    /** my relation */
025    private final Relation my;
026    /** their relation */
027    private final Relation their;
028    /** the list of merged nodes. This becomes the list of news of my way after the
029     *  command is executed
030     */
031    private final List<RelationMember> mergedMembers;
032
033    /** the layer this conflict is resolved in */
034    private OsmDataLayer layer;
035
036    /**
037     *
038     * @param my my relation
039     * @param their their relation
040     * @param mergedMembers the list of merged relation members
041     */
042    public RelationMemberConflictResolverCommand(Relation my, Relation their, List<RelationMember> mergedMembers) {
043        this.my = my;
044        this.their = their;
045        this.mergedMembers = mergedMembers;
046    }
047
048    @Override
049    public String getDescriptionText() {
050        return tr("Resolve conflicts in member list of relation {0}", my.getId());
051    }
052
053    @Override
054    public Icon getDescriptionIcon() {
055        return ImageProvider.get("data", "object");
056    }
057
058    @Override
059    public boolean executeCommand() {
060        // remember the current state of 'my' way
061        //
062        super.executeCommand();
063
064        // replace the list of members of 'my' relation by the list of merged
065        // members
066        //
067        my.setMembers(mergedMembers);
068
069        // remember the layer
070        layer = Main.main.getEditLayer();
071        return true;
072    }
073
074    @Override
075    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
076            Collection<OsmPrimitive> added) {
077        modified.add(my);
078    }
079
080    @Override
081    public void undoCommand() {
082        if (! Main.map.mapView.hasLayer(layer)) {
083            Main.warn(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
084                    this.toString(),
085                    layer.toString()
086            ));
087            return;
088        }
089
090        Main.map.mapView.setActiveLayer(layer);
091        OsmDataLayer editLayer = Main.main.getEditLayer();
092
093        // restore the former state
094        //
095        super.undoCommand();
096
097        // restore a conflict if necessary
098        //
099        if (!editLayer.getConflicts().hasConflictForMy(my)) {
100            editLayer.getConflicts().add(my,their);
101        }
102    }
103}