Changeset 6652 in josm for trunk


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,✗.

Location:
trunk
Files:
4 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    }
  • trunk/src/org/openstreetmap/josm/tools/Predicates.java

    r6592 r6652  
    33import org.openstreetmap.josm.data.osm.OsmPrimitive;
    44
     5import java.util.Collection;
    56import java.util.regex.Pattern;
    67
     
    8485        };
    8586    }
     87
     88    /**
     89     * Returns a {@link Predicate} executing {@link Collection#contains(Object)}.
     90     */
     91    public static <T> Predicate<T> inCollection(final Collection<? extends T> target) {
     92        return new Predicate<T>() {
     93            @Override
     94            public boolean evaluate(T object) {
     95                return target.contains(object);
     96            }
     97        };
     98    }
    8699}
  • trunk/src/org/openstreetmap/josm/tools/Utils.java

    r6642 r6652  
    3737import java.util.Arrays;
    3838import java.util.Collection;
     39import java.util.Collections;
    3940import java.util.Iterator;
    4041import java.util.List;
     
    861862
    862863    /**
     864     * Returns a human readable representation of a list of positions.
     865     * <p/>
     866     * For instance, {@code [1,5,2,6,7} yields "1-2,5-7
     867     * @param positionList a list of positions
     868     * @return a human readable representation
     869     */
     870    public static String getPositionListString(List<Integer> positionList)  {
     871        Collections.sort(positionList);
     872        final StringBuilder sb = new StringBuilder(32);
     873        sb.append(positionList.get(0));
     874        int cnt = 0;
     875        int last = positionList.get(0);
     876        for (int i = 1; i < positionList.size(); ++i) {
     877            int cur = positionList.get(i);
     878            if (cur == last + 1) {
     879                ++cnt;
     880            } else if (cnt == 0) {
     881                sb.append(",").append(cur);
     882            } else {
     883                sb.append("-").append(last);
     884                sb.append(",").append(cur);
     885                cnt = 0;
     886            }
     887            last = cur;
     888        }
     889        if (cnt >= 1) {
     890            sb.append("-").append(last);
     891        }
     892        return sb.toString();
     893    }
     894
     895
     896    /**
    863897     * Returns a list of capture groups if {@link Matcher#matches()}, or {@code null}.
    864898     * The first element (index 0) is the complete match.
  • trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java

    r6471 r6652  
    55import org.junit.Test;
    66import org.openstreetmap.josm.Main;
    7 import org.openstreetmap.josm.data.Preferences;
    87
    98import java.io.BufferedReader;
    109import java.net.URL;
     10import java.util.Arrays;
     11
     12import static org.hamcrest.CoreMatchers.is;
     13import static org.junit.Assert.assertThat;
    1114
    1215/**
     
    8790        x.close();
    8891    }
     92
     93    @Test
     94    public void testPositionListString() throws Exception {
     95        assertThat(Utils.getPositionListString(Arrays.asList(1)), is("1"));
     96        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3)), is("1-3"));
     97        assertThat(Utils.getPositionListString(Arrays.asList(3, 1, 2)), is("1-3"));
     98        assertThat(Utils.getPositionListString(Arrays.asList(1, 2, 3, 6, 7, 8)), is("1-3,6-8"));
     99        assertThat(Utils.getPositionListString(Arrays.asList(1, 5, 2, 6, 7)), is("1-2,5-7"));
     100    }
    89101}
Note: See TracChangeset for help on using the changeset viewer.