/*
Copyright (C) 2009 Diego Darriba
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package es.uvigo.darwin.xprottest;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.FileDialog;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URI;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ActionMap;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.Timer;
import javax.swing.plaf.BorderUIResource;
import org.jdesktop.application.Action;
import org.jdesktop.application.Application;
import org.jdesktop.application.ApplicationContext;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.Task;
import org.jdesktop.application.TaskMonitor;
import org.jdesktop.application.TaskService;
import pal.alignment.Alignment;
import pal.tree.Tree;
import es.uvigo.darwin.prottest.ProtTest;
import es.uvigo.darwin.prottest.facade.ProtTestFacade;
import es.uvigo.darwin.prottest.facade.TreeFacade;
import es.uvigo.darwin.prottest.facade.TreeFacadeImpl;
import es.uvigo.darwin.prottest.global.options.ApplicationOptions;
import es.uvigo.darwin.prottest.model.Model;
import es.uvigo.darwin.prottest.util.ProtTestAlignment;
import es.uvigo.darwin.prottest.util.exception.AlignmentParseException;
import es.uvigo.darwin.prottest.util.exception.ProtTestInternalException;
import es.uvigo.darwin.prottest.util.factory.ProtTestFactory;
import es.uvigo.darwin.prottest.util.logging.ProtTestLogger;
import es.uvigo.darwin.prottest.util.printer.ProtTestFormattedOutput;
import es.uvigo.darwin.prottest.util.printer.ProtTestPrinter;
import es.uvigo.darwin.xprottest.analysis.FrequenciesView;
import es.uvigo.darwin.xprottest.analysis.TreeView;
import es.uvigo.darwin.xprottest.analysis.consensus.Consensus;
import es.uvigo.darwin.xprottest.compute.OptionsView;
import es.uvigo.darwin.xprottest.compute.RunningFrame;
import es.uvigo.darwin.xprottest.results.ErrorLogView;
import es.uvigo.darwin.xprottest.results.ResultsView;
import es.uvigo.darwin.xprottest.util.TextAreaAppender;
/**
* The XProtTest main frame offers whole connection between the application
* componentes providing the full functionality of ProtTest-HPC.
*
* @author Diego Darriba
*/
public final class XProtTestView extends FrameView {
/* Application colors */
public static final Color NORMAL_COLOR = Color.BLACK;
public static final Color CRITIC_COLOR = new Color(153, 0, 0);
public static final Color DONE_COLOR = new Color(102, 102, 153);
/* Settings */
private int errorBehavior;
/* General variables */
private ResourceMap resourceMap;
private Alignment alignment;
private Tree tree;
private ProtTestFacade prottestFacade;
private boolean alignmentLoaded;
private File alignmentFile;
private boolean lnlCalculated;
private Model[] models;
private PrintWriter displayWriter;
private Handler mainHandler;
private PrintWriter lowLevelDisplayWriter;
private Handler lowLevelHandler;
/* WINDOWS */
private ResultsView resultsView;
private TreeView treeView;
private Consensus consensusView;
private FrequenciesView frequenciesView;
private ErrorLogView errorLogView;
public int getErrorBehavior() {
return errorBehavior;
}
protected void setErrorBehavior(int errorBehavior) {
this.errorBehavior = errorBehavior;
}
public ProtTestFacade getFacade() {
return prottestFacade;
}
private void setAlignmentFile(File alignmentFile) {
enableHandler();
int numDecimals = 5;
alignmentLoaded = (alignmentFile != null);
if (alignmentLoaded) {
lblDataFileStatus.setText(resourceMap.getString("msg-data-loaded")
+ " " + alignmentFile.getName());
lblDataFileStatus.setForeground(DONE_COLOR);
this.alignmentFile = alignmentFile;
showFrequenciesItem.setEnabled(true);
double[] frequencies = ProtTestAlignment.getFrequencies(alignment);
displayWriter.println("");
displayWriter.println(resourceMap.getString("aa-frequencies"));
displayWriter.println(ProtTestFormattedOutput.space(resourceMap
.getString("aa-frequencies").length(), '-'));
for (int i = 0; i < frequencies.length; i++) {
displayWriter.println(ProtTestAlignment.charOfIndex(i)
+ " - "
+ ProtTestFormattedOutput.getDecimalString(
frequencies[i], numDecimals));
}
} else {
lblDataFileStatus.setText(resourceMap.getString("msg-no-data"));
lblDataFileStatus.setForeground(CRITIC_COLOR);
showFrequenciesItem.setEnabled(false);
}
frequenciesView = null;
computeMenuItem.setEnabled(alignmentLoaded);
resultsMenuItem.setEnabled(false);
if (resultsView != null) {
resultsView.dispose();
resultsView = null;
}
showTreeMenuItem.setEnabled(false);
if (treeView != null) {
treeView.dispose();
treeView = null;
}
averagingMenuItem.setEnabled(false);
if (consensusView != null) {
consensusView.dispose();
consensusView = null;
}
disableHandler();
}
public PrintWriter getDisplayWriter() {
return displayWriter;
}
public XProtTestView(SingleFrameApplication app, ProtTestFacade facade) {
super(app);
resourceMap = Application
.getInstance(es.uvigo.darwin.xprottest.XProtTestApp.class)
.getContext().getResourceMap(XProtTestView.class);
this.errorBehavior = Application
.getInstance(es.uvigo.darwin.xprottest.XProtTestApp.class)
.getContext().getResourceMap(XProtTestApp.class)
.getInteger("default-error-behavior");
this.prottestFacade = facade;
initComponents();
Image image = new ImageIcon("icon.png").getImage();
getFrame().setIconImage(image);
displayWriter = new PrintWriter(new TextAreaAppender(mainTextArea));
lowLevelDisplayWriter = new PrintWriter(new TextAreaAppender(
phymlTextArea));
mainHandler = ProtTestLogger.getDefaultLogger().addHandler(
displayWriter);
lowLevelHandler = ProtTestLogger.getDefaultLogger().addLowLevelHandler(
lowLevelDisplayWriter);
try {
Handler logHandler = ProtTestFactory.getInstance()
.createLogHandler();
if (logHandler != null) {
ProtTestLogger.getDefaultLogger().addHandler(logHandler);
}
} catch (IOException ex) {
ProtTestLogger.getDefaultLogger().severeln(ex.getMessage());
}
// status bar initialization - message timeout, idle icon and busy
// animation, etc
int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
messageTimer = new Timer(messageTimeout, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
lblLikelihoodStatus.setText("");
}
});
messageTimer.setRepeats(false);
int busyAnimationRate = resourceMap
.getInteger("StatusBar.busyAnimationRate");
for (int i = 0; i < busyIcons.length; i++) {
busyIcons[i] = resourceMap
.getIcon("StatusBar.busyIcons[" + i + "]");
}
busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
lblDataFileStatus.setIcon(busyIcons[busyIconIndex]);
}
});
idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
lblDataFileStatus.setIcon(idleIcon);
TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
taskMonitor
.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
@Override
public void propertyChange(
java.beans.PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
if ("started".equals(propertyName)) {
if (!busyIconTimer.isRunning()) {
lblDataFileStatus.setIcon(busyIcons[0]);
busyIconIndex = 0;
busyIconTimer.start();
}
} else if ("done".equals(propertyName)) {
busyIconTimer.stop();
lblDataFileStatus.setIcon(idleIcon);
} else if ("message".equals(propertyName)) {
String text = (String) (evt.getNewValue());
lblLikelihoodStatus.setText((text == null) ? ""
: text);
messageTimer.restart();
} else if ("progress".equals(propertyName)) {
int value = (Integer) (evt.getNewValue());
}
}
});
lblMoreInfo.setVisible(false);
ProtTestPrinter.printHeader();
disableHandler();
}
public void disableHandler() {
mainHandler.setLevel(Level.OFF);
}
public void enableHandler() {
mainHandler.setLevel(Level.INFO);
}
@Action
public void showAboutBox() {
if (aboutBox == null) {
JFrame mainFrame = XProtTestApp.getApplication().getMainFrame();
aboutBox = new XProtTestAboutBox(mainFrame);
aboutBox.setLocationRelativeTo(mainFrame);
}
aboutBox.setVisible(true);
}
@Action
public void showCreditsBox() {
if (creditsBox == null) {
JFrame mainFrame = XProtTestApp.getApplication().getMainFrame();
creditsBox = new CreditsBox(mainFrame);
creditsBox.setLocationRelativeTo(mainFrame);
}
creditsBox.setVisible(true);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
private void initComponents() {
mainPanel = new JPanel();
mainTabbedPane = new JTabbedPane();
mainScrollPane = new JScrollPane();
mainTextArea = new JTextArea();
phymlScrollPane = new JScrollPane();
phymlTextArea = new JTextArea();
statusPanel = new JPanel();
lblDataFileStatus = new JLabel();
lblLikelihoodStatus = new JLabel();
lblMoreInfo = new JLabel();
menuBar = new JMenuBar();
fileMenu = new JMenu();
loadAlignmentMenuItem = new JMenuItem();
exitMenuItem = new JMenuItem();
saveConsoleMenuItem = new JMenuItem();
printConsoleMenuItem = new JMenuItem();
editMenu = new JMenu();
editCopyMenuItem = new JMenuItem();
editSelectAllMenuItem = new JMenuItem();
preferencesMenuItem = new JMenuItem();
analysisMenu = new JMenu();
computeMenuItem = new JMenuItem();
showFrequenciesItem = new JMenuItem();
showTreeMenuItem = new JMenuItem();
averagingMenuItem = new JMenuItem();
resultsMenu = new JMenu();
resultsMenuItem = new JMenuItem();
errorMenuItem = new JMenuItem();
helpMenu = new JMenu();
manualMenuItem = new JMenuItem();
homepageMenuItem = new JMenuItem();
discgroupMenuItem = new JMenuItem();
aboutMenuItem = new JMenuItem();
org.jdesktop.application.ResourceMap appResourceMap = org.jdesktop.application.Application
.getInstance(es.uvigo.darwin.xprottest.XProtTestApp.class)
.getContext().getResourceMap(XProtTestView.class);
mainPanel.setSize(new java.awt.Dimension(600, 860));
mainPanel.setBorder(new BorderUIResource.EmptyBorderUIResource(
new java.awt.Insets(20, 20, 20, 20)));
mainPanel.setLocation(new java.awt.Point(10, -10));
mainPanel.setVisible(true);
mainPanel.setAutoscrolls(true);
mainPanel.setLayout(new BorderLayout());
mainPanel.setBackground(null);
mainPanel.setName("mainPanel");
mainScrollPane.setSize(590, 800);// new java.awt.Dimension(590, 600));
mainScrollPane.setLocation(new java.awt.Point(20, 20));
mainScrollPane.setVisible(true);
mainScrollPane.setAutoscrolls(true);
mainScrollPane.setName("mainScrollPane");
// mainScrollPane.setPreferredSize(new java.awt.Dimension(460, 500));
mainTextArea.setMargin(new Insets(5, 5, 5, 5));
mainTextArea.setBackground(Color.white);
mainTextArea.setEditable(false);
mainTextArea.setSize(500, 800);// new java.awt.Dimension(15, 10));
mainTextArea.setAutoscrolls(true);
mainTextArea.setVisible(true);
// mainTextArea.setColumns(15);
// mainTextArea.setEditable(false);
mainTextArea.setFont(XProtTestApp.FONT_CONSOLE);
// mainTextArea.setRows(30);
mainTextArea.setName("mainTextArea");
// mainScrollPane.setViewportView(mainTextArea);
mainScrollPane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
mainTextArea.setWrapStyleWord(true);
mainTextArea.setLineWrap(true);
phymlTextArea.setMargin(new Insets(5, 5, 5, 5));
phymlTextArea.setBackground(Color.white);
phymlTextArea.setEditable(false);
phymlTextArea.setSize(500, 800);// new java.awt.Dimension(15, 10));
phymlTextArea.setAutoscrolls(true);
phymlTextArea.setVisible(true);
phymlTextArea.setFont(XProtTestApp.FONT_CONSOLE);
phymlTextArea.setName("phymlTextArea");
phymlScrollPane
.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
phymlTextArea.setWrapStyleWord(true);
phymlTextArea.setLineWrap(true);
statusPanel.setPreferredSize(new java.awt.Dimension(592, 30));
statusPanel.setBorder(new BorderUIResource.EtchedBorderUIResource(1,
new java.awt.Color(182, 182, 182), new java.awt.Color(89, 89,
89)));
statusPanel.setLocation(new java.awt.Point(20, 630));
statusPanel.setVisible(true);
statusPanel.setLayout(new BorderLayout());
statusPanel.setForeground(java.awt.Color.blue);
statusPanel.setBackground(new java.awt.Color(220, 220, 220));
// statusPanel.setFont(new java.awt.Font("Dialog", 0, 9));
// statusPanel.setBorder(BorderFactory.createLineBorder(new
// java.awt.Color(0, 0, 0)));
statusPanel.setName("statusPanel");
// statusPanel.setPreferredSize(new java.awt.Dimension(100, 200));
lblDataFileStatus.setSize(new java.awt.Dimension(150, 40));
lblDataFileStatus.setVisible(true);
lblDataFileStatus.setForeground(CRITIC_COLOR);
lblDataFileStatus.setHorizontalAlignment(JLabel.RIGHT);
lblDataFileStatus.setFont(XProtTestApp.FONT_LABEL);
java.util.ResourceBundle bundle = java.util.ResourceBundle
.getBundle("es/uvigo/darwin/xprottest/resources/XProtTestView");
lblDataFileStatus.setText(bundle.getString("msg-no-data"));
lblDataFileStatus.setName("lblDataFileStatus");
lblLikelihoodStatus.setSize(new java.awt.Dimension(270, 40));
lblLikelihoodStatus.setVisible(true);
lblLikelihoodStatus.setForeground(CRITIC_COLOR);
lblLikelihoodStatus.setFont(XProtTestApp.FONT_LABEL);
lblLikelihoodStatus.setText(bundle.getString("msg-no-lnl-calculated"));
lblLikelihoodStatus.setName("lblLikelihoodStatus");
// mainPanel.add(mainScrollPane, BorderLayout.CENTER);
mainPanel.add(mainTabbedPane, BorderLayout.CENTER);
mainTabbedPane.addTab("Main", mainScrollPane);
mainTabbedPane.addTab("Phyml-log", phymlScrollPane);
mainPanel.add(statusPanel, BorderLayout.PAGE_END);
mainScrollPane.getViewport().add(mainTextArea);
phymlScrollPane.getViewport().add(phymlTextArea);
statusPanel.add(lblLikelihoodStatus, BorderLayout.LINE_START);
statusPanel.add(lblDataFileStatus, BorderLayout.LINE_END);
menuBar.setName("menuBar");
ActionMap actionMap = org.jdesktop.application.Application
.getInstance(es.uvigo.darwin.xprottest.XProtTestApp.class)
.getContext().getActionMap(XProtTestView.class, this);
fileMenu.setAction(actionMap.get("openDataFile"));
fileMenu.setMnemonic('F');
fileMenu.setText(bundle.getString("item-file"));
fileMenu.setName("fileMenu");
saveConsoleMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
java.awt.event.InputEvent.CTRL_MASK));
saveConsoleMenuItem.setMnemonic('S');
saveConsoleMenuItem.setText(bundle.getString("item-save-console"));
saveConsoleMenuItem.setName("saveConsoleMenuItem");
saveConsoleMenuItem
.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
saveConsole(evt);
}
});
printConsoleMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_P,
java.awt.event.InputEvent.CTRL_MASK));
printConsoleMenuItem.setMnemonic('P');
printConsoleMenuItem.setText(bundle.getString("item-print-console"));
printConsoleMenuItem.setName("printConsoleMenuItem");
printConsoleMenuItem
.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
printConsole(evt);
}
});
loadAlignmentMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_O,
java.awt.event.InputEvent.CTRL_MASK));
loadAlignmentMenuItem.setMnemonic('L');
loadAlignmentMenuItem.setText(bundle.getString("item-load-alignment"));
loadAlignmentMenuItem.setName("loadAlignmentMenuItem");
loadAlignmentMenuItem
.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
openDataFile(evt);
}
});
fileMenu.add(loadAlignmentMenuItem);
fileMenu.add(saveConsoleMenuItem);
fileMenu.add(printConsoleMenuItem);
exitMenuItem.setAction(actionMap.get("quit"));
exitMenuItem.setMnemonic('x');
exitMenuItem.setName("menuFileExit");
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
editMenu.setMnemonic('E');
editMenu.setText(appResourceMap.getString("menu-edit"));
editMenu.setName("editMenu");
editCopyMenuItem.setAction(actionMap.get("editCopy"));
editCopyMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
java.awt.event.InputEvent.CTRL_MASK));
editCopyMenuItem.setMnemonic('c');
editCopyMenuItem.setText(appResourceMap.getString("menu-copy"));
editCopyMenuItem.setToolTipText(appResourceMap
.getString("editCopyMenuItem.toolTipText"));
editCopyMenuItem.setName("editCopyMenuItem");
editMenu.add(editCopyMenuItem);
editSelectAllMenuItem.setAction(actionMap.get("editSelectAll"));
editSelectAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_A,
java.awt.event.InputEvent.CTRL_MASK));
editSelectAllMenuItem.setMnemonic('a');
editSelectAllMenuItem.setText(appResourceMap
.getString("menu-selectAll"));
editSelectAllMenuItem.setToolTipText(appResourceMap
.getString("editSelectAllMenuItem.toolTipText"));
editSelectAllMenuItem.setName("editSelectAllMenuItem");
editMenu.add(editSelectAllMenuItem);
preferencesMenuItem.setMnemonic('p');
preferencesMenuItem.setText(appResourceMap
.getString("menu-preferences"));
preferencesMenuItem.setToolTipText(appResourceMap
.getString("editPreferencesMenuItem.toolTipText"));
preferencesMenuItem.setName("preferencesMenuItem");
preferencesMenuItem
.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadPreferencesView(evt);
}
});
editMenu.add(preferencesMenuItem);
menuBar.add(editMenu);
analysisMenu.setMnemonic('A');
analysisMenu.setText(bundle.getString("item-analysis"));
analysisMenu.setName("analysisMenu");
computeMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_L,
java.awt.event.InputEvent.CTRL_MASK));
computeMenuItem.setMnemonic('c');
computeMenuItem.setText(bundle.getString("item-compute-likelihood"));
computeMenuItem.setToolTipText(appResourceMap
.getString("computeMenuItem.toolTipText"));
computeMenuItem.setEnabled(false);
computeMenuItem.setName("computeMenuItem");
computeMenuItem.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadOptionsView(evt);
}
});
analysisMenu.add(computeMenuItem);
showFrequenciesItem
.setAction(actionMap.get("showAminoacidFrequencies"));
showFrequenciesItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_F,
java.awt.event.InputEvent.SHIFT_MASK
| java.awt.event.InputEvent.CTRL_MASK));
showFrequenciesItem.setMnemonic('f');
showFrequenciesItem.setText(bundle.getString("item-show-frequencies"));
showFrequenciesItem.setToolTipText(appResourceMap
.getString("showFrequenciesItem.toolTipText"));
showFrequenciesItem.setEnabled(false);
showFrequenciesItem.setName("showFrequenciesItem");
analysisMenu.add(showFrequenciesItem);
showTreeMenuItem.setAction(actionMap.get("showTree"));
showTreeMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_T,
java.awt.event.InputEvent.SHIFT_MASK
| java.awt.event.InputEvent.CTRL_MASK));
showTreeMenuItem.setMnemonic('t');
showTreeMenuItem.setText(bundle.getString("item-show-tree"));
showTreeMenuItem.setToolTipText(appResourceMap
.getString("showTreeMenuItem.toolTipText"));
showTreeMenuItem.setEnabled(false);
showTreeMenuItem.setName("showTreeMenuItem");
analysisMenu.add(showTreeMenuItem);
averagingMenuItem.setAction(actionMap.get("showConsensus"));
averagingMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
java.awt.event.InputEvent.SHIFT_MASK
| java.awt.event.InputEvent.CTRL_MASK));
averagingMenuItem.setMnemonic('p');
averagingMenuItem.setText(appResourceMap
.getString("averagingMenuItem.text"));
averagingMenuItem.setToolTipText(appResourceMap
.getString("averagingMenuItem.toolTipText"));
averagingMenuItem.setEnabled(false);
averagingMenuItem.setName("averagingMenuItem");
analysisMenu.add(averagingMenuItem);
menuBar.add(analysisMenu);
resultsMenu.setAction(actionMap.get("showResultsWindow"));
resultsMenu.setMnemonic('S');
resultsMenu.setText(bundle.getString("item-results"));
resultsMenu.setName("resultsMenu");
resultsMenuItem.setAction(actionMap.get("showResultsWindow"));
resultsMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_R,
java.awt.event.InputEvent.SHIFT_MASK
| java.awt.event.InputEvent.CTRL_MASK));
resultsMenuItem.setMnemonic('r');
resultsMenuItem.setText(bundle.getString("item-results-sub"));
resultsMenuItem.setEnabled(false);
resultsMenuItem.setName("resultsMenuItem");
resultsMenuItem.setToolTipText(appResourceMap
.getString("resultsMenuItem.toolTipText"));
resultsMenu.add(resultsMenuItem);
errorMenuItem.setAction(actionMap.get("showErrorLog"));
errorMenuItem.setAccelerator(KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_E,
java.awt.event.InputEvent.SHIFT_MASK
| java.awt.event.InputEvent.CTRL_MASK));
errorMenuItem.setMnemonic('e');
errorMenuItem.setText(appResourceMap.getString("errorMenuItem.text"));
errorMenuItem.setToolTipText(appResourceMap
.getString("errorMenuItem.toolTipText"));
errorMenuItem.setEnabled(false);
errorMenuItem.setName("errorMenuItem");
resultsMenu.add(errorMenuItem);
menuBar.add(resultsMenu);
helpMenu.setMnemonic('H');
helpMenu.setText(bundle.getString("item-help"));
helpMenu.setName("helpMenu");
homepageMenuItem.setAction(actionMap.get("openHomepage"));
homepageMenuItem.setMnemonic('p');
homepageMenuItem.setText(appResourceMap.getString("menu-homepage"));
homepageMenuItem.setName("homepageMenuItem");
helpMenu.add(homepageMenuItem);
manualMenuItem.setAction(actionMap.get("showManual"));
manualMenuItem.setMnemonic('m');
manualMenuItem.setText(appResourceMap.getString("menu-manual"));
manualMenuItem.setName("manualMenuItem");
helpMenu.add(manualMenuItem);
discgroupMenuItem.setAction(actionMap.get("openDiscussionGroup"));
discgroupMenuItem.setMnemonic('D');
discgroupMenuItem.setText(appResourceMap.getString("menu-discussiongroup"));
discgroupMenuItem.setName("discgroupMenuItem");
helpMenu.add(discgroupMenuItem);
aboutMenuItem.setAction(actionMap.get("showAboutBox"));
aboutMenuItem.setText(bundle.getString("item-about-window"));
aboutMenuItem.setName("aboutMenuItem");
helpMenu.add(aboutMenuItem);
creditsMenuItem.setAction(actionMap.get("showCreditsBox"));
creditsMenuItem.setText(bundle.getString("item-credits-window"));
creditsMenuItem.setName("creditsMenuItem");
helpMenu.add(creditsMenuItem);
menuBar.add(helpMenu);
setComponent(mainPanel);
setMenuBar(menuBar);
this.getFrame().setLayout(new BorderLayout());
this.getFrame().setLocation(new java.awt.Point(281, 80));
this.getFrame().getContentPane().setLayout(new BorderLayout());
this.getFrame().setTitle("ProtTest " + ProtTest.versionNumber);
this.getFrame().setSize(new java.awt.Dimension(630, 695));
this.getFrame().setResizable(true);
this.getFrame().setContentPane(mainPanel);
}
private void openDataFile(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_openDataFile
FileDialog fc = new FileDialog(this.getFrame(),
"Load amino-acid alignment", FileDialog.LOAD);
fc.setDirectory(System.getProperty("user.dir"));
fc.setVisible(true);
String dataFileName = fc.getFile();
if (dataFileName != null) {
enableHandler();
try {
ProtTestPrinter.printPreAnalysisHeader();
File f = new File(fc.getDirectory() + dataFileName);// fc.getSelectedFile();
ProtTestPrinter.printFileData(f);
if (alignmentFile == null
|| !f.getAbsolutePath().equals(
alignmentFile.getAbsolutePath())) {
lblLikelihoodStatus.setText(resourceMap
.getString("msg-no-lnl-calculated"));
lblLikelihoodStatus.setForeground(CRITIC_COLOR);
lnlCalculated = false;
}
alignment = prottestFacade.readAlignment(f.getAbsolutePath(),
true);
setAlignmentFile(f);
} catch (AlignmentParseException ex) {
displayWriter.println(ex.getMessage());
setAlignmentFile(null);
} catch (FileNotFoundException ex) {
displayWriter.println(ex.getMessage());
setAlignmentFile(null);
} catch (IOException ex) {
displayWriter.println(ex.getMessage());
setAlignmentFile(null);
}
disableHandler();
}
}// GEN-LAST:event_openDataFile
private void saveConsole(java.awt.event.ActionEvent evt) {
String text = mainTextArea.getText();
FileDialog fc = new FileDialog(this.getFrame(),
"Save ProtTest console", FileDialog.SAVE);
fc.setDirectory(System.getProperty("user.dir"));
fc.setVisible(true);
String dataFileName = fc.getFile();
try {
File f = new File(dataFileName);
FileWriter fw = new FileWriter(f);
fw.write(text);
fw.close();
} catch (IOException ex) {
Logger.getLogger(XProtTestView.class.getName()).log(Level.SEVERE,
null, ex);
}
}
private void printConsole(java.awt.event.ActionEvent evt) {
try {
mainTextArea.print();
} catch (PrinterException ex) {
Logger.getLogger(XProtTestView.class.getName()).log(Level.SEVERE,
null, ex);
}
}
private void loadOptionsView(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_loadOptionsView
OptionsView op = new OptionsView(this, alignment,
alignmentFile.getAbsolutePath());
op.setVisible(true);
enableItems(false);
}// GEN-LAST:event_loadOptionsView
private void loadPreferencesView(java.awt.event.ActionEvent evt) {// GEN-FIRST:event_loadPreferencesView
PreferencesView pv = new PreferencesView(this);
pv.setVisible(true);
enableItems(false);
}// GEN-LAST:event_loadPreferencesView
public void unloadOptionsView(boolean running) {
if (!running) {
enableItems(true);
}
}
public void unloadPreferencesView() {
enableItems(true);
}
// private JFileChooser createFileChooser(String title) {
// JFileChooser fc = new JFileChooser();
// fc.setDialogTitle(title);
// fc.setFileFilter(fc.getAcceptAllFileFilter());
// fc.setCurrentDirectory(new File("."));
// return fc;
// }
@Action
public void showAminoacidFrequencies() {
if (alignment != null) {
if (frequenciesView == null) {
frequenciesView = new FrequenciesView(alignment);
}
frequenciesView.setVisible(true);
}
}
private boolean correctDone;
@Action
public void showResultsWindow() {
if (models != null) {
if (resultsView == null) {
resultsView = new ResultsView(this, alignment, models,
correctDone);
}
resultsView.setVisible(true);
}
}
private int numModels;
private boolean taskRunning = false;
public void computeLikelihood(int numModels, ApplicationOptions options) {
enableHandler();
ProtTestPrinter.printExecutionHeader(options);
preferencesMenuItem.setEnabled(false);
this.numModels = numModels;
if (errorLogView != null) {
ProtTestLogger.getDefaultLogger().removeHandler(
errorLogView.getLogHandler());
errorLogView.setVisible(false);
errorLogView.dispose();
errorLogView = null;
}
if (resultsView != null) {
resultsView.setVisible(false);
resultsView.dispose();
resultsView = null;
}
if (treeView != null) {
treeView.setVisible(false);
treeView.dispose();
treeView = null;
}
if (consensusView != null) {
consensusView.setVisible(false);
consensusView.dispose();
consensusView = null;
}
errorLogView = new ErrorLogView();
ProtTestLogger.getDefaultLogger().addHandler(
errorLogView.getLogHandler());
RunningFrame runningFrame = new RunningFrame(this, numModels);
errorMenuItem.setEnabled(false);
prottestFacade.addObserver(runningFrame);
lblMoreInfo.setVisible(false);
Task task = new ComputeLikelihoodTask(getApplication(), runningFrame,
this, options);
// get the application's context...
ApplicationContext appC = Application.getInstance().getContext();
// ...to get the TaskMonitor and TaskService
TaskMonitor tM = appC.getTaskMonitor();
TaskService tS = appC.getTaskService();
// i.e. making the animated progressbar and busy icon visible
tS.execute(task);
taskRunning = true;
enableItems(false);
runningFrame.setVisible(true);
}
private void enableItems(boolean enable) {
menuBar.setEnabled(enable);
fileMenu.setEnabled(enable);
editMenu.setEnabled(enable);
analysisMenu.setEnabled(enable);
resultsMenu.setEnabled(enable);
helpMenu.setEnabled(enable);
}
protected void computationDone(boolean done, Model[] models) {
preferencesMenuItem.setEnabled(true);
if (done) {
correctDone = (models.length == this.numModels);
if (correctDone) {
lblLikelihoodStatus.setText(resourceMap
.getString("msg-lnl-calculated"));
lblLikelihoodStatus.setForeground(DONE_COLOR);
errorMenuItem.setEnabled(false);
lblMoreInfo.setVisible(false);
if (errorLogView != null) {
errorLogView.setVisible(false);
errorLogView.dispose();
errorLogView = null;
}
} else {
lblLikelihoodStatus.setText("Warning! "
+ resourceMap.getString("models-not-complete"));
lblLikelihoodStatus.setForeground(CRITIC_COLOR);
displayWriter.println("");
displayWriter.println(resourceMap
.getString("models-not-complete"));
displayWriter.println(resourceMap
.getString("msg-see-error-log"));
errorMenuItem.setEnabled(true);
lblMoreInfo.setVisible(true);
}
} else {
lblLikelihoodStatus.setText(resourceMap.getString("msg-lnl-error"));
lblLikelihoodStatus.setForeground(CRITIC_COLOR);
displayWriter.println(resourceMap.getString("msg-see-error-log"));
errorMenuItem.setEnabled(true);
}
lnlCalculated = done;
resultsMenuItem.setEnabled(done);
showTreeMenuItem.setEnabled(done);
averagingMenuItem.setEnabled(done);
this.models = models;
disableHandler();
}
public void computationInterrupted() {
lblLikelihoodStatus.setText(resourceMap.getString("msg-lnl-error"));
lblLikelihoodStatus.setForeground(CRITIC_COLOR);
errorMenuItem.setEnabled(true);
lblMoreInfo.setVisible(true);
disableHandler();
}
public void unloadRunningView(RunningFrame rf) {
enableItems(true);
rf.setVisible(false);
disableHandler();
}
private class ComputeLikelihoodTask extends Task<Object, Void> {
private RunningFrame runningFrame;
private XProtTestView mainFrame;
private Model[] models;
private ApplicationOptions options;
ComputeLikelihoodTask(Application app, RunningFrame runningFrame,
XProtTestView mainFrame, ApplicationOptions options) {
// Runs on the EDT. Copy GUI state that
// doInBackground() depends on from parameters
// to ComputeLikelihoodTask fields, here.
super(app);
this.options = options;
this.runningFrame = runningFrame;
this.mainFrame = mainFrame;
runningFrame.setTask(this);
}
@Override
protected Object doInBackground() {
// Your Task's code here. This method runs
// on a background thread, so don't reference
// the Swing GUI from here.
// ProtTestPrinter printer = new ProtTestPrinter(getDisplayWriter(),
// new PrintWriter(System.err));
try {
options.setAlignment(alignmentFile.getAbsolutePath());
models = prottestFacade.startAnalysis(options);
} catch (AlignmentParseException ex) {
ProtTestLogger.severeln(ex.getMessage(), this.getClass());
} catch (IOException ex) {
ProtTestLogger.severeln(ex.getMessage(), this.getClass());
} catch (ProtTestInternalException ex) {
ProtTestLogger.severeln(ex.getMessage(), this.getClass());
}
runningFrame.finishedExecution();
return null; // return your result
}
@Override
protected void succeeded(Object result) {
// Runs on the EDT. Update the GUI based on
// the result computed by doInBackground().
boolean done = models != null && models.length > 0;
if (done) {
try {
for (Model model : models) {
// throws ProtTestInternalException when Lk is not set
model.getLk();
}
} catch (ProtTestInternalException e) {
done = false;
}
}
mainFrame.computationDone(done, models);
}
@Override
protected void cancelled() {
mainFrame.computationDone(false, null);
}
@Override
protected void interrupted(InterruptedException ex) {
mainFrame.computationInterrupted();
}
}
@Action
public void showTree() {
TreeFacade treeFacade = new TreeFacadeImpl();
if (models != null) {
if (treeView == null) {
treeView = new TreeView(this, treeFacade, tree, models);
}
treeView.setVisible(true);
}
}
@Action
public void showConsensus() {
TreeFacade treeFacade = new TreeFacadeImpl();
if (models != null) {
if (consensusView == null) {
consensusView = new Consensus(this, treeFacade, models,
alignment);
}
consensusView.setVisible(true);
}
}
@Action
public void showErrorLog() {
if (errorLogView != null) {
errorLogView.setVisible(true);
}
}
@Action
public void editCopy() {
mainTextArea.copy();
}
@Action
public void editSelectAll() {
mainTextArea.selectAll();
}
@Action
public void showPreferences() {
}
@Action
public void openDiscussionGroup() {
try {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
URI prottestURI = new URI(ProtTest.URL_DISCUSSION_GROUP);
desktop.browse(prottestURI);
} else {
displayWriter.println("Cannot browse URL. Please open " +
ProtTest.URL_DISCUSSION_GROUP + " manually.");
}
} catch (Exception e) {
displayWriter.println("Cannot open URL : " + e.getMessage());
}
}
@Action
public void openHomepage() {
try {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
URI prottestURI = new URI(ProtTest.URL_HOMEPAGE);
desktop.browse(prottestURI);
} else {
displayWriter.println("Cannot browse URL. Please open " +
ProtTest.URL_HOMEPAGE + " manually.");
}
} catch (Exception e) {
displayWriter.println("Cannot open URL : " + e.getMessage());
}
}
@Action
public void showManual() {
try {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
URI prottestURI = new URI(ProtTest.URL_MANUAL);
desktop.browse(prottestURI);
} else {
displayWriter.println("Cannot browse URL. Please open " +
ProtTest.URL_MANUAL + " manually.");
}
} catch (Exception e) {
displayWriter.println("Cannot open URL : " + e.getMessage());
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private JMenu fileMenu;
private JMenuItem exitMenuItem;
private JMenu analysisMenu;
private JMenuItem averagingMenuItem;
private JMenuItem computeMenuItem;
private JMenuItem editCopyMenuItem;
private JMenu editMenu;
private JMenuItem editSelectAllMenuItem;
private JMenuItem errorMenuItem;
private JLabel lblDataFileStatus;
private JLabel lblLikelihoodStatus;
private JLabel lblMoreInfo;
private JMenuItem loadAlignmentMenuItem;
private JPanel mainPanel;
private JTabbedPane mainTabbedPane;
private JScrollPane phymlScrollPane;
private JTextArea phymlTextArea;
private JScrollPane mainScrollPane;
private JTextArea mainTextArea;
private JMenuItem homepageMenuItem;
private JMenuItem manualMenuItem;
private JMenuItem discgroupMenuItem;
private JMenuBar menuBar;
private JMenuItem preferencesMenuItem;
private JMenu resultsMenu;
private JMenuItem resultsMenuItem;
private JMenuItem showFrequenciesItem;
private JMenuItem showTreeMenuItem;
private JMenu helpMenu;
private JMenuItem aboutMenuItem;
private JPanel statusPanel;
// End of variables declaration//GEN-END:variables
private JMenuItem saveConsoleMenuItem;
private JMenuItem printConsoleMenuItem;
private JMenuItem creditsMenuItem = new JMenuItem();
private final Timer messageTimer;
private final Timer busyIconTimer;
private final Icon idleIcon;
private final Icon[] busyIcons = new Icon[15];
private int busyIconIndex = 0;
private JDialog aboutBox;
private JDialog creditsBox;
}