Changeset 1195 in josm for trunk/src/org/openstreetmap/josm/data
- Timestamp:
- 2008-12-31T00:36:58+01:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
r1193 r1195 38 38 protected boolean zoomLevelDisplay; 39 39 protected boolean fillAreas; 40 protected boolean drawMultipolygon; 40 41 protected int fillAlpha; 41 42 protected Color untaggedColor; … … 48 49 protected double circum; 49 50 protected String regionalNameOrder[]; 50 protected Collection<Way> alreadyDrawnWays = new LinkedList<Way>(); 51 protected Collection<Way> alreadyDrawnAreas = new LinkedList<Way>(); 51 protected Boolean selectedCall; 52 protected Collection<OsmPrimitive> alreadyDrawn; 53 protected Collection<Way> alreadyDrawnAreas; 52 54 53 55 protected boolean isZoomOk(ElemStyle e) { … … 73 75 */ 74 76 public void visit(Node n) { 75 IconElemStyle nodeStyle = styles.get(n); 77 IconElemStyle nodeStyle = (IconElemStyle)styles.get(n); 76 78 if (nodeStyle != null && isZoomOk(nodeStyle)) 77 drawNode(n, nodeStyle.icon, nodeStyle.annotate); 79 drawNode(n, nodeStyle.icon, nodeStyle.annotate, n.selected); 78 80 else if (n.selected) 79 81 drawNode(n, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode); … … 114 116 } 115 117 116 drawWay(w, l, areacolor); 117 } 118 119 public void drawWay(Way w, LineElemStyle l, Color color) { 118 drawWay(w, l, areacolor, w.selected); 119 } 120 121 public void drawWay(Way w, LineElemStyle l, Color color, Boolean selected) { 120 122 // show direction arrows, if draw.segment.relevant_directions_only is not set, 121 123 // the way is tagged with a direction key … … 134 136 dashed = l.dashed; 135 137 } 138 if(selected) 139 color = selectedColor; 136 140 if (realWidth > 0 && useRealWidth && !showDirection) 137 141 { … … 294 298 } 295 299 300 public void drawSelected(OsmPrimitive osm, ElemStyle style, Boolean area, 301 Boolean areaselected) 302 { 303 if(osm instanceof Way) 304 { 305 if(style instanceof AreaElemStyle) 306 { 307 drawWay((Way)osm, ((AreaElemStyle)style).line, selectedColor, true); 308 if(area) 309 drawWayAsArea((Way)osm, areaselected ? selectedColor 310 : ((AreaElemStyle)style).color); 311 } 312 else 313 { 314 drawWay((Way)osm, (LineElemStyle)style, selectedColor, true); 315 } 316 } 317 else if(osm instanceof Node) 318 { 319 if(style != null && isZoomOk(style)) 320 drawNode((Node)osm, ((IconElemStyle)style).icon, 321 ((IconElemStyle)style).annotate, true); 322 else 323 drawNode((Node)osm, selectedColor, selectedNodeSize, selectedNodeRadius, fillSelectedNode); 324 } 325 } 326 296 327 public void visit(Relation r) { 297 328 // draw multipolygon relations including their ways 298 // other relations are not (yet?) drawn. 299 if (r.incomplete) return; 300 301 if(!Main.pref.getBoolean("mappaint.multipolygon",false)) return; 302 303 if(!"multipolygon".equals(r.keys.get("type"))) return; 329 // other relations are only drawn when selected 330 if(r.selected) 331 { 332 if(selectedCall) 333 { 334 for (RelationMember m : r.members) 335 { 336 /* second call - draw nodes */ 337 if (!m.member.incomplete && !m.member.deleted 338 && m.member instanceof Node) 339 { 340 drawSelected(m.member, styles.get(m.member), true, true); 341 alreadyDrawn.add(m.member); 342 } 343 } 344 return; 345 } 346 } 347 Boolean isMultipolygon = "multipolygon".equals(r.keys.get("type")); 348 if (!drawMultipolygon || !isMultipolygon) 349 { 350 if(r.selected && !isMultipolygon) 351 { 352 for (RelationMember m : r.members) 353 { 354 if (!m.member.incomplete && !m.member.deleted 355 && !(m.member instanceof Relation)) 356 { 357 /* nodes drawn on second call */ 358 if(!(m.member instanceof Node)) 359 drawSelected(m.member, styles.get(m.member), true, true); 360 alreadyDrawn.add(m.member); 361 } 362 } 363 } 364 return; 365 } 304 366 305 367 Collection<Way> inner = new LinkedList<Way>(); … … 328 390 if(m.role == null || m.role.length() == 0) 329 391 outer.add(w); 392 else if(r.selected) 393 drawSelected(m.member, styles.get(m.member), true, true); 330 394 } 331 395 } 332 396 else 333 397 { 398 /* nodes drawn on second call */ 334 399 System.out.println("ERROR: Non-Way in multipolygon " + m.member); 335 400 } … … 385 450 for (Way w : outerclosed) 386 451 { 387 Color color = w.selected ? selectedColor 452 Color color = (w.selected || r.selected) ? selectedColor 388 453 : ((AreaElemStyle)wayStyle).color; 389 454 Polygon polygon = new Polygon(); … … 423 488 { 424 489 if(zoomok) 490 { 425 491 drawWay(wInner, ((AreaElemStyle)wayStyle).line, 426 ((AreaElemStyle)wayStyle).color); 427 alreadyDrawnWays.add(wInner); 428 } 429 else if(wayStyle.equals(innerStyle)) 430 { 492 ((AreaElemStyle)wayStyle).color, wInner.selected 493 || r.selected); 494 } 495 alreadyDrawn.add(wInner); 496 } 497 else 498 { 499 if(r.selected) 500 { 501 drawSelected(wInner, innerStyle, 502 !wayStyle.equals(innerStyle), wInner.selected); 503 alreadyDrawn.add(wInner); 504 } 505 if(wayStyle.equals(innerStyle)) 506 { 431 507 System.out.println("WARNING: Inner waystyle equals multipolygon for way " + wInner); 432 alreadyDrawnAreas.add(wInner); 508 if(!r.selected) 509 alreadyDrawnAreas.add(wInner); 510 } 433 511 } 434 512 } … … 439 517 { 440 518 if(zoomok) 519 { 441 520 drawWay(wOuter, ((AreaElemStyle)wayStyle).line, 442 ((AreaElemStyle)wayStyle).color); 443 alreadyDrawnWays.add(wOuter); 521 ((AreaElemStyle)wayStyle).color, wOuter.selected 522 || r.selected); 523 } 524 alreadyDrawn.add(wOuter); 444 525 } 445 526 else 446 527 { 447 if(!wayStyle.equals(outerStyle)) 528 if(outerStyle instanceof AreaElemStyle 529 && !wayStyle.equals(outerStyle)) 530 { 448 531 System.out.println("ERROR: Outer waystyle does not match multipolygon for way " + wOuter); 449 alreadyDrawnAreas.add(wOuter); 532 } 533 if(r.selected) 534 { 535 drawSelected(wOuter, outerStyle, false, false); 536 alreadyDrawn.add(wOuter); 537 } 538 // else if(outerStyle instanceof AreaElemStyle) 539 alreadyDrawnAreas.add(wOuter); 450 540 } 451 541 } … … 470 560 } 471 561 472 // NEW 473 protected void drawNode(Node n, ImageIcon icon, boolean annotate) { 562 protected void drawNode(Node n, ImageIcon icon, boolean annotate, Boolean selected) { 474 563 Point p = nc.getPoint(n.eastNorth); 475 564 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; … … 485 574 g.setFont(defaultFont); 486 575 } 487 if ( n.selected)576 if (selected) 488 577 { 489 578 g.setColor ( selectedColor ); … … 582 671 circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter 583 672 styles = MapPaintStyles.getStyles(); 673 drawMultipolygon = Main.pref.getBoolean("mappaint.multipolygon",false); 584 674 orderFont = new Font(Main.pref.get("mappaint.font","Helvetica"), Font.PLAIN, Main.pref.getInteger("mappaint.fontsize", 8)); 585 675 String currentLocale = Locale.getDefault().getLanguage(); 586 676 regionalNameOrder = Main.pref.get("mappaint.nameOrder", "name:"+currentLocale+";name;int_name").split(";"); 587 677 678 alreadyDrawn = new LinkedList<OsmPrimitive>(); 679 alreadyDrawnAreas = new LinkedList<Way>(); 680 selectedCall = false; 681 588 682 if (fillAreas && styles.hasAreas()) { 589 683 Collection<Way> noAreaWays = new LinkedList<Way>(); … … 591 685 for (final Relation osm : data.relations) 592 686 { 593 if (!osm.deleted && !osm.selected) 594 { 687 if(!osm.deleted && !osm.incomplete) 595 688 osm.visit(this); 596 }597 689 } 598 690 599 691 for (final Way osm : data.ways) 600 692 { 601 if (!osm.incomplete && !osm.deleted && !alreadyDrawn Ways.contains(osm))693 if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm)) 602 694 { 603 695 if(styles.isArea((Way)osm) && !alreadyDrawnAreas.contains(osm)) … … 607 699 } 608 700 } 609 // free that stuff610 alreadyDrawnWays = null;611 701 alreadyDrawnAreas = null; 612 702 … … 618 708 { 619 709 for (final OsmPrimitive osm : data.ways) 620 if (!osm.incomplete && !osm.deleted) 710 if (!osm.incomplete && !osm.deleted && !osm.selected) 621 711 osm.visit(this); 622 712 } 623 713 624 for (final OsmPrimitive osm : data.getSelected()) 625 if (!osm.incomplete && !osm.deleted){ 714 selectedCall = true; 715 for (final OsmPrimitive osm : data.getSelected()) { 716 if (!osm.incomplete && !osm.deleted 717 && !(osm instanceof Node) && !alreadyDrawn.contains(osm)) 626 718 osm.visit(this); 627 }719 } 628 720 629 721 displaySegments(); 630 722 631 723 for (final OsmPrimitive osm : data.nodes) 632 if (!osm.incomplete && !osm.deleted) 724 if (!osm.incomplete && !osm.deleted && !alreadyDrawn.contains(osm)) 633 725 osm.visit(this); 726 727 alreadyDrawn = null; 634 728 635 729 if (virtualNodeSize != 0) … … 637 731 currentColor = nodeColor; 638 732 for (final OsmPrimitive osm : data.ways) 639 if (!osm.deleted) 733 if (!osm.incomplete && !osm.deleted) 640 734 visitVirtual((Way)osm); 641 735 displaySegments(null);
Note:
See TracChangeset
for help on using the changeset viewer.
