Ignore:
Timestamp:
2009-10-25T12:18:26+01:00 (14 years ago)
Author:
stoecker
Message:

applied #3696 - patch by Dave - removed primitive based selection

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r2305 r2309  
    55import java.util.Arrays;
    66import java.util.Collection;
     7import java.util.Collections;
    78import java.util.Comparator;
    89import java.util.HashMap;
     10import java.util.LinkedHashSet;
    911import java.util.HashSet;
    1012import java.util.Iterator;
     
    1416
    1517import org.openstreetmap.josm.data.SelectionChangedListener;
     18import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1619
    1720/**
     
    156159            relations.remove(primitive);
    157160        }
     161        selectedPrimitives.remove(primitive);
    158162    }
    159163
     
    163167
    164168    public Collection<OsmPrimitive> getSelectedNodesAndWays() {
    165         Collection<OsmPrimitive> sel = getSelected(nodes);
    166         sel.addAll(getSelected(ways));
     169        Collection<OsmPrimitive> sel = new LinkedList<OsmPrimitive>();
     170        for (OsmPrimitive osm : selectedPrimitives) {
     171            if (osm instanceof Way ||
     172                osm instanceof Node)
     173                sel.add(osm);
     174        }
    167175        return sel;
    168176    }
     
    174182     */
    175183    public Collection<OsmPrimitive> getSelected() {
    176         Collection<OsmPrimitive> sel = getSelected(nodes);
    177         sel.addAll(getSelected(ways));
    178         sel.addAll(getSelected(relations));
    179         return sel;
     184        // It would be nice to have this be a copy-on-write list
     185        // or an Collections.unmodifiableList().  It would be
     186        // much faster for large selections.  May users just
     187        // call this, and only check the .size().
     188        return new ArrayList<OsmPrimitive>(selectedPrimitives);
    180189    }
    181190
     
    233242    }
    234243
    235     public boolean addSelected(OsmPrimitive osm) {
    236         osm.setSelected(true);
     244    LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
     245
     246    public boolean toggleSelected(OsmPrimitive osm) {
     247        if (!selectedPrimitives.remove(osm))
     248            selectedPrimitives.add(osm);
    237249        return true;
    238250    }
    239 
    240     public boolean toggleSelected(OsmPrimitive osm) {
    241         osm.setSelected(!osm.isSelected());
    242         return true;
    243     }
    244251    public boolean isSelected(OsmPrimitive osm) {
    245         return osm.isSelected();
     252        return selectedPrimitives.contains(osm);
    246253    }
    247254
     
    268275     */
    269276    public void setSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    270         clearSelection(nodes);
    271         clearSelection(ways);
    272         clearSelection(relations);
    273         for (OsmPrimitive osm : selection) {
    274             osm.setSelected(true);
    275         }
     277        selectedPrimitives = new LinkedHashSet<OsmPrimitive>(selection);
    276278        if (fireSelectionChangeEvent) {
    277279            fireSelectionChanged(selection);
     
    299301    }
    300302
     303    public void addSelected(OsmPrimitive... osm) {
     304        addSelected(Arrays.asList(osm));
     305    }
     306
    301307    /**
    302308     * Adds the primitives in <code>selection</code> to the current selection.
     
    307313     */
    308314    public void addSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    309         for (OsmPrimitive osm : selection) {
    310             osm.setSelected(true);
    311         }
     315        selectedPrimitives.addAll(selection);
    312316        if (fireSelectionChangeEvent) {
    313317            fireSelectionChanged(selection);
     
    321325            return;
    322326        }
    323         clearSelection(nodes);
    324         clearSelection(ways);
    325         clearSelection(relations);
    326         for (OsmPrimitive o : osm)
    327             if (o != null) {
    328                 o.setSelected(true);
    329             }
    330         fireSelectionChanged(Arrays.asList(osm));
     327        List<OsmPrimitive> list = Arrays.asList(osm);
     328        setSelected(list);
     329        fireSelectionChanged(list);
    331330    }
    332331
     
    364363        if (list == null)
    365364            return;
    366         for (OsmPrimitive osm : list) {
    367             osm.setSelected(false);
    368         }
     365        selectedPrimitives.removeAll(list);
    369366    }
    370367
     
    374371     */
    375372    private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
    376         Collection<OsmPrimitive> sel = new HashSet<OsmPrimitive>();
    377373        if (list == null)
    378             return sel;
    379         for (OsmPrimitive osm : list)
    380             if (osm.isSelected() && !osm.isDeleted()) {
    381                 sel.add(osm);
    382             }
     374            return new LinkedList<OsmPrimitive>();
     375        // getSelected() is called with large lists, so
     376        // creating the return list from the selection
     377        // should be faster most of the time.
     378        Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
     379        sel.retainAll(list);
    383380        return sel;
    384381    }
Note: See TracChangeset for help on using the changeset viewer.