Changeset 5603 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2012-11-27T15:38:20+01:00 (11 years ago)
Author:
Don-vip
Message:

fix #8224 - Relation sorting: run custom sorters before default one in order to take into account all primitives based on their role before their type -> this allows to sort associatedStreet houses if the addr:housenumber is set on a closed way instead of a node

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java

    r5516 r5603  
    699699     */
    700700    private List<RelationMember> sortMembers(List<RelationMember> relationMembers) {
    701         RelationNodeMap map = new RelationNodeMap(relationMembers);
     701        ArrayList<RelationMember> newMembers = new ArrayList<RelationMember>();
     702
     703        // Sort members with custom mechanisms (relation-dependent)
     704        List<RelationMember> defaultMembers = new LinkedList<RelationMember>();
     705        Map<AdditionalSorter, List<RelationMember>> customMap = new HashMap<AdditionalSorter, List<RelationMember>>();
     706
     707        // Dispatch members to correct sorters
     708        for (RelationMember m : relationMembers) {
     709            for (AdditionalSorter sorter : additionalSorters) {
     710                List<RelationMember> list = defaultMembers;
     711                if (sorter.acceptsMember(m)) {
     712                    list = customMap.get(sorter);
     713                    if (list == null) {
     714                        customMap.put(sorter, list = new LinkedList<RelationMember>());
     715                    }
     716                }
     717                list.add(m);
     718            }
     719        }
     720       
     721        // Sort members and add them to result
     722        for (AdditionalSorter s : customMap.keySet()) {
     723            newMembers.addAll(s.sortMembers(customMap.get(s)));
     724        }
     725       
     726        RelationNodeMap map = new RelationNodeMap(defaultMembers);
    702727        // List of groups of linked members
    703728        //
     
    730755        }
    731756
    732         ArrayList<RelationMember> newMembers = new ArrayList<RelationMember>();
    733757        for (LinkedList<Integer> tmpGroup : allGroups) {
    734758            for (Integer p : tmpGroup) {
    735                 newMembers.add(relationMembers.get(p));
    736             }
    737         }
    738 
    739         // Try to sort remaining members with custom mechanisms (relation-dependent)
    740         List<RelationMember> notSortableMembers = new LinkedList<RelationMember>();
    741         Map<AdditionalSorter, List<RelationMember>> additionalMap = new HashMap<AdditionalSorter, List<RelationMember>>();
    742 
    743         // Dispatch members to correct sorters
    744         for (Integer i : map.getNotSortableMembers()) {
    745             RelationMember m = relationMembers.get(i);
    746             for (AdditionalSorter sorter : additionalSorters) {
    747                 List<RelationMember> list = notSortableMembers;
    748                 if (sorter.acceptsMember(m)) {
    749                     list = additionalMap.get(sorter);
    750                     if (list == null) {
    751                         additionalMap.put(sorter, list = new LinkedList<RelationMember>());
    752                     }
    753                 }
    754                 list.add(m);
    755             }
    756         }
    757        
    758         // Sort members and add them to result
    759         for (AdditionalSorter s : additionalMap.keySet()) {
    760             newMembers.addAll(s.sortMembers(additionalMap.get(s)));
     759                newMembers.add(defaultMembers.get(p));
     760            }
    761761        }
    762762       
    763763        // Finally, add members that have not been sorted at all
    764         newMembers.addAll(notSortableMembers);
     764        for (Integer i : map.getNotSortableMembers()) {
     765            newMembers.add(defaultMembers.get(i));
     766        }
    765767       
    766768        return newMembers;
Note: See TracChangeset for help on using the changeset viewer.