X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSplitFrame.java;h=5bff407860c8fc9bb1738639503bb6e9c5da4d30;hb=406e7b1a013740e38221de3a0621232aa229093e;hp=beb2d628e76cd902d4e60745e13107d1c9ec9d08;hpb=3d0101179759ef157b088ea135423cd909512d9f;p=jalview.git diff --git a/src/jalview/gui/SplitFrame.java b/src/jalview/gui/SplitFrame.java index beb2d62..5bff407 100644 --- a/src/jalview/gui/SplitFrame.java +++ b/src/jalview/gui/SplitFrame.java @@ -194,15 +194,29 @@ 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. + *

+ * 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() { - final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport; - final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport; + AlignFrame topFrame = (AlignFrame) getTopFrame(); + AlignFrame bottomFrame = (AlignFrame) getBottomFrame(); + + /* + * recompute layout of top and bottom panels to reflect their + * actual (rather than requested) height + */ + topFrame.alignPanel.adjustAnnotationHeight(); + bottomFrame.alignPanel.adjustAnnotationHeight(); + + final AlignViewport topViewport = topFrame.viewport; + final AlignViewport bottomViewport = bottomFrame.viewport; final AlignmentI topAlignment = topViewport.getAlignment(); final AlignmentI bottomAlignment = bottomViewport.getAlignment(); boolean topAnnotations = topViewport.isShowAnnotation(); @@ -214,6 +228,29 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI int bottomCharHeight = bottomViewport.getViewStyle().getCharHeight(); /* + * 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 - 3 * topCharHeight); + double totalHeight = (double) topPanelHeight + bottomPanelHeight; + double minRatio = topPanelMinHeight / totalHeight; + + /* + * 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 - 3 * bottomCharHeight); + double maxRatio = (totalHeight - bottomPanelMinHeight) / totalHeight; + + /* * estimate ratio of (topFrameContent / bottomFrameContent) */ int insets = Platform.isAMac() ? MAC_INSETS_HEIGHT @@ -223,13 +260,14 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI + (topAnnotations ? topViewport.calcPanelHeight() : 0); int bottomHeight = insets + (3 + bottomCount) * bottomCharHeight + (bottomAnnotations ? bottomViewport.calcPanelHeight() : 0); - double ratio = ((double) topHeight) / (topHeight + bottomHeight); + double ratio = ((double) topHeight) + / (double) (topHeight + bottomHeight); /* - * limit to 0.2 <= ratio <= 0.8 to avoid concealing all sequences + * limit ratio to avoid concealing all sequences */ - ratio = Math.min(ratio, 0.8d); - ratio = Math.max(ratio, 0.2d); + ratio = Math.min(ratio, maxRatio); + ratio = Math.max(ratio, minRatio); setRelativeDividerLocation(ratio); }