Ignore:
Timestamp:
2014-01-06T20:42:32+01:00 (10 years ago)
Author:
simon04
Message:

fix #9525 - multiselecting objects does not show differing relation membership correctly in the sidebar

For instance, positions are displayed as 48-49,91,✗.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r6643 r6652  
    2424import java.util.EnumSet;
    2525import java.util.HashMap;
     26import java.util.HashSet;
    2627import java.util.LinkedList;
    2728import java.util.List;
     
    9596import org.openstreetmap.josm.tools.LanguageInfo;
    9697import org.openstreetmap.josm.tools.OpenBrowser;
     98import org.openstreetmap.josm.tools.Predicates;
    9799import org.openstreetmap.josm.tools.Shortcut;
    98100import org.openstreetmap.josm.tools.Utils;
     
    321323                boolean isDisabledAndHidden = (((Relation)table.getValueAt(row, 0))).isDisabledAndHidden();
    322324                if (c instanceof JLabel) {
    323                     JLabel label = (JLabel)c;
    324                     MemberInfo col = (MemberInfo) value;
    325 
    326                     String text = null;
    327                     for (RelationMember r : col.role) {
    328                         if (text == null) {
    329                             text = r.getRole();
    330                         }
    331                         else if (!text.equals(r.getRole())) {
    332                             text = tr("<different>");
    333                             break;
    334                         }
    335                     }
    336 
    337                     label.setText(text);
     325                    JLabel label = (JLabel) c;
     326                    label.setText(((MemberInfo) value).getRoleString());
    338327                    if (isDisabledAndHidden) {
    339328                        label.setFont(label.getFont().deriveFont(Font.ITALIC));
     
    623612                    MemberInfo mi = roles.get(r);
    624613                    if(mi == null) {
    625                         mi = new MemberInfo();
     614                        mi = new MemberInfo(newSel);
    626615                    }
    627616                    roles.put(r, mi);
     
    792781
    793782    static class MemberInfo {
    794         List<RelationMember> role = new ArrayList<RelationMember>();
    795         List<Integer> position = new ArrayList<Integer>();
     783        private List<RelationMember> role = new ArrayList<RelationMember>();
     784        private Set<OsmPrimitive> members = new HashSet<OsmPrimitive>();
     785        private List<Integer> position = new ArrayList<Integer>();
     786        private Iterable<OsmPrimitive> selection;
    796787        private String positionString = null;
     788        private String roleString = null;
     789
     790        MemberInfo(Iterable<OsmPrimitive> selection) {
     791            this.selection = selection;
     792        }
     793
    797794        void add(RelationMember r, Integer p) {
    798795            role.add(r);
     796            members.add(r.getMember());
    799797            position.add(p);
    800798        }
     799
    801800        String getPositionString() {
    802801            if (positionString == null) {
    803                 Collections.sort(position);
    804                 positionString = String.valueOf(position.get(0));
    805                 int cnt = 0;
    806                 int last = position.get(0);
    807                 for (int i = 1; i < position.size(); ++i) {
    808                     int cur = position.get(i);
    809                     if (cur == last + 1) {
    810                         ++cnt;
    811                     } else if (cnt == 0) {
    812                         positionString += "," + cur;
    813                     } else {
    814                         positionString += "-" + last;
    815                         positionString += "," + cur;
    816                         cnt = 0;
    817                     }
    818                     last = cur;
    819                 }
    820                 if (cnt >= 1) {
    821                     positionString += "-" + last;
    822                 }
     802                positionString = Utils.getPositionListString(position);
     803                // if not all objects from the selection are member of this relation
     804                if (Utils.exists(selection, Predicates.not(Predicates.inCollection(members)))) {
     805                    positionString += ",\u2717";
     806                }
     807                members = null;
     808                position = null;
     809                selection = null;
    823810            }
    824811            if (positionString.length() > 20) {
     
    826813            }
    827814            return positionString;
     815        }
     816
     817        String getRoleString() {
     818            if (roleString == null) {
     819                for (RelationMember r : role) {
     820                    if (roleString == null) {
     821                        roleString = r.getRole();
     822                    } else if (!roleString.equals(r.getRole())) {
     823                        roleString = tr("<different>");
     824                        break;
     825                    }
     826                }
     827                role = null;
     828            }
     829            return roleString;
     830        }
     831
     832        @Override
     833        public String toString() {
     834            return "MemberInfo{" +
     835                    "roles='" + roleString + '\'' +
     836                    ", positions='" + positionString + '\'' +
     837                    '}';
    828838        }
    829839    }
Note: See TracChangeset for help on using the changeset viewer.