2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.jbgui;
23 import jalview.util.Platform;
25 import java.awt.Component;
26 import java.awt.MouseInfo;
27 import java.awt.Point;
28 import java.awt.Rectangle;
30 import javax.swing.JInternalFrame;
31 import javax.swing.JSplitPane;
32 import javax.swing.plaf.basic.BasicInternalFrameUI;
34 public class GSplitFrame extends JInternalFrame
36 protected static final int DIVIDER_SIZE = 5;
38 private static final long serialVersionUID = 1L;
40 private GAlignFrame topFrame;
42 private GAlignFrame bottomFrame;
44 private JSplitPane splitPane;
47 * proportional position of split divider; saving this allows it to be
48 * restored after hiding one half and resizing
50 private double dividerRatio;
52 private static boolean doSetDivider = !Platform.isJS(); // BH why? Old?
60 public GSplitFrame(GAlignFrame top, GAlignFrame bottom)
63 this.bottomFrame = bottom;
71 * Create and add the split pane containing the top and bottom components.
73 protected void addSplitPane()
75 splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topFrame,
77 splitPane.setVisible(true);
80 * set divider split at 50:50, or restore saved split if loading from
83 int topFrameHeight = topFrame.getHeight();
86 splitPane.setDividerSize(DIVIDER_SIZE);
87 if (topFrameHeight == 0)
89 setRelativeDividerLocation(0.5d); // as a proportion
93 int dividerPosition = topFrameHeight + DIVIDER_SIZE / 2;
94 splitPane.setDividerLocation(dividerPosition); // absolute position
96 splitPane.setResizeWeight(0.5d);
102 * Try to hide the title bars as a waste of precious space.
105 * ://stackoverflow.com/questions/7218971/java-method-works-on-windows
106 * -but-not-macintosh -java
108 protected void hideTitleBars()
110 if (Platform.isAMacAndNotJS())
112 // this saves some space - but doesn't hide the title bar
113 topFrame.putClientProperty("JInternalFrame.isPalette", true);
114 // topFrame.getRootPane().putClientProperty("Window.style", "small");
115 bottomFrame.putClientProperty("JInternalFrame.isPalette", true);
121 ((BasicInternalFrameUI) topFrame.getUI()).setNorthPane(null);
122 ((BasicInternalFrameUI) bottomFrame.getUI()).setNorthPane(null);
127 public GAlignFrame getTopFrame()
132 public GAlignFrame getBottomFrame()
138 * Returns the split pane component the mouse is in, or null if neither.
142 protected GAlignFrame getFrameAtMouse()
144 Point loc = MouseInfo.getPointerInfo().getLocation();
146 if (isIn(loc, splitPane.getTopComponent()))
148 return getTopFrame();
150 else if (isIn(loc, splitPane.getBottomComponent()))
152 return getBottomFrame();
157 private boolean isIn(Point loc, Component comp)
159 if (!comp.isVisible())
163 Point p = comp.getLocationOnScreen();
164 Rectangle r = new Rectangle(p.x, p.y, comp.getWidth(),
166 return r.contains(loc);
170 * Makes the complement of the specified split component visible or hidden,
171 * restoring or saving the position of the split divide.
173 public void setComplementVisible(Object alignFrame, boolean show)
176 * save divider ratio on hide, restore on show
180 setRelativeDividerLocation(dividerRatio);
184 this.dividerRatio = splitPane.getDividerLocation()
185 / (double) (splitPane.getHeight()
186 - splitPane.getDividerSize());
189 if (alignFrame == this.topFrame)
191 this.bottomFrame.setVisible(show);
193 else if (alignFrame == this.bottomFrame)
195 this.topFrame.setVisible(show);
202 * Set the divider location as a proportion (0 <= r <= 1) of the height <br>
203 * Warning: this overloads setDividerLocation(int), and getDividerLocation()
204 * returns the int (pixel count) value
208 public void setRelativeDividerLocation(double r)
210 this.dividerRatio = r;
212 if (!Platform.isJS())
214 splitPane.setDividerLocation(r);
219 * Sets the divider location (in pixels from top)
223 protected void setDividerLocation(int p)
227 splitPane.setDividerLocation(p);
232 * Returns the divider location (in pixels from top)
236 protected int getDividerLocation()
238 return splitPane.getDividerLocation();