

---

 core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java |   20 +++++++------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff -puN src/org/openstreetmap/josm/data/osm/DataSet.java~optimize-selection-code src/org/openstreetmap/josm/data/osm/DataSet.java
--- core/src/org/openstreetmap/josm/data/osm/DataSet.java~optimize-selection-code	2009-10-11 14:49:11.000000000 -0700
+++ core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java	2009-10-11 14:49:11.000000000 -0700
@@ -145,12 +145,16 @@ public class DataSet implements Cloneabl
         } else if (primitive instanceof Relation) {
             relations.remove(primitive);
         }
-        selectedPrimitves.remove(primitive);
+        selectedPrimitives.remove(primitive);
     }
 
     public Collection<OsmPrimitive> getSelectedNodesAndWays() {
-        Collection<OsmPrimitive> sel = getSelected(nodes);
-        sel.addAll(getSelected(ways));
+        Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
+        for (OsmPrimitive osm : selectedPrimitives) {
+            if (osm instanceof Way ||
+                osm instanceof Node)
+                sel.add(osm);
+        }
         return sel;
     }
 
@@ -252,10 +256,7 @@ public class DataSet implements Cloneabl
     }
 
     public void setSelected(Collection<? extends OsmPrimitive> selection) {
-        clearSelection(nodes);
-        clearSelection(ways);
-        clearSelection(relations);
-        addSelected(selection);
+        selectedPrimitives = new LinkedHashSet<OsmPrimitive>(selection);
         fireSelectionChanged(selection);
     }
 
@@ -266,7 +267,7 @@ public class DataSet implements Cloneabl
         }
         List<OsmPrimitive> list = Arrays.asList(osm);
         setSelected(list);
-        fireSelectionChanged(Arrays.asList(osm));
+        fireSelectionChanged(list);
     }
 
     /**
@@ -312,6 +313,9 @@ public class DataSet implements Cloneabl
     private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
         if (list == null)
             return new LinkedList<OsmPrimitive>();
+        // getSelected() is called with large lists, so
+        // creating the return list from the selection
+        // should be faster most of the time.
         Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
         sel.retainAll(list);
         return sel;
_
