X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fjbgui%2FGSplitFrame.java;h=2ae335cf6ca5d5ca6c8b2a9ef2324cb53650c4de;hb=c19d2a91ca05e052e3408bf5852d88eb5d0608f1;hp=a377571e2997633aca20081cd45e24daeea66c3b;hpb=be32c14cd8e48fe0a207cd7030cb9cd46f894678;p=jalview.git diff --git a/src/jalview/jbgui/GSplitFrame.java b/src/jalview/jbgui/GSplitFrame.java index a377571..2ae335c 100644 --- a/src/jalview/jbgui/GSplitFrame.java +++ b/src/jalview/jbgui/GSplitFrame.java @@ -1,5 +1,27 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b2) + * Copyright (C) 2015 The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.jbgui; +import jalview.util.Platform; + import java.awt.Component; import java.awt.MouseInfo; import java.awt.Point; @@ -9,10 +31,10 @@ import javax.swing.JInternalFrame; import javax.swing.JSplitPane; import javax.swing.plaf.basic.BasicInternalFrameUI; -import jalview.util.Platform; - public class GSplitFrame extends JInternalFrame { + protected static final int DIVIDER_SIZE = 5; + private static final long serialVersionUID = 1L; private GAlignFrame topFrame; @@ -21,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 * @@ -45,11 +73,23 @@ public class GSplitFrame extends JInternalFrame splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topFrame, bottomFrame); splitPane.setVisible(true); - final double ratio = 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); } @@ -94,7 +134,7 @@ public class GSplitFrame extends JInternalFrame protected GAlignFrame getFrameAtMouse() { Point loc = MouseInfo.getPointerInfo().getLocation(); - + if (isIn(loc, splitPane.getTopComponent())) { return getTopFrame(); @@ -118,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); @@ -131,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(); + } }