JAL-2728 fine tuned initial split of split frame view
authorgmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 18 Sep 2017 08:26:43 +0000 (09:26 +0100)
committergmungoc <g.m.carstairs@dundee.ac.uk>
Mon, 18 Sep 2017 08:26:43 +0000 (09:26 +0100)
src/jalview/gui/CrossRefAction.java
src/jalview/gui/SplitFrame.java

index 01ee1ff..2d1dfd4 100644 (file)
@@ -242,7 +242,7 @@ public class CrossRefAction implements Runnable
       String linkedTitle = MessageManager
               .getString("label.linked_view_title");
       Desktop.addInternalFrame(sf, linkedTitle, -1, -1);
-      sf.adjustDivider();
+      sf.adjustInitialLayout();
 
       // finally add the top, then bottom frame to the view list
       xrefViews.add(dna ? copyThis.alignPanel : newFrame.alignPanel);
index c23ed7c..5bff407 100644 (file)
@@ -194,12 +194,16 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
   }
 
   /**
-   * Adjust the divider for a sensible split of the real estate (for example,
+   * Adjusts the divider for a sensible split of the real estate (for example,
    * when many transcripts are shown with a single protein). This should only be
    * called after the split pane has been laid out (made visible) so it has a
-   * height.
+   * height. The aim is to avoid unnecessary vertical scroll bars, while
+   * ensuring that at least 2 sequences are visible in each panel.
+   * <p>
+   * Once laid out, the user may choose to customise as they wish, so this
+   * method is not called again after the initial layout.
    */
-  protected void adjustDivider()
+  protected void adjustInitialLayout()
   {
     AlignFrame topFrame = (AlignFrame) getTopFrame();
     AlignFrame bottomFrame = (AlignFrame) getBottomFrame();
@@ -224,30 +228,26 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     int bottomCharHeight = bottomViewport.getViewStyle().getCharHeight();
 
     /*
-     * calculate the minimum ratio that leaves at least 
-     * two sequences visible in the top panel
+     * calculate the minimum ratio that leaves at least the height 
+     * of two sequences (after rounding) visible in the top panel
      */
     int topPanelHeight = topFrame.getHeight();
     int bottomPanelHeight = bottomFrame.getHeight();
     int topSequencesHeight = topFrame.alignPanel.getSeqPanel().seqCanvas
             .getHeight();
     int topPanelMinHeight = topPanelHeight
-            - Math.max(0,
-                    topSequencesHeight - 2 * topViewport.getCharHeight());
+            - Math.max(0, topSequencesHeight - 3 * topCharHeight);
     double totalHeight = (double) topPanelHeight + bottomPanelHeight;
     double minRatio = topPanelMinHeight / totalHeight;
 
     /*
-     * calculate the maximum ratio that leaves at least 
-     * two sequences visible in the bottom panel
+     * calculate the maximum ratio that leaves at least the height 
+     * of two sequences (after rounding) visible in the bottom panel
      */
     int bottomSequencesHeight = bottomFrame.alignPanel.getSeqPanel().seqCanvas
             .getHeight();
     int bottomPanelMinHeight = bottomPanelHeight
-            - Math.max(
-                    0,
-                    bottomSequencesHeight - 2
-                            * bottomViewport.getCharHeight());
+            - Math.max(0, bottomSequencesHeight - 3 * bottomCharHeight);
     double maxRatio = (totalHeight - bottomPanelMinHeight) / totalHeight;
 
     /*
@@ -268,7 +268,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      */
     ratio = Math.min(ratio, maxRatio);
     ratio = Math.max(ratio, minRatio);
-    // setRelativeDividerLocation(ratio);
+    setRelativeDividerLocation(ratio);
   }
 
   /**