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