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 import java.util.List; 008 009 import javax.swing.Icon; 010 011 import org.openstreetmap.josm.Main; 012 import org.openstreetmap.josm.data.osm.OsmPrimitive; 013 import org.openstreetmap.josm.data.osm.Relation; 014 import org.openstreetmap.josm.data.osm.RelationMember; 015 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 016 import org.openstreetmap.josm.tools.ImageProvider; 017 018 /** 019 * Represent a command for resolving conflicts in the member lists of two 020 * {@link Relation}s. 021 * 022 */ 023 public class RelationMemberConflictResolverCommand extends Command { 024 /** my relation */ 025 private final Relation my; 026 /** their relation */ 027 private final Relation their; 028 /** the list of merged nodes. This becomes the list of news of my way after the 029 * command is executed 030 */ 031 private final List<RelationMember> mergedMembers; 032 033 /** the layer this conflict is resolved in */ 034 private OsmDataLayer layer; 035 036 /** 037 * 038 * @param my my relation 039 * @param their their relation 040 * @param mergedNodeList the list of merged relation members 041 */ 042 public RelationMemberConflictResolverCommand(Relation my, Relation their, List<RelationMember> mergedMembers) { 043 this.my = my; 044 this.their = their; 045 this.mergedMembers = mergedMembers; 046 } 047 048 @Override 049 public String getDescriptionText() { 050 return tr("Resolve conflicts in member list of relation {0}", my.getId()); 051 } 052 053 @Override 054 public Icon getDescriptionIcon() { 055 return ImageProvider.get("data", "object"); 056 } 057 058 @Override 059 public boolean executeCommand() { 060 // remember the current state of 'my' way 061 // 062 super.executeCommand(); 063 064 // replace the list of members of 'my' relation by the list of merged 065 // members 066 // 067 my.setMembers(mergedMembers); 068 069 // remember the layer 070 layer = Main.map.mapView.getEditLayer(); 071 return true; 072 } 073 074 @Override 075 public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, 076 Collection<OsmPrimitive> added) { 077 modified.add(my); 078 } 079 080 @Override 081 public void undoCommand() { 082 if (! Main.map.mapView.hasLayer(layer)) { 083 System.out.println(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more", 084 this.toString(), 085 layer.toString() 086 )); 087 return; 088 } 089 090 Main.map.mapView.setActiveLayer(layer); 091 OsmDataLayer editLayer = Main.map.mapView.getEditLayer(); 092 093 // restore the former state 094 // 095 super.undoCommand(); 096 097 // restore a conflict if necessary 098 // 099 if (!editLayer.getConflicts().hasConflictForMy(my)) { 100 editLayer.getConflicts().add(my,their); 101 } 102 } 103 }