import jalview.viewmodel.AlignmentViewport;
import java.awt.Component;
-import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
import javax.swing.JComponent;
+import javax.swing.JDesktopPane;
+import javax.swing.JInternalFrame;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
import javax.swing.event.InternalFrameAdapter;
}
/**
- * Adjust the divider for a sensible split of the real estate (for example,
+ * Adjusts the divider for a sensible split of the real estate (for example,
* when many transcripts are shown with a single protein). This should only be
* called after the split pane has been laid out (made visible) so it has a
- * height.
+ * height. The aim is to avoid unnecessary vertical scroll bars, while
+ * ensuring that at least 2 sequences are visible in each panel.
+ * <p>
+ * Once laid out, the user may choose to customise as they wish, so this
+ * method is not called again after the initial layout.
*/
- protected void adjustDivider()
+ protected void adjustInitialLayout()
{
AlignFrame topFrame = (AlignFrame) getTopFrame();
AlignFrame bottomFrame = (AlignFrame) getBottomFrame();
int bottomCharHeight = bottomViewport.getViewStyle().getCharHeight();
/*
- * calculate the minimum ratio that leaves at least
- * two sequences visible in the top panel
+ * calculate the minimum ratio that leaves at least the height
+ * of two sequences (after rounding) visible in the top panel
*/
int topPanelHeight = topFrame.getHeight();
int bottomPanelHeight = bottomFrame.getHeight();
int topSequencesHeight = topFrame.alignPanel.getSeqPanel().seqCanvas
.getHeight();
int topPanelMinHeight = topPanelHeight
- - Math.max(0,
- topSequencesHeight - 2 * topViewport.getCharHeight());
+ - Math.max(0, topSequencesHeight - 3 * topCharHeight);
double totalHeight = (double) topPanelHeight + bottomPanelHeight;
double minRatio = topPanelMinHeight / totalHeight;
/*
- * calculate the maximum ratio that leaves at least
- * two sequences visible in the bottom panel
+ * calculate the maximum ratio that leaves at least the height
+ * of two sequences (after rounding) visible in the bottom panel
*/
int bottomSequencesHeight = bottomFrame.alignPanel.getSeqPanel().seqCanvas
.getHeight();
int bottomPanelMinHeight = bottomPanelHeight
- - Math.max(
- 0,
- bottomSequencesHeight - 2
- * bottomViewport.getCharHeight());
+ - Math.max(0, bottomSequencesHeight - 3 * bottomCharHeight);
double maxRatio = (totalHeight - bottomPanelMinHeight) / totalHeight;
/*
*/
ratio = Math.min(ratio, maxRatio);
ratio = Math.max(ratio, minRatio);
- // setRelativeDividerLocation(ratio);
+ setRelativeDividerLocation(ratio);
}
/**
* Ctrl-W / Cmd-W - close view or window
*/
KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
- Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+ jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
action = new AbstractAction()
{
@Override
* Ctrl-T / Cmd-T open new view
*/
KeyStroke key_cmdT = KeyStroke.getKeyStroke(KeyEvent.VK_T,
- Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+ jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
AbstractAction action = new AbstractAction()
{
@Override
topFrame.setDisplayedView(newTopPanel);
}
- newBottomPanel.av.viewName = newTopPanel.av.viewName;
+ newBottomPanel.av.setViewName(newTopPanel.av.getViewName());
newTopPanel.av.setCodingComplement(newBottomPanel.av);
/*
* Ctrl-F / Cmd-F open Finder dialog, 'focused' on the right alignment
*/
KeyStroke key_cmdF = KeyStroke.getKeyStroke(KeyEvent.VK_F,
- Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(), false);
+ jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
AbstractAction action = new AbstractAction()
{
@Override
};
overrideKeyBinding(key_cmdF, action);
}
+
+ /**
+ * Override to do nothing if triggered from one of the child frames
+ */
+ @Override
+ public void setSelected(boolean selected) throws PropertyVetoException
+ {
+ JDesktopPane desktopPane = getDesktopPane();
+ JInternalFrame fr = desktopPane == null ? null
+ : desktopPane.getSelectedFrame();
+ if (fr == getTopFrame() || fr == getBottomFrame())
+ {
+ /*
+ * patch for JAL-3288 (deselecting top/bottom frame closes popup menu);
+ * it may be possible to remove this method in future
+ * if the underlying Java behaviour changes
+ */
+ if (selected)
+ {
+ moveToFront();
+ }
+ return;
+ }
+ super.setSelected(selected);
+ }
}