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 javax.swing.Icon;
008    
009    import org.openstreetmap.josm.data.conflict.Conflict;
010    import org.openstreetmap.josm.data.osm.Node;
011    import org.openstreetmap.josm.data.osm.OsmPrimitive;
012    import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
013    import org.openstreetmap.josm.tools.ImageProvider;
014    
015    /**
016     * Represents a the resolution of a conflict between the coordinates of two {@link Node}s
017     *
018     */
019    public class CoordinateConflictResolveCommand extends ConflictResolveCommand {
020    
021        /** the conflict to resolve */
022        private Conflict<? extends OsmPrimitive> conflict;
023    
024        /** the merge decision */
025        private final MergeDecisionType decision;
026    
027        /**
028         * constructor
029         *
030         * @param my  my node
031         * @param their  their node
032         * @param decision the merge decision
033         */
034        public CoordinateConflictResolveCommand(Conflict<? extends OsmPrimitive> conflict, MergeDecisionType decision) {
035            this.conflict = conflict;
036            this.decision = decision;
037        }
038    
039        @Override
040        public String getDescriptionText() {
041            return tr("Resolve conflicts in coordinates in {0}", conflict.getMy().getId());
042        }
043    
044        @Override
045        public Icon getDescriptionIcon() {
046            return ImageProvider.get("data", "object");
047        }
048    
049        @Override
050        public boolean executeCommand() {
051            // remember the current state of modified primitives, i.e. of
052            // OSM primitive 'my'
053            //
054            super.executeCommand();
055    
056            if (decision.equals(MergeDecisionType.KEEP_MINE)) {
057                // do nothing
058            } else if (decision.equals(MergeDecisionType.KEEP_THEIR)) {
059                Node my = (Node)conflict.getMy();
060                Node their = (Node)conflict.getTheir();
061                my.setCoor(their.getCoor());
062            } else
063                // should not happen
064                throw new IllegalStateException(tr("Cannot resolve undecided conflict."));
065    
066            // remember the layer this command was applied to
067            //
068            rememberConflict(conflict);
069    
070            return true;
071        }
072    
073        @Override
074        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
075                Collection<OsmPrimitive> added) {
076            modified.add(conflict.getMy());
077        }
078    }