Ignore:
Timestamp:
03.12.2009 19:02:25 (2 years ago)
Author:
Gubaer
Message:

fixed #3400: relation editor: improvement to highlight an element
fixed #3873: Feature request: download selected elements in relation editor
New: Dbl-Click in member table to set the map selection to this member
New: Ctrl-Dbl-Clik in member table to add the member to the the map selection
New: Download selected incomplete members only

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java

    r2512 r2563  
    3838     * to relation members) after the first phase of merging 
    3939     */ 
    40     private Set<Long> childrenToMerge; 
     40    private Set<PrimitiveId> objectsWithChildrenToMerge; 
    4141    private Set<OsmPrimitive> deletedObjectsToUnlink; 
    4242 
     
    5757        conflicts = new ConflictCollection(); 
    5858        mergedMap = new HashMap<Long, Long>(); 
    59         childrenToMerge = new HashSet<Long>(); 
     59        objectsWithChildrenToMerge = new HashSet<PrimitiveId>(); 
    6060        deletedObjectsToUnlink = new HashSet<OsmPrimitive>(); 
    6161    } 
     
    7575     * @param source  the other primitive 
    7676     */ 
    77     protected <P extends OsmPrimitive> void mergePrimitive(P source) { 
     77    protected void mergePrimitive(OsmPrimitive source) { 
    7878        if (!source.isNew() ) { 
    7979            // try to merge onto a matching primitive with the same 
     
    112112                        target.setTimestamp(source.getTimestamp()); 
    113113                        target.setModified(source.isModified()); 
    114                         childrenToMerge.add(source.getUniqueId()); 
     114                        objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    115115                    } 
    116116                    return; 
     
    131131        targetDataSet.addPrimitive(target); 
    132132        mergedMap.put(source.getUniqueId(), target.getUniqueId()); 
    133         childrenToMerge.add(source.getUniqueId()); 
     133        objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    134134    } 
    135135 
     
    154154 
    155155    /** 
     156     * A way in the target dataset might be incomplete because at least of of its nodes is incomplete. 
     157     * The nodes might have become complete because a complete node was merged onto into in the 
     158     * merge operation. 
     159     *  
     160     * This method loops over all parent ways of such nodes and turns them into complete ways 
     161     * if necessary. 
     162     *  
     163     * @param other 
     164     */ 
     165    protected void fixIncompleteParentWays(Node other) { 
     166        Node myNode = (Node)getMergeTarget(other); 
     167        if (myNode == null) 
     168            throw new RuntimeException(tr("Missing merge target for node with id {0}", other.getUniqueId())); 
     169        if (myNode.incomplete || myNode.isDeleted() || !myNode.isVisible()) return; 
     170        wayloop: for (Way w: OsmPrimitive.getFilteredList(myNode.getReferrers(), Way.class)) { 
     171            if (w.isDeleted() || ! w.isVisible() || ! w.incomplete) { 
     172                continue; 
     173            } 
     174            for (Node n: w.getNodes()) { 
     175                if (n.incomplete) { 
     176                    continue wayloop; 
     177                } 
     178            } 
     179            // all nodes are complete - set the way complete too 
     180            w.incomplete = false; 
     181        } 
     182    } 
     183 
     184    /** 
    156185     * Postprocess the dataset and fix all merged references to point to the actual 
    157186     * data. 
     
    159188    public void fixReferences() { 
    160189        for (Way w : sourceDataSet.getWays()) { 
    161             if (!conflicts.hasConflictForTheir(w) && childrenToMerge.contains(w.getUniqueId())) { 
     190            if (!conflicts.hasConflictForTheir(w) && objectsWithChildrenToMerge.contains(w.getPrimitiveId())) { 
    162191                mergeNodeList(w); 
    163192                fixIncomplete(w); 
     
    165194        } 
    166195        for (Relation r : sourceDataSet.getRelations()) { 
    167             if (!conflicts.hasConflictForTheir(r) && childrenToMerge.contains(r.getUniqueId())) { 
     196            if (!conflicts.hasConflictForTheir(r) && objectsWithChildrenToMerge.contains(r.getPrimitiveId())) { 
    168197                mergeRelationMembers(r); 
    169198            } 
     
    175204            targetDataSet.unlinkReferencesToPrimitive(target); 
    176205        } 
     206        // objectsWithChildrenToMerge also includes complete nodes which have 
     207        // been merged into their incomplete equivalents. 
     208        // 
     209        for (PrimitiveId id: objectsWithChildrenToMerge) { 
     210            if (!id.getType().equals(OsmPrimitiveType.NODE)) { 
     211                continue; 
     212            } 
     213            Node n = (Node)sourceDataSet.getPrimitiveById(id); 
     214            if (!conflicts.hasConflictForTheir(n)) { 
     215                fixIncompleteParentWays(n); 
     216            } 
     217        } 
     218 
    177219    } 
    178220 
     
    269311            // 
    270312            target.mergeFrom(source); 
    271             childrenToMerge.add(source.getUniqueId()); 
     313            objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    272314        } else if (!target.incomplete && source.incomplete) { 
    273315            // target is complete and source is incomplete 
     
    282324            // otherwise too many conflicts when refreshing from the server 
    283325        } else if (target.isDeleted() != source.isDeleted()) { 
    284             // differences in deleted state have to be resolved manually 
     326            // differences in deleted state have to be resolved manually. This can 
     327            // happen if one layer is merged onto another layer 
    285328            // 
    286329            conflicts.add(target,source); 
     
    288331            // target not modified. We can assume that source is the most recent version. 
    289332            // clone it into target. But check first, whether source is deleted. if so, 
    290             // make sure that target is not referenced anymore in myDataSet. 
     333            // make sure that target is not referenced any more in myDataSet. 
    291334            // 
    292335            if (source.isDeleted()) { 
     
    294337            } 
    295338            target.mergeFrom(source); 
    296             childrenToMerge.add(source.getUniqueId()); 
     339            objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    297340        } else if (! target.isModified() && !source.isModified() && target.getVersion() == source.getVersion()) { 
    298341            // both not modified. Keep mine 
     
    302345            // 
    303346            target.mergeFrom(source); 
    304             childrenToMerge.add(source.getUniqueId()); 
     347            objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    305348        } else if (target.isModified() && ! source.isModified() && target.getVersion() == source.getVersion()) { 
    306349            // target is same as source but target is modified 
     
    318361            target.mergeFrom(source); 
    319362            target.setModified(true); 
    320             childrenToMerge.add(source.getUniqueId()); 
     363            objectsWithChildrenToMerge.add(source.getPrimitiveId()); 
    321364        } 
    322365        return true; 
Note: See TracChangeset for help on using the changeset viewer.