X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fjbgui%2FGSplitFrame.java;h=4d531bed4caf87f523b9d4af17e5bbd7a95bff27;hb=aa08cfe91eda60027de76aafb0bcdbfc6481a1d9;hp=b9f07db8ea5988c8aa8248b7237ec7ac61779516;hpb=4d7f98a6dd54d9863ba449ec79dcd95d25ed863d;p=jalview.git
diff --git a/src/jalview/jbgui/GSplitFrame.java b/src/jalview/jbgui/GSplitFrame.java
index b9f07db..4d531be 100644
--- a/src/jalview/jbgui/GSplitFrame.java
+++ b/src/jalview/jbgui/GSplitFrame.java
@@ -1,7 +1,25 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ 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;
@@ -11,8 +29,12 @@ 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
*
@@ -29,6 +57,8 @@ public class GSplitFrame extends JInternalFrame
*/
public GSplitFrame(GAlignFrame top, GAlignFrame bottom)
{
+ setFrameIcon(null);
+ setName("jalview-splitframe");
this.topFrame = top;
this.bottomFrame = bottom;
@@ -45,12 +75,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);
}
@@ -63,7 +104,7 @@ public class GSplitFrame extends JInternalFrame
*/
protected void hideTitleBars()
{
- if (new Platform().isAMac())
+ if (Platform.isAMacAndNotJS())
{
// this saves some space - but doesn't hide the title bar
topFrame.putClientProperty("JInternalFrame.isPalette", true);
@@ -114,16 +155,31 @@ public class GSplitFrame extends JInternalFrame
return false;
}
Point p = comp.getLocationOnScreen();
- Rectangle r = new Rectangle(p.x, p.y, comp.getWidth(), comp.getHeight());
+ Rectangle r = new Rectangle(p.x, p.y, comp.getWidth(),
+ comp.getHeight());
return r.contains(loc);
}
/**
- * 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);
@@ -132,12 +188,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();
+ }
}