*/
package jalview.gui;
-import jalview.api.AlignViewControllerGuiI;
-import jalview.api.FeatureSettingsControllerI;
-import jalview.api.SplitContainerI;
-import jalview.controller.FeatureSettingsControllerGuiI;
-import jalview.datamodel.AlignmentI;
-import jalview.jbgui.GAlignFrame;
-import jalview.jbgui.GSplitFrame;
-import jalview.structure.StructureSelectionManager;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.viewmodel.AlignmentViewport;
-
+import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.AbstractAction;
import javax.swing.InputMap;
+import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
+import jalview.api.AlignViewControllerGuiI;
+import jalview.api.FeatureSettingsControllerI;
+import jalview.api.SplitContainerI;
+import jalview.controller.FeatureSettingsControllerGuiI;
+import jalview.datamodel.AlignmentI;
+import jalview.jbgui.GAlignFrame;
+import jalview.jbgui.GSplitFrame;
+import jalview.structure.StructureSelectionManager;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.viewmodel.AlignmentViewport;
+
/**
* An internal frame on the desktop that hosts a horizontally split view of
* linked DNA and Protein alignments. Additional views can be created in linked
* estimate width and height of SplitFrame; this.getInsets() doesn't seem to
* give the full additional size (a few pixels short)
*/
- int widthFudge = Platform.isAMac() ? MAC_INSETS_WIDTH
+ int widthFudge = Platform.isAMacAndNotJS() ? MAC_INSETS_WIDTH
: WINDOWS_INSETS_WIDTH;
- int heightFudge = Platform.isAMac() ? MAC_INSETS_HEIGHT
+ int heightFudge = Platform.isAMacAndNotJS() ? MAC_INSETS_HEIGHT
: WINDOWS_INSETS_HEIGHT;
int width = ((AlignFrame) getTopFrame()).getWidth() + widthFudge;
int height = ((AlignFrame) getTopFrame()).getHeight()
*/
public void adjustLayout()
{
+ final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport;
+ final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport;
+
/*
* Ensure sequence ids are the same width so sequences line up
*/
- int w1 = ((AlignFrame) getTopFrame()).getViewport().getIdWidth();
- int w2 = ((AlignFrame) getBottomFrame()).getViewport().getIdWidth();
+ int w1 = topViewport.getIdWidth();
+ int w2 = bottomViewport.getIdWidth();
int w3 = Math.max(w1, w2);
- if (w1 != w3)
- {
- ((AlignFrame) getTopFrame()).getViewport().setIdWidth(w3);
- }
- if (w2 != w3)
- {
- ((AlignFrame) getBottomFrame()).getViewport().setIdWidth(w3);
- }
+ topViewport.setIdWidth(w3);
+ bottomViewport.setIdWidth(w3);
/*
* Scale protein to either 1 or 3 times character width of dna
*/
- final AlignViewport topViewport = ((AlignFrame) getTopFrame()).viewport;
- final AlignViewport bottomViewport = ((AlignFrame) getBottomFrame()).viewport;
final AlignmentI topAlignment = topViewport.getAlignment();
final AlignmentI bottomAlignment = bottomViewport.getAlignment();
AlignmentViewport cdna = topAlignment.isNucleotide() ? topViewport
* 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 bottomSequencesHeight = bottomFrame.alignPanel
+ .getSeqPanel().seqCanvas.getHeight();
int bottomPanelMinHeight = bottomPanelHeight
- Math.max(0, bottomSequencesHeight - 3 * bottomCharHeight);
double maxRatio = (totalHeight - bottomPanelMinHeight) / totalHeight;
/*
* estimate ratio of (topFrameContent / bottomFrameContent)
*/
- int insets = Platform.isAMac() ? MAC_INSETS_HEIGHT
+ int insets = Platform.isAMacAndNotJS() ? MAC_INSETS_HEIGHT
: WINDOWS_INSETS_HEIGHT;
// allow 3 'rows' for scale, scrollbar, status bar
int topHeight = insets + (3 + topCount) * topCharHeight
* Ctrl-W / Cmd-W - close view or window
*/
KeyStroke key_cmdW = KeyStroke.getKeyStroke(KeyEvent.VK_W,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), 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,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false);
AbstractAction action = new AbstractAction()
{
@Override
* Ctrl-F / Cmd-F open Finder dialog, 'focused' on the right alignment
*/
KeyStroke key_cmdF = KeyStroke.getKeyStroke(KeyEvent.VK_F,
- jalview.util.ShortcutKeyMaskExWrapper.getMenuShortcutKeyMaskEx(), false);
+ jalview.util.ShortcutKeyMaskExWrapper
+ .getMenuShortcutKeyMaskEx(),
+ false);
AbstractAction action = new AbstractAction()
{
@Override
if (c != null && c instanceof AlignFrame)
{
AlignFrame af = (AlignFrame) c;
- new Finder(af.viewport, af.alignPanel);
+ boolean dna = af.getViewport().getAlignment().isNucleotide();
+ String scope = MessageManager.getString("label.in") + " "
+ + (dna ? MessageManager.getString("label.nucleotide")
+ : MessageManager.getString("label.protein"));
+ new Finder(af.alignPanel, true, scope);
}
}
};
}
/**
- * holds the frame for feature settings, so Protein and DNA tabs can be managed
+ * holds the frame for feature settings, so Protein and DNA tabs can be
+ * managed
*/
JInternalFrame featureSettingsUI;
{
showInternalFrame = true;
featureSettingsPanels = new JTabbedPane();
- featureSettingsUI = new JInternalFrame(
- "Feature Settings for CDS and Protein Views");
+ featureSettingsPanels.addChangeListener(new ChangeListener()
+ {
+
+ @Override
+ public void stateChanged(ChangeEvent e)
+ {
+ if (e.getSource() != featureSettingsPanels
+ || featureSettingsUI == null
+ || featureSettingsUI.isClosed()
+ || !featureSettingsUI.isVisible())
+ {
+ // not our tabbed pane
+ return;
+ }
+ int tab = featureSettingsPanels.getSelectedIndex();
+ if (tab < 0 || featureSettingsPanels
+ .getSelectedComponent() instanceof FeatureSettingsControllerGuiI)
+ {
+ // no tab selected or already showing a feature settings GUI
+ return;
+ }
+ getAlignFrames().get(tab).showFeatureSettingsUI();
+ }
+ });
+ featureSettingsUI = new JInternalFrame(MessageManager.getString(
+ "label.sequence_feature_settings_for_CDS_and_Protein"));
featureSettingsPanels.setOpaque(true);
- featureSettingsUI.setContentPane(featureSettingsPanels);
+
+ JPanel dialog = new JPanel();
+ dialog.setOpaque(true);
+ dialog.setLayout(new BorderLayout());
+ dialog.add(featureSettingsPanels, BorderLayout.CENTER);
+ JPanel buttons = new JPanel();
+ JButton ok = new JButton(MessageManager.getString("action.ok"));
+ ok.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ try
+ {
+ featureSettingsUI.setClosed(true);
+ } catch (PropertyVetoException pv)
+ {
+ pv.printStackTrace();
+ }
+ }
+ });
+ JButton cancel = new JButton(
+ MessageManager.getString("action.cancel"));
+ cancel.addActionListener(new ActionListener()
+ {
+
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ try
+ {
+ for (Component fspanel : featureSettingsPanels.getComponents())
+ {
+ if (fspanel instanceof FeatureSettingsControllerGuiI)
+ {
+ ((FeatureSettingsControllerGuiI) fspanel).revert();
+ }
+ }
+ featureSettingsUI.setClosed(true);
+ } catch (Exception pv)
+ {
+ pv.printStackTrace();
+ }
+ }
+ });
+ buttons.add(ok);
+ buttons.add(cancel);
+ dialog.add(buttons, BorderLayout.SOUTH);
+ featureSettingsUI.setContentPane(dialog);
createDummyTabs();
}
if (featureSettingsPanels
if (pos == 0)
{
featureSettingsPanels.removeTabAt(0);
- featureSettingsPanels.insertTab("CDS", null,
- (Component) featureSettings, "Feature Settings for DNA CDS",
+ featureSettingsPanels.insertTab(tabName[0], null,
+ (Component) featureSettings,
+ MessageManager.formatMessage(
+ "label.sequence_feature_settings_for", tabName[0]),
0);
}
if (pos == 1)
{
featureSettingsPanels.removeTabAt(1);
- featureSettingsPanels.insertTab("Protein", null,
- (Component) featureSettings, "Feature Settings for Protein",
+ featureSettingsPanels.insertTab(tabName[1], null,
+ (Component) featureSettings,
+ MessageManager.formatMessage(
+ "label.sequence_feature_settings_for", tabName[1]),
1);
}
featureSettingsPanels.setSelectedComponent((Component) featureSettings);
if (showInternalFrame)
{
- if (Platform.isAMac())
+ if (Platform.isAMacAndNotJS())
{
Desktop.addInternalFrame(featureSettingsUI,
MessageManager.getString(
- "Feature Settings for CDS and Protein Views"),
+ "label.sequence_feature_settings_for_CDS_and_Protein"),
600, 480);
}
else
{
Desktop.addInternalFrame(featureSettingsUI,
MessageManager.getString(
- "Feature Settings for CDS and Protein Views"),
+ "label.sequence_feature_settings_for_CDS_and_Protein"),
600, 450);
}
featureSettingsUI
}
}
featureSettingsPanels = null;
+ featureSettingsUI = null;
};
});
featureSettingsUI.setLayer(JLayeredPane.PALETTE_LAYER);
}
}
- /*
- * for materialising feature settings for a tab when clicked on
- */
- private FocusListener fl1 = new FocusListener()
- {
-
- @Override
- public void focusLost(FocusEvent e)
- {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void focusGained(FocusEvent e)
- {
- int tab = featureSettingsPanels.getSelectedIndex();
- getAlignFrames().get(tab).showFeatureSettingsUI();
- }
- };
-
/**
* tab names for feature settings
*/
private String[] tabName = new String[] {
MessageManager.getString("label.CDS"),
- MessageManager.getString("label.Protein") };
+ MessageManager.getString("label.protein") };
/**
* create placeholder tabs which materialise the feature settings for a given
for (int tabIndex = 0; tabIndex < 2; tabIndex++)
{
JPanel dummyTab = new JPanel();
- dummyTab.addFocusListener(fl1);
featureSettingsPanels.addTab(tabName[tabIndex], dummyTab);
}
}
for (int tabIndex = 0; tabIndex < 2; tabIndex++)
{
if (featureSettingsPanels.getTabCount() > tabIndex)
- {
+ {
dummyTab = featureSettingsPanels.getTabComponentAt(tabIndex);
if (dummyTab instanceof FeatureSettingsControllerGuiI
&& !dummyTab.isVisible())
- {
+ {
featureSettingsPanels.removeTabAt(tabIndex);
// close the feature Settings tab
((FeatureSettingsControllerGuiI) dummyTab)
.featureSettings_isClosed();
// create a dummy tab in its place
- dummyTab = new JPanel();
- dummyTab.addFocusListener(fl1);
+ dummyTab = new JPanel();
featureSettingsPanels.insertTab(tabName[tabIndex], null, dummyTab,
MessageManager.formatMessage(
"label.sequence_feature_settings_for",
tabName[tabIndex]),
tabIndex);
+ }
}
}
- }
}
@Override