JAL-4214 Close modal internal frame if JRootPane activity detected. Problem with...
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 28 Jun 2023 11:45:13 +0000 (12:45 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 28 Jun 2023 11:45:13 +0000 (12:45 +0100)
src/jalview/gui/EditNameDialog.java
src/jalview/gui/JvOptionPane.java

index 4b8a1fd..6d5cb46 100644 (file)
@@ -129,6 +129,6 @@ public class EditNameDialog
     
     JvOptionPane.frameDialog(panel, title, JvOptionPane.PLAIN_MESSAGE,
             options, ok, actions, false);
-            */
+    */
   }
 }
index c0efd4a..5da37fe 100644 (file)
@@ -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);
+      }
     }
   }