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