JAL-3117 raise AlignFrame or SplitFrame when Overview clicked
[jalview.git] / src / jalview / gui / AlignFrame.java
index 4a18067..604e813 100644 (file)
@@ -38,6 +38,7 @@ import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.awt.event.KeyAdapter;
@@ -412,7 +413,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
 
     if (jalview.bin.Cache.getDefault("SHOW_OVERVIEW", false))
     {
-      this.overviewMenuItem_actionPerformed(null);
+      this.overviewMenuItem_actionPerformed();
     }
 
     addKeyListener();
@@ -479,7 +480,7 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
                   }
 
                   ap.updateLayout();
-                  ap.setSelected(true);
+                  ap.setSelected(true, true);
                   ap.alignFrame.setMenusForViewport();
 
                 }
@@ -3423,13 +3424,11 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
   }
 
   /**
-   * DOCUMENT ME!
-   * 
-   * @param e
-   *          DOCUMENT ME!
+   * Opens a new Overview window for the current alignment view, unless one is
+   * open already, in which case does nothing.
    */
   @Override
-  public void overviewMenuItem_actionPerformed(ActionEvent e)
+  public void overviewMenuItem_actionPerformed()
   {
     if (alignPanel.overviewPanel != null)
     {
@@ -3460,24 +3459,43 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
     {
       frame.addKeyListener(getKeyListeners()[0]);
     }
-    
-    /*
-     * bring alignment panel to front when Overview gets focus
-     * (even after New View / eXpand / Gather!)
-     */
+
     final AlignmentPanel ap = alignPanel;
     frame.addFocusListener(new FocusAdapter()
     {
       @Override
       public void focusGained(FocusEvent e)
       {
+        /*
+         * bring alignment panel to front when Overview gets focus
+         * (AlignFrame, or SplitFrame if alignment is in a split frame)
+         */
+        ap.setSelected(true, true);
+        
+        /*
+         * restore focus to the Overview
+         * (temporarily removing the focus listener)
+         */
+        FocusListener me = frame.getFocusListeners()[0];
+        frame.removeFocusListener(me);
         try
         {
-          ap.alignFrame.setSelected(true);
-          ap.alignFrame.setIcon(false);
-          ap.alignFrame.setDisplayedView(ap);
+          frame.setSelected(true);
         } catch (PropertyVetoException e1)
         {
+        } finally
+        {
+          /*
+           * restore the listener _after_ setSelected has run
+           */
+          SwingUtilities.invokeLater(new Runnable()
+          {
+            @Override
+            public void run()
+            {
+              frame.addFocusListener(me);
+            }
+          });
         }
       }
     });