Changeset 3928 in josm for trunk/src/org


Ignore:
Timestamp:
2011-02-23T21:45:50+01:00 (14 years ago)
Author:
jttt
Message:

Fix #6015 Relation-Editor: added objects are not selected when adding "above selected"

File:
1 edited

Legend:

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

    r3925 r3928  
    22package org.openstreetmap.josm.gui.dialogs.relation;
    33
    4 import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.*;
     4import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.BACKWARD;
     5import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.FORWARD;
     6import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.NONE;
     7import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.ROUNDABOUT_LEFT;
     8import static org.openstreetmap.josm.gui.dialogs.relation.WayConnectionType.Direction.ROUNDABOUT_RIGHT;
    59
    610import java.util.ArrayList;
     
    377381    }
    378382
    379     public void addMembersAtBeginning(List<OsmPrimitive> primitives) {
     383    private void addMembersAtIndex(List<? extends OsmPrimitive> primitives, int index) {
    380384        if (primitives == null)
    381385            return;
    382         int index = 0;
    383         for (OsmPrimitive primitive : primitives) {
    384             RelationMember member = new RelationMember("", primitive);
    385             members.add(index++, member);
    386         }
    387         fireTableDataChanged();
    388         getSelectionModel().clearSelection();
    389         for (int i = 0; i < primitives.size(); i++) {
    390             getSelectionModel().addSelectionInterval(i, i);
    391         }
    392         fireMakeMemberVisible(0);
    393     }
    394 
    395     public void addMembersAtEnd(List<? extends OsmPrimitive> primitives) {
    396         if (primitives == null)
    397             return;
    398 
    399         for (OsmPrimitive primitive : primitives) {
    400             RelationMember member = new RelationMember("", primitive);
    401             members.add(member);
    402         }
    403         fireTableDataChanged();
    404         getSelectionModel().clearSelection();
    405         for (int i = 0; i < primitives.size(); i++) {
    406             getSelectionModel().addSelectionInterval(members.size() - 1 - i, members.size() - 1 - i);
    407         }
    408         fireMakeMemberVisible(members.size() - 1);
    409     }
    410 
    411     public void addMembersBeforeIdx(List<? extends OsmPrimitive> primitives, int idx) {
    412         if (primitives == null)
    413             return;
    414 
     386        int idx = index;
    415387        for (OsmPrimitive primitive : primitives) {
    416388            RelationMember member = new RelationMember("", primitive);
     
    418390        }
    419391        fireTableDataChanged();
    420         getSelectionModel().setValueIsAdjusting(true);
    421392        getSelectionModel().clearSelection();
    422         for (int i = 0; i < primitives.size(); i++) {
    423             getSelectionModel().addSelectionInterval(idx + i, idx + i);
    424         }
    425         getSelectionModel().setValueIsAdjusting(false);
    426         fireMakeMemberVisible(idx);
     393        getSelectionModel().addSelectionInterval(index, index + primitives.size() - 1);
     394        fireMakeMemberVisible(index);
     395    }
     396
     397    public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) {
     398        addMembersAtIndex(primitives, 0);
     399    }
     400
     401    public void addMembersAtEnd(List<? extends OsmPrimitive> primitives) {
     402        addMembersAtIndex(primitives, members.size());
     403    }
     404
     405    public void addMembersBeforeIdx(List<? extends OsmPrimitive> primitives, int idx) {
     406        addMembersAtIndex(primitives, idx);
    427407    }
    428408
    429409    public void addMembersAfterIdx(List<? extends OsmPrimitive> primitives, int idx) {
    430         if (primitives == null)
    431             return;
    432         int j = 1;
    433         for (OsmPrimitive primitive : primitives) {
    434             RelationMember member = new RelationMember("", primitive);
    435             members.add(idx + j, member);
    436             j++;
    437         }
    438         fireTableDataChanged();
    439         getSelectionModel().setValueIsAdjusting(true);
    440         getSelectionModel().clearSelection();
    441         for (int i = 0; i < primitives.size(); i++) {
    442             getSelectionModel().addSelectionInterval(idx + 1 + i, idx + 1 + i);
    443         }
    444         getSelectionModel().setValueIsAdjusting(false);
    445         fireMakeMemberVisible(idx + 1);
     410        addMembersAtIndex(primitives, idx + 1);
    446411    }
    447412
     
    962927            final RelationMember m = members.get(i);
    963928            if (!m.isWay() || m.getWay() == null || m.getWay().isIncomplete()) {
    964                 if(i > 0) makeLoopIfNeeded(con, i-1);
     929                if(i > 0) {
     930                    makeLoopIfNeeded(con, i-1);
     931                }
    965932                con.set(i, new WayConnectionType());
    966933                firstGroupIdx = i;
    967934                continue;
    968935            }
    969          
     936
    970937            WayConnectionType wct = new WayConnectionType(false);
    971938            wct.linkPrev = i>0 && con.get(i-1) != null && con.get(i-1).isValid();
     
    973940
    974941            if(isOneway(m)){
    975                 if(lastWct != null && lastWct.isOnewayTail)
     942                if(lastWct != null && lastWct.isOnewayTail) {
    976943                    wct.isOnewayHead = true;
     944                }
    977945                if(lastBackwardWay == UNCONNECTED && lastForwardWay == UNCONNECTED){ //Beginning of new oneway
    978946                    wct.isOnewayHead = true;
     
    981949                    onewayBeginning = true;
    982950                }
    983             }           
     951            }
    984952
    985953            if (wct.linkPrev) {
    986954                if(lastBackwardWay != UNCONNECTED && lastForwardWay != UNCONNECTED) {
    987955                    wct = determineOnewayConnectionType(con, m, i, wct);
    988                     if(!wct.linkPrev)
     956                    if(!wct.linkPrev) {
    989957                        firstGroupIdx = i;
     958                    }
    990959                }
    991960
     
    993962                    wct.direction = determineDirection(i-1, lastWct.direction, i);
    994963                    wct.linkPrev = (wct.direction != NONE);
    995                 }                   
    996             }
    997            
     964                }
     965            }
     966
    998967            if (!wct.linkPrev) {
    999968                wct.direction = determineDirectionOfFirst(i, m);
     
    1005974
    1006975            wct.linkNext = false;
    1007             if(lastWct != null)
     976            if(lastWct != null) {
    1008977                lastWct.linkNext = wct.linkPrev;
     978            }
    1009979            con.set(i, wct);
    1010980            lastWct = wct;
    1011981
    1012982            if(!wct.linkPrev) {
    1013                 if(i > 0) makeLoopIfNeeded(con, i-1);
     983                if(i > 0) {
     984                    makeLoopIfNeeded(con, i-1);
     985                }
    1014986                firstGroupIdx = i;
    1015987            }
     
    1019991    }
    1020992
    1021 //    private static void unconnectPreviousLink(List<WayConnectionType> con, int beg, boolean backward){
    1022 //        int i = beg;
    1023 //        while(true){
    1024 //            WayConnectionType t = con.get(i--);
    1025 //            t.isOnewayOppositeConnected = false;
    1026 //            if(backward && t.isOnewayLoopBackwardPart) break;
    1027 //            if(!backward && t.isOnewayLoopForwardPart) break;
    1028 //        }
    1029 //    }
     993    //    private static void unconnectPreviousLink(List<WayConnectionType> con, int beg, boolean backward){
     994    //        int i = beg;
     995    //        while(true){
     996    //            WayConnectionType t = con.get(i--);
     997    //            t.isOnewayOppositeConnected = false;
     998    //            if(backward && t.isOnewayLoopBackwardPart) break;
     999    //            if(!backward && t.isOnewayLoopForwardPart) break;
     1000    //        }
     1001    //    }
    10301002
    10311003    private static Direction reverse(final Direction dir){
     
    10421014        return member.getRole().equals("forward");
    10431015    }
    1044    
     1016
    10451017    public static boolean isOneway(final RelationMember member){
    10461018        return isForward(member) || isBackward(member);
     
    10631035
    10641036    private Direction determineDirectionOfFirst(final int i, final RelationMember m) {
    1065         if (roundaboutType(i) != NONE) {
     1037        if (roundaboutType(i) != NONE)
    10661038            return roundaboutType(i);
    1067         }
    1068        
     1039
    10691040        if (isOneway(m)){
    10701041            if(isBackward(m)) return BACKWARD;
     
    10841055        Direction dirBW = NONE;
    10851056        if(onewayBeginning) {
    1086             if(lastBackwardWay < 0)
     1057            if(lastBackwardWay < 0) {
    10871058                dirBW = determineDirection(firstGroupIdx, reverse(con.get(firstGroupIdx).direction), i, true);
    1088             else
     1059            } else {
    10891060                dirBW = determineDirection(lastBackwardWay, con.get(lastBackwardWay).direction, i, true);
    1090 
    1091             if(dirBW != NONE)
     1061            }
     1062
     1063            if(dirBW != NONE) {
    10921064                onewayBeginning = false;
    1093         } else
     1065            }
     1066        } else {
    10941067            dirBW = determineDirection(lastBackwardWay, con.get(lastBackwardWay).direction, i, true);
     1068        }
    10951069
    10961070        if(isOneway(m)) {
     
    11061080            }
    11071081            if(dirFW == NONE && dirBW == NONE) { //Not connected to previous
    1108 //                        unconnectPreviousLink(con, i, true);
    1109 //                        unconnectPreviousLink(con, i, false);
     1082                //                        unconnectPreviousLink(con, i, true);
     1083                //                        unconnectPreviousLink(con, i, false);
    11101084                wct.linkPrev = false;
    11111085                if(isOneway(m)){
     
    11371111            lastForwardWay = UNCONNECTED;
    11381112            lastBackwardWay = UNCONNECTED;
    1139             if(dirFW == NONE || dirBW == NONE)
     1113            if(dirFW == NONE || dirBW == NONE) {
    11401114                wct.linkPrev = false;
     1115            }
    11411116        }
    11421117        return wct;
Note: See TracChangeset for help on using the changeset viewer.