

---

 core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java |   50 +++++--------
 1 file changed, 21 insertions(+), 29 deletions(-)

diff -puN src/org/openstreetmap/josm/data/osm/DataSet.java~implement-selection-storage-in-DataSet src/org/openstreetmap/josm/data/osm/DataSet.java
--- core/src/org/openstreetmap/josm/data/osm/DataSet.java~implement-selection-storage-in-DataSet	2009-10-13 15:10:38.000000000 -0700
+++ core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java	2009-10-13 15:15:00.000000000 -0700
@@ -6,8 +6,10 @@ import java.awt.geom.Area;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -16,6 +18,7 @@ import java.util.Set;
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.QuadBuckets;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
 /**
  * DataSet is the data behind the application. It can consists of only a few points up to the whole
@@ -142,6 +145,7 @@ public class DataSet implements Cloneabl
         } else if (primitive instanceof Relation) {
             relations.remove(primitive);
         }
+        selectedPrimitives.remove(primitive);
     }
 
     public Collection<OsmPrimitive> getSelectedNodesAndWays() {
@@ -156,10 +160,11 @@ public class DataSet implements Cloneabl
      * @return List of all selected objects.
      */
     public Collection<OsmPrimitive> getSelected() {
-        Collection<OsmPrimitive> sel = getSelected(nodes);
-        sel.addAll(getSelected(ways));
-        sel.addAll(getSelected(relations));
-        return sel;
+        // It would be nice to have this be a copy-on-write list
+        // or an Collections.unmodifiableList().  It would be
+        // much faster for large selections.  May users just
+        // call this, and only check the .size().
+        return new ArrayList<OsmPrimitive>(selectedPrimitives);
     }
 
     /**
@@ -215,17 +220,15 @@ public class DataSet implements Cloneabl
         }
     }
 
-    public boolean addSelected(OsmPrimitive osm) {
-        osm.setSelected(true);
-        return true;
-    }
+    LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
 
     public boolean toggleSelected(OsmPrimitive osm) {
-        osm.setSelected(!osm.isSelected());
+        if (!selectedPrimitives.remove(osm))
+            selectedPrimitives.add(osm);
         return true;
     }
     public boolean isSelected(OsmPrimitive osm) {
-        return osm.isSelected();
+        return selectedPrimitives.contains(osm);
     }
 
     public void setDisabled(OsmPrimitive... osm) {
@@ -253,9 +256,7 @@ public class DataSet implements Cloneabl
         clearSelection(nodes);
         clearSelection(ways);
         clearSelection(relations);
-        for (OsmPrimitive osm : selection) {
-            osm.setSelected(true);
-        }
+        addSelected(selection);
         if (fireSelectionChangeEvent) {
             fireSelectionChanged(selection);
         }
@@ -292,6 +293,7 @@ public class DataSet implements Cloneabl
         for (OsmPrimitive osm : selection) {
             osm.setSelected(true);
         }
+        selectedPrimitives.addAll(selection);
         if (fireSelectionChangeEvent) {
             fireSelectionChanged(selection);
         }
@@ -303,13 +305,8 @@ public class DataSet implements Cloneabl
             setSelected();
             return;
         }
-        clearSelection(nodes);
-        clearSelection(ways);
-        clearSelection(relations);
-        for (OsmPrimitive o : osm)
-            if (o != null) {
-                o.setSelected(true);
-            }
+        List<OsmPrimitive> list = Arrays.asList(osm);
+        setSelected(list);
         fireSelectionChanged(Arrays.asList(osm));
     }
 
@@ -346,9 +343,7 @@ public class DataSet implements Cloneabl
     private void clearSelection(Collection<? extends OsmPrimitive> list) {
         if (list == null)
             return;
-        for (OsmPrimitive osm : list) {
-            osm.setSelected(false);
-        }
+        selectedPrimitives.removeAll(list);
     }
 
     /**
@@ -356,13 +351,10 @@ public class DataSet implements Cloneabl
      * @param list The collection from which the selected items are returned.
      */
     private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
-        Collection<OsmPrimitive> sel = new HashSet<OsmPrimitive>();
         if (list == null)
-            return sel;
-        for (OsmPrimitive osm : list)
-            if (osm.isSelected() && !osm.isDeleted()) {
-                sel.add(osm);
-            }
+            return new LinkedList<OsmPrimitive>();
+        Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
+        sel.retainAll(list);
         return sel;
     }
 
_
