001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.command;
003    
004    import static org.openstreetmap.josm.tools.I18n.marktr;
005    import static org.openstreetmap.josm.tools.I18n.tr;
006    
007    import java.util.Collection;
008    import java.util.List;
009    import javax.swing.Icon;
010    
011    
012    import org.openstreetmap.josm.data.conflict.Conflict;
013    import org.openstreetmap.josm.data.osm.OsmPrimitive;
014    import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
015    import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
016    import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
017    import org.openstreetmap.josm.tools.ImageProvider;
018    
019    /**
020     * Represents a the resolution of a tag conflict in an {@link OsmPrimitive}
021     *
022     */
023    public class TagConflictResolveCommand extends ConflictResolveCommand {
024        /** the conflict to resolve */
025        private Conflict<? extends OsmPrimitive> conflict;
026    
027        /** the list of merge decisions, represented as {@link TagMergeItem}s */
028        private final List<TagMergeItem> mergeItems;
029    
030        /**
031         * replies the number of decided conflicts
032         *
033         * @return the number of decided conflicts
034         */
035        public int getNumDecidedConflicts() {
036            int n = 0;
037            for (TagMergeItem item: mergeItems) {
038                if (!item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) {
039                    n++;
040                }
041            }
042            return n;
043        }
044    
045        /**
046         * constructor
047         *
048         * @param my  my primitive
049         * @param their  their primitive
050         * @param mergeItems the list of merge decisions, represented as {@link TagMergeItem}s
051         */
052        public TagConflictResolveCommand(Conflict<? extends OsmPrimitive> conflict, List<TagMergeItem> mergeItems) {
053            this.conflict = conflict;
054            this.mergeItems = mergeItems;
055        }
056    
057        @Override
058        public String getDescriptionText() {
059            String msg = "";
060            switch(OsmPrimitiveType.from(conflict.getMy())) {
061            case NODE: msg = marktr("Resolve {0} tag conflicts in node {1}"); break;
062            case WAY: msg = marktr("Resolve {0} tag conflicts in way {1}"); break;
063            case RELATION: msg = marktr("Resolve {0} tag conflicts in relation {1}"); break;
064            }
065            return tr(msg,getNumDecidedConflicts(), conflict.getMy().getId());
066        }
067    
068        @Override
069        public Icon getDescriptionIcon() {
070            return ImageProvider.get("data", "object");
071        }
072    
073        @Override
074        public boolean executeCommand() {
075            // remember the current state of modified primitives, i.e. of
076            // OSM primitive 'my'
077            //
078            super.executeCommand();
079    
080            // apply the merge decisions to OSM primitive 'my'
081            //
082            for (TagMergeItem item: mergeItems) {
083                if (! item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) {
084                    item.applyToMyPrimitive(conflict.getMy());
085                }
086            }
087            rememberConflict(conflict);
088            return true;
089        }
090    
091        @Override
092        public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
093                Collection<OsmPrimitive> added) {
094            modified.add(conflict.getMy());
095        }
096    }