3 import jalview.jbgui.GSplitFrame;
5 import java.awt.Component;
6 import java.awt.MouseInfo;
8 import java.awt.Rectangle;
9 import java.awt.Toolkit;
10 import java.awt.event.ActionEvent;
11 import java.awt.event.KeyAdapter;
12 import java.awt.event.KeyEvent;
13 import java.awt.event.KeyListener;
14 import java.util.Map.Entry;
16 import javax.swing.AbstractAction;
17 import javax.swing.JComponent;
18 import javax.swing.JMenuItem;
19 import javax.swing.KeyStroke;
20 import javax.swing.event.InternalFrameAdapter;
21 import javax.swing.event.InternalFrameEvent;
23 public class SplitFrame extends GSplitFrame
25 private static final long serialVersionUID = 1L;
27 public SplitFrame(JComponent top, JComponent bottom)
34 * Initialise this frame.
38 setSize(AlignFrame.DEFAULT_WIDTH, Desktop.instance.getHeight() - 20);
40 addCloseFrameListener();
49 * Add a listener to tidy up when the frame is closed.
51 protected void addCloseFrameListener()
53 addInternalFrameListener(new InternalFrameAdapter()
56 public void internalFrameClosed(InternalFrameEvent evt)
58 if (getTopComponent() instanceof AlignFrame)
60 ((AlignFrame) getTopComponent())
61 .closeMenuItem_actionPerformed(true);
63 if (getBottomComponent() instanceof AlignFrame)
65 ((AlignFrame) getBottomComponent())
66 .closeMenuItem_actionPerformed(true);
73 * Add a key listener that delegates to whichever split component the mouse is
74 * in (or does nothing if neither).
76 protected void addKeyListener()
78 // TODO Key Bindings rather than KeyListener are recommended for Swing
79 addKeyListener(new KeyAdapter() {
82 public void keyPressed(KeyEvent e)
84 Component c = getComponentAtMouse();
87 for (KeyListener kl : c.getKeyListeners())
95 public void keyReleased(KeyEvent e)
97 Component c = getComponentAtMouse();
100 for (KeyListener kl : c.getKeyListeners())
111 * Returns the split pane component the mouse is in, or null if neither.
115 protected Component getComponentAtMouse()
117 Point loc = MouseInfo.getPointerInfo().getLocation();
119 if (isIn(loc, getTopComponent())) {
120 return getTopComponent();
122 else if (isIn(loc, getBottomComponent()))
124 return getBottomComponent();
129 private boolean isIn(Point loc, JComponent comp)
131 Point p = comp.getLocationOnScreen();
132 Rectangle r = new Rectangle(p.x, p.y, comp.getWidth(), comp.getHeight());
133 return r.contains(loc);
137 * Set key bindings (recommended for Swing over key accelerators).
139 private void addKeyBindings()
142 * Bind Cmd-Alt/I (invert column selection)
144 // If AlignFrame exposed a Map of Action objects by key,
145 // we could delegate all key bindings with a single lookup
146 this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
147 KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, Toolkit
148 .getDefaultToolkit().getMenuShortcutKeyMask()
149 | java.awt.event.KeyEvent.ALT_MASK, false),
151 this.getActionMap().put("INV_SEQ_SEL", new AbstractAction()
154 public void actionPerformed(ActionEvent e)
156 Component c = getComponentAtMouse();
157 if (c instanceof AlignFrame)
159 ((AlignFrame) c).invertColSel_actionPerformed(null);
163 if (getTopComponent() instanceof AlignFrame)
165 for (Entry<KeyStroke, JMenuItem> acc : ((AlignFrame) getTopComponent())
166 .getAccelerators().entrySet())
169 final KeyStroke ks = acc.getKey();
170 this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, ks);
171 this.getActionMap().put(ks, new AbstractAction()
174 public void actionPerformed(ActionEvent e)
176 Component c = getComponentAtMouse();
177 if (c instanceof AlignFrame)
179 ((AlignFrame) c).getAccelerators().get(ks)
180 .getActionListeners()[0].actionPerformed(null);