JAL-4020 Added search for PyMOLWinWithConsole.bat (and PyMOLWin.exe) in likely places...
[jalview.git] / src / jalview / appletgui / SplitFrame.java
index 4fbf65a..777e307 100644 (file)
@@ -1,16 +1,36 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.appletgui;
 
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.GridLayout;
-import java.awt.Panel;
-
-import jalview.analysis.AlignmentUtils;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.ViewStyleI;
 import jalview.bin.JalviewLite;
 import jalview.datamodel.AlignmentI;
 import jalview.structure.StructureSelectionManager;
+import jalview.viewmodel.AlignmentViewport;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Panel;
 
 public class SplitFrame extends EmbmenuFrame
 {
@@ -23,12 +43,14 @@ public class SplitFrame extends EmbmenuFrame
   private Panel outermost;
 
   /**
-   * Constructor
+   * Constructs the split frame placing cdna in the top half. No 'alignment' is
+   * performed here, this should be done by the calling client if wanted.
    */
   public SplitFrame(AlignFrame af1, AlignFrame af2)
   {
-    topFrame = af1;
-    bottomFrame = af2;
+    boolean af1IsNucleotide = af1.viewport.getAlignment().isNucleotide();
+    topFrame = af1IsNucleotide ? af1 : af2;
+    bottomFrame = topFrame == af1 ? af2 : af1;
     init();
   }
 
@@ -49,28 +71,24 @@ public class SplitFrame extends EmbmenuFrame
     final AlignViewport bottomViewport = bottomFrame.viewport;
     final AlignmentI topAlignment = topViewport.getAlignment();
     final AlignmentI bottomAlignment = bottomViewport.getAlignment();
-    AlignViewport cdna = topAlignment.isNucleotide() ? topViewport
+    AlignmentViewport cdna = topAlignment.isNucleotide() ? topViewport
             : (bottomAlignment.isNucleotide() ? bottomViewport : null);
-    AlignViewport protein = !topAlignment.isNucleotide() ? topViewport
+    AlignmentViewport protein = !topAlignment.isNucleotide() ? topViewport
             : (!bottomAlignment.isNucleotide() ? bottomViewport : null);
 
-    boolean mapped = AlignmentUtils.mapProteinToCdna(
-            protein.getAlignment(), cdna.getAlignment());
-    if (mapped)
-    {
-      final StructureSelectionManager ssm = StructureSelectionManager
-              .getStructureSelectionManager(topViewport.applet);
-      ssm.addMappings(protein.getAlignment().getCodonFrames());
-      topViewport.setCodingComplement(bottomViewport);
-      ssm.addCommandListener(cdna);
-      ssm.addCommandListener(protein);
-    }
+    final StructureSelectionManager ssm = StructureSelectionManager
+            .getStructureSelectionManager(topViewport.applet);
+    ssm.registerMappings(protein.getAlignment().getCodonFrames());
+    topViewport.setCodingComplement(bottomViewport);
+    ssm.addCommandListener(cdna);
+    ssm.addCommandListener(protein);
 
     /*
-     * Now mappings exist, can compute cDNA consensus on protein alignment
+     * Compute cDNA consensus on protein alignment
      */
     protein.initComplementConsensus();
-    AlignmentViewPanel ap = topAlignment.isNucleotide() ? bottomFrame.alignPanel
+    AlignmentViewPanel ap = topAlignment.isNucleotide()
+            ? bottomFrame.alignPanel
             : topFrame.alignPanel;
     protein.updateConsensus(ap);
 
@@ -99,9 +117,10 @@ public class SplitFrame extends EmbmenuFrame
    */
   protected void adjustLayout()
   {
-    AlignViewport cdna = topFrame.getAlignViewport().getAlignment()
+    AlignmentViewport cdna = topFrame.getAlignViewport().getAlignment()
             .isNucleotide() ? topFrame.viewport : bottomFrame.viewport;
-    AlignViewport protein = cdna == topFrame.viewport ? bottomFrame.viewport
+    AlignmentViewport protein = cdna == topFrame.viewport
+            ? bottomFrame.viewport
             : topFrame.viewport;
 
     /*
@@ -115,14 +134,14 @@ public class SplitFrame extends EmbmenuFrame
     if (w1 != w3)
     {
       Dimension d = topFrame.alignPanel.idPanel.idCanvas.getSize();
-      topFrame.alignPanel.idPanel.idCanvas.setSize(new Dimension(w3,
-              d.height));
+      topFrame.alignPanel.idPanel.idCanvas
+              .setSize(new Dimension(w3, d.height));
     }
     if (w2 != w3)
     {
       Dimension d = bottomFrame.alignPanel.idPanel.idCanvas.getSize();
-      bottomFrame.alignPanel.idPanel.idCanvas.setSize(new Dimension(w3,
-              d.height));
+      bottomFrame.alignPanel.idPanel.idCanvas
+              .setSize(new Dimension(w3, d.height));
     }
 
     /*
@@ -148,8 +167,8 @@ public class SplitFrame extends EmbmenuFrame
   private void addAlignFrameComponents(AlignFrame af, Panel panel)
   {
     panel.setLayout(new BorderLayout());
-    Panel menuPanel = af
-            .makeEmbeddedPopupMenu(af.getMenuBar(), true, false);
+    Panel menuPanel = af.makeEmbeddedPopupMenu(af.getMenuBar(), true,
+            false);
     panel.add(menuPanel, BorderLayout.NORTH);
     panel.add(af.statusBar, BorderLayout.SOUTH);
     panel.add(af.alignPanel, BorderLayout.CENTER);
@@ -168,9 +187,9 @@ public class SplitFrame extends EmbmenuFrame
     createSplitFrameWindow(embedded, applet);
     validate();
     topFrame.alignPanel.adjustAnnotationHeight();
-    topFrame.alignPanel.paintAlignment(true);
+    topFrame.alignPanel.paintAlignment(true, true);
     bottomFrame.alignPanel.adjustAnnotationHeight();
-    bottomFrame.alignPanel.paintAlignment(true);
+    bottomFrame.alignPanel.paintAlignment(true, true);
   }
 
   /**
@@ -190,11 +209,30 @@ public class SplitFrame extends EmbmenuFrame
     else
     {
       this.add(outermost);
-      int width = Math.max(topFrame.frameWidth,
-              bottomFrame.frameWidth);
+      int width = Math.max(topFrame.frameWidth, bottomFrame.frameWidth);
       int height = topFrame.frameHeight + bottomFrame.frameHeight;
-      jalview.bin.JalviewLite
-              .addFrame(this, this.getTitle(), width, height);
+      jalview.bin.JalviewLite.addFrame(this, this.getTitle(), width,
+              height);
+    }
+  }
+
+  /**
+   * Returns the contained AlignFrame complementary to the one given (or null if
+   * no match to top or bottom component).
+   * 
+   * @param af
+   * @return
+   */
+  public AlignFrame getComplement(AlignFrame af)
+  {
+    if (topFrame == af)
+    {
+      return bottomFrame;
+    }
+    else if (bottomFrame == af)
+    {
+      return topFrame;
     }
+    return null;
   }
 }