Changeset 4270 in josm for trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
- Timestamp:
- 2011-07-27T20:41:25+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
r4250 r4270 26 26 import java.util.Collections; 27 27 import java.util.Comparator; 28 import java.util.Date; 29 import java.util.HashMap; 28 30 import java.util.LinkedList; 29 31 import java.util.List; 32 import java.util.Map; 30 33 import java.util.concurrent.Future; 31 34 … … 34 37 import javax.swing.Box; 35 38 import javax.swing.ButtonGroup; 39 import javax.swing.ButtonModel; 36 40 import javax.swing.Icon; 37 41 import javax.swing.JFileChooser; … … 70 74 import org.openstreetmap.josm.gui.layer.markerlayer.AudioMarker; 71 75 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 76 import org.openstreetmap.josm.gui.preferences.GPXSettingsPanel; 72 77 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 73 78 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor; … … 230 235 public colorModes getColorMode() { 231 236 try { 232 return colorModes.values()[Main.pref.getInteger("draw.rawgps.colors", "layer "+getName(), 0)]; 237 int i=Main.pref.getInteger("draw.rawgps.colors", "layer " + getName(), 0); 238 return colorModes.values()[i]; 233 239 } catch (Exception e) { 234 240 } … … 249 255 SeparatorLayerAction.INSTANCE, 250 256 new CustomizeColor(this), 251 new Customize LineDrawing(this),257 new CustomizeDrawing(this), 252 258 new ConvertToDataLayerAction(), 253 259 SeparatorLayerAction.INSTANCE, … … 262 268 new LayerSaveAsAction(this), 263 269 new CustomizeColor(this), 264 new Customize LineDrawing(this),270 new CustomizeDrawing(this), 265 271 new ImportImages(), 266 272 new ImportAudio(), … … 376 382 // the different color modes 377 383 enum colorModes { 378 none, velocity, dilution, direction 384 none, velocity, dilution, direction, time 379 385 } 380 386 … … 394 400 // Long startTime = System.currentTimeMillis(); 395 401 Color neutralColor = getColor(true); 402 String spec="layer "+getName(); 403 396 404 // also draw lines between points belonging to different segments 397 boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", "layer "+getName(), false);405 boolean forceLines = Main.pref.getBoolean("draw.rawgps.lines.force", spec, false); 398 406 // draw direction arrows on the lines 399 boolean direction = Main.pref.getBoolean("draw.rawgps.direction", "layer "+getName(), false);407 boolean direction = Main.pref.getBoolean("draw.rawgps.direction", spec, false); 400 408 // don't draw lines if longer than x meters 401 int lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", "layer "+getName(), 0);409 int lineWidth = Main.pref.getInteger("draw.rawgps.linewidth", spec, 0); 402 410 403 411 int maxLineLength; 404 412 boolean lines; 405 413 if (this.isLocalFile) { 406 maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", "layer "+getName(), -1);407 lines = Main.pref.getBoolean("draw.rawgps.lines.local", "layer "+getName(), true);414 maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length.local", spec, -1); 415 lines = Main.pref.getBoolean("draw.rawgps.lines.local", spec, true); 408 416 } else { 409 maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", "layer "+getName(), 200);410 lines = Main.pref.getBoolean("draw.rawgps.lines", "layer "+getName(), true);417 maxLineLength = Main.pref.getInteger("draw.rawgps.max-line-length", spec, 200); 418 lines = Main.pref.getBoolean("draw.rawgps.lines", spec, true); 411 419 } 412 420 // paint large dots for points 413 boolean large = Main.pref.getBoolean("draw.rawgps.large", "layer "+getName(), false);414 int largesize = Main.pref.getInteger("draw.rawgps.large.size", "layer "+getName(), 3);415 boolean hdopcircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", "layer "+getName(), false);421 boolean large = Main.pref.getBoolean("draw.rawgps.large", spec, false); 422 int largesize = Main.pref.getInteger("draw.rawgps.large.size", spec, 3); 423 boolean hdopcircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", spec, false); 416 424 // color the lines 417 425 colorModes colored = getColorMode(); 418 426 // paint direction arrow with alternate math. may be faster 419 boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", "layer "+getName(), false);427 boolean alternatedirection = Main.pref.getBoolean("draw.rawgps.alternatedirection", spec, false); 420 428 // don't draw arrows nearer to each other than this 421 int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", "layer "+getName(), 40);429 int delta = Main.pref.getInteger("draw.rawgps.min-arrow-distance", spec, 40); 422 430 // allows to tweak line coloring for different speed levels. 423 int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", "layer "+getName(), 45);424 boolean colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", "layer "+getName(), false);431 int colorTracksTune = Main.pref.getInteger("draw.rawgps.colorTracksTune", spec, 45); 432 boolean colorModeDynamic = Main.pref.getBoolean("draw.rawgps.colors.dynamic", spec, false); 425 433 int hdopfactor = Main.pref.getInteger("hdop.factor", 25); 426 434 … … 448 456 ****************************************************************/ 449 457 if (!computeCacheInSync) { // don't compute if the cache is good 450 Floatminval =null;451 Floatmaxval =null;458 double minval = +1e10; 459 double maxval = -1e10; 452 460 WayPoint oldWp = null; 453 461 if (colorModeDynamic) { … … 462 470 } 463 471 if (oldWp != null && trkPnt.time > oldWp.time) { 464 Float vel = new Float(c.greatCircleDistance(oldWp.getCoor()) / (trkPnt.time - oldWp.time)); 465 if(maxval == null || vel > maxval) maxval = vel; 466 if(minval == null || vel < minval) minval = vel; 472 double vel = c.greatCircleDistance(oldWp.getCoor()) 473 / (trkPnt.time - oldWp.time); 474 if(vel > maxval) maxval = vel; 475 if(vel < minval) minval = vel; 467 476 } 468 477 oldWp = trkPnt; … … 476 485 Object val = trkPnt.attr.get("hdop"); 477 486 if (val != null) { 478 Floathdop = (Float) val;479 if( maxval == null ||hdop > maxval) maxval = hdop;480 if( minval == null ||hdop < minval) minval = hdop;487 double hdop = ((Float) val).doubleValue(); 488 if(hdop > maxval) maxval = hdop; 489 if(hdop < minval) minval = hdop; 481 490 } 482 491 } … … 486 495 oldWp = null; 487 496 } 497 if (colored == colorModes.time) { 498 for (GpxTrack trk : data.tracks) { 499 for (GpxTrackSegment segment : trk.getSegments()) { 500 for (WayPoint trkPnt : segment.getWayPoints()) { 501 double t=trkPnt.time; 502 if (t==0) continue; // skip non-dated trackpoints 503 if(t > maxval) maxval = t; 504 if(t < minval) minval = t; 505 } 506 } 507 } 508 } 509 488 510 for (GpxTrack trk : data.tracks) { 489 511 for (GpxTrackSegment segment : trk.getSegments()) { … … 499 521 if(colored == colorModes.dilution && trkPnt.attr.get("hdop") != null) { 500 522 float hdop = ((Float) trkPnt.attr.get("hdop")).floatValue(); 501 int hdoplvl = Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval)) 523 int hdoplvl =(int) Math.round(colorModeDynamic ? ((hdop-minval)*255/(maxval-minval)) 502 524 : (hdop <= 0 ? 0 : hdop * hdopfactor)); 503 525 // High hdop is bad, but high values in colors are green. … … 508 530 if (oldWp != null) { 509 531 double dist = c.greatCircleDistance(oldWp.getCoor()); 510 532 boolean noDraw=false; 511 533 switch (colored) { 512 534 case velocity: … … 514 536 if(dtime > 0) { 515 537 float vel = (float) (dist / dtime); 516 int velColor = Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval)) 538 int velColor =(int) Math.round(colorModeDynamic ? ((vel-minval)*255/(maxval-minval)) 517 539 : (vel <= 0 ? 0 : vel / colorTracksTune * 255)); 518 540 trkPnt.customColoring = colors[velColor > 255 ? 255 : velColor]; … … 530 552 } 531 553 break; 554 case time: 555 if (trkPnt.time>0){ 556 int tColor = (int) Math.round((trkPnt.time-minval)*255/(maxval-minval)); 557 trkPnt.customColoring = colors[tColor]; 558 } else { 559 trkPnt.customColoring = neutralColor; 560 } 561 break; 532 562 } 533 534 if (maxLineLength == -1 || dist <= maxLineLength) { 563 564 if (!noDraw && (maxLineLength == -1 || dist <= maxLineLength)) { 535 565 trkPnt.drawLine = true; 536 566 trkPnt.dir = (int) oldWp.getCoor().heading(trkPnt.getCoor()); … … 1338 1368 } 1339 1369 1340 private class Customize LineDrawing extends AbstractAction implements LayerAction, MultiLayerAction {1370 private class CustomizeDrawing extends AbstractAction implements LayerAction, MultiLayerAction { 1341 1371 List<Layer> layers; 1342 1372 1343 public Customize LineDrawing(List<Layer> l) {1373 public CustomizeDrawing(List<Layer> l) { 1344 1374 this(); 1345 1375 layers = l; 1346 1376 } 1347 1377 1348 public Customize LineDrawing(Layer l) {1378 public CustomizeDrawing(Layer l) { 1349 1379 this(); 1350 1380 layers = new LinkedList<Layer>(); … … 1352 1382 } 1353 1383 1354 private Customize LineDrawing() {1355 super(tr("Customize linedrawing"), ImageProvider.get("mapmode/addsegment"));1384 private CustomizeDrawing() { 1385 super(tr("Customize track drawing"), ImageProvider.get("mapmode/addsegment")); 1356 1386 } 1357 1387 … … 1372 1402 @Override 1373 1403 public Action getMultiLayerAction(List<Layer> layers) { 1374 return new Customize LineDrawing(layers);1404 return new CustomizeDrawing(layers); 1375 1405 } 1376 1406 1377 1407 @Override 1378 1408 public void actionPerformed(ActionEvent e) { 1379 /* FIXME: Add all the other GPX settings here as well. Unify with DrawingPreferences 1380 Each option should be able to "use global settings". Attention with the handling 1381 of local layer for the two local layer options! */ 1382 JRadioButton[] r = new JRadioButton[3]; 1383 r[0] = new JRadioButton(tr("Use global settings.")); 1384 r[1] = new JRadioButton(tr("Draw lines between points for this layer.")); 1385 r[2] = new JRadioButton(tr("Do not draw lines between points for this layer.")); 1386 ButtonGroup group = new ButtonGroup(); 1387 Box panel = Box.createVerticalBox(); 1388 for (JRadioButton b : r) { 1389 group.add(b); 1390 panel.add(b); 1391 } 1392 String propbase = isLocalFile ? "draw.rawgps.lines.local" : "draw.rawgps.lines"; 1393 String propName = propbase + ".layer " + layers.get(0).getName(); 1394 if (Main.pref.hasKey(propName)) { 1395 group.setSelected(r[Main.pref.getBoolean(propName) ? 1 : 2].getModel(), true); 1396 } else { 1397 group.setSelected(r[0].getModel(), true); 1398 } 1409 GPXSettingsPanel panel=new GPXSettingsPanel(getName()); 1399 1410 int answer = JOptionPane.showConfirmDialog(Main.parent, panel, 1400 tr("Select line drawing options"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); 1401 switch (answer) { 1402 case JOptionPane.CANCEL_OPTION: 1403 case JOptionPane.CLOSED_OPTION: 1404 return; 1405 default: 1406 // continue 1407 } 1411 tr("Customize track drawing"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); 1412 if (answer == JOptionPane.CANCEL_OPTION || answer == JOptionPane.CLOSED_OPTION) return; 1408 1413 for(Layer layer : layers) { 1409 propName = propbase + ".layer " + layer.getName(); 1410 if (group.getSelection() == r[0].getModel()) { 1411 Main.pref.put(propName, null); 1412 } else { 1413 Main.pref.put(propName, group.getSelection() == r[1].getModel()); 1414 } 1414 // save preferences for all layers 1415 panel.savePreferences(layer.getName()); 1415 1416 } 1416 1417 Main.map.repaint(); … … 1418 1419 } 1419 1420 1420 private class MarkersFromNamedPoins extends AbstractAction { 1421 private class MarkersFromNamedPoins extends AbstractAction { 1421 1422 1422 1423 public MarkersFromNamedPoins() {
Note:
See TracChangeset
for help on using the changeset viewer.
