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 }