Ticket #16485: 16485.patch
| File 16485.patch, 9.0 KB (added by , 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. 2 package org.openstreetmap.josm.gui.util; 3 4 import java.awt.Dialog; 5 import java.awt.Window; 6 import java.awt.event.WindowEvent; 7 import java.awt.event.WindowFocusListener; 8 9 import javax.swing.event.AncestorEvent; 10 import 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 */ 16 public 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 4 4 import static org.openstreetmap.josm.tools.I18n.tr; 5 5 6 6 import java.awt.Component; 7 import java.awt.Dialog;8 7 import java.awt.GridBagLayout; 9 8 import java.util.HashMap; 10 9 import java.util.HashSet; … … 15 14 import javax.swing.JOptionPane; 16 15 import javax.swing.JPanel; 17 16 import javax.swing.JRadioButton; 18 import javax.swing.event.AncestorEvent;19 import javax.swing.event.AncestorListener;20 17 18 import org.openstreetmap.josm.gui.util.WindowOnTopListener; 21 19 import org.openstreetmap.josm.gui.widgets.JMultilineLabel; 22 20 import org.openstreetmap.josm.spi.preferences.Config; 23 21 import org.openstreetmap.josm.tools.GBC; … … 287 285 } 288 286 add(cbStandard, GBC.eol()); 289 287 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()); 318 289 } 319 290 320 291 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 35 35 import org.openstreetmap.josm.gui.help.HelpUtil; 36 36 import org.openstreetmap.josm.gui.util.GuiHelper; 37 37 import org.openstreetmap.josm.gui.util.WindowGeometry; 38 import org.openstreetmap.josm.gui.util.WindowOnTopListener; 38 39 import org.openstreetmap.josm.gui.widgets.JMultilineLabel; 39 40 import org.openstreetmap.josm.io.NetworkManager; 40 41 import org.openstreetmap.josm.io.OnlineResource; … … 461 462 } 462 463 if (visible && isModal()) { 463 464 this.setAlwaysOnTop(true); 465 this.addWindowFocusListener(new WindowOnTopListener()); 464 466 } 465 467 super.setVisible(visible); 466 468 -
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 27 27 import org.openstreetmap.josm.gui.help.HelpUtil; 28 28 import org.openstreetmap.josm.gui.util.GuiHelper; 29 29 import org.openstreetmap.josm.gui.util.WindowGeometry; 30 import org.openstreetmap.josm.gui.util.WindowOnTopListener; 30 31 import org.openstreetmap.josm.gui.widgets.HtmlPanel; 31 32 import org.openstreetmap.josm.tools.ImageProvider; 32 33 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes; … … 352 353 } 353 354 if (dialog.isModal()) { 354 355 dialog.setAlwaysOnTop(true); 356 dialog.addWindowFocusListener(new WindowOnTopListener()); 355 357 } 356 358 dialog.setVisible(true); 357 359 } -
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 29 29 import org.openstreetmap.josm.gui.tagging.presets.items.Link; 30 30 import org.openstreetmap.josm.spi.preferences.Config; 31 31 import org.openstreetmap.josm.testutils.annotations.HTTPS; 32 import org.openstreetmap.josm.testutils.annotations.Territories; 32 33 import org.openstreetmap.josm.tools.HttpClient; 33 34 import org.openstreetmap.josm.tools.HttpClient.Response; 34 35 import org.openstreetmap.josm.tools.ImageProvider; … … 39 40 * Integration tests of {@link TaggingPresetPreference} class. 40 41 */ 41 42 @HTTPS 43 @Territories 42 44 @Timeout(value = 20, unit = TimeUnit.MINUTES) 43 45 class TaggingPresetPreferenceTestIT extends AbstractExtendedSourceEntryTestCase { 44 46 /**
