package statalign.ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Modifier;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JTabbedPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import statalign.StatAlign;
import statalign.base.Input;
import statalign.base.MainManager;
import statalign.base.Utils;
import statalign.io.DataType;
import statalign.io.RawSequences;
import statalign.model.ext.ModelExtension;
import statalign.model.subst.RecognitionError;
import statalign.model.subst.SubstitutionModel;
import statalign.model.subst.plugins.Dayhoff;
import statalign.model.subst.plugins.Kimura3;
import statalign.postprocess.Postprocess;
import statalign.postprocess.PostprocessManager;
/**
* The main frame of the program.
* Created by <code>statalign.StatAlign</code> when run in graphical mode.
* @author miklos, novak
*/
public class MainFrame extends JFrame implements ActionListener {
// Constants
private static final long serialVersionUID = 1L;
public static final String IDLE_STATUS_MESSAGE = " StatAlign :: Ready";
public static final String WELCOME_MSG =
"<html><div style='padding: 20px 20px 20px 20px; font-family: Arial; font-size: 12px'>" +
"<h2>Welcome to StatAlign!</h2><br>" +
"<p>To get started, please <a href='http://add'>add sequences</a> (and optionally structures) to analyse." +
"<p>If you need any help along the way, please refer to the <a href='http://doc'>manual</a>, which is available from the <b>Help menu.</b>" +
"<br><br>" +
"<p>Happy StatAligning!" +
// "<div style='padding: 20px 100px 0px 0px' align=right>" +
// "<p><i>The StatAlign team</i>" +
"</div></html>";
/** Set to true if StatAlign is allowed to open the online documentation */
private static final boolean ALLOW_ONLINE_DOCS = true;
private static final int CONNECT_TIMEOUT = 500;
public static final String USER_MANUAL = "doc/user_manual.html";
public static final String DEV_MANUAL = "doc/developer_manual.html";
public static final String JAVADOCS = "doc/javadoc/index.html";
// Variables
private JTabbedPane tab;
private List<Postprocess> pluginTabs;
private Input input;
public JToolBar toolBar;
private JButton openButton;
private JButton runButton;
private JButton pauseButton;
private JButton resumeButton;
private JButton stopButton;
public JToggleButton rnaButton;
// TODO The above should be inside the RNA plugin classes rather than here
private JMenuItem openItem;
private JMenuItem runItem;
private JMenuItem pauseItem;
private JMenuItem resumeItem;
private JMenuItem stopItem;
private JMenuItem[] modelButtons;
public JLabel statusText;
private HashMap<Integer, Postprocess> tabPluginMap = new HashMap<Integer, Postprocess>();
private int lastSelectedTabIndex;
/** The main manager that handles the MCMC run. */
public MainManager manager;
private McmcSettingsDlg mcmcSettingsDlg;
private File inFile;
private Class<? extends SubstitutionModel>[] substModels;
// Functions
OutputPreferences op;
RNASettingsDlg dlg = new RNASettingsDlg(this);
/** The only constructor of the class. It launches the main window. */
@SuppressWarnings("unchecked")
public MainFrame() throws Exception {
super("StatAlign " + StatAlign.version);
try {
String syslook = UIManager.getSystemLookAndFeelClassName();
if (!UIManager.getLookAndFeel().getClass().getName().equals(syslook)) {
UIManager.setLookAndFeel(syslook);
SwingUtilities.updateComponentTreeUI(this);
}
} catch (Exception ex) {
ex.printStackTrace();
// JOptionPane.showMessageDialog(this, ex);
}
ArrayList<Class<?>> substModList = new ArrayList<Class<?>>();
for (String model : Utils.classesInPackage(SubstitutionModel.class.getPackage().getName() + ".plugins")) {
try {
Class<?> cl = Class.forName(model);
/* Only include non-abstract substitution models that extend SubstitutionModel */
if (!Modifier.isAbstract(cl.getModifiers()) &&
SubstitutionModel.class.isAssignableFrom(cl))
substModList.add(cl);
} catch (Exception ex) {
ErrorMessage.showPane(null, ex, true);
}
}
substModels = (Class<? extends SubstitutionModel>[]) substModList.toArray(new Class<?>[substModList.size()]);
manager = new MainManager(this);
manager.init(null);
//mcmcSettingsDlg = new McmcSettingsDlg(this);
setMinimumSize(new Dimension(500, 250));
///
/// Creates the MenuBar and the ToolBar
///
toolBar = new JToolBar();
toolBar.setFloatable(false);
toolBar.setRollover(true);
JMenuBar menubar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.setMnemonic(KeyEvent.VK_F);
JMenuItem item;
String openText = "Add sequence(s)...";
ImageIcon icon = new ImageIcon(ClassLoader.getSystemResource("icons/open.png"));
openItem = createMenuItem(openText, true);
openItem.setAccelerator(KeyStroke.getKeyStroke("control O"));
openItem.setMnemonic(KeyEvent.VK_A);
openItem.setIcon(icon);
menu.add(openItem);
openButton = createButton(new ImageIcon(ClassLoader.
getSystemResource("icons/open.png")), "Add sequence(s)...");
openButton = createButton(icon, "Add sequence(s)...");
toolBar.add(openButton);
toolBar.addSeparator();
for(ModelExtension plugin : manager.modelExtMan.getPluginList()) {
if (plugin.getToolBarItems() != null) {
for(JComponent comp : plugin.getToolBarItems()) {
comp.setEnabled(plugin.isSelectable());
toolBar.add(comp);
}
}
}
String rnaText = "RNA mode";
rnaButton = createToggleButton(new ImageIcon(ClassLoader.getSystemResource("icons/rna1.png")), rnaText);
rnaButton.setEnabled(false);
rnaButton.setSelected(false);
toolBar.add(rnaButton);
mcmcSettingsDlg = new McmcSettingsDlg(this);
toolBar.addSeparator();
JMenuItem ioPreferencesItem = createMenuItem("Output settings...", true);
ioPreferencesItem.setAccelerator(KeyStroke.getKeyStroke("control 1"));
ioPreferencesItem.setMnemonic(KeyEvent.VK_O);
menu.add(ioPreferencesItem);
menu.addSeparator();
item = createMenuItem("Exit", true);
item.setAccelerator(KeyStroke.getKeyStroke("alt F4"));
item.setMnemonic(KeyEvent.VK_X);
menu.add(item);
menubar.add(menu);
// menu = new JMenu("Edit");
// menu.setMnemonic(KeyEvent.VK_E);
// item = new JMenuItem("Cut");
// item.addActionListener(this);
// item.setAccelerator(KeyStroke.getKeyStroke("control X"));
// menu.add(item);
// item = new JMenuItem("Copy");
// item.addActionListener(this);
// item.setAccelerator(KeyStroke.getKeyStroke("control C"));
// menu.add(item);
// item = new JMenuItem("Paste");
// item.addActionListener(this);
// item.setAccelerator(KeyStroke.getKeyStroke("control V"));
// menu.add(item);
// menubar.add(menu);
menu = new JMenu("Analysis");
menu.setMnemonic(KeyEvent.VK_A);
// item = createMenuItem("Settings", true);
// item.setAccelerator(KeyStroke.getKeyStroke("control M"));
// item.setMnemonic(KeyEvent.VK_S);
// menu.add(item);
String runText = "Run";
icon = new ImageIcon(ClassLoader.getSystemResource("icons/play.png"));
runItem = createMenuItem(runText, false);
runItem.setAccelerator(KeyStroke.getKeyStroke("control ENTER"));
runItem.setMnemonic(KeyEvent.VK_E);
runItem.setIcon(icon);
menu.add(runItem);
runButton = createButton(icon, runText);
menu.addSeparator();
runButton.setEnabled(false);
toolBar.add(runButton);
String pauseText = "Pause";
icon = new ImageIcon(ClassLoader.getSystemResource("icons/pause.png"));
pauseItem = createMenuItem("Pause", false);
pauseItem.setMnemonic(KeyEvent.VK_P);
pauseItem.setIcon(icon);
menu.add(pauseItem);
pauseButton = createButton(icon, pauseText);
pauseButton.setEnabled(false);
toolBar.add(pauseButton);
String resumeText = "Resume";
icon = new ImageIcon(ClassLoader.getSystemResource("icons/resume.png"));
resumeItem = createMenuItem(resumeText, false);
resumeItem.setMnemonic(KeyEvent.VK_R);
resumeItem.setIcon(icon);
menu.add(resumeItem);
resumeButton = createButton(icon, resumeText);
resumeButton.setEnabled(false);
toolBar.add(resumeButton);
String stopText = "Stop";
icon = new ImageIcon(ClassLoader.getSystemResource("icons/stop.png"));
stopItem = createMenuItem("Stop", false);
stopItem.setMnemonic(KeyEvent.VK_S);
stopItem.setIcon(icon);
menu.add(stopItem);
menubar.add(menu);
stopButton = createButton(icon, stopText);
stopButton.setEnabled(false);
toolBar.add(stopButton);
String settingsText = "Settings";
JButton settingsButton = createButton(new ImageIcon(ClassLoader.
getSystemResource("icons/settings.png")), settingsText);
toolBar.add(settingsButton);
menu = new JMenu("Substitution models");
menu.setMnemonic(KeyEvent.VK_M);
modelButtons = new JMenuItem[substModels.length];
ButtonGroup modelGroup = new ButtonGroup();
HashMap<String, ArrayList<Class<? extends SubstitutionModel>>> substModTypes =
new HashMap<String, ArrayList<Class<? extends SubstitutionModel>>>();
for (Class<? extends SubstitutionModel> cl : substModels) {
String type = SubstitutionModel.getType(cl);
ArrayList<Class<? extends SubstitutionModel>> arr = substModTypes.get(type);
if (arr == null)
substModTypes.put(type, arr = new ArrayList<Class<? extends SubstitutionModel>>());
arr.add(cl);
}
String[] typeArr = new String[substModTypes.keySet().size()];
int s = 0;
if (typeArr.length >= 2) {
typeArr[0] = "protein"; // amino acid subst models first
typeArr[1] = "nucleotide"; // then nucleotide models, then the rest
s = 2;
}
for (String type : substModTypes.keySet()) {
if (!type.equals("protein") && !type.equals("nucleotide"))
typeArr[s++] = type;
}
s = 0;
for (String type : typeArr) {
if (s > 0)
menu.addSeparator();
for (Class<? extends SubstitutionModel> cl : substModTypes.get(type)) {
String name = SubstitutionModel.getMenuName(cl);
item = new JRadioButtonMenuItem(name);
item.addActionListener(this);
modelButtons[s++] = item;
modelGroup.add(item);
menu.add(item);
}
}
modelGroup.clearSelection();
menubar.add(menu);
/*menu = new JMenu("View");
menu.setMnemonic(KeyEvent.VK_V);
JMenuItem zoomInItem = new JMenuItem("Zoom in");
zoomInItem.setEnabled(false);
zoomInItem.addActionListener(this);
menu.add(zoomInItem);
JMenuItem zoomOutItem = new JMenuItem("Zoom out");
zoomOutItem.setEnabled(false);
zoomOutItem.addActionListener(this);
menu.add(zoomOutItem);
JMenuItem autofitItem = new JMenuItem("Fit to frame");
autofitItem.setEnabled(false);
autofitItem.addActionListener(this);
menu.add(autofitItem);
menubar.add(menu);*/
menu = new JMenu("Help");
menu.setMnemonic(KeyEvent.VK_H);
item = new JMenuItem("About...");
item.setMnemonic(KeyEvent.VK_A);
item.addActionListener(this);
menu.add(item);
menu.addSeparator();
item = new JMenuItem("User's manual");
item.setMnemonic(KeyEvent.VK_U);
item.addActionListener(this);
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Developer's manual");
item.setMnemonic(KeyEvent.VK_D);
item.addActionListener(this);
menu.add(item);
item = new JMenuItem("Javadocs for StatAlign");
item.setMnemonic(KeyEvent.VK_J);
item.addActionListener(this);
menu.add(item);
menu.addSeparator();
item = new JMenuItem("Check for updates");
item.setMnemonic(KeyEvent.VK_C);
item.addActionListener(this);
menu.add(item);
menubar.add(menu);
setJMenuBar(menubar);
add(toolBar, BorderLayout.PAGE_START);
///
/// Creates the main panel
///
Container cp = getContentPane();
JPanel mainPanel = new JPanel(new BorderLayout());
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
mainPanel.setMinimumSize(new Dimension(screenSize.width / 3, screenSize.height / 3));
mainPanel.setMaximumSize(new Dimension(screenSize.width, screenSize.height));
mainPanel.setPreferredSize(new Dimension(screenSize.width / 2, screenSize.height / 2));
tab = new JTabbedPane();
tab.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent changeEvent) {
JTabbedPane pane = (JTabbedPane) changeEvent.getSource();
Integer i = pane.getSelectedIndex();
// Remove the last tab's toolbar items.
if (lastSelectedTabIndex != -1) {
Postprocess lastPlugin = tabPluginMap.get(lastSelectedTabIndex);
if (lastPlugin != null && lastPlugin.hasToolBar) {
for (JComponent item : lastPlugin.getToolBarItems()) {
toolBar.remove(item);
}
toolBar.repaint();
}
}
// Add the current tab's toolbar items.
Postprocess plugin = tabPluginMap.get(i);
if (plugin != null && plugin.hasToolBar) {
for (JComponent item : plugin.getToolBarItems()) {
toolBar.add(item);
}
toolBar.repaint();
}
lastSelectedTabIndex = i;
}
});
input = new Input(manager);
// Sorts the tab according to their getTabOrder()
pluginTabs = new ArrayList<Postprocess>(manager.postProcMan.getPlugins());
Collections.sort(pluginTabs, new Comparator<Postprocess>() {
@Override
public int compare(Postprocess firstTab, Postprocess secondTab) {
return Double.compare(firstTab.getTabOrder(), secondTab.getTabOrder());
}
});
updateTabs();
manager.inputgui = input.inputgui;
mainPanel.add(tab, BorderLayout.CENTER);
cp.add(mainPanel, BorderLayout.CENTER);
JPanel statusBar = new JPanel(new BorderLayout());
statusText = new JLabel(IDLE_STATUS_MESSAGE);
statusBar.add(statusText, BorderLayout.CENTER);
cp.add(statusBar, BorderLayout.SOUTH);
manager.inputgui.grabFocus();
// setSize(300, 200);
// setLocationByPlatform(true);
// setLocation(screenSize.width/4,screenSize.height/4);
pack();
setBounds(screenSize.width / 5 - 15, screenSize.height / 5 - 15, screenSize.width * 3 / 5 + 30, screenSize.height * 3 / 5 + 30);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private JMenuItem createMenuItem(String text, boolean enabled) {
JMenuItem item = new JMenuItem(text);
item.addActionListener(this);
item.setEnabled(enabled);
return item;
}
private JButton createButton(Icon icon, String text) {
JButton button = new JButton(icon);
button.setToolTipText(text);
button.addActionListener(this);
button.setActionCommand(text);
return button;
}
private JToggleButton createToggleButton(Icon icon, String text) {
JToggleButton button = new JToggleButton(icon);
button.setToolTipText(text);
button.addActionListener(this);
button.setActionCommand(text);
return button;
}
/** An ActioListener is implemented, so we have to implement this function. It handles actions on the menu bar. */
@Override
public void actionPerformed(ActionEvent ev) {
if (ev.getActionCommand() == "Add sequence(s)...") {
addSequences();
}
if (ev.getActionCommand() == "Add structure(s)...") {
addSequences();
}
else if (ev.getActionCommand() == "Exit") {
System.exit(0);
} else if (ev.getActionCommand() == "Output settings...") {
//System.out.println("here!!!");
op = new OutputPreferences(this);
} else if (ev.getActionCommand() == "Settings") {
mcmcSettingsDlg.display(this);
} else if (ev.getActionCommand() == "Run") {
if (manager.inputData.seqs.size() < 2) {
JOptionPane.showMessageDialog(this, "At least two sequences are needed!!!",
"Not enough sequences", JOptionPane.ERROR_MESSAGE);
// manager.finished();
return;
}
disableAllButtons();
start();
} else if (ev.getActionCommand() == "Pause") {
pauseItem.setEnabled(false);
pauseButton.setEnabled(false);
resumeItem.setEnabled(true);
resumeButton.setEnabled(true);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
final String savTit = getTitle();
setTitle("Pausing...");
manager.thread.suspendSoft();
setTitle(savTit);
setCursor(Cursor.getDefaultCursor());
} else if (ev.getActionCommand() == "Resume") {
manager.thread.resumeSoft();
pauseItem.setEnabled(true);
pauseButton.setEnabled(true);
resumeItem.setEnabled(false);
resumeButton.setEnabled(false);
} else if (ev.getActionCommand() == "Stop") {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
final String savTit = getTitle();
setTitle("Stopping...");
manager.thread.stopSoft();
//manager.modelExtMan.resetAll();
//finished();
setTitle(savTit);
setCursor(Cursor.getDefaultCursor());
} else if (ev.getActionCommand() == "RNA mode") {
if(rnaButton.isSelected()) {
dlg = new RNASettingsDlg (this);
if(!dlg.display(this)) {
rnaButton.setSelected(false);
manager.inputgui.grabFocus(); // transfer focus
return;
}
}
boolean sel = rnaButton.isSelected();
PostprocessManager.rnaMode = sel;
for(Postprocess plugin : pluginTabs) {
if(plugin.rnaAssociated) {
plugin.selected = sel;
}
}
updateTabs();
manager.inputgui.grabFocus(); // transfer focus
} else if (ev.getActionCommand() == "About...") {
// new HelpWindow(this, "About", getClass().getClassLoader().getResource("doc/about/index.html"), false);
JDialog dlg = new AboutDlg(this);
dlg.setVisible(true);
} else if (ev.getActionCommand() == "User's manual") {
helpUsers();
} else if (ev.getActionCommand() == "Developer's manual") {
helpDevs();
} else if (ev.getActionCommand() == "Javadocs for StatAlign") {
helpJavadocs();
} else if (ev.getActionCommand() == "Check for updates") {
checkForUpdates();
} else { // new substitution model selected
for (Class<? extends SubstitutionModel> cl : substModels) {
try {
if (ev.getActionCommand().equals(SubstitutionModel.getMenuName(cl))) {
try {
SubstitutionModel model = cl.newInstance();
model.acceptable(manager.inputData.seqs);
manager.inputData.model = model;
break;
} catch (RecognitionError e) {
selectModel(manager.inputData.model);
JOptionPane.showMessageDialog(this, e.message, "Cannot apply this model", JOptionPane.ERROR_MESSAGE);
break;
}
}
} catch (Exception e) {
new ErrorMessage(this, e.getLocalizedMessage(), true);
}
}
}
}
public void addSequences() {
JFileChooser choose = new JFileChooser("Add sequence(s)...");
choose.setCurrentDirectory(new File(System.getProperty("user.dir")));
choose.setMultiSelectionEnabled(true);
if (choose.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
for(File file : choose.getSelectedFiles()) {
DataType data = manager.dataMan.read(file);
if(data == null) {
JOptionPane.showMessageDialog(this, "The following file was not recognised to be in a known format:\n"+file+"\n\n", "Error reading input file", JOptionPane.ERROR_MESSAGE);
continue;
}
if(data.getSeqs() != null) {
if(inFile == null)
inFile = file;
manager.inputData.seqs.add(data.getSeqs());
manager.inputgui.updateSequences();
manager.fullPath = inFile.getAbsolutePath();
if (manager.inputData.model != null) {
try {
manager.inputData.model.acceptable(manager.inputData.seqs);
} catch (RecognitionError e) {
tryModels();
}
} else {
tryModels();
}
if (manager.inputData.model != null) {
runItem.setEnabled(true);
runButton.setEnabled(true);
if(manager.inputData.seqs.isRNA()) {
rnaButton.setEnabled(true);
// only pop up if it looks very much like RNA (and not DNA)
String text = "<html><div style='padding: 0 10px 10px 10px'>StatAlign has detected that these are RNA sequences.<br>" +
"To enable RNA secondary structure prediction,<br>" +
"please toggle the RNA icon on the toolbar.</div></html>";
ErrorMessage.showPane(this, text, "RNA sequences found", false);
} else {
rnaButton.setEnabled(false);
}
}
}
if (!(data instanceof RawSequences)) {
// TODO add Tree type as in console version
manager.inputData.auxData.add(data);
manager.inputgui.updateSequences();
}
manager.modelExtMan.dataAdded(file, data);
}
}
}
public boolean checkPage() {
try {
URLConnection conn = new URL(StatAlign.webPageURL).openConnection();
conn.setReadTimeout(CONNECT_TIMEOUT);
InputStream stream = conn.getInputStream();
stream.close();
return true;
} catch (Exception e) {
return false;
}
}
public void checkForUpdates() {
if(StatAlign.allowVersionCheck && checkPage()) {
try {
URL urlVersion = new URL("https://raw.github.com/statalign/statalign/master/release_version.txt");
HttpsURLConnection con = (HttpsURLConnection)urlVersion.openConnection();
BufferedReader br =
new BufferedReader(
new InputStreamReader(con.getInputStream()));
String s = br.readLine();
if(s.compareTo(StatAlign.version) > 0) {
JOptionPane.showMessageDialog(this, "You are using StatAlign "+StatAlign.version+
". StatAlign "+s+" is now available!\n"+
"To download the new version, please visit "
+ StatAlign.webPageURL,
"New version available!",
JOptionPane.INFORMATION_MESSAGE);
}
else {
JOptionPane.showMessageDialog(this, "You are using StatAlign "+StatAlign.version+".",
"Version up-to-date.\n",
JOptionPane.INFORMATION_MESSAGE);
}
} catch(Exception e) {
JOptionPane.showMessageDialog(this, "Could not open connection to "+StatAlign.webPageURL+".\n"+e.getStackTrace(),
"Connection error.\n",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
public void browseManual(String path, String description) {
try {
if(ALLOW_ONLINE_DOCS && checkPage()) {
Desktop.getDesktop().browse(new URI(StatAlign.webPageURL+path));
return;
}
} catch (Exception e) {}
try {
// File dir = new File(System.getProperty("user.dir")+"/"+path);
Desktop.getDesktop().browse(ClassLoader.getSystemResource(path).toURI());
return;
} catch (Exception e) {
}
URL url = ClassLoader.getSystemResource(path);
if(url != null) {
try {
new HelpWindow(this, description, url, true);
return;
} catch (Exception e) {
}
}
ErrorMessage.showPane(this, "<html>The documentation is not available, please<br>check StatAlign's web page directly at<br><br>"+StatAlign.webPageURL+"</html>", true);
}
public void helpUsers() {
browseManual(USER_MANUAL, "User's manual");
}
public void helpDevs() {
browseManual(DEV_MANUAL, "Developer's manual");
}
public void helpJavadocs() {
browseManual(JAVADOCS, "Javadocs for StatAlign");
}
private String tryModels() {
String message = "";
try {
SubstitutionModel[] defaultSubstList = {
new Kimura3(),
new Dayhoff()
};
for (SubstitutionModel model : defaultSubstList) {
try {
model.acceptable(manager.inputData.seqs);
selectModel(model);
break;
} catch (RecognitionError e) {
}
}
if (manager.inputData.model == null) {
double max = 0.0;
for (Class<? extends SubstitutionModel> cl : substModels) {
SubstitutionModel m;
try {
m = cl.newInstance();
if (m.acceptable(manager.inputData.seqs) > max) {
manager.inputData.model = m;
max = m.acceptable(manager.inputData.seqs);
selectModel(m);
}
} catch (RecognitionError e) {
message += e.message;
}
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error accessing substitution models", JOptionPane.ERROR_MESSAGE);
}
return message;
}
private void selectModel(SubstitutionModel m) {
manager.inputData.model = m;
for (JMenuItem mi : modelButtons) {
if (mi.getText().equals(m.getMenuName())) {
mi.setSelected(true);
break;
}
}
}
/**
* Enables several menu items that were kept disabled during the run.
* @param errorCode -1: error 0: completed 1: stopped after sampling 2: stopped before sampling
* @param ex the exception that was thrown when <tt>errorCode = -1</tt>
*/
public void finished(int errorCode, Exception ex) {
openItem.setEnabled(true);
openButton.setEnabled(true);
runItem.setEnabled(true);
runButton.setEnabled(true);
rnaButton.setEnabled(manager.inputData.seqs.isRNA());
//rnaButton.setSelected(false);
pauseItem.setEnabled(false);
pauseButton.setEnabled(false);
resumeItem.setEnabled(false);
resumeButton.setEnabled(false);
stopItem.setEnabled(false);
stopButton.setEnabled(false);
manager.inputgui.sequencesAreRemovable = true;
statusText.setText(MainFrame.IDLE_STATUS_MESSAGE);
//SavedFilesPopup.showPane(this);
if(errorCode < 0) ErrorMessage.showPane(this, ex, true);
}
public void deactivateRNA() {
int count = 0;
if(PostprocessManager.rnaMode) {
for(Postprocess plugin : pluginTabs) {
if(plugin.rnaAssociated) {
plugin.reloadPanel();
tabPluginMap.remove(plugin);
tab.remove(count + 1);
count--;
}
count++;
}
}
PostprocessManager.rnaMode = false;
rnaButton.setSelected(false);
rnaButton.setEnabled(false);
}
public void disableAllButtons() {
openItem.setEnabled(false);
openButton.setEnabled(false);
runItem.setEnabled(false);
runButton.setEnabled(false);
pauseItem.setEnabled(true);
pauseButton.setEnabled(true);
resumeItem.setEnabled(false);
stopItem.setEnabled(true);
stopButton.setEnabled(true);
rnaButton.setEnabled(false);
manager.inputgui.sequencesAreRemovable = false;
}
public void start() {
//runSettings.display(this);
manager.start();
}
/**
* Merely for testing purposes.
* @param args No argument is used.
*/
public static void main(String[] args) throws Exception {
new MainFrame();
}
public void updateTabs() {
tab.removeAll();
tab.addTab(input.getTabName(), input.getIcon(), input.getJPanel(), input.getTip());
tabPluginMap.clear();
for (int i = 0; i < pluginTabs.size(); i++) {
Postprocess plugin = pluginTabs.get(i);
if (plugin.selected && plugin.screenable) {
tabPluginMap.put(tab.getTabCount(), plugin);
tab.addTab(plugin.getTabName(), plugin.getIcon(), plugin.getJPanel(), plugin.getTip());
}
}
}
}