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 private static final long serialVersionUID = 1L;
38 private GAlignFrame topFrame;
40 private GAlignFrame bottomFrame;
42 private JSplitPane splitPane;
50 public GSplitFrame(GAlignFrame top, GAlignFrame bottom)
53 this.bottomFrame = bottom;
61 * Create and add the split pane containing the top and bottom components.
63 protected void addSplitPane()
65 splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, topFrame,
67 splitPane.setVisible(true);
68 final double ratio = bottomFrame.getHeight() == 0 ? 0.5d : topFrame
70 / (double) (topFrame.getHeight() + bottomFrame.getHeight());
71 splitPane.setDividerLocation(ratio);
72 splitPane.setResizeWeight(ratio);
73 splitPane.setDividerSize(5);
78 * Try to hide the title bars as a waste of precious space.
81 * ://stackoverflow.com/questions/7218971/java-method-works-on-windows
82 * -but-not-macintosh -java
84 protected void hideTitleBars()
86 if (new Platform().isAMac())
88 // this saves some space - but doesn't hide the title bar
89 topFrame.putClientProperty("JInternalFrame.isPalette", true);
90 // topFrame.getRootPane().putClientProperty("Window.style", "small");
91 bottomFrame.putClientProperty("JInternalFrame.isPalette", true);
95 ((BasicInternalFrameUI) topFrame.getUI()).setNorthPane(null);
96 ((BasicInternalFrameUI) bottomFrame.getUI()).setNorthPane(null);
100 public GAlignFrame getTopFrame()
105 public GAlignFrame getBottomFrame()
111 * Returns the split pane component the mouse is in, or null if neither.
115 protected GAlignFrame getFrameAtMouse()
117 Point loc = MouseInfo.getPointerInfo().getLocation();
119 if (isIn(loc, splitPane.getTopComponent()))
121 return getTopFrame();
123 else if (isIn(loc, splitPane.getBottomComponent()))
125 return getBottomFrame();
130 private boolean isIn(Point loc, Component comp)
132 if (!comp.isVisible())
136 Point p = comp.getLocationOnScreen();
137 Rectangle r = new Rectangle(p.x, p.y, comp.getWidth(), comp.getHeight());
138 return r.contains(loc);
142 * Make the complement of the specified split component visible or hidden,
143 * adjusting the position of the split divide.
145 public void setComplementVisible(Object alignFrame, boolean show)
147 if (alignFrame == this.topFrame)
149 this.bottomFrame.setVisible(show);
151 else if (alignFrame == this.bottomFrame)
153 this.topFrame.setVisible(show);
157 // SplitPane needs nudging to restore 50-50 split
158 // TODO save/restore other ratios
159 splitPane.setDividerLocation(0.5d);