X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJvOptionPane.java;h=eaaa2a11011f741d6e05a68b5d2732c01a7f72ce;hb=8a2a0cda7067530f8481c2aec203e18d555f2dfd;hp=61a971a9cfc90b3a514acb6a595f3c5cb987d68b;hpb=e73c44c30780c03d952cfe223742e9f996c75022;p=jalview.git diff --git a/src/jalview/gui/JvOptionPane.java b/src/jalview/gui/JvOptionPane.java index 61a971a..eaaa2a1 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); @@ -1510,7 +1518,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()) { @@ -1520,34 +1529,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); + } } }