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 }