X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FSplitFrame.java;h=5bff407860c8fc9bb1738639503bb6e9c5da4d30;hb=bd894ca9f2aae448653d7431ab8a170e1105e85c;hp=31742592fa884e7f0d8d0233fa4799cebb890e6b;hpb=8181358395df043e2554381f84229cc0e0323011;p=jalview.git diff --git a/src/jalview/gui/SplitFrame.java b/src/jalview/gui/SplitFrame.java index 3174259..5bff407 100644 --- a/src/jalview/gui/SplitFrame.java +++ b/src/jalview/gui/SplitFrame.java @@ -131,8 +131,8 @@ 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); + int newHeight = Math.min(height, + Desktop.instance.getHeight() - DESKTOP_DECORATORS_HEIGHT); if (newHeight != height) { int oldDividerLocation = getDividerLocation(); @@ -188,25 +188,35 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI : (!bottomAlignment.isNucleotide() ? bottomViewport : null); if (protein != null && cdna != null) { - // if (protein.isProteinFontAsCdna()) - // { - // TODO handle different fonts - int scale = protein.isScaleProteinAsCdna() ? 3 : 1; - protein.setCharWidth(scale * cdna.getViewStyle().getCharWidth()); - // } + int scale = protein.isScaleProteinAsCdna() ? 3 : 1; + protein.setCharWidth(scale * cdna.getViewStyle().getCharWidth()); } } /** - * 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();
@@ -218,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
@@ -227,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);
}
@@ -377,8 +411,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
/*
* Ctrl-W / Cmd-W - close view or window
*/
- KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W, Toolkit
- .getDefaultToolkit().getMenuShortcutKeyMask(), false);
+ KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
action = new AbstractAction()
{
@Override
@@ -398,8 +432,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
/*
* Ctrl-T / Cmd-T open new view
*/
- KeyStroke key_cmdT = KeyStroke.getKeyStroke(KeyEvent.VK_T, Toolkit
- .getDefaultToolkit().getMenuShortcutKeyMask(), false);
+ KeyStroke key_cmdT = KeyStroke.getKeyStroke(KeyEvent.VK_T,
+ Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
AbstractAction action = new AbstractAction()
{
@Override
@@ -452,8 +486,8 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
Component c = getFrameAtMouse();
if (c != null && c instanceof AlignFrame)
{
- for (ActionListener a : ((AlignFrame) c).getAccelerators()
- .get(ks).getActionListeners())
+ for (ActionListener a : ((AlignFrame) c).getAccelerators().get(ks)
+ .getActionListeners())
{
a.actionPerformed(null);
}
@@ -723,8 +757,9 @@ public class SplitFrame extends GSplitFrame implements SplitContainerI
*/
public List