Ignore:
Timestamp:
2009-07-26T22:52:23+02:00 (16 years ago)
Author:
Gubaer
Message:

replaced JOptionDialog.show... by OptionPaneUtil.show....
improved relation editor

File:
1 edited

Legend:

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

    r1845 r1857  
    440440    }
    441441
     442    /**
     443     * get a node we can link against when sorting members
     444     * @param element the element we want to link against
     445     * @param linked_element already linked against element
     446     * @return the unlinked node if element is a way, the node itself if element is a node, null otherwise
     447     */
     448    private static Node getUnusedNode(RelationMember element, RelationMember linked_element)
     449    {
     450        Node    result = null;
     451
     452        if (element.member instanceof Way) {
     453            Way w = (Way) element.member;
     454            if (linked_element.member instanceof Way) {
     455                Way x = (Way) linked_element.member;
     456                if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) {
     457                    result = w.lastNode();
     458                } else {
     459                    result = w.firstNode();
     460                }
     461            } else if (linked_element.member instanceof Node) {
     462                Node m = (Node) linked_element.member;
     463                if (w.firstNode() == m) {
     464                    result = w.lastNode();
     465                } else {
     466                    result = w.firstNode();
     467                }
     468            }
     469        } else if (element.member instanceof Node) {
     470            Node n = (Node) element.member;
     471            result = n;
     472        }
     473
     474        return result;
     475    }
     476
    442477    void sort() {
    443478        RelationNodeMap map = new RelationNodeMap(members);
     
    450485        /*
    451486         * sort any 2 or more connected elements together may be slow with many unconnected members
    452          * TODO: cleanup again, too much code in 1 method
    453487         */
    454488
    455         if (map.isEmpty())
     489        if (map.isEmpty()) {
    456490            // empty relation or incomplete members
    457491            return;
     492        }
    458493        segments = new Vector<LinkedList<Integer>>();
    459494
     
    482517                endSearchNode = null;
    483518                if (segment.size() == 1) {
     519                    // only one element in segment, so try to link against each linkable node of element
    484520                    RelationMember m = members.get(segment.getFirst());
    485521                    if (m.member instanceof Way) {
    486522                        Way w = (Way) m.member;
    487523                        endSearchNode = w.lastNode();
    488                         startSearchNode = w.firstNode();
     524                        if (w.lastNode() != w.firstNode())
     525                        {
     526                            startSearchNode = w.firstNode();
     527                        }
    489528                    } else if (m.member instanceof Node) {
    490529                        Node n = (Node) m.member;
     
    493532                } else {
    494533                    // add unused node of first element and unused node of last element
    495                     // start with the first element
    496                     RelationMember element = members.get(segment.getFirst());
    497                     RelationMember other_element = members.get(segment.get(1));
    498 
    499                     if (element.member instanceof Way) {
    500                         Way w = (Way) element.member;
    501                         if (other_element.member instanceof Way) {
    502                             Way x = (Way) other_element.member;
    503                             if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) {
    504                                 startSearchNode = w.lastNode();
    505                             } else {
    506                                 startSearchNode = w.firstNode();
    507                             }
    508                         } else if (other_element.member instanceof Node) {
    509                             Node m = (Node) other_element.member;
    510                             if (w.firstNode() == m) {
    511                                 startSearchNode = w.lastNode();
    512                             } else {
    513                                 startSearchNode = w.firstNode();
    514                             }
    515                         }
    516                     } else if (element.member instanceof Node) {
    517                         Node n = (Node) element.member;
    518                         startSearchNode = n;
    519                     }
    520 
    521                     // now the same for the last element
    522                     element = members.get(segment.getLast());
    523                     other_element = members.get(segment.get(segment.size() - 2));
    524 
    525                     if (element.member instanceof Way) {
    526                         Way w = (Way) element.member;
    527                         if (other_element.member instanceof Way) {
    528                             Way x = (Way) other_element.member;
    529                             if ((w.firstNode() == x.firstNode()) || (w.firstNode() == x.lastNode())) {
    530                                 endSearchNode = w.lastNode();
    531                             } else {
    532                                 endSearchNode = w.firstNode();
    533                             }
    534                         } else if (other_element.member instanceof Node) {
    535                             Node m = (Node) other_element.member;
    536                             if (w.firstNode() == m) {
    537                                 endSearchNode = w.lastNode();
    538                             } else {
    539                                 endSearchNode = w.firstNode();
    540                             }
    541                         }
    542                     } else if (element.member instanceof Node) {
    543                         Node n = (Node) element.member;
    544                         endSearchNode = n;
    545                     }
     534                    // start with the first element (compared to next element)
     535                    startSearchNode = getUnusedNode(members.get(segment.getFirst()), members.get(segment.get(1)));
     536
     537                    // now the same for the last element (compared to previous element)
     538                    endSearchNode = getUnusedNode(members.get(segment.getLast()), members.get(segment.get(segment.size() - 2)));
    546539                }
    547540
     
    566559
    567560        }
     561
    568562        if (segments.size() > 0) {
    569563            // append map.remaining() to segments list (as a single segment)
Note: See TracChangeset for help on using the changeset viewer.