package dr.app.bss;
import jam.framework.Exportable;
import jam.panels.OptionsPanel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingWorker;
import dr.evolution.io.Importer.ImportException;
import dr.evolution.io.NewickImporter;
import dr.evolution.io.NexusImporter;
import dr.evolution.tree.Tree;
import dr.evomodel.tree.TreeModel;
@SuppressWarnings("serial")
public class TreePanel extends JPanel implements Exportable {
private BeagleSequenceSimulatorFrame frame = null;
private PartitionDataList dataList = null;
private OptionsPanel optionPanel;
private JButton treeFileButton = new JButton("Choose File...");
private JTextField treeFileNameText = new JTextField("not selected", 16);
public TreePanel(final BeagleSequenceSimulatorFrame frame,
final PartitionDataList dataList) {
super();
this.frame = frame;
this.dataList = dataList;
setOpaque(false);
setLayout(new BorderLayout());
optionPanel = new OptionsPanel(12, 12, SwingConstants.CENTER);
add(optionPanel, BorderLayout.NORTH);
treeFileNameText.setEditable(false);
treeFileButton.addActionListener(new ListenTreeFileButton());
JPanel tmpPanel = new JPanel(new BorderLayout(0, 0));
tmpPanel.setOpaque(false);
tmpPanel.add(treeFileNameText, BorderLayout.CENTER);
tmpPanel.add(treeFileButton, BorderLayout.EAST);
optionPanel.addComponentWithLabel("Input Tree File: ", tmpPanel);
}// END: Constructor
private class ListenTreeFileButton implements ActionListener {
public void actionPerformed(ActionEvent ae) {
doImport();
}// END: actionPerformed
}// END: ListenTreeFileButton
public void doImport() {
try {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Select input tree file...");
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(frame.getWorkingDirectory());
int returnValue = chooser.showOpenDialog(Utils.getActiveFrame());
if (returnValue == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
if (file != null) {
// dataList.treeFilesList.add(file);
treeFileNameText.setText(file.getName());
importFromFile(file);
File tmpDir = chooser.getCurrentDirectory();
if (tmpDir != null) {
frame.setWorkingDirectory(tmpDir);
}
}// END: file opened check
}// END: dialog cancelled check
} catch (IOException e) {
e.printStackTrace();
} catch (ImportException e) {
e.printStackTrace();
}// END: try-catch block
}// END: doImport
public void importFromFile(final File file) throws IOException,
ImportException {
frame.setBusy();
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
// Executed in background thread
public Void doInBackground() {
try {
BufferedReader reader = new BufferedReader(new FileReader(
file));
String line = reader.readLine();
Tree tree;
if (line.toUpperCase().startsWith("#NEXUS")) {
NexusImporter importer = new NexusImporter(reader);
tree = importer.importTree(null);
} else {
NewickImporter importer = new NewickImporter(reader);
tree = importer.importTree(null);
}
// TODO Add taxons from a new tree to that list and display
// them in Taxa panel
dataList.taxonList = tree;
dataList.forestMap.put(file, new TreeModel(tree));
reader.close();
} catch (Exception e) {
Utils.handleException(e);
}// END: try-catch block
return null;
}// END: doInBackground()
// Executed in event dispatch thread
public void done() {
frame.setIdle();
frame.fireTaxaChanged();
}// END: done
};
worker.execute();
}// END: importFromFile
public JComponent getExportableComponent() {
return this;
}// END: getExportableComponent
}// END: class