JAL-1681 ensure cDNA consensus computed on startup (project/applet)
[jalview.git] / src / jalview / appletgui / SplitFrame.java
index 4f61f4a..68da6cf 100644 (file)
@@ -1,16 +1,17 @@
 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.analysis.AlignmentUtils.MappingResult;
+import jalview.api.AlignmentViewPanel;
 import jalview.api.ViewStyleI;
 import jalview.bin.JalviewLite;
 import jalview.datamodel.AlignmentI;
 import jalview.structure.StructureSelectionManager;
 
-import java.awt.BorderLayout;
-import java.awt.GridLayout;
-import java.awt.Panel;
-
 public class SplitFrame extends EmbmenuFrame
 {
   private static final long serialVersionUID = 1L;
@@ -39,16 +40,7 @@ public class SplitFrame extends EmbmenuFrame
    */
   public void init()
   {
-    setMenuBar(null);
-    outermost = new Panel(new GridLayout(2, 1));
-
-    Panel topPanel = new Panel();
-    Panel bottomPanel = new Panel();
-    outermost.add(topPanel);
-    outermost.add(bottomPanel);
-
-    addAlignFrameComponents(topFrame, topPanel);
-    addAlignFrameComponents(bottomFrame, bottomPanel);
+    constructSplit();
 
     /*
      * Try to make and add dna/protein sequence mappings
@@ -62,9 +54,9 @@ public class SplitFrame extends EmbmenuFrame
     AlignViewport protein = !topAlignment.isNucleotide() ? topViewport
             : (!bottomAlignment.isNucleotide() ? bottomViewport : null);
 
-    MappingResult mapped = AlignmentUtils.mapProteinToCdna(
+    boolean mapped = AlignmentUtils.mapProteinToCdna(
             protein.getAlignment(), cdna.getAlignment());
-    if (mapped != MappingResult.NotMapped)
+    if (mapped)
     {
       final StructureSelectionManager ssm = StructureSelectionManager
               .getStructureSelectionManager(topViewport.applet);
@@ -72,6 +64,65 @@ public class SplitFrame extends EmbmenuFrame
       topViewport.setCodingComplement(bottomViewport);
       ssm.addCommandListener(cdna);
       ssm.addCommandListener(protein);
+
+      /*
+       * Now mappings exist, can compute cDNA consensus on protein alignment
+       */
+      protein.initComplementConsensus();
+      AlignmentViewPanel ap = topAlignment.isNucleotide() ? bottomFrame.alignPanel
+              : topFrame.alignPanel;
+      protein.updateConsensus(ap);
+    }
+
+    adjustLayout();
+  }
+
+  /**
+   * 
+   */
+  protected void constructSplit()
+  {
+    setMenuBar(null);
+    outermost = new Panel(new GridLayout(2, 1));
+
+    Panel topPanel = new Panel();
+    Panel bottomPanel = new Panel();
+    outermost.add(topPanel);
+    outermost.add(bottomPanel);
+
+    addAlignFrameComponents(topFrame, topPanel);
+    addAlignFrameComponents(bottomFrame, bottomPanel);
+  }
+
+  /**
+   * Make any adjustments to the layout
+   */
+  protected void adjustLayout()
+  {
+    AlignViewport cdna = topFrame.getAlignViewport().getAlignment()
+            .isNucleotide() ? topFrame.viewport : bottomFrame.viewport;
+    AlignViewport protein = cdna == topFrame.viewport ? bottomFrame.viewport
+            : topFrame.viewport;
+
+    /*
+     * Ensure sequence ids are the same width for good alignment.
+     */
+    // TODO should do this via av.getViewStyle/setViewStyle
+    // however at present av.viewStyle is not set in IdPanel.fontChanged
+    int w1 = topFrame.alignPanel.idPanel.idCanvas.getWidth();
+    int w2 = bottomFrame.alignPanel.idPanel.idCanvas.getWidth();
+    int w3 = Math.max(w1, w2);
+    if (w1 != w3)
+    {
+      Dimension d = topFrame.alignPanel.idPanel.idCanvas.getSize();
+      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));
     }
 
     /*
@@ -83,7 +134,6 @@ public class SplitFrame extends EmbmenuFrame
       vs.setCharWidth(3 * vs.getCharWidth());
       protein.setViewStyle(vs);
     }
-
   }
 
   /**
@@ -112,7 +162,7 @@ public class SplitFrame extends EmbmenuFrame
    */
   public void addToDisplay(boolean embedded, JalviewLite applet)
   {
-    createAlignFrameWindow(embedded, applet);
+    createSplitFrameWindow(embedded, applet);
     validate();
     topFrame.alignPanel.adjustAnnotationHeight();
     topFrame.alignPanel.paintAlignment(true);
@@ -127,7 +177,7 @@ public class SplitFrame extends EmbmenuFrame
    * @param embed
    * @param applet
    */
-  public void createAlignFrameWindow(boolean embed, JalviewLite applet)
+  protected void createSplitFrameWindow(boolean embed, JalviewLite applet)
   {
     if (embed)
     {
@@ -137,9 +187,9 @@ public class SplitFrame extends EmbmenuFrame
     else
     {
       this.add(outermost);
-      int width = Math.max(topFrame.DEFAULT_WIDTH,
-              bottomFrame.DEFAULT_WIDTH);
-      int height = topFrame.DEFAULT_HEIGHT + bottomFrame.DEFAULT_HEIGHT;
+      int width = Math.max(topFrame.frameWidth,
+              bottomFrame.frameWidth);
+      int height = topFrame.frameHeight + bottomFrame.frameHeight;
       jalview.bin.JalviewLite
               .addFrame(this, this.getTitle(), width, height);
     }