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}