Ticket #5480: SelectAction.java.permissiveness.around.virtualnode.patch
| File SelectAction.java.permissiveness.around.virtualnode.patch, 5.0 KB (added by , 16 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
274 274 snapDistance *= snapDistance; 275 275 276 276 MapView c = Main.map.mapView; 277 278 277 Collection<OsmPrimitive> sel = getCurrentDataSet().getSelected(); 278 279 // take nearest node 279 280 OsmPrimitive osm = c.getNearestNode(p, OsmPrimitive.isSelectablePredicate); 280 281 281 282 if (osm != null) { 282 283 for (Node n : c.getNearestNodes(p, OsmPrimitive.isSelectablePredicate)) { 283 284 if (sel.contains(n)) { 285 // take nearest selected node 284 286 osm = n; 287 break; 285 288 } 286 289 } 287 290 } else { … … 289 292 Way w = null; 290 293 291 294 Collection<WaySegment> virtualWaysInSel = new ArrayList<WaySegment>(); 292 osm = c.getNearestWay(p, OsmPrimitive.isSelectablePredicate); 293 294 for(WaySegment nearestWS : c.getNearestWaySegments(p, OsmPrimitive.isSelectablePredicate)) { 295 Collection<WaySegment> wss = c.getNearestWaySegments(p, OsmPrimitive.isSelectablePredicate); 296 for(WaySegment nearestWS : wss) { 295 297 if (nearestWS == null) { 296 298 continue; 297 299 } 298 if (sel.contains(w = nearestWS.way)) { 300 301 w = nearestWS.way; 302 if (osm == null && sel.contains(w)) { 303 // take nearest selected way 299 304 osm = w; 300 305 } 301 306 … … 329 334 } 330 335 331 336 if (virtualNode != null) { 337 // insert virtualNode into all segments if nothing was selected, 338 // else only into the (previously) selected segments 332 339 virtualWays = virtualWaysInSel.isEmpty() ? virtualWays : virtualWaysInSel; 333 osm = virtualWays.iterator().next().way; 340 } 341 342 if (osm == null && !wss.isEmpty()) { 343 // take nearest way 344 osm = wss.iterator().next().way; 334 345 } 335 346 } 336 347 … … 434 445 boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 435 446 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 436 447 boolean alt = (e.getModifiers() & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0 437 || Main.pref.getBoolean("selectaction. rotates", false);448 || Main.pref.getBoolean("selectaction.cycles.multiple.matches", false); 438 449 439 450 virtualWays.clear(); 440 451 virtualNode = null; … … 443 454 Collection<OsmPrimitive> c = Main.map.mapView.getNearestCollection(e.getPoint(), OsmPrimitive.isSelectablePredicate); 444 455 if (!c.isEmpty() && alt) { 445 456 if (c.iterator().next() instanceof Node) { 446 // there is at least one node under the cursor: 447 // - make sure (first element of new list) equals (result of getNearestCollection) 448 // - do not consider ways at all, but all nearest nodes 457 // consider all nearest nodes 449 458 c = new ArrayList<OsmPrimitive>(Main.map.mapView.getNearestNodes(e.getPoint(), OsmPrimitive.isSelectablePredicate)); 450 459 } else { 451 // consider all ways..460 // consider all nearest primitives (should be only ways at this point..) 452 461 c = Main.map.mapView.getAllNearest(e.getPoint(), OsmPrimitive.isSelectablePredicate); 453 462 } 454 463 } … … 535 544 public void selectPrims(Collection<OsmPrimitive> selectionList, boolean shift, 536 545 boolean ctrl, boolean released, boolean area) { 537 546 DataSet ds = getCurrentDataSet(); 547 548 // decides on mousePressed whether 549 // to cycle on mouseReleased (selList already selected) 550 // or not (selList is a new selection) 551 selMorePrims = (released || area) ? selMorePrims : ds.getSelected().containsAll(selectionList); 552 553 // not allowed together: do not change dataset selection, return early 538 554 if ((shift && ctrl) || (ctrl && !released) || (!virtualWays.isEmpty())) 539 return; // not allowed together555 return; 540 556 541 557 // toggle through possible objects on mouse release 542 558 if (released && !area) { … … 588 604 } 589 605 } 590 606 591 // hard-wiring to false due to performance reasons, should do w/out592 selMorePrims = (released || area) ? false : ds.getSelected().containsAll(selectionList);593 594 607 if (ctrl) { 595 608 // Ctrl on an item toggles its selection status, 596 609 // but Ctrl on an *area* just clears those items
