

---

 core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java |   21 ++++++-------
 1 file changed, 11 insertions(+), 10 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-14 09:15:27.000000000 -0700
+++ core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java	2009-10-14 09:15:27.000000000 -0700
@@ -149,8 +149,12 @@ public class DataSet implements Cloneabl
     }
 
     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;
     }
 
@@ -253,10 +257,7 @@ public class DataSet implements Cloneabl
      * @param fireSelectionChangeEvent true, if the selection change listeners are to be notified; false, otherwise
      */
     public void setSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
-        clearSelection(nodes);
-        clearSelection(ways);
-        clearSelection(relations);
-        addSelected(selection);
+        selectedPrimitives = new LinkedHashSet<OsmPrimitive>(selection);
         if (fireSelectionChangeEvent) {
             fireSelectionChanged(selection);
         }
@@ -290,9 +291,6 @@ public class DataSet implements Cloneabl
      * @param fireSelectionChangeEvent true, if the selection change listeners are to be notified; false, otherwise
      */
     public void addSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
-        for (OsmPrimitive osm : selection) {
-            osm.setSelected(true);
-        }
         selectedPrimitives.addAll(selection);
         if (fireSelectionChangeEvent) {
             fireSelectionChanged(selection);
@@ -307,7 +305,7 @@ public class DataSet implements Cloneabl
         }
         List<OsmPrimitive> list = Arrays.asList(osm);
         setSelected(list);
-        fireSelectionChanged(Arrays.asList(osm));
+        fireSelectionChanged(list);
     }
 
     /**
@@ -353,6 +351,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;
_
