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