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 final 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}",
061                        getNumDecidedConflicts(), getNumDecidedConflicts(), conflict.getMy().getId());
062            case WAY:
063                /* for correct i18n of plural forms - see #9110 */
064                return trn("Resolve {0} tag conflict in way {1}", "Resolve {0} tag conflicts in way {1}",
065                        getNumDecidedConflicts(), getNumDecidedConflicts(), conflict.getMy().getId());
066            case RELATION:
067                /* for correct i18n of plural forms - see #9110 */
068                return trn("Resolve {0} tag conflict in relation {1}", "Resolve {0} tag conflicts in relation {1}",
069                        getNumDecidedConflicts(), getNumDecidedConflicts(), conflict.getMy().getId());
070        }
071        return "";
072    }
073
074    @Override
075    public Icon getDescriptionIcon() {
076        return ImageProvider.get("data", "object");
077    }
078
079    @Override
080    public boolean executeCommand() {
081        // remember the current state of modified primitives, i.e. of
082        // OSM primitive 'my'
083        //
084        super.executeCommand();
085
086        // apply the merge decisions to OSM primitive 'my'
087        //
088        for (TagMergeItem item: mergeItems) {
089            if (!item.getMergeDecision().equals(MergeDecisionType.UNDECIDED)) {
090                item.applyToMyPrimitive(conflict.getMy());
091            }
092        }
093        rememberConflict(conflict);
094        return true;
095    }
096
097    @Override
098    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
099            Collection<OsmPrimitive> added) {
100        modified.add(conflict.getMy());
101    }
102
103    @Override
104    public int hashCode() {
105        final int prime = 31;
106        int result = super.hashCode();
107        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
108        result = prime * result + ((mergeItems == null) ? 0 : mergeItems.hashCode());
109        return result;
110    }
111
112    @Override
113    public boolean equals(Object obj) {
114        if (this == obj)
115            return true;
116        if (!super.equals(obj))
117            return false;
118        if (getClass() != obj.getClass())
119            return false;
120        TagConflictResolveCommand other = (TagConflictResolveCommand) obj;
121        if (conflict == null) {
122            if (other.conflict != null)
123                return false;
124        } else if (!conflict.equals(other.conflict))
125            return false;
126        if (mergeItems == null) {
127            if (other.mergeItems != null)
128                return false;
129        } else if (!mergeItems.equals(other.mergeItems))
130            return false;
131        return true;
132    }
133}