Ticket #3780: fix-shift-selection.patch

File fix-shift-selection.patch, 5.9 KB (added by hansendc, 16 years ago)
  • (a) core/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java~fix-shift-selection vs. (b) core-dave/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java

    
    ---
    
     core-dave/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java |   40 +++++-----
     core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java             |   31 +++++--
     2 files changed, 41 insertions(+), 30 deletions(-)
    
    diff -puN src/org/openstreetmap/josm/gui/SelectionManager.java~fix-shift-selection src/org/openstreetmap/josm/gui/SelectionManager.java
    diff -puN src/org/openstreetmap/josm/actions/mapmode/SelectAction.java~fix-shift-selection src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
    a b public class SelectAction extends MapMod  
    498498                        }
    499499                    }
    500500                }
    501                 DataSet.fireSelectionChanged(selection);
     501                getCurrentDataSet().fireSelectionChanged();
    502502            }
    503503        }
    504504
    public class SelectAction extends MapMod  
    514514
    515515    public void selectPrims(Collection<OsmPrimitive> selectionList, boolean shift,
    516516            boolean ctrl, boolean released, boolean area) {
     517        DataSet ds = getCurrentDataSet();
    517518        if ((shift && ctrl) || (ctrl && !released))
    518519            return; // not allowed together
    519520
    520         Collection<OsmPrimitive> curSel;
    521         if (!ctrl && !shift) {
    522             curSel = new LinkedList<OsmPrimitive>(); // new selection will replace the old.
     521        // plain clicks with no modifiers clear the selection
     522        if (!ctrl && !shift)
     523            ds.clearSelection();
     524
     525        if (ctrl) {
     526            // Ctrl on an item toggles its selection status,
     527            // but Ctrl on an *area* just clears those items
     528            // out of the selection.
     529            if (area)
     530                ds.clearSelection(selectionList);
     531            else
     532                ds.toggleSelected(selectionList);
    523533        } else {
    524             curSel = getCurrentDataSet().getSelected();
     534            // This is either a plain click (which means we
     535            // previously cleared the selection), or a
     536            // shift-click where we are adding things to an
     537            // existing selection.
     538            ds.addSelected(selectionList);
    525539        }
    526 
    527         for (OsmPrimitive osm : selectionList)
    528         {
    529             if (ctrl)
    530             {
    531                 if(curSel.contains(osm)) {
    532                     curSel.remove(osm);
    533                 } else if(!area) {
    534                     curSel.add(osm);
    535                 }
    536             } else {
    537                 curSel.add(osm);
    538             }
    539         }
    540         getCurrentDataSet().setSelected(curSel);
     540        ds.fireSelectionChanged();
    541541        Main.map.mapView.repaint();
    542542    }
    543543
  • (a) core/src/org/openstreetmap/josm/data/osm/DataSet.java~fix-shift-selection vs. (b) core-dave/src/org/openstreetmap/josm/data/osm/DataSet.java

    diff -puN src/org/openstreetmap/josm/data/osm/DataSet.java~fix-shift-selection src/org/openstreetmap/josm/data/osm/DataSet.java
    a b public class DataSet implements Cloneabl  
    241241
    242242    LinkedHashSet<OsmPrimitive> selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
    243243
     244    public boolean toggleSelected(Collection<OsmPrimitive> osm) {
     245        for (OsmPrimitive o : osm)
     246            this.toggleSelected(o);
     247        return true;
     248    }
     249    public boolean toggleSelected(OsmPrimitive... osm) {
     250        return this.toggleSelected(Arrays.asList(osm));
     251    }
    244252    public boolean toggleSelected(OsmPrimitive osm) {
    245253        if (!selectedPrimitives.remove(osm)) {
    246254            selectedPrimitives.add(osm);
    public class DataSet implements Cloneabl  
    275283    public void setSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    276284        selectedPrimitives = new LinkedHashSet<OsmPrimitive>(selection);
    277285        if (fireSelectionChangeEvent) {
    278             fireSelectionChanged(selection);
     286            fireSelectionChanged();
    279287        }
    280288    }
    281289
    public class DataSet implements Cloneabl  
    313321    public void addSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    314322        selectedPrimitives.addAll(selection);
    315323        if (fireSelectionChangeEvent) {
    316             fireSelectionChanged(selection);
     324            fireSelectionChanged();
    317325        }
    318326    }
    319327
    public class DataSet implements Cloneabl  
    325333        }
    326334        List<OsmPrimitive> list = Arrays.asList(osm);
    327335        setSelected(list);
    328         fireSelectionChanged(list);
     336        fireSelectionChanged();
    329337    }
    330338
    331339    /**
    public class DataSet implements Cloneabl  
    358366    public void clearSelection(OsmPrimitive... osm) {
    359367        clearSelection(Arrays.asList(osm));
    360368    }
    361     private void clearSelection(Collection<? extends OsmPrimitive> list) {
     369    public void clearSelection(Collection<? extends OsmPrimitive> list) {
    362370        if (list == null)
    363371            return;
    364372        selectedPrimitives.removeAll(list);
    365373    }
     374    public void clearSelection() {
     375        selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
     376    }
    366377
    367378    /**
    368379     * Return all selected items in the collection.
    public class DataSet implements Cloneabl  
    379390        return sel;
    380391    }
    381392
    382     /**
    383      * Remember to fire an selection changed event. A call to this will not fire the event
    384      * immediately. For more,
    385      * @see SelectionChangedListener
    386      */
    387     public static void fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
     393    public void fireSelectionChanged()
     394    {
     395        __fireSelectionChanged(selectedPrimitives);
     396    }
     397
     398    public static void __fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
    388399        for (SelectionChangedListener l : selListeners) {
    389400            l.selectionChanged(sel);
    390401        }