From: Ben Soares Date: Wed, 28 Jun 2023 11:45:13 +0000 (+0100) Subject: JAL-4214 Close modal internal frame if JRootPane activity detected. Problem with... X-Git-Tag: Release_2_11_3_0~8^2~36^2~2 X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=commitdiff_plain;h=07711595213cb89a9c42e2659c7b208b4a8b8d39 JAL-4214 Close modal internal frame if JRootPane activity detected. Problem with re-opened modal internal frame afterwards --- diff --git a/src/jalview/gui/EditNameDialog.java b/src/jalview/gui/EditNameDialog.java index 4b8a1fd..6d5cb46 100644 --- a/src/jalview/gui/EditNameDialog.java +++ b/src/jalview/gui/EditNameDialog.java @@ -129,6 +129,6 @@ public class EditNameDialog JvOptionPane.frameDialog(panel, title, JvOptionPane.PLAIN_MESSAGE, options, ok, actions, false); - */ + */ } } diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index c0efd4a..5da37fe 100644 --- a/src/jalview/gui/JvOptionPane.java +++ b/src/jalview/gui/JvOptionPane.java @@ -36,6 +36,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseMotionAdapter; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.beans.PropertyVetoException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -1080,37 +1081,44 @@ public class JvOptionPane extends JOptionPane @Override public void internalFrameActivated(InternalFrameEvent arg0) { + System.err.println("##### internalFrameActivated"); } @Override public void internalFrameClosed(InternalFrameEvent arg0) { + System.err.println("##### internalFrameClosed"); JvOptionPane.this.internalDialogHandleResponse(); } @Override public void internalFrameClosing(InternalFrameEvent arg0) { + System.err.println("##### internalFrameClosing"); } @Override public void internalFrameDeactivated(InternalFrameEvent arg0) { + System.err.println("##### internalFrameDeactivated"); } @Override public void internalFrameDeiconified(InternalFrameEvent arg0) { + System.err.println("##### internalFrameDeiconified"); } @Override public void internalFrameIconified(InternalFrameEvent arg0) { + System.err.println("##### internalFrameIconified"); } @Override public void internalFrameOpened(InternalFrameEvent arg0) { + System.err.println("##### internalFrameOpened"); } }); jif.setVisible(true); @@ -1504,7 +1512,8 @@ public class JvOptionPane extends JOptionPane EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); try { - while (!f.isClosed()) + boolean stillModal = true; + while (!f.isClosed() && stillModal) { if (EventQueue.isDispatchThread()) { @@ -1514,34 +1523,68 @@ public class JvOptionPane extends JOptionPane // This mimics EventQueue.dispatchEvent(). We can't use // EventQueue.dispatchEvent() directly, because it is // protected, unfortunately. + System.out.println( + "##### ev source=" + ev.getSource().getClass() + ""); if (ev instanceof ActiveEvent) + { + System.err.println("##### 1"); ((ActiveEvent) ev).dispatch(); - else if (ev.getSource() instanceof Component) - ((Component) ev.getSource()).dispatchEvent(ev); + } else if (ev.getSource() instanceof MenuComponent) + { + System.err.println("##### 2"); ((MenuComponent) ev.getSource()).dispatchEvent(ev); + } + else if (ev.getSource() instanceof Component) + { + System.err.println("##### 3"); + if (ev.getSource().equals(Desktop.getDesktop().getRootPane())) + { + stillModal = false; + } + else + { + ((Component) ev.getSource()).dispatchEvent(ev); + } + } // Other events are ignored as per spec in // EventQueue.dispatchEvent + System.err.println("##### 4"); } else { // Give other threads a chance to become active. + System.err.println("##### 5"); Thread.yield(); } } } catch (InterruptedException ex) { // If we get interrupted, then leave the modal state. + System.err.println("##### 6"); } finally { + System.err.println("##### 7"); // Clean up the modal interceptor. lp.remove(modalInterceptor); + f.setVisible(false); + + try + { + f.setClosed(true); + } catch (PropertyVetoException e) + { + f.doDefaultCloseAction(); + } + // Remove the internal frame from its parent, so it is no longer // lurking around and clogging memory. Container parent = f.getParent(); if (parent != null) + { parent.remove(f); + } } }