/* * TreeAnnotatorDialog.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.tools; import dr.app.gui.components.RealNumberField; import dr.app.gui.FileDrop; import jam.panels.OptionsPanel; import dr.app.gui.components.WholeNumberField; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemListener; import java.awt.event.ItemEvent; import java.io.File; public class TreeAnnotatorDialog { private JFrame frame; private OptionsPanel optionPanel; private WholeNumberField burninStatesText = new WholeNumberField(0, Long.MAX_VALUE); private WholeNumberField burninTreesText = new WholeNumberField(0, Long.MAX_VALUE); private RealNumberField limitText = new RealNumberField(0.0, 1.0); private JComboBox summaryTreeCombo = new JComboBox(TreeAnnotator.Target.values()); private JComboBox nodeHeightsCombo = new JComboBox(TreeAnnotator.HeightsSummary.values()); private File targetFile = null; private File inputFile = null; private File outputFile = null; public TreeAnnotatorDialog(final JFrame frame) { this.frame = frame; optionPanel = new OptionsPanel(12, 12); this.frame = frame; JPanel panel = new JPanel(new BorderLayout()); panel.setOpaque(false); final JRadioButton burninStatesRadio = new JRadioButton("Specify the burnin as the number of states"); optionPanel.addSpanningComponent(burninStatesRadio); burninStatesText.setColumns(12); burninStatesText.setValue(0); burninStatesText.setToolTipText("<html>Specify the burnin as the number of states<br> in the MCMC chain</html>"); final JLabel burninStatesLabel = optionPanel.addComponentWithLabel("Burnin (as states): ", burninStatesText); final JRadioButton burninTreesRadio = new JRadioButton("Specify the burnin as the number of trees"); optionPanel.addSpanningComponent(burninTreesRadio); burninTreesText.setColumns(12); burninTreesText.setValue(0); burninTreesText.setToolTipText("<html>Specify the burnin as the number of trees<br> in the tree file</html>"); final JLabel burninTreesLabel = optionPanel.addComponentWithLabel("Burnin (as trees): ", burninTreesText); ButtonGroup group = new ButtonGroup(); group.add(burninStatesRadio); group.add(burninTreesRadio); //Register a listener for the radio buttons. burninStatesRadio.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { burninStatesLabel.setEnabled(burninStatesRadio.isSelected()); burninStatesText.setEnabled(burninStatesRadio.isSelected()); burninTreesLabel.setEnabled(!burninStatesRadio.isSelected()); burninTreesText.setEnabled(!burninStatesRadio.isSelected()); } }); burninStatesRadio.setSelected(true); limitText.setColumns(12); limitText.setValue(0.0); limitText.setToolTipText("<html>Specify a lower limit on the posterior probability<br>" + "below which a clade will not be annotated</html>"); optionPanel.addComponentWithLabel("Posterior probability limit: ", limitText); optionPanel.addComponentWithLabel("Target tree type: ", summaryTreeCombo); optionPanel.addComponentWithLabel("Node heights: ", nodeHeightsCombo); optionPanel.addSeparator(); final JButton targetFileButton = new JButton("Choose File..."); final JTextField targetFileNameText = new JTextField("not selected", 16); targetFileButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { FileDialog dialog = new FileDialog(frame, "Select target file...", FileDialog.LOAD); dialog.setVisible(true); if (dialog.getFile() == null) { // the dialog was cancelled... return; } targetFile = new File(dialog.getDirectory(), dialog.getFile()); targetFileNameText.setText(targetFile.getName()); }}); targetFileNameText.setEditable(false); JPanel panel1 = new JPanel(new BorderLayout(0,0)); panel1.add(targetFileNameText, BorderLayout.CENTER); panel1.add(targetFileButton, BorderLayout.EAST); final JLabel label1 = optionPanel.addComponentWithLabel("Target Tree File: ", panel1); JButton inputFileButton = new JButton("Choose File..."); final JTextField inputFileNameText = new JTextField("not selected", 16); inputFileButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { FileDialog dialog = new FileDialog(frame, "Select input tree 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); label1.setEnabled(false); targetFileNameText.setEnabled(false); targetFileButton.setEnabled(false); summaryTreeCombo.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent itemEvent) { boolean selected = summaryTreeCombo.getSelectedItem().equals(TreeAnnotator.Target.USER_TARGET_TREE); label1.setEnabled(selected); targetFileNameText.setEnabled(selected); targetFileButton.setEnabled(selected); } }); JPanel panel2 = new JPanel(new BorderLayout(0,0)); panel2.add(inputFileNameText, BorderLayout.CENTER); panel2.add(inputFileButton, BorderLayout.EAST); Color focusColor = UIManager.getColor("Focus.color"); Border focusBorder = BorderFactory.createMatteBorder( 2, 2, 2, 2, focusColor ); new FileDrop( null, inputFileNameText, focusBorder, new FileDrop.Listener() { public void filesDropped( java.io.File[] files ) { inputFile = files[0]; inputFileNameText.setText(inputFile.getName()); } // end filesDropped }); // end FileDrop.Listener optionPanel.addComponentWithLabel("Input Tree File: ", panel2); JButton outputFileButton = new JButton("Choose File..."); final JTextField outputFileNameText = new JTextField("not selected", 16); outputFileButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent ae) { FileDialog dialog = new FileDialog(frame, "Select output file...", FileDialog.SAVE); dialog.setVisible(true); if (dialog.getFile() == null) { // the dialog was cancelled... return; } outputFile = new File(dialog.getDirectory(), dialog.getFile()); outputFileNameText.setText(outputFile.getName()); }}); outputFileNameText.setEditable(false); JPanel panel3 = new JPanel(new BorderLayout(0,0)); panel3.add(outputFileNameText, BorderLayout.CENTER); panel3.add(outputFileButton, BorderLayout.EAST); optionPanel.addComponentWithLabel("Output File: ", panel3); } public boolean showDialog(String title) { JOptionPane optionPane = new JOptionPane(optionPanel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, null, new String[] { "Run", "Quit" }, null); optionPane.setBorder(new EmptyBorder(12, 12, 12, 12)); final JDialog dialog = optionPane.createDialog(frame, title); //dialog.setResizable(true); dialog.pack(); dialog.setVisible(true); return optionPane.getValue().equals("Run"); } public int getBurninStates() { return burninStatesText.getValue(); } public int getBurninTrees() { return burninTreesText.getValue(); } public double getPosteriorLimit() { return limitText.getValue(); } public TreeAnnotator.Target getTargetOption() { return (TreeAnnotator.Target)summaryTreeCombo.getSelectedItem(); } public TreeAnnotator.HeightsSummary getHeightsOption() { return (TreeAnnotator.HeightsSummary)nodeHeightsCombo.getSelectedItem(); } public String getTargetFileName() { if (targetFile == null) return null; return targetFile.getPath(); } public String getInputFileName() { if (inputFile == null) return null; return inputFile.getPath(); } public String getOutputFileName() { if (outputFile == null) return null; return outputFile.getPath(); } }