/*
Copyright (C) 2011 Diego Darriba, David Posada
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 3 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.jmodeltest.gui;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.plaf.BorderUIResource;
import es.uvigo.darwin.jmodeltest.ModelTest;
import es.uvigo.darwin.jmodeltest.selection.HLRT;
public class Frame_hLRT extends JModelTestFrame {
private static final long serialVersionUID = -3314020071170637296L;
private JPanel PanelSettings = new JPanel();
private JTextField TextFieldConfidenceLevelhLRT = new JTextField();
private JList<String> HypothesisList = new JList<String>();
private DefaultListModel<String> listModel = new DefaultListModel<String>();
private JButton ButtonListUp = new JButton();
private JButton ButtonListDown = new JButton();
private JButton CancelButtonhLRT = new JButton();
private JButton RunButtonhLRT = new JButton();
private JButton JButtonDefaulthLRT = new JButton();
private JPanel PanelForwardBackward = new JPanel();
private JRadioButton ButtonForward = new JRadioButton();
private JRadioButton ButtonBackward = new JRadioButton();
private ButtonGroup ButtonGroupForwardBackward = new ButtonGroup();
private JCheckBox jCheckBoxPAUPblock = new JCheckBox();
private JCheckBox jCheckBoxDynamical = new JCheckBox();
private String currentDirectory = System.getProperty("user.dir");
public Frame_hLRT() {
}
public void initComponents() throws Exception {
java.awt.Image img0 = Toolkit.getDefaultToolkit().getImage(currentDirectory + "/resources/icons/Up24.gif");
java.awt.Image img1 = Toolkit.getDefaultToolkit().getImage(currentDirectory + "/resources/icons/Down24.gif");
PanelSettings.setSize(new java.awt.Dimension(460, 370));
PanelSettings.setBorder(new BorderUIResource.TitledBorderUIResource(new LineBorder(new java.awt.Color(153, 153, 153), 1, false), "hLRT Settings", 4, 2, new java.awt.Font("Application", 1, 10), new java.awt.Color(102, 102, 153)));
PanelSettings.setLocation(new java.awt.Point(10, 10));
PanelSettings.setVisible(true);
PanelSettings.setLayout(null);
TextFieldConfidenceLevelhLRT.setToolTipText("Enter the confidence level for individual LRTs and click ENTER");
TextFieldConfidenceLevelhLRT.setBorder(new BorderUIResource.TitledBorderUIResource(new LineBorder(new java.awt.Color(153, 153, 153), 1, false), "Confidence level LRT", 4, 2, new java.awt.Font("Application", 1, 10), new java.awt.Color(102, 102, 153)));
TextFieldConfidenceLevelhLRT.setVisible(true);
TextFieldConfidenceLevelhLRT.setSize(new java.awt.Dimension(130, 50));
TextFieldConfidenceLevelhLRT.setText("0.01");
TextFieldConfidenceLevelhLRT.setHorizontalAlignment(JTextField.RIGHT);
TextFieldConfidenceLevelhLRT.setLocation(new java.awt.Point(20, 20));
HypothesisList.setToolTipText("Use the buttons to move up and down the different hypotheses");
HypothesisList.setBorder(new BorderUIResource.TitledBorderUIResource(new LineBorder(new java.awt.Color(153, 153, 153), 1, false), "Hypotheses order", 4, 2, new java.awt.Font("Application", 1, 10), new java.awt.Color(102, 102, 153)));
HypothesisList.setVisible(true);
HypothesisList.setSize(new java.awt.Dimension(130, 230));
HypothesisList.setVisibleRowCount(ModelTest.testingOrder.size());
HypothesisList.setFont(XManager.FONT_LABEL_BIG);
HypothesisList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
HypothesisList.setLocation(new java.awt.Point(20, 80));
ButtonListUp.setIcon(new ImageIcon(img0));
ButtonListUp.setVisible(true);
ButtonListUp.setSize(new java.awt.Dimension(35, 40));
ButtonListUp.setLocation(new java.awt.Point(155, 100));
ButtonListDown.setIcon(new ImageIcon(img1));
ButtonListDown.setVisible(true);
ButtonListDown.setSize(new java.awt.Dimension(35, 40));
ButtonListDown.setLocation(new java.awt.Point(155, 140));
PanelForwardBackward.setSize(new java.awt.Dimension(200, 50));
PanelForwardBackward.setBorder(new BorderUIResource.TitledBorderUIResource(new LineBorder(new java.awt.Color(153, 153, 153), 1, false), "Forward/Backward Selection", 4, 2, new java.awt.Font("Application", 1, 10), new java.awt.Color(102, 102, 153)));
PanelForwardBackward.setLocation(new java.awt.Point(200, 20));
PanelForwardBackward.setVisible(true);
PanelForwardBackward.setLayout(null);
ButtonForward.setVisible(true);
ButtonForward.setSize(new java.awt.Dimension(90, 20));
ButtonForward.setText("Forward");
ButtonForward.setLocation(new java.awt.Point(10, 20));
ButtonForward.setToolTipText("Adds parameters starting from a JC model");
ButtonForward.setSelected(true);
ButtonBackward.setVisible(true);
ButtonBackward.setSize(new java.awt.Dimension(90, 20));
ButtonBackward.setText("Backward");
ButtonBackward.setLocation(new java.awt.Point(100, 20));
ButtonBackward.setToolTipText("Removes parameters starting from a GTR+I+G model");
jCheckBoxDynamical.setVisible(true);
jCheckBoxDynamical.setSize(new java.awt.Dimension(200, 20));
jCheckBoxDynamical.setText("Perform dynamical LRTs");
jCheckBoxDynamical.setLocation(new java.awt.Point(230, 100));
jCheckBoxDynamical.setSelected(false);
jCheckBoxDynamical.setToolTipText("The sequences of LRTs will be build according to best lnL moves");
jCheckBoxPAUPblock.setVisible(true);
jCheckBoxPAUPblock.setSize(new java.awt.Dimension(160, 20));
jCheckBoxPAUPblock.setText("Write PAUP* block");
jCheckBoxPAUPblock.setLocation(new java.awt.Point(230, 160));
jCheckBoxPAUPblock.setSelected(false);
jCheckBoxPAUPblock.setToolTipText("Writes a block of PAUP* commands implementing the selected model");
JButtonDefaulthLRT.setVisible(true);
JButtonDefaulthLRT.setSize(new java.awt.Dimension(141, 40));
JButtonDefaulthLRT.setText("Default Settings");
JButtonDefaulthLRT.setLocation(new java.awt.Point(10, 320));
CancelButtonhLRT.setVisible(true);
CancelButtonhLRT.setSize(new java.awt.Dimension(140, 40));
CancelButtonhLRT.setText("Cancel");
CancelButtonhLRT.setLocation(new java.awt.Point(160, 320));
RunButtonhLRT.setVisible(true);
RunButtonhLRT.setSize(new java.awt.Dimension(140, 40));
RunButtonhLRT.setText("Run");
RunButtonhLRT.setLocation(new java.awt.Point(310, 320));
RunButtonhLRT.setToolTipText("Click here to start the hLRT selection");
getRootPane().setDefaultButton(RunButtonhLRT);
ButtonGroupForwardBackward.add(ButtonForward);
ButtonGroupForwardBackward.add(ButtonBackward);
setLocation(new java.awt.Point(281, 80));
getContentPane().setLayout(null);
setTitle("Hierarchical Likelihood Ratio Tests (hLRT) Settings");
PanelSettings.add(TextFieldConfidenceLevelhLRT);
PanelSettings.add(HypothesisList);
PanelSettings.add(ButtonListUp);
PanelSettings.add(ButtonListDown);
PanelSettings.add(PanelForwardBackward);
PanelSettings.add(jCheckBoxDynamical);
PanelSettings.add(jCheckBoxPAUPblock);
PanelSettings.add(CancelButtonhLRT);
PanelSettings.add(RunButtonhLRT);
PanelSettings.add(JButtonDefaulthLRT);
PanelForwardBackward.add(ButtonForward);
PanelForwardBackward.add(ButtonBackward);
getContentPane().add(PanelSettings);
setSize(new java.awt.Dimension(482, 420));
setResizable(false);
// event handling
HypothesisList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
HypothesisListValueChanged(e);
}
});
ButtonListUp.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
ButtonListUpActionPerformed(e);
}
});
ButtonListDown.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
ButtonListDownActionPerformed(e);
}
});
ButtonForward.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e) {
ButtonForwardActionPerformed(e);
}
});
jCheckBoxDynamical.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
jCheckBoxDynamicalActionPerformed(e);
}
});
CancelButtonhLRT.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
CancelButtonhLRTActionPerformed(e);
}
});
RunButtonhLRT.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
RunButtonhLRTActionPerformed(e);
}
});
JButtonDefaulthLRT.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
JButtonDefaulthLRTActionPerformed(e);
}
});
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
thisWindowClosing(e);
}
});
// for (Enumeration e=testOrder.elements(); e.hasMoreElements();)
// ModelTest.testingOrder[i++] = (String)e.nextElement();
if (options.doF)
listModel.addElement("freq");
listModel.addElement("titv");
if (options.getSubstTypeCode() == 0)
listModel.addElement("2ti4tv");
else if (options.getSubstTypeCode() == 1)
{
listModel.addElement("2ti");
listModel.addElement("2tv");
}
else
{
listModel.addElement("2ti");
listModel.addElement("2tv");
listModel.addElement("4tv");
}
if (options.doG)
listModel.addElement("gamma");
if (options.doI)
listModel.addElement("pinv");
HypothesisList.setModel(listModel);
}
private boolean mShown = false;
public void addNotify() {
super.addNotify();
if (mShown)
return;
// resize frame to account for menubar
JMenuBar jMenuBar = getJMenuBar();
if (jMenuBar != null) {
int jMenuBarHeight = jMenuBar.getPreferredSize().height;
Dimension dimension = getSize();
dimension.height += jMenuBarHeight;
setSize(dimension);
// move down components in layered pane
Component[] components = getLayeredPane().getComponentsInLayer(JLayeredPane.DEFAULT_LAYER.intValue());
for (int i = 0; i < components.length; i++) {
Point location = components[i].getLocation();
location.move(location.x, location.y + jMenuBarHeight);
components[i].setLocation(location);
}
}
mShown = true;
}
// Close the window when the close box is clicked
void thisWindowClosing(java.awt.event.WindowEvent e) {
setVisible(false);
dispose();
//System.exit(0);
}
public void ButtonListUpActionPerformed(java.awt.event.ActionEvent e)
{
int moveMe = HypothesisList.getSelectedIndex();
if (moveMe != 0) //not already at top
{
swap (moveMe, moveMe-1);
HypothesisList.setSelectedIndex(moveMe-1);
HypothesisList.ensureIndexIsVisible(moveMe-1);
}
}
public void ButtonListDownActionPerformed(java.awt.event.ActionEvent e)
{
int moveMe = HypothesisList.getSelectedIndex();
if (moveMe != listModel.getSize()-1) //not already at bottom
{
swap (moveMe, moveMe+1);
HypothesisList.setSelectedIndex(moveMe+1);
HypothesisList.ensureIndexIsVisible(moveMe+1);
}
}
public void HypothesisListValueChanged(ListSelectionEvent e) {
}
//Swap two elements in the list.
private void swap(int a, int b)
{
if (a >= 0 && b >= 0
&& a < listModel.getSize()
&& b < listModel.getSize()) {
String aObject = listModel.getElementAt(a);
String bObject = listModel.getElementAt(b);
listModel.set(a, bObject);
listModel.set(b, aObject);
}
}
public void ButtonForwardActionPerformed(ChangeEvent e)
{
listModel.removeAllElements();
if (options.doF)
listModel.addElement("freq");
if (ButtonForward.isSelected())
{
listModel.addElement("titv");
if (options.getSubstTypeCode() == 0)
listModel.addElement("2ti4tv");
else if (options.getSubstTypeCode() == 1)
{
listModel.addElement("2ti");
listModel.addElement("2tv");
}
else if (options.getSubstTypeCode() > 1)
{
listModel.addElement("2ti");
listModel.addElement("2tv");
listModel.addElement("4tv");
}
}
else
{
if (options.getSubstTypeCode() == 0)
listModel.addElement("2ti4tv");
else if (options.getSubstTypeCode() == 1)
{
listModel.addElement("2tv");
listModel.addElement("2ti");
}
else if (options.getSubstTypeCode() > 1)
{
listModel.addElement("4tv");
listModel.addElement("2tv");
listModel.addElement("2ti");
}
listModel.addElement("titv");
}
if (options.doG)
listModel.addElement("gamma");
if (options.doI)
listModel.addElement("pinv");
HypothesisList.setModel(listModel);
}
public void jCheckBoxDynamicalActionPerformed(java.awt.event.ActionEvent e)
{
try
{
if (jCheckBoxDynamical.isSelected())
{
ButtonListUp.setEnabled(false);
ButtonListDown.setEnabled(false);
HypothesisList.setEnabled(false);
}
else
{
ButtonListUp.setEnabled(true);
ButtonListDown.setEnabled(true);
HypothesisList.setEnabled(true);
}
}
catch (Exception f)
{
f.printStackTrace();
}
}
public void JButtonDefaulthLRTActionPerformed(java.awt.event.ActionEvent e)
{
TextFieldConfidenceLevelhLRT.setText("0.01");
listModel.removeAllElements();
if (options.doF)
listModel.addElement("freq");
listModel.addElement("titv");
if (options.getSubstTypeCode() == 0)
listModel.addElement("2ti4tv");
else if (options.getSubstTypeCode() == 1)
{
listModel.addElement("2ti");
listModel.addElement("2tv");
}
else
{
listModel.addElement("2ti");
listModel.addElement("2tv");
listModel.addElement("4tv");
}
if (options.doG)
listModel.addElement("gamma");
if (options.doI)
listModel.addElement("pinv");
HypothesisList.setModel(listModel);
ButtonForward.setSelected(true);
jCheckBoxPAUPblock.setSelected(false);
jCheckBoxDynamical.setSelected(false);
}
public void CancelButtonhLRTActionPerformed(java.awt.event.ActionEvent e)
{
try
{
setVisible(false);
dispose();
}
catch (Exception f)
{
f.printStackTrace();
}
}
public void RunButtonhLRTActionPerformed(java.awt.event.ActionEvent e)
{
int i;
double alpha;
boolean forward,writePAUPblock;
setVisible(false);
dispose();
alpha = Double.parseDouble (TextFieldConfidenceLevelhLRT.getText());
writePAUPblock = jCheckBoxPAUPblock.isSelected();
if (ButtonForward.isSelected())
forward = true;
else
forward = false;
for (i=0; i< listModel.getSize(); i++) {
ModelTest.testingOrder.setElementAt(listModel.getElementAt(i),i);
}
/* check whether 2tv goes before 4tv */
if (forward && ModelTest.testingOrder.indexOf("2tv") > ModelTest.testingOrder.indexOf("4tv"))
{
JOptionPane.showMessageDialog(this, "for forward hLRTs the hypothesis 2tv needs\nto be tested before the hypothesis 4tv",
"jModelTest error", JOptionPane.ERROR_MESSAGE);
ModelTest.getMainConsole().println ("\nError: for forward hLRTs the hypothesis 2tv needs\nto be tested before the hypothesis 4tv");
}
else if (!forward && ModelTest.testingOrder.indexOf("2tv") < ModelTest.testingOrder.indexOf("4tv"))
{
JOptionPane.showMessageDialog(this, "for backward hLRTs the hypothesis 2tv needs\nto be tested after the hypothesis 4tv",
"jModelTest error", JOptionPane.ERROR_MESSAGE);
ModelTest.getMainConsole().println ("\nError: for backward hLRTs the hypothesis 2tv needs\nto be tested after the hypothesis 4tv");
}
HLRT myHLRT = new HLRT(options);
if (jCheckBoxDynamical.isSelected())
myHLRT.computeDynamical(forward, alpha, writePAUPblock);
else
myHLRT.compute(forward, alpha, writePAUPblock);
}
}