Changeset 2972 in josm


Ignore:
Timestamp:
13.02.2010 16:19:56 (2 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.