001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.command;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.util.Collection;
007    import java.util.List;
008    
009    import javax.swing.Icon;
010    
011    import org.openstreetmap.josm.Main;
012    import org.openstreetmap.josm.data.osm.OsmPrimitive;
013    import org.openstreetmap.josm.data.osm.Relation;
014    import org.openstreetmap.josm.data.osm.RelationMember;
015    import org.openstreetmap.josm.gui.layer.OsmDataLayer;
016    import 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     */
023    public 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 mergedNodeList  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.map.mapView.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                System.out.println(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.map.mapView.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    }