Changeset 18586 in josm


Ignore:
Timestamp:
2022-11-07T21:46:03+01:00 (18 months ago)
Author:
taylor.smock
Message:

Fix #22487: Object hover preview is re-enabled on layer change even when disabled in properties (patch by Woazboat, modified)

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

    r18576 r18586  
    895895        if (newLayer != null) {
    896896            newLayer.addPropertyChangeListener(this);
    897             if (newLayer.isVisible()) {
     897            if (newLayer.isVisible() && Boolean.TRUE.equals(PROP_PREVIEW_ON_HOVER.get())) {
    898898                MainApplication.getMap().mapView.addPrimitiveHoverListener(this);
    899899            } else {
     
    909909
    910910            // Disable hover preview when primitives are invisible
    911             if (isVisible) {
     911            if (isVisible && Boolean.TRUE.equals(PROP_PREVIEW_ON_HOVER.get())) {
    912912                MainApplication.getMap().mapView.addPrimitiveHoverListener(this);
    913913            } else {
  • trunk/test/unit/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialogTest.java

    r18037 r18586  
    33
    44import static org.junit.jupiter.api.Assertions.assertEquals;
     5import static org.junit.jupiter.api.Assertions.assertFalse;
     6import static org.junit.jupiter.api.Assertions.assertTrue;
    57
     8import java.lang.reflect.Field;
    69import java.util.ArrayList;
    710import java.util.List;
     11import java.util.concurrent.CopyOnWriteArrayList;
     12import java.util.stream.Stream;
    813
     14import org.junit.jupiter.api.Test;
     15import org.junit.jupiter.api.extension.RegisterExtension;
     16import org.junit.jupiter.params.ParameterizedTest;
     17import org.junit.jupiter.params.provider.Arguments;
     18import org.junit.jupiter.params.provider.MethodSource;
    919import org.openstreetmap.josm.data.coor.LatLon;
     20import org.openstreetmap.josm.data.osm.DataSet;
    1021import org.openstreetmap.josm.data.osm.Node;
    1122import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1223import org.openstreetmap.josm.data.osm.Way;
     24import org.openstreetmap.josm.gui.MainApplication;
     25import org.openstreetmap.josm.gui.NavigatableComponent;
     26import org.openstreetmap.josm.gui.PrimitiveHoverListener;
     27import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     28import org.openstreetmap.josm.testutils.JOSMTestRules;
    1329import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
    14 
    15 import org.junit.jupiter.api.Test;
     30import org.openstreetmap.josm.tools.ReflectionUtils;
    1631
    1732/**
     
    2035@BasicPreferences
    2136class PropertiesDialogTest {
     37    @RegisterExtension
     38    static JOSMTestRules rules = new JOSMTestRules().main().projection();
     39
    2240    private static String createSearchSetting(List<OsmPrimitive> sel, boolean sameType) {
    2341        return PropertiesDialog.createSearchSetting("foo", sel, sameType).text;
     
    5472        assertEquals("(type:way \"foo\"=\"bar\") OR (type:node \"foo\"=\"bar\")", createSearchSetting(sel, true));
    5573    }
     74
     75    static Stream<Arguments> testTicket22487() {
     76        return Stream.of(
     77                Arguments.of("Layer add", (Runnable) () ->
     78                        MainApplication.getLayerManager().addLayer(new OsmDataLayer(new DataSet(), "testTicket22487-layerAdd", null))),
     79                Arguments.of("Layer hide", (Runnable) () -> {
     80                    // We need to toggle the layer visibility to hit the bug.
     81                    MainApplication.getLayerManager().getLayers().forEach(layer -> layer.setVisible(false));
     82                    MainApplication.getLayerManager().getLayers().forEach(layer -> layer.setVisible(true));
     83                })
     84        );
     85    }
     86
     87    @ParameterizedTest
     88    @MethodSource
     89    void testTicket22487(String ignored_title, Runnable action) throws ReflectiveOperationException {
     90        Field primitiveHoverListenersField = NavigatableComponent.class.getDeclaredField("primitiveHoverListeners");
     91        ReflectionUtils.setObjectsAccessible(primitiveHoverListenersField);
     92
     93        DataSet ds = new DataSet();
     94        OsmDataLayer layer = new OsmDataLayer(ds, "testTicket22487", null);
     95        // Ensure that the navigatable component is set up
     96        MainApplication.getLayerManager().addLayer(layer);
     97        PropertiesDialog propertiesDialog = MainApplication.getMap().propertiesDialog;
     98        @SuppressWarnings("unchecked")
     99        CopyOnWriteArrayList<PrimitiveHoverListener> listeners =
     100                (CopyOnWriteArrayList<PrimitiveHoverListener>) primitiveHoverListenersField.get(MainApplication.getMap().mapView);
     101        assertTrue(listeners.contains(propertiesDialog));
     102
     103        // Set the properties to false
     104        PropertiesDialog.PROP_PREVIEW_ON_HOVER.put(false);
     105        assertFalse(listeners.contains(propertiesDialog));
     106
     107        action.run();
     108        assertFalse(listeners.contains(propertiesDialog));
     109    }
    56110}
Note: See TracChangeset for help on using the changeset viewer.