Changeset 18923 in josm for trunk/src


Ignore:
Timestamp:
2023-12-21T13:32:11+01:00 (6 months ago)
Author:
taylor.smock
Message:

Fix #16485: Ensure windows lose always-on-top status when JOSM loses focus

Also fix some spotbugs/sonarlint issues.

Location:
trunk/src/org/openstreetmap/josm/gui
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java

    r18849 r18923  
    55
    66import java.awt.Component;
    7 import java.awt.Dialog;
    87import java.awt.GridBagLayout;
    98import java.util.HashMap;
     
    1615import javax.swing.JPanel;
    1716import javax.swing.JRadioButton;
    18 import javax.swing.event.AncestorEvent;
    19 import javax.swing.event.AncestorListener;
    20 
     17
     18import org.openstreetmap.josm.gui.util.WindowOnTopListener;
    2119import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
    2220import org.openstreetmap.josm.spi.preferences.Config;
     
    4341    /** a set indication that (preference key) is or may be stored for the currently active bulk operation */
    4442    private static final Set<String> immediateActive = new HashSet<>();
     43    /** The prefix for config options */
     44    private static final String CONFIG_PREFIX = "message.";
    4545
    4646    /**
     
    6161        return Utils.firstNonNull(immediateChoices.get(prefKey),
    6262                sessionChoices.get(prefKey),
    63                 !Config.getPref().getBoolean("message." + prefKey, true) ? Config.getPref().getInt("message." + prefKey + ".value", -1) : -1
     63                !Config.getPref().getBoolean(CONFIG_PREFIX + prefKey, true)
     64                        ? Config.getPref().getInt(CONFIG_PREFIX + prefKey + ".value", -1)
     65                        : -1
    6466        );
    6567    }
     
    228230                    break;
    229231                case PERMANENT:
    230                     Config.getPref().putBoolean("message." + prefKey, false);
    231                     Config.getPref().putInt("message." + prefKey + ".value", value);
     232                    Config.getPref().putBoolean(CONFIG_PREFIX + prefKey, false);
     233                    Config.getPref().putInt(CONFIG_PREFIX + prefKey + ".value", value);
    232234                    break;
    233235            }
     
    288290            add(cbStandard, GBC.eol());
    289291
    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             });
     292            this.addAncestorListener(new WindowOnTopListener());
    318293        }
    319294
    320295        NotShowAgain getNotShowAgain() {
    321             return cbStandard.isSelected()
    322                     ? NotShowAgain.NO
    323                     : cbShowImmediateDialog.isSelected()
    324                     ? NotShowAgain.OPERATION
    325                     : cbShowSessionDialog.isSelected()
    326                     ? NotShowAgain.SESSION
    327                     : cbShowPermanentDialog.isSelected()
    328                     ? NotShowAgain.PERMANENT
    329                     : null;
     296            if (cbStandard.isSelected()) {
     297                return NotShowAgain.NO;
     298            }
     299            if (cbShowImmediateDialog.isSelected()) {
     300                return NotShowAgain.OPERATION;
     301            }
     302            if (cbShowSessionDialog.isSelected()) {
     303                return NotShowAgain.SESSION;
     304            }
     305            if (cbShowPermanentDialog.isSelected()) {
     306                return NotShowAgain.PERMANENT;
     307            }
     308            return null;
    330309        }
    331310    }
  • trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java

    r18849 r18923  
    3131import javax.swing.KeyStroke;
    3232import javax.swing.UIManager;
     33import javax.swing.WindowConstants;
    3334
    3435import org.openstreetmap.josm.gui.help.HelpBrowser;
     
    3637import org.openstreetmap.josm.gui.util.GuiHelper;
    3738import org.openstreetmap.josm.gui.util.WindowGeometry;
     39import org.openstreetmap.josm.gui.util.WindowOnTopListener;
    3840import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
    3941import org.openstreetmap.josm.io.NetworkManager;
     
    4850/**
    4951 * General configurable dialog window.
    50  *
     52 * <p>
    5153 * If dialog is modal, you can use {@link #getValue()} to retrieve the
    5254 * button index. Note that the user can close the dialog
    5355 * by other means. This is usually equivalent to cancel action.
    54  *
     56 * <p>
    5557 * For non-modal dialogs, {@link #buttonAction(int, ActionEvent)} can be overridden.
    56  *
     58 * <p>
    5759 * There are various options, see below.
    58  *
     60 * <p>
    5961 * Note: The button indices are counted from 1 and upwards.
    6062 * So for {@link #getValue()}, {@link #setDefaultButton(int)} and
    6163 * {@link #setCancelButton} the first button has index 1.
    62  *
     64 * <p>
    6365 * Simple example:
    6466 * <pre>
     
    8587    private int toggleValue = -1;
    8688    private ConditionalOptionPaneUtil.MessagePanel togglePanel;
    87     private final Component parent;
     89    private final Component parentComponent;
    8890    private Component content;
    8991    private final String[] bTexts;
     
    9496    protected JButton defaultButton;
    9597    private transient Icon icon;
    96     private final boolean modal;
     98    private final boolean isModal;
    9799    private boolean focusOnDefaultButton;
    98100
     
    158160    public ExtendedDialog(Component parent, String title, String[] buttonTexts, boolean modal, boolean disposeOnClose) {
    159161        super(searchRealParent(parent), title, modal ? ModalityType.DOCUMENT_MODAL : ModalityType.MODELESS);
    160         this.parent = parent;
    161         this.modal = modal;
     162        this.parentComponent = parent;
     163        this.isModal = modal;
    162164        bTexts = Utils.copyArray(buttonTexts);
    163165        if (disposeOnClose) {
    164             setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
     166            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    165167        }
    166168        this.disposeOnClose = disposeOnClose;
     
    372374
    373375        setSize(d);
    374         setLocationRelativeTo(parent);
     376        setLocationRelativeTo(parentComponent);
    375377    }
    376378
     
    401403        Dimension screenSize = GuiHelper.getScreenSize();
    402404        Dimension x = new Dimension(screenSize.width*2/3, screenSize.height*2/3);
    403         if (parent != null && parent.isVisible()) {
    404             x = GuiHelper.getFrameForComponent(parent).getSize();
     405        if (parentComponent != null && parentComponent.isVisible()) {
     406            x = GuiHelper.getFrameForComponent(parentComponent).getSize();
    405407        }
    406408        return x;
     
    462464        if (visible && isModal()) {
    463465            this.setAlwaysOnTop(true);
     466            this.addWindowFocusListener(new WindowOnTopListener());
    464467        }
    465468        super.setVisible(visible);
     
    479482    @Override
    480483    public ExtendedDialog toggleEnable(String togglePref) {
    481         if (!modal) {
     484        if (!isModal) {
    482485            throw new IllegalStateException();
    483486        }
     
    495498    @Override
    496499    public ExtendedDialog setCancelButton(Integer... cancelButtonIdx) {
    497         this.cancelButtonIdx = new HashSet<>(Arrays.<Integer>asList(cancelButtonIdx));
     500        this.cancelButtonIdx = new HashSet<>(Arrays.asList(cancelButtonIdx));
    498501        return this;
    499502    }
  • trunk/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java

    r18849 r18923  
    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;
     
    353354        if (dialog.isModal()) {
    354355            dialog.setAlwaysOnTop(true);
     356            dialog.addWindowFocusListener(new WindowOnTopListener());
    355357        }
    356358        dialog.setVisible(true);
Note: See TracChangeset for help on using the changeset viewer.