package beast.app.beastapp;
import java.awt.BorderLayout;
import java.awt.Font;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import jam.html.SimpleLinkListener;
import jam.panels.OptionsPanel;
public class BeastDialog {
private final JFrame frame;
private final OptionsPanel optionPanel;
private final WholeNumberField seedText = new WholeNumberField(1, Long.MAX_VALUE);
// private final JCheckBox overwriteCheckBox = new JCheckBox("Allow overwriting of log files");
private final JComboBox<String> logginMode = new JComboBox<>(new String[]{"default: only write new log files",
"overwrite: overwrite log files",
"resume: appends log to existing files (if any)"});
private final JCheckBox strictVersionCheckBox = new JCheckBox("Only load packages and versions specified in XML");
private final JCheckBox beagleCheckBox = new JCheckBox("Use BEAGLE library if available:");
private final JCheckBox beagleInfoCheckBox = new JCheckBox("Show list of available BEAGLE resources and Quit");
private final JComboBox<Object> beagleResourceCombo = new JComboBox<>(new Object[]{"CPU", "GPU"});
private final JCheckBox beagleSSECheckBox = new JCheckBox("Use CPU's SSE extensions");
private final JComboBox<Object> beaglePrecisionCombo = new JComboBox<>(new Object[]{"Double", "Single"});
private final JComboBox<Object> threadsCombo = new JComboBox<>(new Object[]{"Automatic", 0, 1, 2, 3, 4, 5, 6, 7, 8});
private File inputFile = null;
public BeastDialog(final JFrame frame, final String titleString, final Icon icon) {
this.frame = frame;
optionPanel = new OptionsPanel(12, 12);
//this.frame = frame;
// JPanel panel = new JPanel(new BorderLayout());
// panel.setOpaque(false);
final JLabel titleText = new JLabel(titleString);
titleText.setIcon(icon);
optionPanel.addSpanningComponent(titleText);
Font font = UIManager.getFont("Label.font");
titleText.setFont(new Font("sans-serif", font.getStyle(), font.getSize()));
final JButton inputFileButton = new JButton("Choose File...");
final JTextField inputFileNameText = new JTextField("not selected", 16);
inputFileButton.addActionListener(ae -> {
File file = beast.app.util.Utils.getLoadFile("Load xml file", inputFile, "Beast xml files", "xml");
if (file != null) {
inputFile = file;
inputFileNameText.setText(inputFile.getName());
}
// if (!Utils.isMacOSX()) {
// JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
// fc.addChoosableFileFilter(new FileFilter() {
// public boolean accept(File f) {
// if (f.isDirectory()) {
// return true;
// }
// String name = f.getName().toLowerCase();
// if (name.endsWith(".xml")) {
// return true;
// }
// return false;
// }
//
// // The description of this filter
// public String getDescription() {
// return "xml files";
// }
// });
//
// fc.setDialogTitle("Load xml file");
// int rval = fc.showOpenDialog(null);
// if (rval == JFileChooser.APPROVE_OPTION) {
// inputFile = fc.getSelectedFile();
// inputFileNameText.setText(inputFile.getName());
// }
// } else {
// FileDialog dialog = new FileDialog(frame,
// "Select target file...",
// FileDialog.LOAD);
//
// dialog.setVisible(true);
// if (dialog.getFile() == null) {
// // the dialog was cancelled...
// return;
// }
//
// inputFile = new File(dialog.getDirectory(), dialog.getFile());
// inputFileNameText.setText(inputFile.getName());
//
// }
});
inputFileNameText.setEditable(false);
JPanel panel1 = new JPanel(new BorderLayout(0, 0));
panel1.add(inputFileNameText, BorderLayout.CENTER);
panel1.add(inputFileButton, BorderLayout.EAST);
optionPanel.addComponentWithLabel("BEAST XML File: ", panel1);
optionPanel.addComponent(logginMode);
// optionPanel.addComponent(overwriteCheckBox);
optionPanel.addComponent(strictVersionCheckBox);
strictVersionCheckBox.setToolTipText("Only check this box to run a file with exactly the same packages "
+ "and package versions as specified in the 'required' attribute of the beast element in "
+ "the XML file");
optionPanel.addSeparator();
seedText.setColumns(12);
optionPanel.addComponentWithLabel("Random number seed: ", seedText);
optionPanel.addComponentWithLabel("Thread pool size: ", threadsCombo);
optionPanel.addSeparator();
optionPanel.addSpanningComponent(beagleCheckBox);
beagleCheckBox.setSelected(true);
final OptionsPanel optionPanel1 = new OptionsPanel(0, 12);
// optionPanel1.setBorder(BorderFactory.createEmptyBorder());
optionPanel1.setBorder(new TitledBorder(""));
OptionsPanel optionPanel2 = new OptionsPanel(0, 12);
optionPanel2.setBorder(BorderFactory.createEmptyBorder());
final JLabel label1 = optionPanel2.addComponentWithLabel("Prefer use of: ", beagleResourceCombo);
// optionPanel2.addComponent(beagleSSECheckBox);
beagleSSECheckBox.setSelected(true);
final JLabel label2 = optionPanel2.addComponentWithLabel("Prefer precision: ", beaglePrecisionCombo);
optionPanel2.addComponent(beagleInfoCheckBox);
optionPanel1.addComponent(optionPanel2);
final JEditorPane beagleInfo = new JEditorPane("text/html",
"<html><div style=\"font-family:sans-serif;font-size:12;\"><p>BEAGLE is a high-performance phylogenetic library that can make use of<br>" +
"additional computational resources such as graphics boards. It must be<br>" +
"downloaded and installed independently of BEAST:</p>" +
"<pre><a href=\"http://beagle-lib.googlecode.com/\">http://beagle-lib.googlecode.com/</a></pre></div>");
beagleInfo.setOpaque(false);
beagleInfo.setEditable(false);
beagleInfo.addHyperlinkListener(new SimpleLinkListener());
optionPanel1.addComponent(beagleInfo);
optionPanel.addSpanningComponent(optionPanel1);
beagleInfoCheckBox.setEnabled(false);
beagleCheckBox.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
beagleInfo.setEnabled(beagleCheckBox.isSelected());
beagleInfoCheckBox.setEnabled(beagleCheckBox.isSelected());
label1.setEnabled(beagleCheckBox.isSelected());
beagleResourceCombo.setEnabled(beagleCheckBox.isSelected());
beagleSSECheckBox.setEnabled(beagleCheckBox.isSelected());
label2.setEnabled(beagleCheckBox.isSelected());
beaglePrecisionCombo.setEnabled(beagleCheckBox.isSelected());
}
});
beagleCheckBox.setSelected(false);
beagleResourceCombo.setSelectedItem("CPU");
}
public boolean showDialog(String title, long seed) {
JOptionPane optionPane = new JOptionPane(optionPanel,
JOptionPane.PLAIN_MESSAGE,
JOptionPane.OK_CANCEL_OPTION,
null,
new String[]{"Run", "Quit"},
"Run");
optionPane.setBorder(new EmptyBorder(12, 12, 12, 12));
seedText.setValue(seed);
final JDialog dialog = optionPane.createDialog(frame, title);
//dialog.setResizable(true);
dialog.pack();
dialog.setVisible(true);
if (optionPane.getValue() == null) {
System.exit(0);
}
return optionPane.getValue().equals("Run");
}
public long getSeed() {
return seedText.getLongValue();
}
// public boolean allowOverwrite() {
// return overwriteCheckBox.isSelected();
// }
public int getLogginMode() {
return logginMode.getSelectedIndex();
}
public boolean useStrictVersions() {
return strictVersionCheckBox.isSelected();
}
public boolean useBeagle() {
return beagleCheckBox.isSelected();
}
public boolean preferBeagleGPU() {
return beagleResourceCombo.getSelectedItem().equals("GPU");
}
public boolean preferBeagleCPU() {
return beagleResourceCombo.getSelectedItem().equals("CPU");
}
public boolean preferBeagleSSE() {
// for the moment we will alway use SSE if CPU is selected...
return preferBeagleCPU();
}
public boolean preferBeagleSingle() {
return beaglePrecisionCombo.getSelectedItem().equals("Single");
}
public boolean preferBeagleDouble() {
return beaglePrecisionCombo.getSelectedItem().equals("Double");
}
public boolean showBeagleInfo() {
return beagleInfoCheckBox.isSelected();
}
public int getThreadPoolSize() {
if (threadsCombo.getSelectedIndex() == 0) {
// Automatic
return -1;
}
return (Integer) threadsCombo.getSelectedItem();
}
public File getInputFile() {
return inputFile;
}
}