JAL-3187 alternative solution - gather feature settings for CDS/Protein as tabs in...
[jalview.git] / src / jalview / gui / SplitFrame.java
index 396e3b3..6d5bd34 100644 (file)
 package jalview.gui;
 
 import jalview.api.AlignViewControllerGuiI;
+import jalview.api.FeatureSettingsControllerI;
 import jalview.api.SplitContainerI;
+import jalview.controller.FeatureSettingsControllerGuiI;
 import jalview.datamodel.AlignmentI;
 import jalview.jbgui.GAlignFrame;
 import jalview.jbgui.GSplitFrame;
 import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
 import jalview.util.Platform;
 import jalview.viewmodel.AlignmentViewport;
 
 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;
@@ -45,7 +51,10 @@ import javax.swing.InputMap;
 import javax.swing.JComponent;
 import javax.swing.JDesktopPane;
 import javax.swing.JInternalFrame;
+import javax.swing.JLayeredPane;
 import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
@@ -76,6 +85,13 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
 
   private static final long serialVersionUID = 1L;
 
+  /**
+   * geometry for Feature Settings Holder
+   */
+  private static final int FS_MIN_WIDTH = 400;
+
+  private static final int FS_MIN_HEIGHT = 400;
+
   public SplitFrame(GAlignFrame top, GAlignFrame bottom)
   {
     super(top, bottom);
@@ -832,4 +848,138 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     }
     super.setSelected(selected);
   }
-}
+
+  /**
+   * holds the frame for feature settings, so Protein and DNA tabs can be managed
+   */
+  JInternalFrame featureSettingsUI;
+
+  JTabbedPane featureSettingsPanels;
+
+  @Override
+  public void addFeatureSettingsUI(
+          FeatureSettingsControllerGuiI featureSettings)
+  {
+    boolean showInternalFrame = false;
+    if (featureSettingsUI == null)
+    {
+      showInternalFrame = true;
+      featureSettingsPanels = new JTabbedPane();
+      featureSettingsUI = new JInternalFrame(
+              "Feature Settings for CDS and Protein Views");
+      featureSettingsPanels.setOpaque(true);
+      featureSettingsUI.setContentPane(featureSettingsPanels);
+      JPanel dummyDNA = new JPanel(),dummyProtein=new JPanel();
+      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();
+        }
+      };
+      dummyDNA.addFocusListener(fl1);
+      dummyProtein.addFocusListener(fl1);
+      
+      featureSettingsPanels.addTab("CDS", dummyDNA);
+      featureSettingsPanels.addTab("Protein", dummyProtein);
+    }
+    if (featureSettingsPanels
+            .indexOfTabComponent((Component) featureSettings) > -1)
+    {
+      // just show the feature settings !
+      featureSettingsPanels
+              .setSelectedComponent((Component) featureSettings);
+      return;
+    }
+    // otherwise replace the dummy tab with the given feature settings
+    int pos = getAlignFrames().indexOf(featureSettings.getAlignframe());
+    // if pos==-1 then alignFrame isn't managed by this splitframe
+    if (pos == 0)
+    {
+      featureSettingsPanels.removeTabAt(0);
+      featureSettingsPanels.insertTab("CDS", null,
+              (Component) featureSettings, "Feature Settings for DNA CDS",
+              0);
+    }
+    if (pos == 1)
+    {
+      featureSettingsPanels.removeTabAt(1);
+      featureSettingsPanels.insertTab("Protein", null,
+              (Component) featureSettings, "Feature Settings for Protein",
+              1);
+    }
+    featureSettingsPanels.setSelectedComponent((Component) featureSettings);
+    if (showInternalFrame)
+    {
+      if (Platform.isAMac())
+      {
+        Desktop.addInternalFrame(featureSettingsUI,
+                MessageManager.getString(
+                        "Feature Settings for CDS and Protein Views"),
+                600, 480);
+      }
+      else
+      {
+        Desktop.addInternalFrame(featureSettingsUI,
+                MessageManager.getString(
+                        "Feature Settings for CDS and Protein Views"),
+                600, 450);
+      }
+      featureSettingsUI
+              .setMinimumSize(new Dimension(FS_MIN_WIDTH, FS_MIN_HEIGHT));
+
+      featureSettingsUI.addInternalFrameListener(
+              new javax.swing.event.InternalFrameAdapter()
+              {
+                @Override
+                public void internalFrameClosed(
+                        javax.swing.event.InternalFrameEvent evt)
+                {
+                  for (int tab = 0; tab < featureSettingsPanels
+                          .getTabCount();)
+                  {
+                    FeatureSettingsControllerGuiI fsettings = (FeatureSettingsControllerGuiI) featureSettingsPanels
+                            .getTabComponentAt(tab);
+                    if (fsettings != null)
+                    {
+                      featureSettingsPanels.removeTabAt(tab);
+                      fsettings.closeFeatureSettings();
+                    }
+                    else
+                    {
+                      tab++;
+                    }
+                  }
+                  featureSettingsPanels = null;
+                };
+              });
+      featureSettingsUI.setLayer(JLayeredPane.PALETTE_LAYER);
+    }
+  }
+
+  @Override
+  public void closeFeatureSettings(
+          FeatureSettingsControllerI featureSettings)
+  {
+    if (featureSettingsUI != null)
+    {
+      try
+      {
+        featureSettingsUI.setClosed(true);
+      } catch (Exception x)
+      {
+      }
+      featureSettingsUI = null;
+    }
+  }
+}
\ No newline at end of file