001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.command; 003 004 import static org.openstreetmap.josm.tools.I18n.tr; 005 006 import java.util.Collection; 007 008 import javax.swing.Icon; 009 010 import org.openstreetmap.josm.data.conflict.Conflict; 011 import org.openstreetmap.josm.data.osm.Node; 012 import org.openstreetmap.josm.data.osm.OsmPrimitive; 013 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType; 014 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 015 import org.openstreetmap.josm.tools.ImageProvider; 016 017 /** 018 * Represents a the resolution of a conflict between the coordinates of two {@link Node}s 019 * 020 */ 021 public class DeletedStateConflictResolveCommand extends ConflictResolveCommand { 022 023 /** the conflict to resolve */ 024 private Conflict<? extends OsmPrimitive> conflict; 025 026 /** the merge decision */ 027 private final MergeDecisionType decision; 028 029 /** 030 * constructor 031 * 032 * @param my my node 033 * @param their their node 034 * @param decision the merge decision 035 */ 036 public DeletedStateConflictResolveCommand(Conflict<? extends OsmPrimitive> conflict, MergeDecisionType decision) { 037 this.conflict = conflict; 038 this.decision = decision; 039 } 040 041 @Override 042 public String getDescriptionText() { 043 return tr("Resolve conflicts in deleted state in {0}", conflict.getMy().getId()); 044 } 045 046 @Override 047 public Icon getDescriptionIcon() { 048 return ImageProvider.get("data", "object"); 049 } 050 051 @Override 052 public boolean executeCommand() { 053 // remember the current state of modified primitives, i.e. of 054 // OSM primitive 'my' 055 // 056 super.executeCommand(); 057 058 OsmDataLayer layer = getLayer(); 059 060 if (decision.equals(MergeDecisionType.KEEP_MINE)) { 061 if (conflict.getMy().isDeleted() || conflict.isMyDeleted()) { 062 // because my was involved in a conflict it my still be referred 063 // to from a way or a relation. Fix this now. 064 // 065 layer.data.unlinkReferencesToPrimitive(conflict.getMy()); 066 conflict.getMy().setDeleted(true); 067 } 068 } else if (decision.equals(MergeDecisionType.KEEP_THEIR)) { 069 if (conflict.getTheir().isDeleted()) { 070 layer.data.unlinkReferencesToPrimitive(conflict.getMy()); 071 conflict.getMy().setDeleted(true); 072 } else { 073 conflict.getMy().setDeleted(false); 074 } 075 } else 076 // should not happen 077 throw new IllegalStateException(tr("Cannot resolve undecided conflict.")); 078 079 rememberConflict(conflict); 080 return true; 081 } 082 083 @Override 084 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, 085 Collection<OsmPrimitive> added) { 086 modified.add(conflict.getMy()); 087 modified.addAll(conflict.getMy().getReferrers()); 088 } 089 }