Ticket #16809: v1-0004-SlippyMapBBoxChooser-add-ability-to-listen-for-la.patch
| File v1-0004-SlippyMapBBoxChooser-add-ability-to-listen-for-la.patch, 9.6 KB (added by , 7 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
From 9e2e551a0afeee267151d0f84fe7bd66eff5f8a5 Mon Sep 17 00:00:00 2001 From: Robert Scott <code@humanleg.org.uk> Date: Sat, 6 Oct 2018 12:27:38 +0100 Subject: [PATCH v1 4/4] SlippyMapBBoxChooser: add ability to listen for layer additions & removals, triggering refreshTileSources hook this up for MiniMapDialog. most other SlippyMapBBoxChooser uses in josm aren't really long-lived enough for this to be worth it. --- .../josm/gui/bbox/SlippyMapBBoxChooser.java | 20 ++- .../josm/gui/dialogs/MinimapDialog.java | 1 + .../josm/gui/dialogs/MinimapDialogTest.java | 138 +++++++++++++++++++-- 3 files changed, 149 insertions(+), 10 deletions(-) diff --git a/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java b/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java index 821065de6..e4344b220 100644
a b import org.openstreetmap.josm.tools.Logging; 63 63 /** 64 64 * This panel displays a map and lets the user chose a {@link BBox}. 65 65 */ 66 public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, ChangeListener, MainLayerManager.ActiveLayerChangeListener { 67 66 public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, ChangeListener, MainLayerManager.ActiveLayerChangeListener, MainLayerManager.LayerChangeListener { 68 67 /** 69 68 * A list of tile sources that can be used for displaying the map. 70 69 */ … … public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, Cha 449 448 450 449 this.iSourceButton.setSources(new ArrayList<>(newTileSources.values())); 451 450 } 451 452 @Override 453 public void layerAdded(MainLayerManager.LayerAddEvent e) { 454 if (e.getAddedLayer() instanceof ImageryLayer) { 455 this.refreshTileSources(); 456 } 457 } 458 459 @Override 460 public void layerRemoving(MainLayerManager.LayerRemoveEvent e) { 461 if (e.getRemovedLayer() instanceof ImageryLayer) { 462 this.refreshTileSources(); 463 } 464 } 465 466 @Override 467 public void layerOrderChanged(MainLayerManager.LayerOrderChangeEvent e) {} 452 468 } -
src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java index 26248164b..509b4a3e4 100644
a b public class MinimapDialog extends ToggleDialog implements NavigatableComponent. 37 37 createLayout(slippyMap, false, Collections.emptyList()); 38 38 slippyMap.setSizeButtonVisible(false); 39 39 slippyMap.addPropertyChangeListener(BBoxChooser.BBOX_PROP, this); 40 MainApplication.getLayerManager().addLayerChangeListener(slippyMap); 40 41 } 41 42 42 43 @Override -
test/unit/org/openstreetmap/josm/gui/dialogs/MinimapDialogTest.java
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/MinimapDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/MinimapDialogTest.java index 8d33d3f2a..69103a30b 100644
a b 2 2 package org.openstreetmap.josm.gui.dialogs; 3 3 4 4 import static java.util.concurrent.TimeUnit.MILLISECONDS; 5 import static org.junit.Assert.assertArrayEquals; 5 6 import static org.junit.Assert.assertEquals; 6 7 import static org.junit.Assert.assertFalse; 7 8 import static org.junit.Assert.assertTrue; … … import java.awt.Component; 13 14 import java.awt.Graphics2D; 14 15 import java.awt.event.ComponentEvent; 15 16 import java.awt.image.BufferedImage; 17 import java.util.ArrayList; 16 18 import java.util.Arrays; 17 19 import java.util.Map; 18 20 import java.util.Objects; … … public class MinimapDialogTest { 130 132 } 131 133 } 132 134 135 protected void assertSourceLabelsVisible(final String... labels) { 136 GuiHelper.runInEDTAndWaitWithException(() -> { 137 final ArrayList<String> menuLabels = new ArrayList<>(); 138 final JPopupMenu menu = this.sourceButton.getPopupMenu(); 139 for (Component c: menu.getComponents()) { 140 if (c instanceof JPopupMenu.Separator) { 141 break; 142 } 143 menuLabels.add(((JMenuItem) c).getText()); 144 } 145 146 assertArrayEquals( 147 labels, 148 menuLabels.toArray() 149 ); 150 }); 151 } 152 133 153 private MinimapDialog minimap; 134 154 private SlippyMapBBoxChooser slippyMap; 135 155 private SourceButton sourceButton; … … public class MinimapDialogTest { 302 322 // relevant prefs starting out empty, should choose the first (ImageryLayerInfo) source and have shown download area enabled 303 323 // (not that there's a data layer for it to use) 304 324 305 // first we will remove "Green Tiles" from ImageryLayerInfo 306 final ImageryInfo greenTilesInfo = ImageryLayerInfo.instance.getLayers().stream().filter( 307 i -> i.getName().equals("Green Tiles") 325 final ImageryInfo magentaTilesInfo = ImageryLayerInfo.instance.getLayers().stream().filter( 326 i -> i.getName().equals("Magenta Tiles") 327 ).findAny().get(); 328 final ImageryInfo blackTilesInfo = ImageryLayerInfo.instance.getLayers().stream().filter( 329 i -> i.getName().equals("Black Tiles") 308 330 ).findAny().get(); 309 ImageryLayerInfo.instance.remove(greenTilesInfo);310 331 311 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().addLayer(ImageryLayer.create(greenTilesInfo))); 332 // first we will remove "Magenta Tiles" from ImageryLayerInfo 333 ImageryLayerInfo.instance.remove(magentaTilesInfo); 312 334 313 335 this.setUpMiniMap(); 314 336 315 this.clickSourceMenuItemByLabel("Green Tiles"); 316 this.assertSingleSelectedSourceLabel("Green Tiles"); 337 assertSourceLabelsVisible( 338 "White Tiles", 339 "Black Tiles", 340 "Green Tiles" 341 ); 342 343 final ImageryLayer magentaTilesLayer = ImageryLayer.create(magentaTilesInfo); 344 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().addLayer(magentaTilesLayer)); 345 346 assertSourceLabelsVisible( 347 "White Tiles", 348 "Black Tiles", 349 "Green Tiles", 350 "Magenta Tiles" 351 ); 352 353 this.clickSourceMenuItemByLabel("Magenta Tiles"); 354 this.assertSingleSelectedSourceLabel("Magenta Tiles"); 317 355 318 356 // call paint to trigger new tile fetch 319 357 this.paintSlippyMap(); … … public class MinimapDialogTest { 322 360 323 361 this.paintSlippyMap(); 324 362 325 assertEquals(0xff00ff00, paintedSlippyMap.getRGB(0, 0)); 363 assertEquals(0xffff00ff, paintedSlippyMap.getRGB(0, 0)); 364 365 final ImageryLayer blackTilesLayer = ImageryLayer.create(blackTilesInfo); 366 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().addLayer(blackTilesLayer)); 367 368 assertSourceLabelsVisible( 369 "White Tiles", 370 "Black Tiles", 371 "Green Tiles", 372 "Magenta Tiles" 373 ); 374 375 this.clickSourceMenuItemByLabel("Black Tiles"); 376 this.assertSingleSelectedSourceLabel("Black Tiles"); 377 378 // call paint to trigger new tile fetch 379 this.paintSlippyMap(); 380 381 Awaitility.await().atMost(1000, MILLISECONDS).until(this.slippyMapTasksFinished); 382 383 this.paintSlippyMap(); 384 385 assertEquals(0xff000000, paintedSlippyMap.getRGB(0, 0)); 386 387 // removing magentaTilesLayer while it is *not* the selected TileSource should make it disappear 388 // immediately 389 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().removeLayer(magentaTilesLayer)); 390 391 assertSourceLabelsVisible( 392 "White Tiles", 393 "Black Tiles", 394 "Green Tiles" 395 ); 396 this.assertSingleSelectedSourceLabel("Black Tiles"); 397 398 final ImageryLayer magentaTilesLayer2 = ImageryLayer.create(magentaTilesInfo); 399 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().addLayer(magentaTilesLayer2)); 400 401 assertSourceLabelsVisible( 402 "White Tiles", 403 "Black Tiles", 404 "Green Tiles", 405 "Magenta Tiles" 406 ); 407 408 this.clickSourceMenuItemByLabel("Magenta Tiles"); 409 this.assertSingleSelectedSourceLabel("Magenta Tiles"); 410 411 // call paint to trigger new tile fetch 412 this.paintSlippyMap(); 413 414 Awaitility.await().atMost(1000, MILLISECONDS).until(this.slippyMapTasksFinished); 415 416 this.paintSlippyMap(); 417 418 assertEquals(0xffff00ff, paintedSlippyMap.getRGB(0, 0)); 419 420 // removing magentaTilesLayer while it *is* the selected TileSource... 421 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().removeLayer(magentaTilesLayer2)); 422 423 assertSourceLabelsVisible( 424 "White Tiles", 425 "Black Tiles", 426 "Green Tiles", 427 "Magenta Tiles" 428 ); 429 this.assertSingleSelectedSourceLabel("Magenta Tiles"); 430 431 this.clickSourceMenuItemByLabel("Green Tiles"); 432 this.assertSingleSelectedSourceLabel("Green Tiles"); 433 assertSourceLabelsVisible( 434 "White Tiles", 435 "Black Tiles", 436 "Green Tiles" 437 ); 438 439 // removing blackTilesLayer shouldn't remove it from the menu as it is already in ImageryLayerInfo 440 GuiHelper.runInEDT(() -> MainApplication.getLayerManager().removeLayer(blackTilesLayer)); 441 442 this.assertSingleSelectedSourceLabel("Green Tiles"); 443 assertSourceLabelsVisible( 444 "White Tiles", 445 "Black Tiles", 446 "Green Tiles" 447 ); 326 448 } 327 449 328 450 /**
