Merge branch 'releases/Release_2_11_1_Branch' into merge/JAL_1842+JAL-3509+releases_R...
[jalview.git] / src / jalview / gui / SplitFrame.java
index 948b73b..f7c93db 100644 (file)
@@ -32,12 +32,11 @@ import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.viewmodel.AlignmentViewport;
 
+import java.awt.BorderLayout;
 import java.awt.Component;
 import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.KeyListener;
@@ -48,6 +47,7 @@ import java.util.Map.Entry;
 
 import javax.swing.AbstractAction;
 import javax.swing.InputMap;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JDesktopPane;
 import javax.swing.JInternalFrame;
@@ -56,6 +56,8 @@ import javax.swing.JMenuItem;
 import javax.swing.JPanel;
 import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
 
@@ -178,26 +180,21 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   public void adjustLayout()
   {
+    final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport;
+    final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport;
+
     /*
      * Ensure sequence ids are the same width so sequences line up
      */
-    int w1 = ((AlignFrame) getTopFrame()).getViewport().getIdWidth();
-    int w2 = ((AlignFrame) getBottomFrame()).getViewport().getIdWidth();
+    int w1 = topViewport.getIdWidth();
+    int w2 = bottomViewport.getIdWidth();
     int w3 = Math.max(w1, w2);
-    if (w1 != w3)
-    {
-      ((AlignFrame) getTopFrame()).getViewport().setIdWidth(w3);
-    }
-    if (w2 != w3)
-    {
-      ((AlignFrame) getBottomFrame()).getViewport().setIdWidth(w3);
-    }
+    topViewport.setIdWidth(w3);
+    bottomViewport.setIdWidth(w3);
 
     /*
      * Scale protein to either 1 or 3 times character width of dna
      */
-    final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport;
-    final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport;
     final AlignmentI topAlignment = topViewport.getAlignment();
     final AlignmentI bottomAlignment = bottomViewport.getAlignment();
     AlignmentViewport cdna = topAlignment.isNucleotide() ? topViewport
@@ -817,7 +814,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
         if (c != null && c instanceof AlignFrame)
         {
           AlignFrame af = (AlignFrame) c;
-          new Finder(af.viewport, af.alignPanel);
+          new Finder(af.alignPanel);
         }
       }
     };
@@ -865,10 +862,83 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     {
       showInternalFrame = true;
       featureSettingsPanels = new JTabbedPane();
+      featureSettingsPanels.addChangeListener(new ChangeListener()
+      {
+
+        @Override
+        public void stateChanged(ChangeEvent e)
+        {
+          if (e.getSource() != featureSettingsPanels
+                  || featureSettingsUI == null
+                  || featureSettingsUI.isClosed()
+                  || !featureSettingsUI.isVisible())
+          {
+            // not our tabbed pane
+            return;
+          }
+          int tab = featureSettingsPanels.getSelectedIndex();
+          if (tab < 0 || featureSettingsPanels
+                  .getSelectedComponent() instanceof FeatureSettingsControllerGuiI)
+          {
+            // no tab selected or already showing a feature settings GUI
+            return;
+          }
+          getAlignFrames().get(tab).showFeatureSettingsUI();
+        }
+      });
       featureSettingsUI = new JInternalFrame(MessageManager.getString(
               "label.sequence_feature_settings_for_CDS_and_Protein"));
       featureSettingsPanels.setOpaque(true);
-      featureSettingsUI.setContentPane(featureSettingsPanels);
+
+      JPanel dialog = new JPanel();
+      dialog.setOpaque(true);
+      dialog.setLayout(new BorderLayout());
+      dialog.add(featureSettingsPanels, BorderLayout.CENTER);
+      JPanel buttons = new JPanel();
+      JButton ok = new JButton(MessageManager.getString("action.ok"));
+      ok.addActionListener(new ActionListener()
+      {
+
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+          try
+          {
+            featureSettingsUI.setClosed(true);
+          } catch (PropertyVetoException pv)
+          {
+            pv.printStackTrace();
+          }
+        }
+      });
+      JButton cancel = new JButton(
+              MessageManager.getString("action.cancel"));
+      cancel.addActionListener(new ActionListener()
+      {
+
+        @Override
+        public void actionPerformed(ActionEvent e)
+        {
+          try
+          {
+            for (Component fspanel : featureSettingsPanels.getComponents())
+            {
+              if (fspanel instanceof FeatureSettingsControllerGuiI)
+              {
+                ((FeatureSettingsControllerGuiI) fspanel).revert();
+              }
+            }
+            featureSettingsUI.setClosed(true);
+          } catch (Exception pv)
+          {
+            pv.printStackTrace();
+          }
+        }
+      });
+      buttons.add(ok);
+      buttons.add(cancel);
+      dialog.add(buttons, BorderLayout.SOUTH);
+      featureSettingsUI.setContentPane(dialog);
       createDummyTabs();
     }
     if (featureSettingsPanels
@@ -947,33 +1017,13 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
                     }
                   }
                   featureSettingsPanels = null;
+                  featureSettingsUI = null;
                 };
               });
       featureSettingsUI.setLayer(JLayeredPane.PALETTE_LAYER);
     }
   }
 
-  /*
-   * for materialising feature settings for a tab when clicked on
-   */
-  private FocusListener fl1 = new FocusListener()
-  {
-
-    @Override
-    public void focusLost(FocusEvent e)
-    {
-      // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void focusGained(FocusEvent e)
-    {
-      int tab = featureSettingsPanels.getSelectedIndex();
-      getAlignFrames().get(tab).showFeatureSettingsUI();
-    }
-  };
-
   /**
    * tab names for feature settings
    */
@@ -990,7 +1040,6 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     for (int tabIndex = 0; tabIndex < 2; tabIndex++)
     {
       JPanel dummyTab = new JPanel();
-      dummyTab.addFocusListener(fl1);
       featureSettingsPanels.addTab(tabName[tabIndex], dummyTab);
     }
   }
@@ -1001,26 +1050,25 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     for (int tabIndex = 0; tabIndex < 2; tabIndex++)
     {
       if (featureSettingsPanels.getTabCount() > tabIndex)
-    {
+      {
         dummyTab = featureSettingsPanels.getTabComponentAt(tabIndex);
         if (dummyTab instanceof FeatureSettingsControllerGuiI
                 && !dummyTab.isVisible())
-      {
+        {
           featureSettingsPanels.removeTabAt(tabIndex);
           // close the feature Settings tab
           ((FeatureSettingsControllerGuiI) dummyTab)
                   .featureSettings_isClosed();
           // create a dummy tab in its place
-        dummyTab = new JPanel();
-        dummyTab.addFocusListener(fl1);
+          dummyTab = new JPanel();
           featureSettingsPanels.insertTab(tabName[tabIndex], null, dummyTab,
                   MessageManager.formatMessage(
                           "label.sequence_feature_settings_for",
                           tabName[tabIndex]),
                   tabIndex);
+        }
       }
     }
-    }
   }
 
   @Override