Ticket #3696: implement-selection-storage-in-DataSet.patch

File implement-selection-storage-in-DataSet.patch, 4.8 KB (added by hansendc, 17 years ago)
  • (a) core/src/org/openstreetmap/josm/data/osm/DataSet.java~implement-selection-storage-in-DataSet vs. (b) core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java

    
    ---
    
     core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java |   53 ++++++-------
     1 file changed, 25 insertions(+), 28 deletions(-)
    
    diff -puN src/org/openstreetmap/josm/data/osm/DataSet.java~implement-selection-storage-in-DataSet src/org/openstreetmap/josm/data/osm/DataSet.java
    a b import java.awt.geom.Area;  
    66import java.util.ArrayList;
    77import java.util.Arrays;
    88import java.util.Collection;
     9import java.util.Collections;
    910import java.util.Comparator;
    1011import java.util.HashMap;
     12import java.util.LinkedHashSet;
    1113import java.util.HashSet;
    1214import java.util.Iterator;
    1315import java.util.LinkedList;
    import java.util.Set;  
    1618
    1719import org.openstreetmap.josm.data.SelectionChangedListener;
    1820import org.openstreetmap.josm.data.osm.QuadBuckets;
     21import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1922
    2023/**
    2124 * DataSet is the data behind the application. It can consists of only a few points up to the whole
    public class DataSet implements Cloneabl  
    142145        } else if (primitive instanceof Relation) {
    143146            relations.remove(primitive);
    144147        }
     148        selectedPrimitves.remove(primitive);
    145149    }
    146150
    147151    public Collection<OsmPrimitive> getSelectedNodesAndWays() {
    public class DataSet implements Cloneabl  
    156160     * @return List of all selected objects.
    157161     */
    158162    public Collection<OsmPrimitive> getSelected() {
    159         Collection<OsmPrimitive> sel = getSelected(nodes);
    160         sel.addAll(getSelected(ways));
    161         sel.addAll(getSelected(relations));
    162         return sel;
     163        // It would be nice to have this be a copy-on-write list
     164        // or an Collections.unmodifiableList().  It would be
     165        // much faster for large selections.  May users just
     166        // call this, and only check the .size().
     167        return new ArrayList<OsmPrimitive>(selectedPrimitives);
    163168    }
    164169
    165170    /**
    public class DataSet implements Cloneabl  
    215220        }
    216221    }
    217222
    218     public boolean addSelected(OsmPrimitive osm) {
    219         osm.setSelected(true);
    220         return true;
     223    LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
     224    public boolean addSelected(OsmPrimitive... osm) {
     225        return this.addSelected(Arrays.asList(osm));
     226    }
     227    public boolean addSelected(Collection<? extends OsmPrimitive> list) {
     228        return selectedPrimitives.addAll(list);
    221229    }
    222230
    223231    public boolean toggleSelected(OsmPrimitive osm) {
    224         osm.setSelected(!osm.isSelected());
     232        if (!selectedPrimitives.remove(osm))
     233            selectedPrimitives.add(osm);
    225234        return true;
    226235    }
    227236    public boolean isSelected(OsmPrimitive osm) {
    228         return osm.isSelected();
     237        return selectedPrimitives.contains(osm);
    229238    }
    230239
    231240    public void setDisabled(OsmPrimitive... osm) {
    public class DataSet implements Cloneabl  
    246255        clearSelection(nodes);
    247256        clearSelection(ways);
    248257        clearSelection(relations);
    249         for (OsmPrimitive osm : selection) {
    250             osm.setSelected(true);
    251         }
     258        addSelected(selection);
    252259        fireSelectionChanged(selection);
    253260    }
    254261
    public class DataSet implements Cloneabl  
    257264            setSelected();
    258265            return;
    259266        }
    260         clearSelection(nodes);
    261         clearSelection(ways);
    262         clearSelection(relations);
    263         for (OsmPrimitive o : osm)
    264             if (o != null) {
    265                 o.setSelected(true);
    266             }
     267        List<OsmPrimitive> list = Arrays.asList(osm);
     268        setSelected(list);
    267269        fireSelectionChanged(Arrays.asList(osm));
    268270    }
    269271
    public class DataSet implements Cloneabl  
    300302    private void clearSelection(Collection<? extends OsmPrimitive> list) {
    301303        if (list == null)
    302304            return;
    303         for (OsmPrimitive osm : list) {
    304             osm.setSelected(false);
    305         }
     305        selectedPrimitives.removeAll(list);
    306306    }
    307307
    308308    /**
    public class DataSet implements Cloneabl  
    310310     * @param list The collection from which the selected items are returned.
    311311     */
    312312    private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
    313         Collection<OsmPrimitive> sel = new HashSet<OsmPrimitive>();
    314313        if (list == null)
    315             return sel;
    316         for (OsmPrimitive osm : list)
    317             if (osm.isSelected() && !osm.isDeleted()) {
    318                 sel.add(osm);
    319             }
     314            return new LinkedList<OsmPrimitive>();
     315        Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
     316        sel.retainAll(list);
    320317        return sel;
    321318    }
    322319