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

File implement-selection-storage-in-DataSet.2.patch, 4.9 KB (added by hansendc, 15 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 |   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
    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        selectedPrimitives.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;
    221     }
     223    LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
    222224
    223225    public boolean toggleSelected(OsmPrimitive osm) {
    224         osm.setSelected(!osm.isSelected());
     226        if (!selectedPrimitives.remove(osm))
     227            selectedPrimitives.add(osm);
    225228        return true;
    226229    }
    227230    public boolean isSelected(OsmPrimitive osm) {
    228         return osm.isSelected();
     231        return selectedPrimitives.contains(osm);
    229232    }
    230233
    231234    public void setDisabled(OsmPrimitive... osm) {
    public class DataSet implements Cloneabl  
    253256        clearSelection(nodes);
    254257        clearSelection(ways);
    255258        clearSelection(relations);
    256         for (OsmPrimitive osm : selection) {
    257             osm.setSelected(true);
    258         }
     259        addSelected(selection);
    259260        if (fireSelectionChangeEvent) {
    260261            fireSelectionChanged(selection);
    261262        }
    public class DataSet implements Cloneabl  
    292293        for (OsmPrimitive osm : selection) {
    293294            osm.setSelected(true);
    294295        }
     296        selectedPrimitives.addAll(selection);
    295297        if (fireSelectionChangeEvent) {
    296298            fireSelectionChanged(selection);
    297299        }
    public class DataSet implements Cloneabl  
    303305            setSelected();
    304306            return;
    305307        }
    306         clearSelection(nodes);
    307         clearSelection(ways);
    308         clearSelection(relations);
    309         for (OsmPrimitive o : osm)
    310             if (o != null) {
    311                 o.setSelected(true);
    312             }
     308        List<OsmPrimitive> list = Arrays.asList(osm);
     309        setSelected(list);
    313310        fireSelectionChanged(Arrays.asList(osm));
    314311    }
    315312
    public class DataSet implements Cloneabl  
    346343    private void clearSelection(Collection<? extends OsmPrimitive> list) {
    347344        if (list == null)
    348345            return;
    349         for (OsmPrimitive osm : list) {
    350             osm.setSelected(false);
    351         }
     346        selectedPrimitives.removeAll(list);
    352347    }
    353348
    354349    /**
    public class DataSet implements Cloneabl  
    356351     * @param list The collection from which the selected items are returned.
    357352     */
    358353    private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
    359         Collection<OsmPrimitive> sel = new HashSet<OsmPrimitive>();
    360354        if (list == null)
    361             return sel;
    362         for (OsmPrimitive osm : list)
    363             if (osm.isSelected() && !osm.isDeleted()) {
    364                 sel.add(osm);
    365             }
     355            return new LinkedList<OsmPrimitive>();
     356        Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
     357        sel.retainAll(list);
    366358        return sel;
    367359    }
    368360