Merge branch 'bug/JAL-4214_system_freeze_when_opening_file_using_gui_in_linux' into...
authorBen Soares <b.soares@dundee.ac.uk>
Fri, 18 Aug 2023 14:33:53 +0000 (15:33 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Fri, 18 Aug 2023 14:33:53 +0000 (15:33 +0100)
1  2 
src/jalview/gui/JvOptionPane.java

@@@ -36,6 -36,7 +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;
@@@ -717,7 -718,7 +718,7 @@@ public class JvOptionPane extends JOpti
  
    private static void outputMessage(Object message)
    {
 -    System.out.println(">>> JOption Message : " + message.toString());
 +    jalview.bin.Console.outPrintln(">>> JOption Message : " + message.toString());
    }
  
    public static Object getMockResponse()
          @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);
  
    private void internalDialogHandleResponse()
    {
 -    String responseString = (String) this.getValue();
 +    Object value = this.getValue();
 +    if (value == null
 +            || (value instanceof Integer && (Integer) value == -1))
 +    {
 +      return;
 +    }
 +    String responseString = value.toString();
      int response = ourOptions.indexOf(responseString);
  
      if (!Platform.isJS())
      EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
      try
      {
-       while (!f.isClosed())
+       boolean stillModal = true;
+       while (!f.isClosed() && stillModal)
        {
          if (EventQueue.isDispatchThread())
          {
            // 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);
+       }
      }
    }