Changeset 4327 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2011-08-21T13:12:53+02:00 (13 years ago)
- Location:
- trunk/src/org/openstreetmap/josm
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/actions/mapmode/DeleteAction.java
r3919 r4327 6 6 import java.awt.AWTEvent; 7 7 import java.awt.Cursor; 8 import java.awt.EventQueue;9 8 import java.awt.Toolkit; 10 9 import java.awt.event.AWTEventListener; … … 14 13 import java.awt.event.MouseEvent; 15 14 import java.util.Collections; 15 import java.util.HashSet; 16 import java.util.Set; 16 17 17 18 import org.openstreetmap.josm.Main; 18 19 import org.openstreetmap.josm.command.Command; 19 20 import org.openstreetmap.josm.command.DeleteCommand; 21 import org.openstreetmap.josm.data.osm.DataSet; 20 22 import org.openstreetmap.josm.data.osm.Node; 21 23 import org.openstreetmap.josm.data.osm.OsmPrimitive; … … 45 47 * @author imi 46 48 */ 47 48 /**49 * This class contains stubs for highlighting affected primitives when affected.50 * However, way segments can be deleted as well, but cannot be highlighted51 * alone. If the highlight feature for this delete action is to be implemented52 * properly, highlighting way segments must be possible first. --xeen, 2009-09-0253 */54 49 public class DeleteAction extends MapMode implements AWTEventListener { 55 50 // Cache previous mouse event (needed when only the modifier keys are 56 51 // pressed but the mouse isn't moved) 57 52 private MouseEvent oldEvent = null; 53 54 /** 55 * elements that have been highlighted in the previous iteration. Used 56 * to remove the highlight from them again as otherwise the whole data 57 * set would have to be checked. 58 */ 59 private Set<OsmPrimitive> oldHighlights = new HashSet<OsmPrimitive>(); 60 61 private boolean drawTargetHighlight; 58 62 59 63 private enum DeleteMode { … … 101 105 return; 102 106 107 drawTargetHighlight = Main.pref.getBoolean("draw.target-highlight", true); 108 103 109 Main.map.mapView.addMouseListener(this); 104 110 Main.map.mapView.addMouseMotionListener(this); … … 120 126 System.out.println(ex); 121 127 } 128 removeHighlighting(); 122 129 } 123 130 … … 157 164 @Override public void mouseMoved(MouseEvent e) { 158 165 oldEvent = e; 159 updateCursor(e, e.getModifiers()); 166 giveUserFeedback(e); 167 } 168 169 /** 170 * removes any highlighting that may have been set beforehand. 171 */ 172 private void removeHighlighting() { 173 for(OsmPrimitive prim : oldHighlights) { 174 prim.setHighlighted(false); 175 } 176 oldHighlights = new HashSet<OsmPrimitive>(); 177 DataSet ds = getCurrentDataSet(); 178 if(ds != null) { 179 ds.clearHighlightedWaySegments(); 180 } 181 } 182 183 /** 184 * handles everything related to highlighting primitives and way 185 * segments for the given pointer position (via MouseEvent) and 186 * modifiers. 187 * @param e 188 * @param modifiers 189 */ 190 private void addHighlighting(MouseEvent e, int modifiers) { 191 if(!drawTargetHighlight) 192 return; 193 removeHighlighting(); 194 195 DeleteParameters parameters = getDeleteParameters(e, modifiers); 196 197 if(parameters.mode == DeleteMode.segment) { 198 // deleting segments is the only action not working on OsmPrimitives 199 // so we have to handle them separately. 200 DataSet ds = getCurrentDataSet(); 201 if(ds != null) { 202 ds.setHighlightedWaySegments(Collections.singleton(parameters.nearestSegment)); 203 } 204 } else { 205 // don't call buildDeleteCommands for DeleteMode.segment because it doesn't support 206 // silent operation and SplitWayAction will show dialogs. A lot. 207 Command delCmd = buildDeleteCommands(e, modifiers, true); 208 if(delCmd == null) { 209 Main.map.mapView.repaint(); 210 return; 211 } 212 213 // all other cases delete OsmPrimitives directly, so we can 214 // safely do the following 215 for(OsmPrimitive osm : delCmd.getParticipatingPrimitives()) { 216 osm.setHighlighted(true); 217 oldHighlights.add(osm); 218 } 219 } 220 Main.map.mapView.repaint(); 160 221 } 161 222 162 223 /** 163 224 * This function handles all work related to updating the cursor and 164 * highlights. For now, only the cursor is enabled because highlighting 165 * requires WaySegment to be highlightable. 225 * highlights 166 226 * 227 * @param MouseEvent 228 * @param int modifiers 229 */ 230 private void updateCursor(MouseEvent e, int modifiers) { 231 if (!Main.isDisplayingMapView()) 232 return; 233 if(!Main.map.mapView.isActiveLayerVisible() || e == null) 234 return; 235 236 DeleteParameters parameters = getDeleteParameters(e, modifiers); 237 Main.map.mapView.setNewCursor(parameters.mode.cursor(), this); 238 } 239 /** 240 * Gives the user feedback for the action he/she is about to do. Currently 241 * calls the cursor and target highlighting routines. Allows for modifiers 242 * not taken from the given mouse event. 243 * 167 244 * Normally the mouse event also contains the modifiers. However, when the 168 245 * mouse is not moved and only modifier keys are pressed, no mouse event … … 170 247 * mouseevent. Instead we copy the previous event and only update the 171 248 * modifiers. 172 * 173 * @param MouseEvent 174 * @param int modifiers 175 */ 176 private void updateCursor(MouseEvent e, int modifiers) { 177 if (!Main.isDisplayingMapView()) 178 return; 179 if(!Main.map.mapView.isActiveLayerVisible() || e == null) 180 return; 181 182 DeleteParameters parameters = getDeleteParameters(e, modifiers); 183 Main.map.mapView.setNewCursor(parameters.mode.cursor(), this); 249 */ 250 private void giveUserFeedback(MouseEvent e, int modifiers) { 251 updateCursor(e, modifiers); 252 addHighlighting(e, modifiers); 253 } 254 255 /** 256 * Gives the user feedback for the action he/she is about to do. Currently 257 * calls the cursor and target highlighting routines. Extracts modifiers 258 * from mouse event. 259 */ 260 private void giveUserFeedback(MouseEvent e) { 261 giveUserFeedback(e, e.getModifiers()); 184 262 } 185 263 … … 204 282 205 283 getCurrentDataSet().setSelected(); 284 giveUserFeedback(e); 206 285 Main.map.mapView.repaint(); 207 286 } … … 242 321 243 322 private DeleteParameters getDeleteParameters(MouseEvent e, int modifiers) { 244 // Note: CTRL is the only modifier that is checked in MouseMove, don't 245 // forget updating it there 246 boolean ctrl = (modifiers & ActionEvent.CTRL_MASK) != 0; 247 boolean shift = (modifiers & ActionEvent.SHIFT_MASK) != 0; 248 boolean alt = (modifiers & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0; 323 updateKeyModifiers(modifiers); 249 324 250 325 DeleteParameters result = new DeleteParameters(); … … 288 363 return DeleteCommand.delete(getEditLayer(),Collections.singleton(parameters.nearestNode), false, silent); 289 364 case node_with_references: 290 return DeleteCommand.deleteWithReferences(getEditLayer(),Collections.singleton(parameters.nearestNode) );365 return DeleteCommand.deleteWithReferences(getEditLayer(),Collections.singleton(parameters.nearestNode), silent); 291 366 case segment: 292 367 return DeleteCommand.deleteWaySegment(getEditLayer(), parameters.nearestSegment); … … 296 371 return DeleteCommand.delete(getEditLayer(), Collections.singleton(parameters.nearestSegment.way), true, silent); 297 372 case way_with_references: 298 return DeleteCommand.deleteWithReferences(getEditLayer(), Collections.singleton(parameters.nearestSegment.way),true);373 return DeleteCommand.deleteWithReferences(getEditLayer(), Collections.singleton(parameters.nearestSegment.way), true); 299 374 default: 300 375 return null; … … 306 381 */ 307 382 public void eventDispatched(AWTEvent e) { 383 if(e == null) 384 return; 308 385 // We don't have a mouse event, so we pass the old mouse event but the 309 386 // new modifiers. 310 updateCursor(oldEvent, ((InputEvent)e).getModifiers());387 giveUserFeedback(oldEvent, ((InputEvent) e).getModifiers()); 311 388 } 312 389 } -
trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
r4191 r4327 9 9 import java.awt.Color; 10 10 import java.awt.Cursor; 11 import java.awt.EventQueue;12 11 import java.awt.Graphics2D; 13 12 import java.awt.Point; 14 13 import java.awt.Toolkit; 15 14 import java.awt.event.AWTEventListener; 16 import java.awt.event.ActionEvent;17 15 import java.awt.event.InputEvent; 18 16 import java.awt.event.KeyEvent; … … 66 64 private double PHI=Math.toRadians(90); 67 65 68 private boolean ctrl;69 private boolean alt;70 private boolean shift;71 66 private Node mouseOnExistingNode; 72 67 private Set<Way> mouseOnExistingWays = new HashSet<Way>(); … … 513 508 getCurrentDataSet().setSelected(newSelection); 514 509 515 // "viewport following" mode for tracing long features 516 // from aerial imagery or GPS tracks. 510 // "viewport following" mode for tracing long features 511 // from aerial imagery or GPS tracks. 517 512 if (n != null && Main.map.mapView.viewportFollowing) { 518 513 Main.map.mapView.smoothScrollTo(n.getEastNorth()); … … 602 597 } 603 598 604 private void updateKeyModifiers(InputEvent e) {605 ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;606 alt = (e.getModifiers() & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0;607 shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;608 }609 610 private void updateKeyModifiers(MouseEvent e) {611 ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;612 alt = (e.getModifiers() & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0;613 shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;614 }615 616 599 /** 617 600 * This method prepares data required for painting the "helper line" from -
trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
r4142 r4327 185 185 return; 186 186 187 updateKeyModifiers(e); 188 187 189 selectedSegment = Main.map.mapView.getNearestWaySegment(e.getPoint(), OsmPrimitive.isSelectablePredicate); 188 190 … … 192 194 // Otherwise switch to another mode 193 195 194 if ( (e.getModifiers() & ActionEvent.CTRL_MASK) != 0) {196 if (ctrl) { 195 197 mode = Mode.translate; 196 } else if ( (e.getModifiers() & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0) {198 } else if (alt) { 197 199 mode = Mode.create_new; 198 200 // create a new segment and then select and extrude the new segment … … 202 204 mode = Mode.extrude; 203 205 getCurrentDataSet().setSelected(selectedSegment.way); 204 alwaysCreateNodes = ((e.getModifiers() & ActionEvent.SHIFT_MASK) != 0);206 alwaysCreateNodes = shift; 205 207 } 206 208 -
trunk/src/org/openstreetmap/josm/actions/mapmode/MapMode.java
r3919 r4327 4 4 import java.awt.Cursor; 5 5 import java.awt.event.ActionEvent; 6 import java.awt.event.InputEvent; 6 7 import java.awt.event.MouseEvent; 7 8 import java.awt.event.MouseListener; … … 25 26 abstract public class MapMode extends JosmAction implements MouseListener, MouseMotionListener { 26 27 protected final Cursor cursor; 28 protected boolean ctrl; 29 protected boolean alt; 30 protected boolean shift; 27 31 28 32 /** … … 77 81 } 78 82 83 protected void updateKeyModifiers(InputEvent e) { 84 updateKeyModifiers(e.getModifiers()); 85 } 86 87 protected void updateKeyModifiers(MouseEvent e) { 88 updateKeyModifiers(e.getModifiers()); 89 } 90 91 protected void updateKeyModifiers(int modifiers) { 92 ctrl = (modifiers & ActionEvent.CTRL_MASK) != 0; 93 alt = (modifiers & (ActionEvent.ALT_MASK|InputEvent.ALT_GRAPH_MASK)) != 0; 94 shift = (modifiers & ActionEvent.SHIFT_MASK) != 0; 95 } 96 79 97 public void mouseReleased(MouseEvent e) {} 80 98 public void mouseExited(MouseEvent e) {} -
trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
r4251 r4327 14 14 import java.awt.Toolkit; 15 15 import java.awt.event.AWTEventListener; 16 import java.awt.event.ActionEvent;17 16 import java.awt.event.InputEvent; 18 17 import java.awt.event.KeyEvent; … … 109 108 private final MapView mv; 110 109 111 private boolean ctrl;112 private boolean alt;113 private boolean shift;114 115 110 // Mouse tracking state 116 111 private Point mousePressedPos; … … 233 228 private boolean updateModifiersState(InputEvent e) { 234 229 boolean oldAlt = alt, oldShift = shift, oldCtrl = ctrl; 235 alt = (e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0; 236 ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 237 shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 230 updateKeyModifiers(e); 238 231 boolean changed = (oldAlt != alt || oldShift != shift || oldCtrl != ctrl); 239 232 return changed; … … 394 387 if (!isModifiersValidForDragMode()) 395 388 return; 396 if (!initParallelWays(mousePressedPos, copyTags)) {389 if (!initParallelWays(mousePressedPos, copyTags)) 397 390 return; 398 }399 391 setMode(Mode.dragging); 400 392 } … … 409 401 double realD = mv.getProjection().eastNorth2latlon(enp).greatCircleDistance(mv.getProjection().eastNorth2latlon(nearestPointOnRefLine)); 410 402 double snappedRealD = realD; 411 403 412 404 // TODO: abuse of isToTheRightSideOfLine function. 413 405 boolean toTheRight = Geometry.isToTheRightSideOfLine(referenceSegment.getFirstNode(), … … 431 423 } 432 424 pWays.changeOffset(d); 433 425 434 426 Main.map.statusLine.setDist(Math.abs(snappedRealD)); 435 427 Main.map.statusLine.repaint(); -
trunk/src/org/openstreetmap/josm/actions/mapmode/PlayHeadDragMode.java
r2808 r4327 6 6 import java.awt.Cursor; 7 7 import java.awt.Point; 8 import java.awt.event.ActionEvent;9 8 import java.awt.event.MouseEvent; 10 9 … … 28 27 public PlayHeadDragMode(PlayHeadMarker m) { 29 28 super(tr("Drag play head"), "playheaddrag", tr("Drag play head"), null, 30 Main.map, Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));29 Main.map, Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); 31 30 playHeadMarker = m; 32 31 } … … 68 67 if (ev.getButton() != MouseEvent.BUTTON1 || p == null || ! dragging) 69 68 return; 70 boolean shift = (ev.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 69 70 updateKeyModifiers(ev); 71 71 72 EastNorth en = Main.map.mapView.getEastNorth(ev.getX(), ev.getY()); 72 73 if (! shift) { -
trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
r4191 r4327 6 6 import static org.openstreetmap.josm.tools.I18n.trn; 7 7 8 import java.awt.AWTEvent; 8 9 import java.awt.Cursor; 9 10 import java.awt.Point; 10 11 import java.awt.Rectangle; 12 import java.awt.Toolkit; 13 import java.awt.event.AWTEventListener; 11 14 import java.awt.event.ActionEvent; 12 15 import java.awt.event.InputEvent; … … 16 19 import java.util.Collection; 17 20 import java.util.Collections; 21 import java.util.HashSet; 18 22 import java.util.Iterator; 19 23 import java.util.LinkedList; 24 import java.util.Set; 20 25 21 26 import javax.swing.JOptionPane; … … 60 65 * @author imi 61 66 */ 62 public class SelectAction extends MapMode implements SelectionEnded { 67 public class SelectAction extends MapMode implements AWTEventListener, SelectionEnded { 68 // "select" means the selection rectangle and "move" means either dragging 69 // or select if no mouse movement occurs (i.e. just clicking) 63 70 enum Mode { move, rotate, scale, select } 64 71 72 // contains all possible cases the cursor can be in the SelectAction except the 73 // the move pointer (latter is a system one and not an image) 74 private enum SelectActionCursor { 75 rect("normal", "selection"), 76 rect_add("normal", "select_add"), 77 rect_rm("normal", "select_remove"), 78 way("normal", "select_way"), 79 way_add("normal", "select_way_add"), 80 way_rm("normal", "select_way_remove"), 81 node("normal", "select_node"), 82 node_add("normal", "select_node_add"), 83 node_rm("normal", "select_node_remove"), 84 virtual_node("normal", "addnode"), 85 scale("scale", null), 86 rotate("rotate", null); 87 88 private final Cursor c; 89 private SelectActionCursor(String main, String sub) { 90 c = ImageProvider.getCursor(main, sub); 91 } 92 public Cursor cursor() { 93 return c; 94 } 95 } 96 97 // Cache previous mouse event (needed when only the modifier keys are 98 // pressed but the mouse isn't moved) 99 private MouseEvent oldEvent = null; 100 65 101 private Mode mode = null; 66 102 private SelectionManager selectionManager; 67 103 private boolean cancelDrawMode = false; 104 private boolean drawTargetHighlight; 68 105 private boolean didMouseDrag = false; 69 106 /** … … 94 131 private int initialMoveThreshold; 95 132 private boolean initialMoveThresholdExceeded = false; 133 134 /** 135 * elements that have been highlighted in the previous iteration. Used 136 * to remove the highlight from them again as otherwise the whole data 137 * set would have to be checked. 138 */ 139 private Set<OsmPrimitive> oldHighlights = new HashSet<OsmPrimitive>(); 96 140 97 141 /** … … 109 153 initialMoveDelay = Main.pref.getInteger("edit.initial-move-delay", 200); 110 154 initialMoveThreshold = Main.pref.getInteger("edit.initial-move-threshold", 5); 155 drawTargetHighlight = Main.pref.getBoolean("draw.target-highlight", true); 156 // This is required to update the cursors when ctrl/shift/alt is pressed 157 try { 158 Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK); 159 } catch (SecurityException ex) { 160 System.out.println(ex); 161 } 111 162 } 112 163 … … 127 178 mv.removeMouseMotionListener(this); 128 179 mv.setVirtualNodesEnabled(false); 180 removeHighlighting(); 181 } 182 183 /** 184 * works out which cursor should be displayed for most of SelectAction's 185 * features. The only exception is the "move" cursor when actually dragging 186 * primitives. 187 * @param nearbyStuff primitives near the cursor 188 * @return the cursor that should be displayed 189 */ 190 private Cursor getCursor(Collection<OsmPrimitive> nearbyStuff) { 191 String c = "rect"; 192 switch(mode) { 193 case move: 194 if(virtualNode != null) { 195 c = "virtual_node"; 196 break; 197 } 198 199 // nearbyStuff cannot be empty as otherwise we would be in 200 // Move.select and not Move.move 201 OsmPrimitive osm = nearbyStuff.iterator().next(); 202 203 c = (osm instanceof Node) ? "node" : c; 204 c = (osm instanceof Way) ? "way" : c; 205 206 if(shift) { 207 c += "_add"; 208 } else if(ctrl) { 209 c += osm.isSelected() ? "_rm" : "_add"; 210 } 211 break; 212 case rotate: 213 c = "rotate"; 214 break; 215 case scale: 216 c = "scale"; 217 break; 218 case select: 219 c = "rect" + (shift ? "_add" : (ctrl ? "_rm" : "")); 220 break; 221 } 222 return SelectActionCursor.valueOf(c).cursor(); 223 } 224 225 /** 226 * Removes all existing highlights. 227 * @return true if a repaint is required 228 */ 229 private boolean removeHighlighting() { 230 boolean needsRepaint = false; 231 DataSet ds = getCurrentDataSet(); 232 if(ds != null && !ds.getHighlightedVirtualNodes().isEmpty()) { 233 needsRepaint = true; 234 ds.clearHighlightedVirtualNodes(); 235 } 236 if(oldHighlights.isEmpty()) 237 return needsRepaint; 238 239 for(OsmPrimitive prim : oldHighlights) { 240 prim.setHighlighted(false); 241 } 242 oldHighlights = new HashSet<OsmPrimitive>(); 243 return true; 244 } 245 246 /** 247 * handles adding highlights and updating the cursor for the given mouse event. 248 * @param MouseEvent which should be used as base for the feedback 249 * @return true if repaint is required 250 */ 251 private boolean giveUserFeedback(MouseEvent e) { 252 return giveUserFeedback(e, e.getModifiers()); 253 } 254 255 /** 256 * handles adding highlights and updating the cursor for the given mouse event. 257 * @param MouseEvent which should be used as base for the feedback 258 * @param define custom keyboard modifiers if the ones from MouseEvent are outdated or similar 259 * @return true if repaint is required 260 */ 261 private boolean giveUserFeedback(MouseEvent e, int modifiers) { 262 boolean needsRepaint = false; 263 264 Collection<OsmPrimitive> c = MapView.asColl( 265 mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, true)); 266 267 updateKeyModifiers(modifiers); 268 determineMapMode(!c.isEmpty()); 269 270 if(drawTargetHighlight) { 271 needsRepaint = removeHighlighting(); 272 } 273 274 virtualWays.clear(); 275 virtualNode = null; 276 if(mode == Mode.move && setupVirtual(e)) { 277 DataSet ds = getCurrentDataSet(); 278 if (ds != null) { 279 ds.setHighlightedVirtualNodes(virtualWays); 280 } 281 mv.setNewCursor(SelectActionCursor.virtual_node.cursor(), this); 282 // don't highlight anything else if a virtual node will be 283 return true; 284 } 285 286 mv.setNewCursor(getCursor(c), this); 287 288 // return early if there can't be any highlights 289 if(!drawTargetHighlight || mode != Mode.move || c.isEmpty()) 290 return needsRepaint; 291 292 for(OsmPrimitive x : c) { 293 // only highlight primitives that will change the selection 294 // when clicked. I.e. don't highlight selected elements unless 295 // we are in toggle mode. 296 if(ctrl || !x.isSelected()) { 297 x.setHighlighted(true); 298 oldHighlights.add(x); 299 } 300 } 301 return needsRepaint || !oldHighlights.isEmpty(); 302 } 303 304 /** 305 * This is called whenever the keyboard modifier status changes 306 */ 307 public void eventDispatched(AWTEvent e) { 308 if(oldEvent == null) 309 return; 310 // We don't have a mouse event, so we pass the old mouse event but the 311 // new modifiers. 312 giveUserFeedback(oldEvent, ((InputEvent) e).getModifiers()); 129 313 } 130 314 … … 264 448 public void mouseMoved(MouseEvent e) { 265 449 // Mac OSX simulates with ctrl + mouse 1 the second mouse button hence no dragging events get fired. 266 //267 450 if ((Main.platform instanceof PlatformHookOsx) && (mode == Mode.rotate || mode == Mode.scale)) { 268 451 mouseDragged(e); 269 } 270 } 452 return; 453 } 454 oldEvent = e; 455 if(giveUserFeedback(e)) { 456 mv.repaint(); 457 } 458 } 459 460 @Override 461 public void mouseExited(MouseEvent e) { 462 if(removeHighlighting()) { 463 mv.repaint(); 464 } 465 } 466 271 467 private Node virtualNode = null; 272 468 private Collection<WaySegment> virtualWays = new LinkedList<WaySegment>(); … … 339 535 Point p = e.getPoint(); 340 536 boolean waitForMouseUp = Main.pref.getBoolean("mappaint.select.waits-for-mouse-up", false); 341 boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;342 boolean alt = ((e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0 || Main.pref.getBoolean("selectaction.cycles.multiple.matches", false));537 updateKeyModifiers(e); 538 alt = alt || Main.pref.getBoolean("selectaction.cycles.multiple.matches", false); 343 539 344 540 if (!alt) { … … 389 585 390 586 /** 587 * sets the mapmode according to key modifiers and if there are any 588 * selectables nearby. Everything has to be pre-determined for this 589 * function; its main purpose is to centralize what the modifiers do. 590 * @param nearSelectables 591 */ 592 private void determineMapMode(boolean hasSelectionNearby) { 593 if (shift && ctrl) { 594 mode = Mode.rotate; 595 } else if (alt && ctrl) { 596 mode = Mode.scale; 597 } else if (hasSelectionNearby) { 598 mode = Mode.move; 599 } else { 600 mode = Mode.select; 601 } 602 } 603 604 /** 391 605 * Look, whether any object is selected. If not, select the nearest node. 392 606 * If there are no nodes in the dataset, do nothing. … … 400 614 public void mousePressed(MouseEvent e) { 401 615 // return early 402 if (!mv.isActiveLayerVisible() || !(Boolean) this.getValue("active") || e.getButton() != MouseEvent.BUTTON1) { 403 return; 404 } 616 if (!mv.isActiveLayerVisible() || !(Boolean) this.getValue("active") || e.getButton() != MouseEvent.BUTTON1) 617 return; 405 618 406 619 // request focus in order to enable the expected keyboard shortcuts 407 620 mv.requestFocus(); 408 621 409 boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 410 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 411 boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0; 622 // update which modifiers are pressed (shift, alt, ctrl) 623 updateKeyModifiers(e); 412 624 413 625 // We don't want to change to draw tool if the user tries to (de)select … … 422 634 mv.getNearestNodeOrWay(e.getPoint(), OsmPrimitive.isSelectablePredicate, true)); 423 635 424 if (shift && ctrl) { 425 mode = Mode.rotate; 426 636 determineMapMode(!c.isEmpty()); 637 switch(mode) { 638 case rotate: 639 case scale: 427 640 if (getCurrentDataSet().getSelected().isEmpty()) { 428 641 getCurrentDataSet().setSelected(c); … … 432 645 // Mode.move redraws when mouseDragged is called 433 646 // Mode.rotate redraws here 434 mv.setNewCursor(ImageProvider.getCursor("rotate", null), this);435 mv.repaint();436 } else if (alt && ctrl) {437 mode = Mode.scale;438 439 if (getCurrentDataSet().getSelected().isEmpty()) {440 getCurrentDataSet().setSelected(c);441 }442 443 // Mode.select redraws when selectPrims is called444 // Mode.move redraws when mouseDragged is called445 647 // Mode.scale redraws here 446 mv.setNewCursor(ImageProvider.getCursor("scale", null), this); 447 mv.repaint(); 448 } else if (!c.isEmpty()) { 449 mode = Mode.move; 450 648 break; 649 case move: 451 650 if (!cancelDrawMode && c.iterator().next() instanceof Way) { 452 651 setupVirtual(e); … … 454 653 455 654 selectPrims(cycleSetup(c, e), e, false, false); 456 } else {457 mode = Mode.select;458 655 break; 656 case select: 657 default: 459 658 selectionManager.register(mv); 460 659 selectionManager.mousePressed(e); 461 } 462 660 break; 661 } 662 giveUserFeedback(e); 663 mv.repaint(); 463 664 updateStatusLine(); 464 665 } … … 466 667 @Override 467 668 public void mouseReleased(MouseEvent e) { 468 if (!mv.isActiveLayerVisible()) { 469 return; 470 } 669 if (!mv.isActiveLayerVisible()) 670 return; 471 671 472 672 startingDraggingPos = null; 473 673 474 mv.setNewCursor(cursor, this);475 674 if (mode == Mode.select) { 476 675 selectionManager.unregister(mv); … … 489 688 virtualNode = null; 490 689 491 // do nothing if the click was to short to be recognized as a drag,690 // do nothing if the click was to short too be recognized as a drag, 492 691 // but the release position is farther than 10px away from the press position 493 if (lastMousePos .distanceSq(e.getPoint()) < 100) {692 if (lastMousePos == null || lastMousePos.distanceSq(e.getPoint()) < 100) { 494 693 selectPrims(cyclePrims(cycleList, e), e, true, false); 495 694 … … 500 699 // click and switch back to SelectMode 501 700 Main.worker.execute(new Runnable() { 502 503 701 public void run() { 504 702 Main.map.selectDrawTool(true); … … 539 737 } 540 738 541 // I don't see why we need this.542 //updateStatusLine();543 739 mode = null; 740 giveUserFeedback(e); 544 741 updateStatusLine(); 545 742 } 546 743 547 744 public void selectionEnded(Rectangle r, MouseEvent e) { 548 boolean alt = (e.getModifiersEx() & (MouseEvent.ALT_DOWN_MASK | MouseEvent.ALT_GRAPH_DOWN_MASK)) != 0;745 updateKeyModifiers(e); 549 746 selectPrims(selectionManager.getObjectsInRectangle(r, alt), e, true, true); 550 747 } … … 554 751 * selection cycle given by <code>prims</code>. 555 752 * @param prims the primitives that form the selection cycle 556 * @param shift whether shift is pressed 557 * @param ctrl whether ctrl is pressed 753 * @param mouse event 558 754 * @return the next element of cycle list <code>prims</code>. 559 755 */ … … 562 758 563 759 if (prims.size() > 1) { 564 boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 565 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 760 updateKeyModifiers(e); 566 761 567 762 DataSet ds = getCurrentDataSet(); … … 630 825 631 826 private void selectPrims(Collection<OsmPrimitive> prims, MouseEvent e, boolean released, boolean area) { 632 boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0; 633 boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0; 827 updateKeyModifiers(e); 634 828 DataSet ds = getCurrentDataSet(); 635 829 636 830 // not allowed together: do not change dataset selection, return early 637 if ((shift && ctrl) || (ctrl && !released) || (!virtualWays.isEmpty())) { 638 return; 639 } 831 if ((shift && ctrl) || (ctrl && !released) || (!virtualWays.isEmpty())) 832 return; 640 833 641 834 if (!released) { … … 666 859 @Override 667 860 public String getModeHelpText() { 668 if (mode == Mode.select) {861 if (mode == Mode.select) 669 862 return tr("Release the mouse button to select the objects in the rectangle."); 670 } else if (mode == Mode.move) {863 else if (mode == Mode.move) 671 864 return tr("Release the mouse button to stop moving. Ctrl to merge with nearest node."); 672 } else if (mode == Mode.rotate) {865 else if (mode == Mode.rotate) 673 866 return tr("Release the mouse button to stop rotating."); 674 } else if (mode == Mode.scale) {867 else if (mode == Mode.scale) 675 868 return tr("Release the mouse button to stop scaling."); 676 } else {869 else 677 870 return tr("Move objects by dragging; Shift to add to selection (Ctrl to toggle); Shift-Ctrl to rotate selected; Alt-Ctrl to scale selected; or change selection"); 678 }679 871 } 680 872 -
trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
r4310 r4327 115 115 private CopyOnWriteArrayList<DataSetListener> listeners = new CopyOnWriteArrayList<DataSetListener>(); 116 116 117 // provide means to highlight map elements that are not osm primitives 118 private Collection<WaySegment> highlightedVirtualNodes = new LinkedList<WaySegment>(); 119 private Collection<WaySegment> highlightedWaySegments = new LinkedList<WaySegment>(); 120 117 121 // Number of open calls to beginUpdate 118 122 private int updateCount; … … 431 435 432 436 /** 437 * returns an unmodifiable collection of *WaySegments* whose virtual 438 * nodes should be highlighted. WaySegments are used to avoid having 439 * to create a VirtualNode class that wouldn't have much purpose otherwise. 440 * 441 * @return unmodifiable collection of WaySegments 442 */ 443 public Collection<WaySegment> getHighlightedVirtualNodes() { 444 return Collections.unmodifiableCollection(highlightedVirtualNodes); 445 } 446 447 /** 448 * returns an unmodifiable collection of WaySegments that should be 449 * highlighted. 450 * 451 * @return unmodifiable collection of WaySegments 452 */ 453 public Collection<WaySegment> getHighlightedWaySegments() { 454 return Collections.unmodifiableCollection(highlightedWaySegments); 455 } 456 457 /** 433 458 * Replies an unmodifiable collection of primitives currently selected 434 459 * in this dataset. May be empty, but not null. … … 505 530 selectionSnapshot = null; 506 531 return true; 532 } 533 534 /** 535 * set what virtual nodes should be highlighted. Requires a Collection of 536 * *WaySegments* to avoid a VirtualNode class that wouldn't have much use 537 * otherwise. 538 * @param Collection of waySegments 539 */ 540 public void setHighlightedVirtualNodes(Collection<WaySegment> waySegments) { 541 if(highlightedVirtualNodes.isEmpty() && waySegments.isEmpty()) 542 return; 543 544 highlightedVirtualNodes = waySegments; 545 // can't use fireHighlightingChanged because it requires an OsmPrimitive 546 highlightUpdateCount++; 547 } 548 549 /** 550 * set what virtual ways should be highlighted. 551 * @param Collection of waySegments 552 */ 553 public void setHighlightedWaySegments(Collection<WaySegment> waySegments) { 554 if(highlightedWaySegments.isEmpty() && waySegments.isEmpty()) 555 return; 556 557 highlightedWaySegments = waySegments; 558 // can't use fireHighlightingChanged because it requires an OsmPrimitive 559 highlightUpdateCount++; 507 560 } 508 561 … … 590 643 } 591 644 return changed; 645 } 646 647 /** 648 * clear all highlights of virtual nodes 649 */ 650 public void clearHighlightedVirtualNodes() { 651 setHighlightedVirtualNodes(new ArrayList<WaySegment>()); 652 } 653 654 /** 655 * clear all highlights of way segments 656 */ 657 public void clearHighlightedWaySegments() { 658 setHighlightedWaySegments(new ArrayList<WaySegment>()); 592 659 } 593 660 -
trunk/src/org/openstreetmap/josm/data/osm/WaySegment.java
r3557 r4327 30 30 } 31 31 32 /** 33 * returns this way segment as complete way. 34 * @return 35 */ 36 public Way toWay() { 37 Way w = new Way(); 38 w.addNode(getFirstNode()); 39 w.addNode(getSecondNode()); 40 return w; 41 } 42 32 43 @Override public boolean equals(Object o) { 33 44 return o != null && o instanceof WaySegment -
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java
r4319 r4327 35 35 import org.openstreetmap.josm.data.osm.RelationMember; 36 36 import org.openstreetmap.josm.data.osm.Way; 37 import org.openstreetmap.josm.data.osm.WaySegment; 37 38 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon; 38 39 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData; 39 40 import org.openstreetmap.josm.gui.NavigatableComponent; 40 41 import org.openstreetmap.josm.gui.mappaint.BoxTextElemStyle; 42 import org.openstreetmap.josm.gui.mappaint.NodeElemStyle; 43 import org.openstreetmap.josm.gui.mappaint.TextElement; 41 44 import org.openstreetmap.josm.gui.mappaint.BoxTextElemStyle.HorizontalTextAlignment; 42 45 import org.openstreetmap.josm.gui.mappaint.BoxTextElemStyle.VerticalTextAlignment; 43 import org.openstreetmap.josm.gui.mappaint.NodeElemStyle;44 46 import org.openstreetmap.josm.gui.mappaint.NodeElemStyle.Symbol; 45 import org.openstreetmap.josm.gui.mappaint.TextElement;46 47 import org.openstreetmap.josm.tools.ImageProvider; 47 48 import org.openstreetmap.josm.tools.Pair; … … 53 54 private final boolean inactive; 54 55 private final MapPaintSettings settings; 56 private final Collection<WaySegment> highlightWaySegments; 55 57 56 58 private final boolean useStrokes; … … 64 66 private final Color relationSelectedColor; 65 67 private final Color nodeColor; 68 private final Color highlightColor; 69 private final Color highlightColorTransparent; 66 70 private final Color backgroundColor; 67 71 … … 81 85 public MapPainter(MapPaintSettings settings, Graphics2D g, 82 86 boolean inactive, NavigatableComponent nc, boolean virtual, 83 double circum, boolean leftHandTraffic){ 87 double circum, boolean leftHandTraffic, 88 Collection<WaySegment> highlightWaySegments){ 84 89 this.settings = settings; 85 90 this.g = g; 86 91 this.inactive = inactive; 87 92 this.nc = nc; 93 this.highlightWaySegments = highlightWaySegments; 88 94 this.useStrokes = settings.getUseStrokesDistance() > circum; 89 95 this.showNames = settings.getShowNamesDistance() > circum; … … 96 102 this.relationSelectedColor = PaintColors.RELATIONSELECTED.get(); 97 103 this.nodeColor = PaintColors.NODE.get(); 104 this.highlightColor = PaintColors.HIGHLIGHT.get(); 105 this.highlightColorTransparent = new Color(highlightColor.getRed(), highlightColor.getGreen(), highlightColor.getBlue(), 100); 98 106 this.backgroundColor = PaintColors.getBackgroundColor(); 99 107 … … 131 139 List<Node> wayNodes = way.getNodes(); 132 140 if (wayNodes.size() < 2) return; 133 134 Iterator<Point> it = new OffsetIterator(way.getNodes(), offset); 141 142 // only highlight the segment if the way itself is not highlighted 143 if(!way.isHighlighted()) { 144 GeneralPath highlightSegs = null; 145 for(WaySegment ws : highlightWaySegments) { 146 if(ws.way != way || ws.lowerIndex < offset) { 147 continue; 148 } 149 if(highlightSegs == null) { 150 highlightSegs = new GeneralPath(); 151 } 152 153 Point p1 = nc.getPoint(ws.getFirstNode()); 154 Point p2 = nc.getPoint(ws.getSecondNode()); 155 highlightSegs.moveTo(p1.x, p1.y); 156 highlightSegs.lineTo(p2.x, p2.y); 157 } 158 159 drawPathHighlight(highlightSegs, line); 160 } 161 162 163 Iterator<Point> it = new OffsetIterator(wayNodes, offset); 135 164 while (it.hasNext()) { 136 165 Point p = it.next(); … … 209 238 lastPoint = p; 210 239 } 240 if(way.isHighlighted()) { 241 drawPathHighlight(path, line); 242 } 211 243 displaySegments(path, orientationArrows, onewayArrows, onewayArrowsCasing, color, line, dashes, dashedColor); 212 244 } … … 221 253 */ 222 254 public class OffsetIterator implements Iterator<Point> { 223 255 224 256 private List<Node> nodes; 225 257 private int offset; 226 258 private int idx; 227 259 228 260 private Point prev = null; 229 261 /* 'prev0' is a point that has distance 'offset' from 'prev' and the … … 238 270 idx = 0; 239 271 } 240 272 241 273 @Override 242 274 public boolean hasNext() { … … 247 279 public Point next() { 248 280 if (offset == 0) return nc.getPoint(nodes.get(idx++)); 249 281 250 282 Point current = nc.getPoint(nodes.get(idx)); 251 283 252 284 if (idx == nodes.size() - 1) { 253 285 ++idx; … … 277 309 int dx_prev = current.x - prev.x; 278 310 int dy_prev = current.y - prev.y; 279 311 280 312 // determine intersection of the lines parallel to the two 281 313 // segments 282 314 int det = dx_next*dy_prev - dx_prev*dy_next; 283 315 284 316 if (det == 0) { 285 317 ++idx; … … 292 324 int m = dx_next*(y_current0 - y_prev0) - dy_next*(x_current0 - x_prev0); 293 325 294 int cx_ = x_prev0 + (int)Math.round(m * dx_prev / det);295 int cy_ = y_prev0 + (int)Math.round(m * dy_prev / det);326 int cx_ = x_prev0 + Math.round(m * dx_prev / det); 327 int cy_ = y_prev0 + Math.round(m * dy_prev / det); 296 328 ++idx; 297 329 prev = current; … … 307 339 } 308 340 } 309 341 310 342 private void displaySegments(GeneralPath path, GeneralPath orientationArrows, GeneralPath onewayArrows, GeneralPath onewayArrowsCasing, 311 343 Color color, BasicStroke line, BasicStroke dashes, Color dashedColor) { … … 337 369 if(useStrokes) { 338 370 g.setStroke(new BasicStroke()); 371 } 372 } 373 374 /** 375 * highlights a given GeneralPath using the settings from BasicStroke to match the line's 376 * style. Width of the highlight is hard coded. 377 * @param path 378 * @param line 379 */ 380 private void drawPathHighlight(GeneralPath path, BasicStroke line) { 381 if(path == null) 382 return; 383 g.setColor(highlightColorTransparent); 384 float w = (line.getLineWidth() + 4); 385 while(w >= line.getLineWidth()) { 386 g.setStroke(new BasicStroke(w, line.getEndCap(), line.getLineJoin(), line.getMiterLimit())); 387 g.draw(path); 388 w -= 4; 339 389 } 340 390 } … … 498 548 public void drawNodeIcon(Node n, ImageIcon icon, float iconAlpha, boolean selected, boolean member) { 499 549 Point p = nc.getPoint(n); 500 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 501 502 int w = icon.getIconWidth(), h=icon.getIconHeight(); 550 551 final int w = icon.getIconWidth(), h=icon.getIconHeight(); 552 if(n.isHighlighted()) { 553 drawPointHighlight(p, Math.max(w, h)); 554 } 555 503 556 if (iconAlpha != 1f) { 504 557 g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, iconAlpha)); … … 530 583 public void drawNodeSymbol(Node n, Symbol s, Color fillColor, Color strokeColor) { 531 584 Point p = nc.getPoint(n); 532 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return;533 585 int radius = s.size / 2; 586 587 if(n.isHighlighted()) { 588 drawPointHighlight(p, s.size); 589 } 534 590 535 591 if (fillColor != null) { … … 612 668 */ 613 669 public void drawNode(Node n, Color color, int size, boolean fill) { 670 if(size <= 0 && !n.isHighlighted()) 671 return; 672 673 Point p = nc.getPoint(n); 674 675 if(n.isHighlighted()) { 676 drawPointHighlight(p, size); 677 } 678 614 679 if (size > 1) { 615 Point p = nc.getPoint(n);616 680 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 617 681 int radius = size / 2; … … 623 687 } 624 688 if (fill) { 625 g.fillRect(p.x - radius, p.y - radius, size + 1, size + 1);689 g.fillRect(p.x-radius-1, p.y-radius-1, size + 1, size + 1); 626 690 } else { 627 g.drawRect(p.x - radius, p.y - radius, size, size); 628 } 691 g.drawRect(p.x-radius-1, p.y-radius-1, size, size); 692 } 693 } 694 } 695 696 /** 697 * highlights a given point by drawing a rounded rectangle around it. Give the 698 * size of the object you want to be highlighted, width is added automatically. 699 */ 700 private void drawPointHighlight(Point p, int size) { 701 g.setColor(highlightColorTransparent); 702 int s = size + 7; 703 while(s >= size) { 704 int r = (int) Math.floor(s/2); 705 g.fillRoundRect(p.x-r, p.y-r, s, s, r, r); 706 s -= 4; 629 707 } 630 708 } … … 633 711 if (!isShowNames() || bs == null) 634 712 return; 635 636 Point p = nc.getPoint( (Node)n);713 714 Point p = nc.getPoint(n); 637 715 TextElement text = bs.text; 638 716 String s = text.labelCompositionStrategy.compose(n); … … 823 901 824 902 public void drawRestriction(Relation r, NodeElemStyle icon) { 825 826 903 Way fromWay = null; 827 904 Way toWay = null; … … 998 1075 } 999 1076 1000 public void drawVirtualNodes(Collection<Way> ways) { 1001 1002 if (virtualNodeSize != 0) { 1003 GeneralPath path = new GeneralPath(); 1004 for (Way osm: ways){ 1005 if (osm.isUsable() && !osm.isDisabled()) { 1006 visitVirtual(path, osm); 1007 } 1008 } 1009 g.setColor(nodeColor); 1010 g.draw(path); 1011 } 1077 public void drawVirtualNodes(Collection<Way> ways, Collection<WaySegment> highlightVirtualNodes) { 1078 if (virtualNodeSize == 0) 1079 return; 1080 // print normal virtual nodes 1081 GeneralPath path = new GeneralPath(); 1082 for (Way osm: ways){ 1083 if (osm.isUsable() && !osm.isDisabled()) { 1084 visitVirtual(path, osm); 1085 } 1086 } 1087 g.setColor(nodeColor); 1088 g.draw(path); 1089 // print highlighted virtual nodes. Since only the color changes, simply 1090 // drawing them over the existing ones works fine (at least in their current 1091 // simple style) 1092 path = new GeneralPath(); 1093 for (WaySegment wseg: highlightVirtualNodes){ 1094 if (wseg.way.isUsable() && !wseg.way.isDisabled()) { 1095 visitVirtual(path, wseg.toWay()); 1096 } 1097 } 1098 g.setColor(highlightColor); 1099 g.draw(path); 1012 1100 } 1013 1101 -
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/PaintColors.java
r3896 r4327 10 10 import org.openstreetmap.josm.data.Preferences.ColorKey; 11 11 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles; 12 import org.openstreetmap.josm.gui.mappaint.StyleSource; 12 13 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener; 13 import org.openstreetmap.josm.gui.mappaint.StyleSource;14 14 15 15 public enum PaintColors implements ColorKey { … … 26 26 INCOMPLETE_WAY(marktr("incomplete way"), new Color(0,0,96)), // darker blue 27 27 BACKGROUND(marktr("background"), Color.BLACK), 28 HIGHLIGHT(marktr("highlight"), new Color(0, 255, 186)), // lighteal28 HIGHLIGHT(marktr("highlight"), SELECTED.get()), 29 29 30 30 UNTAGGED(marktr("untagged"),Color.GRAY), -
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
r4317 r4327 5 5 import java.awt.RenderingHints; 6 6 import java.util.ArrayList; 7 import java.util.Collection; 7 8 import java.util.Collections; 8 9 import java.util.List; … … 16 17 import org.openstreetmap.josm.data.osm.Relation; 17 18 import org.openstreetmap.josm.data.osm.Way; 19 import org.openstreetmap.josm.data.osm.WaySegment; 18 20 import org.openstreetmap.josm.gui.NavigatableComponent; 19 21 import org.openstreetmap.josm.gui.mappaint.AreaElemStyle; … … 220 222 RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF); 221 223 222 this.painter = new MapPainter(paintSettings, g, isInactiveMode, nc, renderVirtualNodes, circum, leftHandTraffic); 224 Collection<WaySegment> hws = data.getHighlightedWaySegments(); 225 226 this.painter = new MapPainter(paintSettings, g, isInactiveMode, nc, renderVirtualNodes, circum, leftHandTraffic, hws); 223 227 224 228 StyleCollector sc = new StyleCollector(drawArea, drawMultipolygon, drawRestriction); … … 229 233 sc.drawAll(); 230 234 sc = null; 231 painter.drawVirtualNodes(data.searchWays(bbox) );235 painter.drawVirtualNodes(data.searchWays(bbox), data.getHighlightedVirtualNodes()); 232 236 233 237 //long now = System.currentTimeMillis(); -
trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
r4087 r4327 25 25 import org.openstreetmap.josm.data.osm.RelationMember; 26 26 import org.openstreetmap.josm.data.osm.Way; 27 import org.openstreetmap.josm.data.osm.WaySegment; 27 28 import org.openstreetmap.josm.data.osm.visitor.Visitor; 28 29 import org.openstreetmap.josm.gui.NavigatableComponent; … … 168 169 } 169 170 } 170 drawVirtualNodes(data.searchWays(bbox)); 171 drawVirtualNodes(data.searchWays(bbox), data.getHighlightedVirtualNodes()); 172 173 // draw highlighted way segments over the already drawn ways. Otherwise each 174 // way would have to be checked if it contains a way segment to highlight when 175 // in most of the cases there won't be more than one segment. Since the wireframe 176 // renderer does not feature any transparency there should be no visual difference. 177 for(final WaySegment wseg : data.getHighlightedWaySegments()) { 178 drawSegment(nc.getPoint(wseg.getFirstNode()), nc.getPoint(wseg.getSecondNode()), highlightColor, false); 179 } 180 displaySegments(); 171 181 } 172 182 … … 228 238 } 229 239 230 public void drawVirtualNodes(Collection<Way> ways) { 231 232 if (virtualNodeSize != 0) { 233 GeneralPath path = new GeneralPath(); 234 for (Way osm: ways){ 235 if (osm.isUsable() && !osm.isDisabledAndHidden() && !osm.isDisabled()) { 236 visitVirtual(path, osm); 237 } 238 } 239 g.setColor(nodeColor); 240 g.draw(path); 241 } 240 public void drawVirtualNodes(Collection<Way> ways, Collection<WaySegment> highlightVirtualNodes) { 241 if (virtualNodeSize == 0) 242 return; 243 // print normal virtual nodes 244 GeneralPath path = new GeneralPath(); 245 for (Way osm : ways) { 246 if (osm.isUsable() && !osm.isDisabledAndHidden() && !osm.isDisabled()) { 247 visitVirtual(path, osm); 248 } 249 } 250 g.setColor(nodeColor); 251 g.draw(path); 252 // print highlighted virtual nodes. Since only the color changes, simply 253 // drawing them over the existing ones works fine (at least in their current 254 // simple style) 255 path = new GeneralPath(); 256 for (WaySegment wseg: highlightVirtualNodes){ 257 if (wseg.way.isUsable() && !wseg.way.isDisabled()) { 258 visitVirtual(path, wseg.toWay()); 259 } 260 } 261 g.setColor(highlightColor); 262 g.draw(path); 242 263 } 243 264 -
trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java
r4316 r4327 221 221 222 222 Color myColor = color; 223 if(w.isHighlighted()) { 224 myColor = paintSettings.getHighlightColor(); 225 } else if (selected) { 223 if (selected) { 226 224 myColor = paintSettings.getSelectedColor(color.getAlpha()); 227 225 } else if (member) { … … 292 290 '}'; 293 291 } 294 292 295 293 public String linejoinToString(int linejoin) { 296 294 switch (linejoin) { -
trunk/src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java
r4319 r4327 111 111 symbol = createSymbol(env); 112 112 } 113 113 114 114 // optimization: if we neither have a symbol, nor an icon 115 115 // we don't have to check for the remaining style properties and we don't … … 243 243 Color fillColor = symbol.fillColor; 244 244 if (fillColor != null) { 245 if (n.isHighlighted()) { 246 fillColor = settings.getHighlightColor(); 247 } else { 248 if (painter.isInactiveMode() || n.isDisabled()) { 249 fillColor = settings.getInactiveColor(); 250 } else if (selected) { 251 fillColor = settings.getSelectedColor(fillColor.getAlpha()); 252 } else if (member) { 253 fillColor = settings.getRelationSelectedColor(fillColor.getAlpha()); 254 } 245 if (painter.isInactiveMode() || n.isDisabled()) { 246 fillColor = settings.getInactiveColor(); 247 } else if (selected) { 248 fillColor = settings.getSelectedColor(fillColor.getAlpha()); 249 } else if (member) { 250 fillColor = settings.getRelationSelectedColor(fillColor.getAlpha()); 255 251 } 256 252 } 257 253 Color strokeColor = symbol.strokeColor; 258 254 if (strokeColor != null) { 259 if (n.isHighlighted()) { 260 strokeColor = settings.getHighlightColor(); 261 } else { 262 if (painter.isInactiveMode() || n.isDisabled()) { 263 strokeColor = settings.getInactiveColor(); 264 } else if (selected) { 265 strokeColor = settings.getSelectedColor(strokeColor.getAlpha()); 266 } else if (member) { 267 strokeColor = settings.getRelationSelectedColor(strokeColor.getAlpha()); 268 } 255 if (painter.isInactiveMode() || n.isDisabled()) { 256 strokeColor = settings.getInactiveColor(); 257 } else if (selected) { 258 strokeColor = settings.getSelectedColor(strokeColor.getAlpha()); 259 } else if (member) { 260 strokeColor = settings.getRelationSelectedColor(strokeColor.getAlpha()); 269 261 } 270 262 } 271 263 painter.drawNodeSymbol(n, symbol, fillColor, strokeColor); 272 264 } else { 273 if (n.isHighlighted()) { 274 painter.drawNode(n, settings.getHighlightColor(), settings.getSelectedNodeSize(), settings.isFillSelectedNode()); 265 Color color; 266 boolean isConnection = n.isConnectionNode(); 267 268 if (painter.isInactiveMode() || n.isDisabled()) { 269 color = settings.getInactiveColor(); 270 } else if (selected) { 271 color = settings.getSelectedColor(); 272 } else if (member) { 273 color = settings.getRelationSelectedColor(); 274 } else if (isConnection) { 275 if (n.isTagged()) { 276 color = settings.getTaggedConnectionColor(); 277 } else { 278 color = settings.getConnectionColor(); 279 } 275 280 } else { 276 Color color; 277 boolean isConnection = n.isConnectionNode(); 278 279 if (painter.isInactiveMode() || n.isDisabled()) { 280 color = settings.getInactiveColor(); 281 } else if (selected) { 282 color = settings.getSelectedColor(); 283 } else if (member) { 284 color = settings.getRelationSelectedColor(); 285 } else if (isConnection) { 286 if (n.isTagged()) { 287 color = settings.getTaggedConnectionColor(); 288 } else { 289 color = settings.getConnectionColor(); 290 } 281 if (n.isTagged()) { 282 color = settings.getTaggedColor(); 291 283 } else { 292 if (n.isTagged()) { 293 color = settings.getTaggedColor(); 294 } else { 295 color = settings.getNodeColor(); 296 } 284 color = settings.getNodeColor(); 297 285 } 298 299 final int size = Utils.max((selected ? settings.getSelectedNodeSize() : 0),300 (n.isTagged() ? settings.getTaggedNodeSize() : 0),301 (isConnection ? settings.getConnectionNodeSize() : 0),302 settings.getUnselectedNodeSize());303 304 final boolean fill = (selected && settings.isFillSelectedNode()) ||305 (n.isTagged() && settings.isFillTaggedNode()) ||306 (isConnection && settings.isFillConnectionNode()) ||307 settings.isFillUnselectedNode();308 309 painter.drawNode(n, color, size, fill);310 286 } 287 288 final int size = Utils.max((selected ? settings.getSelectedNodeSize() : 0), 289 (n.isTagged() ? settings.getTaggedNodeSize() : 0), 290 (isConnection ? settings.getConnectionNodeSize() : 0), 291 settings.getUnselectedNodeSize()); 292 293 final boolean fill = (selected && settings.isFillSelectedNode()) || 294 (n.isTagged() && settings.isFillTaggedNode()) || 295 (isConnection && settings.isFillConnectionNode()) || 296 settings.isFillUnselectedNode(); 297 298 painter.drawNode(n, color, size, fill); 299 311 300 } 312 301 } else if (primitive instanceof Relation && icon != null) { … … 322 311 return disabledIcon = new ImageIcon(GrayFilter.createDisabledImage(icon.getImage())); 323 312 } 324 313 325 314 public Rectangle getBox() { 326 315 if (icon != null) {
Note:
See TracChangeset
for help on using the changeset viewer.