Ignore:
Timestamp:
2010-02-13T16:19:56+01:00 (14 years ago)
Author:
jttt
Message:

Fix #4070 confict management: reseting ID

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/command/UndeletePrimitivesCommand.java

    r2844 r2972  
    66import java.util.ArrayList;
    77import java.util.Collection;
     8import java.util.Collections;
    89import java.util.List;
    9 import java.util.logging.Logger;
     10import java.util.ListIterator;
    1011
    1112import javax.swing.JLabel;
     
    1314import javax.swing.tree.MutableTreeNode;
    1415
     16import org.openstreetmap.josm.data.osm.DataSet;
     17import org.openstreetmap.josm.data.osm.Node;
    1518import org.openstreetmap.josm.data.osm.OsmPrimitive;
     19import org.openstreetmap.josm.data.osm.Relation;
     20import org.openstreetmap.josm.data.osm.RelationMember;
     21import org.openstreetmap.josm.data.osm.Way;
    1622import org.openstreetmap.josm.tools.ImageProvider;
    1723
     
    2329 */
    2430public class UndeletePrimitivesCommand extends ConflictResolveCommand {
    25     static private final Logger logger = Logger.getLogger(UndeletePrimitivesCommand.class.getName());
     31    //static private final Logger logger = Logger.getLogger(UndeletePrimitivesCommand.class.getName());
    2632
    2733    /** the node to undelete */
    2834    private final List<OsmPrimitive> toUndelete = new ArrayList<OsmPrimitive>();
     35    /** primitives that replaced undeleted primitives */
     36    private final List<OsmPrimitive> replacedPrimitives = new ArrayList<OsmPrimitive>();
    2937
    3038    /**
     
    5159     */
    5260    public UndeletePrimitivesCommand(Collection<OsmPrimitive> toUndelete) {
    53         this();
    5461        this.toUndelete.addAll(toUndelete);
    5562    }
     
    7077        super.executeCommand();
    7178
     79        replacedPrimitives.clear();
    7280        for(OsmPrimitive primitive: toUndelete) {
    7381            if(getLayer().getConflicts().hasConflictForMy(primitive)) {
     
    7583                getLayer().getConflicts().remove(primitive);
    7684            }
    77             primitive.clearOsmId();
     85            OsmPrimitive prim;
     86            switch (primitive.getType()) {
     87            case NODE:
     88                prim = new Node((Node)primitive, true);
     89                break;
     90            case WAY:
     91                prim = new Way((Way)primitive, true);
     92                break;
     93            case RELATION:
     94                prim = new Relation((Relation)primitive, true);
     95                break;
     96            default:
     97                throw new AssertionError();
     98            }
     99            replacedPrimitives.add(prim);
     100            replacePrimitive(getLayer().data, primitive, prim);
    78101        }
    79102        return true;
     103    }
     104
     105    private void replacePrimitive(DataSet dataSet, OsmPrimitive oldPrim, OsmPrimitive newPrim) {
     106        dataSet.addPrimitive(newPrim);
     107        for (OsmPrimitive referrer: oldPrim.getReferrers()) {
     108            if (referrer instanceof Way) {
     109                Way w = (Way)referrer;
     110                List<Node> nodes = w.getNodes();
     111                Collections.replaceAll(nodes, (Node)oldPrim, (Node)newPrim);
     112                w.setNodes(nodes);
     113                w.setModified(true);
     114            } else if (referrer instanceof Relation) {
     115                Relation r = (Relation)referrer;
     116                List<RelationMember> members = r.getMembers();
     117                ListIterator<RelationMember> it = members.listIterator();
     118                while (it.hasNext()) {
     119                    RelationMember rm = it.next();
     120                    if (rm.getMember() == oldPrim) {
     121                        it.set(new RelationMember(rm.getRole(), newPrim));
     122                    }
     123                }
     124                r.setMembers(members);
     125                r.setModified(true);
     126            }
     127        }
     128        dataSet.removePrimitive(oldPrim);
     129    }
     130
     131    @Override
     132    public void undoCommand() {
     133        for (int i=0; i<toUndelete.size(); i++) {
     134            replacePrimitive(getLayer().data, replacedPrimitives.get(i), toUndelete.get(i));
     135        }
     136        super.undoCommand();
    80137    }
    81138
     
    83140    public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted,
    84141            Collection<OsmPrimitive> added) {
    85         modified.addAll(toUndelete);
    86142    }
    87143}
Note: See TracChangeset for help on using the changeset viewer.