- Timestamp:
- 2014-05-14T02:16:44+02:00 (11 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/APIDataSet.java
r7005 r7120 76 76 } 77 77 } 78 OsmPrimitiveComparator c = new OsmPrimitiveComparator(); 79 c.relationsFirst = true; 78 OsmPrimitiveComparator c = new OsmPrimitiveComparator(false, true); 80 79 Collections.sort(toDelete, c); 81 80 Collections.sort(toAdd, c); -
trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitiveComparator.java
r7005 r7120 8 8 import org.openstreetmap.josm.gui.DefaultNameFormatter; 9 9 10 /** Comparator, comparing by type and objects display names */ 10 /** 11 * Comparator, comparing pritimives by:<ul> 12 * <li>type and ids in "quick" mode</li> 13 * <li>type and objects display names instead</li> 14 * </ul> 15 * @since 4113 16 */ 11 17 public class OsmPrimitiveComparator implements Comparator<OsmPrimitive> { 12 private final Map<OsmPrimitive, String> cache= new HashMap<>(); 13 private final DefaultNameFormatter df = DefaultNameFormatter.getInstance(); 14 public boolean relationsFirst = false; 18 private final Map<OsmPrimitive, String> cache = new HashMap<>(); 19 private final boolean relationsFirst; 20 private final boolean quick; 21 22 /** 23 * Constructs a new {@code OsmPrimitiveComparator}. 24 */ 25 public OsmPrimitiveComparator() { 26 this(false, false); 27 } 28 29 /** 30 * Constructs a new {@code OsmPrimitiveComparator}. 31 * @param quick if {@code true}, sorts by type and ids (fast), otherwise sort by type and display names (slower) 32 * @param relationsFirst if {@code true}, always list relations first 33 */ 34 public OsmPrimitiveComparator(boolean quick, boolean relationsFirst) { 35 this.quick = quick; 36 this.relationsFirst = relationsFirst; 37 } 15 38 16 39 private String cachedName(OsmPrimitive p) { 17 40 String name = cache.get(p); 18 41 if (name == null) { 19 name = p.getDisplayName( df);42 name = p.getDisplayName(DefaultNameFormatter.getInstance()); 20 43 cache.put(p, name); 21 44 } … … 36 59 } 37 60 61 private static int compareId(OsmPrimitive a, OsmPrimitive b) { 62 long idA = a.getUniqueId(); 63 long idB = b.getUniqueId(); 64 if (idA < idB) return -1; 65 if (idA > idB) return 1; 66 return 0; 67 } 68 38 69 private int compareType(OsmPrimitive a, OsmPrimitive b) { 39 if(relationsFirst) { 70 if (relationsFirst) { 40 71 // show relations before ways, then nodes 41 72 if (a.getType().equals(OsmPrimitiveType.RELATION)) return -1; … … 58 89 public int compare(OsmPrimitive a, OsmPrimitive b) { 59 90 if (a.getType().equals(b.getType())) 60 return compareName(a, b); 91 return quick ? compareId(a, b) : compareName(a, b); 61 92 return compareType(a, b); 62 93 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
r7021 r7120 15 15 import java.util.Collection; 16 16 import java.util.Collections; 17 import java.util.Comparator;18 17 import java.util.HashSet; 19 18 import java.util.Iterator; … … 44 43 import org.openstreetmap.josm.data.osm.OsmPrimitive; 45 44 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator; 46 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;47 45 import org.openstreetmap.josm.data.osm.Relation; 48 46 import org.openstreetmap.josm.data.osm.Way; … … 585 583 */ 586 584 public void sort() { 587 if (this.selection.size()>Main.pref.getInteger("selection.no_sort_above",100000)) return; 588 if (this.selection.size()>Main.pref.getInteger("selection.fast_sort_above",10000)) { 589 Collections.sort(this.selection, new OsmPrimitiveQuickComparator()); 590 } else { 591 Collections.sort(this.selection, new OsmPrimitiveComparator()); 585 if (this.selection.size() <= Main.pref.getInteger("selection.no_sort_above", 100000)) { 586 boolean quick = this.selection.size() > Main.pref.getInteger("selection.fast_sort_above", 10000); 587 Collections.sort(this.selection, new OsmPrimitiveComparator(quick, false)); 592 588 } 593 589 } … … 778 774 } 779 775 } 780 781 /** Quicker comparator, comparing just by type and ID's */782 private static class OsmPrimitiveQuickComparator implements Comparator<OsmPrimitive> {783 784 private int compareId(OsmPrimitive a, OsmPrimitive b) {785 long id_a=a.getUniqueId();786 long id_b=b.getUniqueId();787 if (id_a<id_b) return -1;788 if (id_a>id_b) return 1;789 return 0;790 }791 792 private int compareType(OsmPrimitive a, OsmPrimitive b) {793 // show ways before relations, then nodes794 if (a.getType().equals(OsmPrimitiveType.WAY)) return -1;795 if (a.getType().equals(OsmPrimitiveType.NODE)) return 1;796 // a is a relation797 if (b.getType().equals(OsmPrimitiveType.WAY)) return 1;798 // b is a node799 return -1;800 }801 802 @Override803 public int compare(OsmPrimitive a, OsmPrimitive b) {804 if (a.getType().equals(b.getType()))805 return compareId(a, b);806 return compareType(a, b);807 }808 }809 810 776 }
Note:
See TracChangeset
for help on using the changeset viewer.