X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGSplitFrame.java;h=daad4fde305e98b52bef209682b9acd35a2b5575;hb=b0842a6ddaef0ceb4de3e1534c3772515d4b103d;hp=5661ab0102a53dbdb46fde5930a0b3ac03e6d0e9;hpb=a9734e4d3a0683b713aee7136bfda0640ef579b1;p=jalview.git diff --git a/src/jalview/jbgui/GSplitFrame.java b/src/jalview/jbgui/GSplitFrame.java index 5661ab0..daad4fd 100644 --- a/src/jalview/jbgui/GSplitFrame.java +++ b/src/jalview/jbgui/GSplitFrame.java @@ -33,6 +33,8 @@ import javax.swing.plaf.basic.BasicInternalFrameUI; public class GSplitFrame extends JInternalFrame { + private static final int DIVIDER_SIZE = 5; + private static final long serialVersionUID = 1L; private GAlignFrame topFrame; @@ -41,6 +43,12 @@ public class GSplitFrame extends JInternalFrame private JSplitPane splitPane; + /* + * proportional position of split divider; saving this allows it to be + * restored after hiding one half and resizing + */ + private double dividerRatio; + /** * Constructor * @@ -65,12 +73,23 @@ public class GSplitFrame extends JInternalFrame splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topFrame, bottomFrame); splitPane.setVisible(true); - final double ratio = bottomFrame.getHeight() == 0 ? 0.5d : topFrame - .getHeight() - / (double) (topFrame.getHeight() + bottomFrame.getHeight()); - splitPane.setDividerLocation(ratio); - splitPane.setResizeWeight(ratio); - splitPane.setDividerSize(5); + + /* + * set divider split at 50:50, or restore saved split if loading from + * project + */ + int topFrameHeight = topFrame.getHeight(); + splitPane.setDividerSize(DIVIDER_SIZE); + if (topFrameHeight == 0) + { + setRelativeDividerLocation(0.5d); // as a proportion + } + else + { + int dividerPosition = topFrameHeight + DIVIDER_SIZE / 2; + splitPane.setDividerLocation(dividerPosition); // absolute position + } + splitPane.setResizeWeight(0.5d); add(splitPane); } @@ -139,11 +158,25 @@ public class GSplitFrame extends JInternalFrame } /** - * Make the complement of the specified split component visible or hidden, - * adjusting the position of the split divide. + * Makes the complement of the specified split component visible or hidden, + * restoring or saving the position of the split divide. */ public void setComplementVisible(Object alignFrame, boolean show) { + /* + * save divider ratio on hide, restore on show + */ + if (show) + { + setRelativeDividerLocation(dividerRatio); + } + else + { + this.dividerRatio = splitPane.getDividerLocation() + / (double) (splitPane.getHeight() - splitPane + .getDividerSize()); + } + if (alignFrame == this.topFrame) { this.bottomFrame.setVisible(show); @@ -152,12 +185,40 @@ public class GSplitFrame extends JInternalFrame { this.topFrame.setVisible(show); } - if (show) - { - // SplitPane needs nudging to restore 50-50 split - // TODO save/restore other ratios - splitPane.setDividerLocation(0.5d); - } + validate(); } + + /** + * Set the divider location as a proportion (0 <= r <= 1) of the height
+ * Warning: this overloads setDividerLocation(int), and getDividerLocation() + * returns the int (pixel count) value + * + * @param r + */ + public void setRelativeDividerLocation(double r) + { + this.dividerRatio = r; + splitPane.setDividerLocation(r); + } + + /** + * Sets the divider location (in pixels from top) + * + * @return + */ + protected void setDividerLocation(int p) + { + splitPane.setDividerLocation(p); + } + + /** + * Returns the divider location (in pixels from top) + * + * @return + */ + protected int getDividerLocation() + { + return splitPane.getDividerLocation(); + } }