JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / gui / SplitFrame.java
index d28bb14..253b02c 100644 (file)
@@ -97,9 +97,9 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      * estimate width and height of SplitFrame; this.getInsets() doesn't seem to
      * give the full additional size (a few pixels short)
      */
-    int widthFudge = Platform.isAMac() ? MAC_INSETS_WIDTH
+    int widthFudge = Platform.isAMacAndNotJS() ? MAC_INSETS_WIDTH
             : WINDOWS_INSETS_WIDTH;
-    int heightFudge = Platform.isAMac() ? MAC_INSETS_HEIGHT
+    int heightFudge = Platform.isAMacAndNotJS() ? MAC_INSETS_HEIGHT
             : WINDOWS_INSETS_HEIGHT;
     int width = ((AlignFrame) getTopFrame()).getWidth() + widthFudge;
     int height = ((AlignFrame) getTopFrame()).getHeight()
@@ -132,7 +132,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
     // allow about 65 pixels for Desktop decorators on Windows
 
     int newHeight = Math.min(height,
-            Desktop.instance.getHeight() - DESKTOP_DECORATORS_HEIGHT);
+            Desktop.getInstance().getHeight() - DESKTOP_DECORATORS_HEIGHT);
     if (newHeight != height)
     {
       int oldDividerLocation = getDividerLocation();
@@ -149,8 +149,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
   {
     // TODO if CommandListener is only ever 1:1 for complementary views,
     // may change broadcast pattern to direct messaging (more efficient)
-    final StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
+    final StructureSelectionManager ssm = Desktop
+            .getStructureSelectionManager();
     ssm.addCommandListener(((AlignFrame) getTopFrame()).getViewport());
     ssm.addCommandListener(((AlignFrame) getBottomFrame()).getViewport());
   }
@@ -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,36 +228,32 @@ 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());
-    int myHeight = getHeight();
-    double minRatio = topPanelMinHeight / (double) myHeight;
+            - 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 bottomPanelHeight = bottomFrame.getHeight();
     int bottomSequencesHeight = bottomFrame.alignPanel.getSeqPanel().seqCanvas
             .getHeight();
     int bottomPanelMinHeight = bottomPanelHeight
-            - Math.max(
-                    0,
-                    bottomSequencesHeight - 2
-                            * bottomViewport.getCharHeight());
-    double maxRatio = (myHeight - bottomPanelMinHeight) / (double) myHeight;
+            - Math.max(0, bottomSequencesHeight - 3 * bottomCharHeight);
+    double maxRatio = (totalHeight - bottomPanelMinHeight) / totalHeight;
 
     /*
      * estimate ratio of (topFrameContent / bottomFrameContent)
      */
-    int insets = Platform.isAMac() ? MAC_INSETS_HEIGHT
+    int insets = Platform.isAMacAndNotJS() ? MAC_INSETS_HEIGHT
             : WINDOWS_INSETS_HEIGHT;
     // allow 3 'rows' for scale, scrollbar, status bar
     int topHeight = insets + (3 + topCount) * topCharHeight
@@ -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);
   }
 
   /**
@@ -282,7 +282,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
       public void internalFrameClosed(InternalFrameEvent evt)
       {
         close();
-      };
+      }
     });
   }
 
@@ -539,7 +539,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
       topFrame.setDisplayedView(newTopPanel);
     }
 
-    newBottomPanel.av.viewName = newTopPanel.av.viewName;
+    newBottomPanel.av.setViewName(newTopPanel.av.getViewName());
     newTopPanel.av.setCodingComplement(newBottomPanel.av);
 
     /*
@@ -555,8 +555,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
      */
     adjustLayout();
 
-    final StructureSelectionManager ssm = StructureSelectionManager
-            .getStructureSelectionManager(Desktop.instance);
+    final StructureSelectionManager ssm = Desktop
+            .getStructureSelectionManager();
     ssm.addCommandListener(newTopPanel.av);
     ssm.addCommandListener(newBottomPanel.av);
   }
@@ -683,7 +683,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   protected void expandViews_actionPerformed()
   {
-    Desktop.instance.explodeViews(this);
+    Desktop.getInstance().explodeViews(this);
   }
 
   /**
@@ -692,7 +692,7 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
    */
   protected void gatherViews_actionPerformed()
   {
-    Desktop.instance.gatherViews(this);
+    Desktop.getInstance().gatherViews(this);
   }
 
   /**