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 ris, 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;  
    6363/**
    6464 * This panel displays a map and lets the user chose a {@link BBox}.
    6565 */
    66 public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, ChangeListener, MainLayerManager.ActiveLayerChangeListener {
    67 
     66public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, ChangeListener, MainLayerManager.ActiveLayerChangeListener, MainLayerManager.LayerChangeListener {
    6867    /**
    6968     * A list of tile sources that can be used for displaying the map.
    7069     */
    public class SlippyMapBBoxChooser extends JMapViewer implements BBoxChooser, Cha  
    449448
    450449        this.iSourceButton.setSources(new ArrayList<>(newTileSources.values()));
    451450    }
     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) {}
    452468}
  • 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.  
    3737        createLayout(slippyMap, false, Collections.emptyList());
    3838        slippyMap.setSizeButtonVisible(false);
    3939        slippyMap.addPropertyChangeListener(BBoxChooser.BBOX_PROP, this);
     40        MainApplication.getLayerManager().addLayerChangeListener(slippyMap);
    4041    }
    4142
    4243    @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  
    22package org.openstreetmap.josm.gui.dialogs;
    33
    44import static java.util.concurrent.TimeUnit.MILLISECONDS;
     5import static org.junit.Assert.assertArrayEquals;
    56import static org.junit.Assert.assertEquals;
    67import static org.junit.Assert.assertFalse;
    78import static org.junit.Assert.assertTrue;
    import java.awt.Component;  
    1314import java.awt.Graphics2D;
    1415import java.awt.event.ComponentEvent;
    1516import java.awt.image.BufferedImage;
     17import java.util.ArrayList;
    1618import java.util.Arrays;
    1719import java.util.Map;
    1820import java.util.Objects;
    public class MinimapDialogTest {  
    130132        }
    131133    }
    132134
     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
    133153    private MinimapDialog minimap;
    134154    private SlippyMapBBoxChooser slippyMap;
    135155    private SourceButton sourceButton;
    public class MinimapDialogTest {  
    302322        // relevant prefs starting out empty, should choose the first (ImageryLayerInfo) source and have shown download area enabled
    303323        // (not that there's a data layer for it to use)
    304324
    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")
    308330        ).findAny().get();
    309         ImageryLayerInfo.instance.remove(greenTilesInfo);
    310331
    311         GuiHelper.runInEDT(() -> MainApplication.getLayerManager().addLayer(ImageryLayer.create(greenTilesInfo)));
     332        // first we will remove "Magenta Tiles" from ImageryLayerInfo
     333        ImageryLayerInfo.instance.remove(magentaTilesInfo);
    312334
    313335        this.setUpMiniMap();
    314336
    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");
    317355
    318356        // call paint to trigger new tile fetch
    319357        this.paintSlippyMap();
    public class MinimapDialogTest {  
    322360
    323361        this.paintSlippyMap();
    324362
    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        );
    326448    }
    327449
    328450    /**