- Timestamp:
- 2008-05-12T17:02:08+02:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/visitor/MapPaintVisitor.java
r634 r636 9 9 import java.awt.Point; 10 10 import java.awt.Polygon; 11 import java.awt.Rectangle;12 11 import java.awt.Stroke; 13 12 import java.awt.geom.GeneralPath; … … 30 29 import org.openstreetmap.josm.gui.mappaint.LineElemStyle; 31 30 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles; 32 import org.openstreetmap.josm.tools.ColorHelper;33 31 34 32 public class MapPaintVisitor implements Visitor { 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 33 34 protected boolean useRealWidth; 35 protected boolean zoomLevelDisplay; 36 protected boolean fillAreas; 37 protected int fillAlpha; 38 protected Color untaggedColor; 39 protected Color textColor; 40 protected boolean currentDashed = false; 41 protected int currentWidth = 0; 42 protected Stroke currentStroke = null; 43 protected static final Font orderFont = new Font("Helvetica", Font.PLAIN, 8); 44 45 public boolean inactive; 46 47 /** 48 * The environment to paint to. 49 */ 50 protected Graphics g; 51 52 /** 53 * MapView to get screen coordinates. 54 */ 55 protected NavigatableComponent nc; 56 57 /** 58 * Draw subsequent segments of same color as one Path 59 */ 60 protected Color currentColor = null; 61 protected GeneralPath currentPath = new GeneralPath(); 62 63 protected static final double PHI = Math.toRadians(20); 64 65 /** 66 * Preferences 67 */ 68 protected Color inactiveColor; 69 protected Color selectedColor; 70 protected Color nodeColor; 71 protected Color dfltWayColor; 72 protected Color untaggedWayColor; 73 protected Color incompleteColor; 74 protected Color backgroundColor; 75 protected boolean showDirectionArrow; 78 76 protected boolean showRelevantDirectionsOnly; 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 77 protected boolean showOrderNumber; 78 79 public final static Color darkerblue = new Color(0,0,96); 80 public final static Color darkblue = new Color(0,0,128); 81 82 protected boolean isZoomOk(ElemStyle e) { 83 double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter 84 85 /* show everything if the user wishes so */ 86 if (!zoomLevelDisplay) { 87 return true; 88 } 89 90 if (e == null) { 91 /* the default for things that don't have a rule (show, if scale is smaller than 1500m) */ 92 if (circum < 1500) 93 return true; 94 return false; 95 } 96 97 // formula to calculate a map scale: natural size / map size = scale 98 // example: 876000mm (876m as displayed) / 22mm (roughly estimated screen size of legend bar) = 39818 99 // 100 // so the exact "correcting value" below depends only on the screen size and resolution 101 // XXX - do we need a Preference setting for this (if things vary widely)? 102 /*System.out.println( 105 103 "Circum: " + circum + 106 104 " max: " + e.getMaxScale() + "(" + e.getMaxScale()/22 + ")" + 107 105 " min:" + e.getMinScale() + "(" + e.getMinScale()/22 + ")");*/ 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 106 if(circum>=e.getMaxScale() / 22 || circum<e.getMinScale() / 22) 107 return false; 108 return true; 109 } 110 111 /** 112 * Draw a small rectangle. 113 * White if selected (as always) or red otherwise. 114 * 115 * @param n The node to draw. 116 */ 117 public void visit(Node n) { 118 ElemStyle nodeStyle = MapPaintStyles.getStyle(n); 119 if (nodeStyle!=null) { 120 if (nodeStyle instanceof IconElemStyle) { 121 if (isZoomOk(nodeStyle)) { 122 drawNode(n, ((IconElemStyle)nodeStyle).getIcon(), ((IconElemStyle)nodeStyle).doAnnotate()); 123 } 124 } else { 125 // throw some sort of exception 126 } 127 } else { 128 drawNode(n, n.selected ? selectedColor : nodeColor); 129 } 130 } 131 132 /** 133 * Draw a line for all segments, according to tags. 134 * @param w The way to draw. 135 */ 136 public void visit(Way w) { 137 double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter 140 138 // show direction arrows, if draw.segment.relevant_directions_only is not set, the way is tagged with a direction key 141 139 // (even if the tag is negated as in oneway=false) or the way is selected 142 140 boolean showDirection = w.selected || 143 141 ((!useRealWidth) && (showDirectionArrow 144 142 && (!showRelevantDirectionsOnly || w.hasDirectionKeys))); 145 143 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 144 Color colour = untaggedColor; 145 int width = 2; 146 int realWidth = 0; //the real width of the element in meters 147 boolean dashed = false; 148 boolean area = false; 149 ElemStyle wayStyle = MapPaintStyles.getStyle(w); 150 151 if(!isZoomOk(wayStyle)) { 152 return; 153 } 154 155 if(wayStyle!=null) 156 { 157 if(wayStyle instanceof LineElemStyle) 158 { 159 colour = ((LineElemStyle)wayStyle).colour; 160 width = ((LineElemStyle)wayStyle).width; 161 realWidth = ((LineElemStyle)wayStyle).realWidth; 162 dashed = ((LineElemStyle)wayStyle).dashed; 163 } 164 else if (wayStyle instanceof AreaElemStyle) 165 { 166 colour = ((AreaElemStyle)wayStyle).getColour(); 167 area = true; 168 } 169 } 170 171 if (area && fillAreas) 172 drawWayAsArea(w, colour); 173 int orderNumber = 0; 174 175 Node lastN = null; 176 for (Node n : w.nodes) { 177 if (lastN == null) { 178 lastN = n; 179 continue; 180 } 181 orderNumber++; 182 183 if (area && fillAreas) { 186 184 // hack to make direction arrows visible against filled background 187 188 189 190 191 192 193 194 195 196 185 if (showDirection) 186 drawSeg(lastN, n, w.selected ? selectedColor : untaggedColor, showDirection, width, true); 187 } else { 188 if (area) { 189 drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, true); 190 } else { 191 if (realWidth > 0 && useRealWidth && !showDirection) { 192 int tmpWidth = (int) (100 / (float) (circum / realWidth)); 193 if (tmpWidth > width) width = tmpWidth; 194 } 197 195 } 198 196 } 199 197 200 drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, dashed); 201 202 if (showOrderNumber) 203 drawOrderNumber(lastN, n, orderNumber); 204 205 lastN = n; 206 } 207 } 208 209 public void visit(Relation e) { 210 // relations are not (yet?) drawn. 211 } 212 213 // This assumes that all segments are aligned in the same direction! 214 protected void drawWayAsArea(Way w, Color colour) 215 { 216 Polygon polygon = new Polygon(); 217 Point p; 218 // set the opacity (alpha) level of the filled polygon 219 Color coloura = new Color( colour.getRed(), colour.getGreen(), colour.getBlue(), fillAlpha); 220 221 for (Node n : w.nodes) 222 { 223 p = nc.getPoint(n.eastNorth); 224 polygon.addPoint(p.x,p.y); 225 } 226 227 g.setColor( w.selected ? 228 selectedColor : coloura); 229 230 g.fillPolygon(polygon); 231 } 232 233 // NEW 234 protected void drawNode(Node n, ImageIcon icon, boolean annotate) { 235 Point p = nc.getPoint(n.eastNorth); 236 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 237 int w = icon.getIconWidth(), h=icon.getIconHeight(); 238 icon.paintIcon ( Main.map.mapView, g, p.x-w/2, p.y-h/2 ); 239 String name = (n.keys==null) ? null : n.keys.get("name"); 240 if (name!=null && annotate) 241 { 242 g.setColor(textColor); 243 Font defaultFont = g.getFont(); 244 g.setFont (orderFont); 245 g.drawString (name, p.x+w/2+2, p.y+h/2+2); 246 g.setFont(defaultFont); 247 } 248 if (n.selected) 249 { 250 g.setColor ( selectedColor ); 251 g.drawRect (p.x-w/2-2,p.y-w/2-2, w+4, h+4); 252 } 253 } 254 255 /** 256 * Draw a line with the given color. 257 */ 258 protected void drawSegment(Node n1, Node n2, Color col, boolean showDirection) { 259 if (useRealWidth && showDirection) showDirection = false; 260 drawSeg(n1, n2, col, showDirection, 1, false); 261 } 262 263 private void drawSeg(Node n1, Node n2, Color col, boolean showDirection, int width, boolean dashed) { 264 if (col != currentColor || width != currentWidth || dashed != currentDashed) { 265 displaySegments(col, width, dashed); 266 } 267 Point p1 = nc.getPoint(n1.eastNorth); 268 Point p2 = nc.getPoint(n2.eastNorth); 269 270 // checking if this segment is visible 271 if ((p1.x < 0) && (p2.x < 0)) return ; 272 if ((p1.y < 0) && (p2.y < 0)) return ; 273 if ((p1.x > nc.getWidth()) && (p2.x > nc.getWidth())) return ; 274 if ((p1.y > nc.getHeight()) && (p2.y > nc.getHeight())) return ; 275 //if (ls.selected) 276 // col = selectedColor; 277 //g.setColor(col); 278 //g.setWidth(width); 279 //if (dashed) 280 // g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0)); 281 //else 282 // g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); 283 284 //g.drawLine(p1.x, p1.y, p2.x, p2.y); 285 currentPath.moveTo(p1.x, p1.y); 286 currentPath.lineTo(p2.x, p2.y); 287 288 if (showDirection) { 289 double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI; 290 //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 291 //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 292 currentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 293 currentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 294 currentPath.lineTo(p2.x, p2.y); 295 } 296 //g2d.setStroke(new BasicStroke(1)); 297 298 } 299 300 protected void displaySegments() { 301 displaySegments(null, 0, false); 302 } 303 304 protected void displaySegments(Color newColor, int newWidth, boolean newDash) { 305 306 if (currentPath != null) { 307 Graphics2D g2d = (Graphics2D)g; 308 g2d.setColor(inactive ? inactiveColor : currentColor); 309 if (currentStroke == null) { 310 if (currentDashed) 311 g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0)); 312 else 313 g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); 314 } 315 g2d.draw(currentPath); 316 g2d.setStroke(new BasicStroke(1)); 317 318 currentPath = new GeneralPath(); 319 currentColor = newColor; 320 currentWidth = newWidth; 321 currentDashed = newDash; 322 currentStroke = null; 323 } 324 } 325 326 /** 327 * Draw the node as small rectangle with the given color. 328 * 329 * @param n The node to draw. 330 * @param color The color of the node. 331 */ 332 public void drawNode(Node n, Color color) { 333 if(isZoomOk(null)) { 334 Point p = nc.getPoint(n.eastNorth); 335 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 336 g.setColor(color); 337 g.drawRect(p.x-1, p.y-1, 2, 2); 338 } 339 } 340 341 // NW 111106 Overridden from SimplePaintVisitor in josm-1.4-nw1 342 // Shows areas before non-areas 343 public void visitAll(DataSet data) { 344 inactiveColor = Preferences.getPreferencesColor("inactive", Color.DARK_GRAY); 345 selectedColor = Preferences.getPreferencesColor("selected", Color.YELLOW); 346 nodeColor = Preferences.getPreferencesColor("node", Color.RED); 347 dfltWayColor = Preferences.getPreferencesColor("way", darkblue); 348 incompleteColor = Preferences.getPreferencesColor("incomplete way", darkerblue); 349 backgroundColor = Preferences.getPreferencesColor("background", Color.BLACK); 350 untaggedColor = Preferences.getPreferencesColor("untagged",Color.GRAY); 351 textColor = Preferences.getPreferencesColor ("text", Color.WHITE); 352 showDirectionArrow = Main.pref.getBoolean("draw.segment.direction"); 353 showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only"); 354 showOrderNumber = Main.pref.getBoolean("draw.segment.order_number"); 355 useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false); 356 zoomLevelDisplay = Main.pref.getBoolean("mappaint.zoomLevelDisplay",false); 357 fillAreas = Main.pref.getBoolean("mappaint.fillareas", true); 358 359 /* XXX - there must be a better way to get a bounded Integer pref! */ 360 try { 361 fillAlpha = Integer.valueOf(Main.pref.get("mappaint.fillalpha", "50")); 362 if (fillAlpha < 0) { 363 fillAlpha = 0; 364 } 365 if (fillAlpha > 255) { 366 fillAlpha = 255; 367 } 368 } catch (NumberFormatException nfe) { 369 fillAlpha = 50; 370 } 371 372 Collection<Way> noAreaWays = new LinkedList<Way>(); 373 374 for (final OsmPrimitive osm : data.ways) 375 if (!osm.incomplete && !osm.deleted && MapPaintStyles.isArea(osm)) 376 osm.visit(this); 377 else if (!osm.deleted && !osm.incomplete) 378 noAreaWays.add((Way)osm); 379 380 for (final OsmPrimitive osm : noAreaWays) 381 osm.visit(this); 382 383 for (final OsmPrimitive osm : data.nodes) 384 if (!osm.incomplete && !osm.deleted) 385 osm.visit(this); 386 387 for (final OsmPrimitive osm : data.getSelected()) 388 if (!osm.incomplete && !osm.deleted){ 389 osm.visit(this); 390 } 391 displaySegments(); 392 } 393 394 /** 395 * Draw an number of the order of the two consecutive nodes within the 396 * parents way 397 */ 398 protected void drawOrderNumber(Node n1, Node n2, int orderNumber) { 399 int strlen = (""+orderNumber).length(); 400 Point p1 = nc.getPoint(n1.eastNorth); 401 Point p2 = nc.getPoint(n2.eastNorth); 402 int x = (p1.x+p2.x)/2 - 4*strlen; 403 int y = (p1.y+p2.y)/2 + 4; 404 405 Rectangle screen = g.getClipBounds(); 406 if ((screen != null) && screen.contains(x,y)) { 407 Color c = g.getColor(); 408 g.setColor(backgroundColor); 409 g.fillRect(x-1, y-12, 8*strlen+1, 14); 410 g.setColor(c); 411 g.drawString(""+orderNumber, x, y); 412 } 413 } 414 415 public void setGraphics(Graphics g) { 416 this.g = g; 417 } 418 419 public void setNavigatableComponent(NavigatableComponent nc) { 420 this.nc = nc; 198 drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, dashed); 199 200 if (showOrderNumber) 201 drawOrderNumber(lastN, n, orderNumber); 202 203 lastN = n; 204 } 205 } 206 207 public void visit(Relation e) { 208 // relations are not (yet?) drawn. 209 } 210 211 // This assumes that all segments are aligned in the same direction! 212 protected void drawWayAsArea(Way w, Color colour) 213 { 214 Polygon polygon = new Polygon(); 215 Point p; 216 // set the opacity (alpha) level of the filled polygon 217 Color coloura = new Color( colour.getRed(), colour.getGreen(), colour.getBlue(), fillAlpha); 218 219 for (Node n : w.nodes) 220 { 221 p = nc.getPoint(n.eastNorth); 222 polygon.addPoint(p.x,p.y); 223 } 224 225 g.setColor( w.selected ? 226 selectedColor : coloura); 227 228 g.fillPolygon(polygon); 229 } 230 231 // NEW 232 protected void drawNode(Node n, ImageIcon icon, boolean annotate) { 233 Point p = nc.getPoint(n.eastNorth); 234 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 235 int w = icon.getIconWidth(), h=icon.getIconHeight(); 236 icon.paintIcon ( Main.map.mapView, g, p.x-w/2, p.y-h/2 ); 237 String name = (n.keys==null) ? null : n.keys.get("name"); 238 if (name!=null && annotate) 239 { 240 g.setColor(textColor); 241 Font defaultFont = g.getFont(); 242 g.setFont (orderFont); 243 g.drawString (name, p.x+w/2+2, p.y+h/2+2); 244 g.setFont(defaultFont); 245 } 246 if (n.selected) 247 { 248 g.setColor ( selectedColor ); 249 g.drawRect (p.x-w/2-2,p.y-w/2-2, w+4, h+4); 250 } 251 } 252 253 /** 254 * Draw a line with the given color. 255 */ 256 protected void drawSegment(Node n1, Node n2, Color col, boolean showDirection) { 257 if (useRealWidth && showDirection) showDirection = false; 258 drawSeg(n1, n2, col, showDirection, 1, false); 259 } 260 261 private void drawSeg(Node n1, Node n2, Color col, boolean showDirection, int width, boolean dashed) { 262 if (col != currentColor || width != currentWidth || dashed != currentDashed) { 263 displaySegments(col, width, dashed); 264 } 265 Point p1 = nc.getPoint(n1.eastNorth); 266 Point p2 = nc.getPoint(n2.eastNorth); 267 268 if (!isSegmentVisible(p1, p2)) { 269 return; 270 } 271 //if (ls.selected) 272 // col = selectedColor; 273 //g.setColor(col); 274 //g.setWidth(width); 275 //if (dashed) 276 // g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0)); 277 //else 278 // g2d.setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); 279 280 //g.drawLine(p1.x, p1.y, p2.x, p2.y); 281 currentPath.moveTo(p1.x, p1.y); 282 currentPath.lineTo(p2.x, p2.y); 283 284 if (showDirection) { 285 double t = Math.atan2(p2.y-p1.y, p2.x-p1.x) + Math.PI; 286 //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 287 //g.drawLine(p2.x,p2.y, (int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 288 currentPath.lineTo((int)(p2.x + 10*Math.cos(t-PHI)), (int)(p2.y + 10*Math.sin(t-PHI))); 289 currentPath.moveTo((int)(p2.x + 10*Math.cos(t+PHI)), (int)(p2.y + 10*Math.sin(t+PHI))); 290 currentPath.lineTo(p2.x, p2.y); 291 } 292 //g2d.setStroke(new BasicStroke(1)); 293 294 } 295 296 protected void displaySegments() { 297 displaySegments(null, 0, false); 298 } 299 300 protected void displaySegments(Color newColor, int newWidth, boolean newDash) { 301 302 if (currentPath != null) { 303 Graphics2D g2d = (Graphics2D)g; 304 g2d.setColor(inactive ? inactiveColor : currentColor); 305 if (currentStroke == null) { 306 if (currentDashed) 307 g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND,0,new float[] {9},0)); 308 else 309 g2d.setStroke(new BasicStroke(currentWidth,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); 310 } 311 g2d.draw(currentPath); 312 g2d.setStroke(new BasicStroke(1)); 313 314 currentPath = new GeneralPath(); 315 currentColor = newColor; 316 currentWidth = newWidth; 317 currentDashed = newDash; 318 currentStroke = null; 319 } 320 } 321 322 /** 323 * Draw the node as small rectangle with the given color. 324 * 325 * @param n The node to draw. 326 * @param color The color of the node. 327 */ 328 public void drawNode(Node n, Color color) { 329 if(isZoomOk(null)) { 330 Point p = nc.getPoint(n.eastNorth); 331 if ((p.x < 0) || (p.y < 0) || (p.x > nc.getWidth()) || (p.y > nc.getHeight())) return; 332 g.setColor(color); 333 g.drawRect(p.x-1, p.y-1, 2, 2); 334 } 335 } 336 337 // NW 111106 Overridden from SimplePaintVisitor in josm-1.4-nw1 338 // Shows areas before non-areas 339 public void visitAll(DataSet data) { 340 inactiveColor = Preferences.getPreferencesColor("inactive", Color.DARK_GRAY); 341 selectedColor = Preferences.getPreferencesColor("selected", Color.YELLOW); 342 nodeColor = Preferences.getPreferencesColor("node", Color.RED); 343 dfltWayColor = Preferences.getPreferencesColor("way", darkblue); 344 incompleteColor = Preferences.getPreferencesColor("incomplete way", darkerblue); 345 backgroundColor = Preferences.getPreferencesColor("background", Color.BLACK); 346 untaggedColor = Preferences.getPreferencesColor("untagged",Color.GRAY); 347 textColor = Preferences.getPreferencesColor ("text", Color.WHITE); 348 showDirectionArrow = Main.pref.getBoolean("draw.segment.direction"); 349 showRelevantDirectionsOnly = Main.pref.getBoolean("draw.segment.relevant_directions_only"); 350 showOrderNumber = Main.pref.getBoolean("draw.segment.order_number"); 351 useRealWidth = Main.pref.getBoolean("mappaint.useRealWidth",false); 352 zoomLevelDisplay = Main.pref.getBoolean("mappaint.zoomLevelDisplay",false); 353 fillAreas = Main.pref.getBoolean("mappaint.fillareas", true); 354 355 /* XXX - there must be a better way to get a bounded Integer pref! */ 356 try { 357 fillAlpha = Integer.valueOf(Main.pref.get("mappaint.fillalpha", "50")); 358 if (fillAlpha < 0) { 359 fillAlpha = 0; 360 } 361 if (fillAlpha > 255) { 362 fillAlpha = 255; 363 } 364 } catch (NumberFormatException nfe) { 365 fillAlpha = 50; 366 } 367 368 Collection<Way> noAreaWays = new LinkedList<Way>(); 369 370 for (final OsmPrimitive osm : data.ways) 371 if (!osm.incomplete && !osm.deleted && MapPaintStyles.isArea(osm)) 372 osm.visit(this); 373 else if (!osm.deleted && !osm.incomplete) 374 noAreaWays.add((Way)osm); 375 376 for (final OsmPrimitive osm : noAreaWays) 377 osm.visit(this); 378 379 for (final OsmPrimitive osm : data.nodes) 380 if (!osm.incomplete && !osm.deleted) 381 osm.visit(this); 382 383 for (final OsmPrimitive osm : data.getSelected()) 384 if (!osm.incomplete && !osm.deleted){ 385 osm.visit(this); 386 } 387 displaySegments(); 388 } 389 390 /** 391 * Draw a number of the order of the two consecutive nodes within the 392 * parents way 393 */ 394 protected void drawOrderNumber(Node n1, Node n2, int orderNumber) { 395 Point p1 = nc.getPoint(n1.eastNorth); 396 Point p2 = nc.getPoint(n2.eastNorth); 397 if (!isSegmentVisible(p1, p2)) { 398 return; 399 } 400 int strlen = (""+orderNumber).length(); 401 int x = (p1.x+p2.x)/2 - 4*strlen; 402 int y = (p1.y+p2.y)/2 + 4; 403 404 Color c = g.getColor(); 405 g.setColor(backgroundColor); 406 g.fillRect(x-1, y-12, 8*strlen+1, 14); 407 g.setColor(c); 408 g.drawString(""+orderNumber, x, y); 409 } 410 411 private boolean isSegmentVisible(Point p1, Point p2) { 412 if ((p1.x < 0) && (p2.x < 0)) return false; 413 if ((p1.y < 0) && (p2.y < 0)) return false; 414 if ((p1.x > nc.getWidth()) && (p2.x > nc.getWidth())) return false; 415 if ((p1.y > nc.getHeight()) && (p2.y > nc.getHeight())) return false; 416 return true; 417 } 418 419 public void setGraphics(Graphics g) { 420 this.g = g; 421 } 422 423 public void setNavigatableComponent(NavigatableComponent nc) { 424 this.nc = nc; 421 425 } 422 426 }
Note:
See TracChangeset
for help on using the changeset viewer.