Changeset 636 in josm for trunk/src/org
- Timestamp:
- 2008-05-12T17:02:08+02:00 (17 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 protected boolean useRealWidth;37 protected boolean zoomLevelDisplay;38 protected boolean fillAreas;39 protected int fillAlpha;40 protected Color untaggedColor;41 protected Color textColor;42 protected boolean currentDashed = false;43 protected int currentWidth = 0;44 protected Stroke currentStroke = null;45 protected static final Font orderFont = new Font("Helvetica", Font.PLAIN, 8);46 47 public boolean inactive;48 49 /**50 * The environment to paint to.51 */52 protected Graphics g;53 54 /**55 * MapView to get screen coordinates.56 */57 protected NavigatableComponent nc;58 59 /**60 * Draw subsequent segments of same color as one Path61 */62 protected Color currentColor = null;63 protected GeneralPath currentPath = new GeneralPath();64 65 protected static final double PHI = Math.toRadians(20);66 67 /**68 * Preferences69 */70 protected Color inactiveColor;71 protected Color selectedColor;72 protected Color nodeColor;73 protected Color dfltWayColor;74 protected Color untaggedWayColor;75 protected Color incompleteColor;76 protected Color backgroundColor;77 protected boolean showDirectionArrow;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 protected boolean showOrderNumber;80 81 public final static Color darkerblue = new Color(0,0,96);82 public final static Color darkblue = new Color(0,0,128);83 84 protected boolean isZoomOk(ElemStyle e) {85 double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter86 87 /* show everything if the user wishes so */88 if (!zoomLevelDisplay) {89 return true;90 }91 92 if (e == null) {93 /* the default for things that don't have a rule (show, if scale is smaller than 1500m) */94 if (circum < 1500)95 return true;96 return false;97 }98 99 // formula to calculate a map scale: natural size / map size = scale100 // example: 876000mm (876m as displayed) / 22mm (roughly estimated screen size of legend bar) = 39818101 //102 // so the exact "correcting value" below depends only on the screen size and resolution103 // XXX - do we need a Preference setting for this (if things vary widely)?104 /*System.out.println(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 if(circum>=e.getMaxScale() / 22 || circum<e.getMinScale() / 22)109 return false;110 return true;111 }112 113 /**114 * Draw a small rectangle.115 * White if selected (as always) or red otherwise.116 *117 * @param n The node to draw.118 */119 public void visit(Node n) {120 ElemStyle nodeStyle = MapPaintStyles.getStyle(n);121 if (nodeStyle!=null) {122 if (nodeStyle instanceof IconElemStyle) {123 if (isZoomOk(nodeStyle)) {124 drawNode(n, ((IconElemStyle)nodeStyle).getIcon(), ((IconElemStyle)nodeStyle).doAnnotate());125 }126 } else {127 // throw some sort of exception128 }129 } else {130 drawNode(n, n.selected ? selectedColor : nodeColor);131 }132 }133 134 /**135 * Draw a line for all segments, according to tags.136 * @param w The way to draw.137 */138 public void visit(Way w) {139 double circum = Main.map.mapView.getScale()*100*Main.proj.scaleFactor()*40041455; // circumference of the earth in meter106 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 boolean showDirection = w.selected ||140 boolean showDirection = w.selected || 143 141 ((!useRealWidth) && (showDirectionArrow 144 142 && (!showRelevantDirectionsOnly || w.hasDirectionKeys))); 145 143 146 Color colour = untaggedColor;147 int width = 2;148 int realWidth = 0; //the real width of the element in meters149 boolean dashed = false;150 boolean area = false;151 ElemStyle wayStyle = MapPaintStyles.getStyle(w);152 153 if(!isZoomOk(wayStyle)) {154 return;155 }156 157 if(wayStyle!=null)158 {159 if(wayStyle instanceof LineElemStyle)160 {161 colour = ((LineElemStyle)wayStyle).colour;162 width = ((LineElemStyle)wayStyle).width;163 realWidth = ((LineElemStyle)wayStyle).realWidth;164 dashed = ((LineElemStyle)wayStyle).dashed;165 }166 else if (wayStyle instanceof AreaElemStyle)167 {168 colour = ((AreaElemStyle)wayStyle).getColour();169 area = true;170 }171 }172 173 if (area && fillAreas)174 drawWayAsArea(w, colour);175 int orderNumber = 0;176 177 Node lastN = null;178 for (Node n : w.nodes) {179 if (lastN == null) {180 lastN = n;181 continue;182 }183 orderNumber++;184 185 if (area && fillAreas) {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 if (showDirection)188 drawSeg(lastN, n, w.selected ? selectedColor : untaggedColor, showDirection, width, true);189 } else {190 if (area) {191 drawSeg(lastN, n, w.selected ? selectedColor : colour, showDirection, width, true);192 } else {193 if (realWidth > 0 && useRealWidth && !showDirection) {194 int tmpWidth = (int) (100 / (float) (circum / realWidth));195 if (tmpWidth > width) width = tmpWidth;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.
