Ticket #3780: fix-shift-selection-1.patch

File fix-shift-selection-1.patch, 16.6 KB (added by hansendc, 14 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             |   34 +++++---
     2 files changed, 43 insertions(+), 31 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(OsmPrimitive osm) {
     244    public boolean toggleSelected(Collection<OsmPrimitive> osm) {
     245        for (OsmPrimitive o : osm)
     246            this.__toggleSelected(o);
     247        fireSelectionChanged();
     248        return true;
     249    }
     250    public boolean toggleSelected(OsmPrimitive... osm) {
     251        return this.toggleSelected(Arrays.asList(osm));
     252    }
     253    private boolean __toggleSelected(OsmPrimitive osm) {
    245254        if (!selectedPrimitives.remove(osm)) {
    246255            selectedPrimitives.add(osm);
    247256        }
    public class DataSet implements Cloneabl  
    275284    public void setSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    276285        selectedPrimitives = new LinkedHashSet<OsmPrimitive>(selection);
    277286        if (fireSelectionChangeEvent) {
    278             fireSelectionChanged(selection);
     287            fireSelectionChanged();
    279288        }
    280289    }
    281290
    public class DataSet implements Cloneabl  
    313322    public void addSelected(Collection<? extends OsmPrimitive> selection, boolean fireSelectionChangeEvent) {
    314323        selectedPrimitives.addAll(selection);
    315324        if (fireSelectionChangeEvent) {
    316             fireSelectionChanged(selection);
     325            fireSelectionChanged();
    317326        }
    318327    }
    319328
    public class DataSet implements Cloneabl  
    325334        }
    326335        List<OsmPrimitive> list = Arrays.asList(osm);
    327336        setSelected(list);
    328         fireSelectionChanged(list);
     337        fireSelectionChanged();
    329338    }
    330339
    331340    /**
    public class DataSet implements Cloneabl  
    358367    public void clearSelection(OsmPrimitive... osm) {
    359368        clearSelection(Arrays.asList(osm));
    360369    }
    361     private void clearSelection(Collection<? extends OsmPrimitive> list) {
     370    public void clearSelection(Collection<? extends OsmPrimitive> list) {
    362371        if (list == null)
    363372            return;
    364373        selectedPrimitives.removeAll(list);
    365374    }
     375    public void clearSelection() {
     376        selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
     377    }
    366378
    367379    /**
    368380     * Return all selected items in the collection.
    public class DataSet implements Cloneabl  
    379391        return sel;
    380392    }
    381393
    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) {
     394    public void fireSelectionChanged()
     395    {
     396        __fireSelectionChanged(selectedPrimitives);
     397    }
     398
     399    public static void __fireSelectionChanged(Collection<? extends OsmPrimitive> sel) {
    388400        for (SelectionChangedListener l : selListeners) {
    389401            l.selectionChanged(sel);
    390402        }
  • src/org/openstreetmap/josm/actions/ReverseWayAction.java

    _
    old new  
    8080        }
    8181        Main.main.undoRedo.add(new SequenceCommand(tr("Reverse ways"), c));
    8282        if (propertiesUpdated) {
    83             DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     83            getCurrentDataSet().fireSelectionChanged();
    8484        }
    8585        Main.map.repaint();
    8686    }
  • src/org/openstreetmap/josm/actions/mapmode/DrawAction.java

    old new  
    244244        // when exiting we let everybody know about the currently selected
    245245        // primitives
    246246        //
    247         DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     247        getCurrentDataSet().fireSelectionChanged();
    248248    }
    249249
    250250    /**
     
    271271
    272272    private void tryAgain(MouseEvent e) {
    273273        getCurrentDataSet().setSelected();
    274         DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     274        Main.main.getCurrentDataSet().fireSelectionChanged();
    275275        mouseClicked(e);
    276276    }
    277277
     
    283283    private void finishDrawing() {
    284284        // let everybody else know about the current selection
    285285        //
    286         DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     286        Main.main.getCurrentDataSet().fireSelectionChanged();
    287287        lastUsedNode = null;
    288288        wayIsFinished = true;
    289289        Main.map.selectSelectTool(true);
     
    584584                    (posn0 >= 1                             && targetNode.equals(selectedWay.getNode(posn0-1))) || // previous node
    585585                    (posn0 < selectedWay.getNodesCount()-1) && targetNode.equals(selectedWay.getNode(posn0+1))) {  // next node
    586586                getCurrentDataSet().setSelected(targetNode);
    587                 DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     587                getCurrentDataSet().fireSelectionChanged();
    588588                lastUsedNode = targetNode;
    589589                return true;
    590590            }
  • src/org/openstreetmap/josm/actions/UploadAction.java

    old new  
    687687            // partially uploaded
    688688            //
    689689            layer.cleanupAfterUpload(processedPrimitives);
    690             DataSet.fireSelectionChanged(layer.data.getSelected());
     690            layer.data.fireSelectionChanged();
    691691            layer.fireDataChange();
    692692            if (lastException != null) {
    693693                handleFailedUpload(lastException);
  • src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java

    old new  
    516516                selection.add(model.getRelation(i));
    517517            }
    518518            Main.map.mapView.getEditLayer().data.setSelected(selection);
    519             DataSet.fireSelectionChanged(selection);
     519            Main.map.mapView.getEditLayer().data.fireSelectionChanged();
    520520        }
    521521
    522522        public void valueChanged(ListSelectionEvent e) {
     
    544544                members.addAll(r.getMemberPrimitives());
    545545            }
    546546            Main.map.mapView.getEditLayer().data.setSelected(members);
    547             DataSet.fireSelectionChanged(members);
    548547        }
    549548
    550549        protected void updateEnabledState() {
  • src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java

    old new  
    266266                            commands));
    267267        }
    268268
    269         DataSet.fireSelectionChanged(sel);
     269        Main.main.getCurrentDataSet().fireSelectionChanged();
    270270        selectionChanged(sel); // update whole table
    271271        Main.parent.repaint(); // repaint all - drawing could have been changed
    272272
     
    354354        if (value.equals(""))
    355355            return;
    356356        Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, value));
    357         DataSet.fireSelectionChanged(sel);
     357        Main.main.getCurrentDataSet().fireSelectionChanged();
    358358        selectionChanged(sel); // update table
    359359        Main.parent.repaint(); // repaint all - drawing could have been changed
    360360    }
     
    825825            String key = propertyData.getValueAt(row, 0).toString();
    826826            Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
    827827            Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, null));
    828             DataSet.fireSelectionChanged(sel);
     828            Main.main.getCurrentDataSet().fireSelectionChanged();
    829829            selectionChanged(sel); // update table
    830830
    831831            int rowCount = propertyTable.getRowCount();
     
    851851                rel.removeMembersFor(primitive);
    852852            }
    853853            Main.main.undoRedo.add(new ChangeCommand(cur, rel));
    854             DataSet.fireSelectionChanged(sel);
     854            Main.main.getCurrentDataSet().fireSelectionChanged();
    855855            selectionChanged(sel); // update whole table
    856856        }
    857857
  • src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java

    old new  
    203203            int row = rows[0];
    204204            OsmPrimitive primitive = getMemberTableModel().getReferredPrimitive(row);
    205205            layer.data.setSelected(primitive);
    206             DataSet.fireSelectionChanged(layer.data.getSelected());
    207206            AutoScaleAction action = new AutoScaleAction("selection");
    208207            action.autoScale();
    209208        }
  • src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    old new  
    882882
    883883        public void actionPerformed(ActionEvent e) {
    884884            getLayer().data.setSelected(memberTableModel.getSelectedChildPrimitives());
    885             DataSet.fireSelectionChanged(getLayer().data.getSelected());
    886885        }
    887886
    888887        public void valueChanged(ListSelectionEvent e) {
     
    10051004
    10061005            // make sure everybody is notified about the changes
    10071006            //
    1008             DataSet.fireSelectionChanged(getLayer().data.getSelected());
     1007            getLayer().data.fireSelectionChanged();
    10091008            getLayer().fireDataChange();
    10101009            GenericRelationEditor.this.setRelation(newRelation);
    10111010            RelationDialogManager.getRelationDialogManager().updateContext(
     
    10381037            tagEditorPanel.getModel().applyToPrimitive(editedRelation);
    10391038            memberTableModel.applyToRelation(editedRelation);
    10401039            Main.main.undoRedo.add(new ChangeCommand(getRelation(), editedRelation));
    1041             DataSet.fireSelectionChanged(getLayer().data.getSelected());
     1040            getLayer().data.fireSelectionChanged();
    10421041            getLayer().fireDataChange();
    10431042            // this will refresh the snapshot and update the dialog title
    10441043            //
  • src/org/openstreetmap/josm/gui/MapView.java

    old new  
    502502        if (! (layer instanceof OsmDataLayer)) {
    503503            if (getCurrentDataSet() != null) {
    504504                getCurrentDataSet().setSelected();
    505                 DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
     505                getCurrentDataSet().fireSelectionChanged();
    506506            }
    507507        }
    508508        Layer old = activeLayer;
  • src/org/openstreetmap/josm/gui/MapStatus.java

    old new  
    332332                    ds.addSelected(nextSelected);
    333333                }
    334334            }
    335             DataSet.fireSelectionChanged(ds.getSelected());
     335            ds.fireSelectionChanged();
    336336        }
    337337
    338338        /**
     
    462462                    DataSet ds = Main.main.getCurrentDataSet();
    463463                    // Let the user toggle the selection
    464464                    ds.toggleSelected(osm);
    465                     DataSet.fireSelectionChanged(ds.getSelected());
    466465                    l.validate();
    467466                }
    468467            });
  • src/org/openstreetmap/josm/gui/io/UploadLayerTask.java

    old new  
    143143        if (isCancelled())
    144144            return;
    145145        layer.cleanupAfterUpload(processedPrimitives);
    146         DataSet.fireSelectionChanged(layer.data.getSelected());
     146        layer.data.fireSelectionChanged();;
    147147        layer.fireDataChange();
    148148        layer.onPostUploadToServer();
    149149
     
    158158            writer.cancel();
    159159        }
    160160    }
    161 }
    162  No newline at end of file
     161}
  • src/org/openstreetmap/josm/data/UndoRedoHandler.java

    old new  
    4949        fireCommandsChanged();
    5050
    5151        // the command may have changed the selection so tell the listeners about the current situation
    52         DataSet.fireSelectionChanged(Main.main.getCurrentDataSet().getSelected());
     52        Main.main.getCurrentDataSet().fireSelectionChanged();
    5353    }
    5454
    5555    /**