[2512] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
| 2 | package org.openstreetmap.josm.command;
|
---|
| 3 |
|
---|
| 4 | import static org.openstreetmap.josm.tools.I18n.tr;
|
---|
| 5 |
|
---|
| 6 | import java.util.Collection;
|
---|
| 7 | import java.util.List;
|
---|
| 8 | import java.util.logging.Logger;
|
---|
| 9 |
|
---|
| 10 | import javax.swing.JLabel;
|
---|
| 11 | import javax.swing.tree.DefaultMutableTreeNode;
|
---|
| 12 | import javax.swing.tree.MutableTreeNode;
|
---|
| 13 |
|
---|
| 14 | import org.openstreetmap.josm.Main;
|
---|
| 15 | import org.openstreetmap.josm.data.osm.OsmPrimitive;
|
---|
| 16 | import org.openstreetmap.josm.data.osm.Relation;
|
---|
| 17 | import org.openstreetmap.josm.data.osm.RelationMember;
|
---|
| 18 | import org.openstreetmap.josm.gui.layer.OsmDataLayer;
|
---|
| 19 | import org.openstreetmap.josm.tools.ImageProvider;
|
---|
| 20 |
|
---|
| 21 | /**
|
---|
| 22 | * Represent a command for resolving conflicts in the member lists of two
|
---|
| 23 | * {@see Relation}s.
|
---|
| 24 | *
|
---|
| 25 | */
|
---|
| 26 | public class RelationMemberConflictResolverCommand extends Command {
|
---|
| 27 | private static final Logger logger = Logger.getLogger(RelationMemberConflictResolverCommand.class.getName());
|
---|
| 28 |
|
---|
| 29 | /** my relation */
|
---|
| 30 | private final Relation my;
|
---|
| 31 | /** their relation */
|
---|
| 32 | private final Relation their;
|
---|
| 33 | /** the list of merged nodes. This becomes the list of news of my way after the
|
---|
| 34 | * command is executed
|
---|
| 35 | */
|
---|
| 36 | private final List<RelationMember> mergedMembers;
|
---|
| 37 |
|
---|
| 38 | /** the layer this conflict is resolved in */
|
---|
| 39 | private OsmDataLayer layer;
|
---|
| 40 |
|
---|
| 41 | /**
|
---|
| 42 | *
|
---|
| 43 | * @param my my relation
|
---|
| 44 | * @param their their relation
|
---|
| 45 | * @param mergedNodeList the list of merged relation members
|
---|
| 46 | */
|
---|
| 47 | public RelationMemberConflictResolverCommand(Relation my, Relation their, List<RelationMember> mergedMembers) {
|
---|
| 48 | this.my = my;
|
---|
| 49 | this.their = their;
|
---|
| 50 | this.mergedMembers = mergedMembers;
|
---|
| 51 | }
|
---|
| 52 |
|
---|
| 53 | @Override
|
---|
| 54 | public MutableTreeNode description() {
|
---|
| 55 | return new DefaultMutableTreeNode(
|
---|
| 56 | new JLabel(
|
---|
| 57 | tr("Resolve conflicts in member list of relation {0}", my.getId()),
|
---|
| 58 | ImageProvider.get("data", "object"),
|
---|
| 59 | JLabel.HORIZONTAL
|
---|
| 60 | )
|
---|
| 61 | );
|
---|
| 62 | }
|
---|
| 63 |
|
---|
| 64 | @Override
|
---|
| 65 | public boolean executeCommand() {
|
---|
| 66 | // remember the current state of 'my' way
|
---|
| 67 | //
|
---|
| 68 | super.executeCommand();
|
---|
| 69 |
|
---|
[2569] | 70 | // replace the list of members of 'my' relation by the list of merged
|
---|
| 71 | // members
|
---|
[2512] | 72 | //
|
---|
| 73 | my.setMembers(mergedMembers);
|
---|
| 74 |
|
---|
| 75 | // remember the layer
|
---|
| 76 | layer = Main.map.mapView.getEditLayer();
|
---|
| 77 | return true;
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | @Override
|
---|
| 81 | public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
|
---|
| 82 | Collection<OsmPrimitive> added) {
|
---|
| 83 | modified.add(my);
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | @Override
|
---|
| 87 | public void undoCommand() {
|
---|
| 88 | if (! Main.map.mapView.hasLayer(layer)) {
|
---|
[2844] | 89 | logger.warning(tr("Cannot undo command ''{0}'' because layer ''{1}'' is not present any more",
|
---|
[2512] | 90 | this.toString(),
|
---|
| 91 | layer.toString()
|
---|
| 92 | ));
|
---|
| 93 | return;
|
---|
| 94 | }
|
---|
| 95 |
|
---|
| 96 | Main.map.mapView.setActiveLayer(layer);
|
---|
| 97 | OsmDataLayer editLayer = Main.map.mapView.getEditLayer();
|
---|
| 98 |
|
---|
| 99 | // restore the former state
|
---|
| 100 | //
|
---|
| 101 | super.undoCommand();
|
---|
| 102 |
|
---|
| 103 | // restore a conflict if necessary
|
---|
| 104 | //
|
---|
| 105 | if (!editLayer.getConflicts().hasConflictForMy(my)) {
|
---|
| 106 | editLayer.getConflicts().add(my,their);
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 | }
|
---|