Ticket #16485: 16485.patch

File 16485.patch, 9.0 KB (added by taylor.smock, 2 years ago)
  • new file core/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java

    Subject: [PATCH] Fix #16485: Ensure windows lose always-on-top status when JOSM loses focus
    ---
    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/core/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java b/core/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java
    new file mode 100644
    - +  
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.gui.util;
     3
     4import java.awt.Dialog;
     5import java.awt.Window;
     6import java.awt.event.WindowEvent;
     7import java.awt.event.WindowFocusListener;
     8
     9import javax.swing.event.AncestorEvent;
     10import javax.swing.event.AncestorListener;
     11
     12/**
     13 * A listener for windows that block other inputs, to ensure they are always on top
     14 * @since xxx
     15 */
     16public class WindowOnTopListener implements AncestorListener, WindowFocusListener {
     17
     18    /**
     19     * {@code true} indicates that the window was always on top prior to the change
     20     */
     21    private boolean wasAlwaysOnTop;
     22    @Override
     23    public void windowGainedFocus(WindowEvent e) {
     24        final Window window = e.getWindow();
     25        if (window != null && window.isAlwaysOnTop() != wasAlwaysOnTop) {
     26            window.setAlwaysOnTop(wasAlwaysOnTop);
     27        }
     28    }
     29
     30    @Override
     31    public void windowLostFocus(WindowEvent e) {
     32        final Window window = e.getWindow();
     33        if (window != null) {
     34            wasAlwaysOnTop = window.isAlwaysOnTop();
     35        }
     36    }
     37
     38    @Override
     39    public void ancestorAdded(AncestorEvent event) {
     40        if (event.getAncestor() instanceof Dialog) {
     41            Dialog dialog = (Dialog) event.getAncestor();
     42            wasAlwaysOnTop = dialog.isAlwaysOnTop();
     43            if (dialog.isVisible() && dialog.isModal()) {
     44                dialog.setAlwaysOnTop(true);
     45            }
     46        }
     47        if (event.getAncestor() instanceof Window) {
     48            Window window = (Window) event.getAncestor();
     49            window.addWindowFocusListener(this);
     50        }
     51    }
     52
     53    @Override
     54    public void ancestorRemoved(AncestorEvent event) {
     55        if (event.getAncestor() instanceof Dialog) {
     56            Dialog dialog = (Dialog) event.getAncestor();
     57            if (dialog.isVisible() && dialog.isModal()) {
     58                dialog.setAlwaysOnTop(wasAlwaysOnTop);
     59            }
     60        }
     61        if (event.getAncestor() instanceof Window) {
     62            Window window = (Window) event.getAncestor();
     63            window.removeWindowFocusListener(this);
     64        }
     65    }
     66
     67    @Override
     68    public void ancestorMoved(AncestorEvent event) {
     69        // Do nothing
     70    }
     71}
  • core/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/core/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java b/core/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java
    a b  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.awt.Component;
    7 import java.awt.Dialog;
    87import java.awt.GridBagLayout;
    98import java.util.HashMap;
    109import java.util.HashSet;
     
    1514import javax.swing.JOptionPane;
    1615import javax.swing.JPanel;
    1716import javax.swing.JRadioButton;
    18 import javax.swing.event.AncestorEvent;
    19 import javax.swing.event.AncestorListener;
    2017
     18import org.openstreetmap.josm.gui.util.WindowOnTopListener;
    2119import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
    2220import org.openstreetmap.josm.spi.preferences.Config;
    2321import org.openstreetmap.josm.tools.GBC;
     
    287285            }
    288286            add(cbStandard, GBC.eol());
    289287
    290             this.addAncestorListener(new AncestorListener() {
    291                 boolean wasAlwaysOnTop;
    292                 @Override
    293                 public void ancestorAdded(AncestorEvent event) {
    294                     if (event.getAncestor() instanceof Dialog) {
    295                         Dialog dialog = (Dialog) event.getAncestor();
    296                         wasAlwaysOnTop = dialog.isAlwaysOnTop();
    297                         if (dialog.isVisible() && dialog.isModal()) {
    298                             dialog.setAlwaysOnTop(true);
    299                         }
    300                     }
    301                 }
    302 
    303                 @Override
    304                 public void ancestorRemoved(AncestorEvent event) {
    305                     if (event.getAncestor() instanceof Dialog) {
    306                         Dialog dialog = (Dialog) event.getAncestor();
    307                         if (dialog.isVisible() && dialog.isModal()) {
    308                             dialog.setAlwaysOnTop(wasAlwaysOnTop);
    309                         }
    310                     }
    311                 }
    312 
    313                 @Override
    314                 public void ancestorMoved(AncestorEvent event) {
    315                     // Do nothing
    316                 }
    317             });
     288            this.addAncestorListener(new WindowOnTopListener());
    318289        }
    319290
    320291        NotShowAgain getNotShowAgain() {
  • core/src/org/openstreetmap/josm/gui/ExtendedDialog.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/core/src/org/openstreetmap/josm/gui/ExtendedDialog.java b/core/src/org/openstreetmap/josm/gui/ExtendedDialog.java
    a b  
    3535import org.openstreetmap.josm.gui.help.HelpUtil;
    3636import org.openstreetmap.josm.gui.util.GuiHelper;
    3737import org.openstreetmap.josm.gui.util.WindowGeometry;
     38import org.openstreetmap.josm.gui.util.WindowOnTopListener;
    3839import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
    3940import org.openstreetmap.josm.io.NetworkManager;
    4041import org.openstreetmap.josm.io.OnlineResource;
     
    461462        }
    462463        if (visible && isModal()) {
    463464            this.setAlwaysOnTop(true);
     465            this.addWindowFocusListener(new WindowOnTopListener());
    464466        }
    465467        super.setVisible(visible);
    466468
  • core/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/core/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java b/core/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
    a b  
    2727import org.openstreetmap.josm.gui.help.HelpUtil;
    2828import org.openstreetmap.josm.gui.util.GuiHelper;
    2929import org.openstreetmap.josm.gui.util.WindowGeometry;
     30import org.openstreetmap.josm.gui.util.WindowOnTopListener;
    3031import org.openstreetmap.josm.gui.widgets.HtmlPanel;
    3132import org.openstreetmap.josm.tools.ImageProvider;
    3233import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
     
    352353        }
    353354        if (dialog.isModal()) {
    354355            dialog.setAlwaysOnTop(true);
     356            dialog.addWindowFocusListener(new WindowOnTopListener());
    355357        }
    356358        dialog.setVisible(true);
    357359    }
  • core/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
    diff --git a/core/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java b/core/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
    a b  
    2929import org.openstreetmap.josm.gui.tagging.presets.items.Link;
    3030import org.openstreetmap.josm.spi.preferences.Config;
    3131import org.openstreetmap.josm.testutils.annotations.HTTPS;
     32import org.openstreetmap.josm.testutils.annotations.Territories;
    3233import org.openstreetmap.josm.tools.HttpClient;
    3334import org.openstreetmap.josm.tools.HttpClient.Response;
    3435import org.openstreetmap.josm.tools.ImageProvider;
     
    3940 * Integration tests of {@link TaggingPresetPreference} class.
    4041 */
    4142@HTTPS
     43@Territories
    4244@Timeout(value = 20, unit = TimeUnit.MINUTES)
    4345class TaggingPresetPreferenceTestIT extends AbstractExtendedSourceEntryTestCase {
    4446    /**