package dr.app.bss; import jam.framework.DocumentFrame; import jam.framework.Exportable; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.plaf.BorderUIResource; import dr.app.beagle.tools.BeagleSequenceSimulator; import dr.app.beagle.tools.Partition; import dr.evolution.io.Importer.ImportException; @SuppressWarnings("serial") public class BeagleSequenceSimulatorFrame extends DocumentFrame { private JTabbedPane tabbedPane = new JTabbedPane(); private TaxaPanel taxaPanel; private TreePanel treePanel; private PartitionsPanel partitionsPanel; private SimulationPanel simulationPanel; private PartitionDataList dataList; private JLabel statusLabel; private JProgressBar progressBar; private File workingDirectory = null; public BeagleSequenceSimulatorFrame(String title) { super(); setTitle(title); dataList = new PartitionDataList(); dataList.add(new PartitionData()); }// END: Constructor @Override protected void initializeComponents() { try { setSize(new Dimension(900, 600)); setMinimumSize(new Dimension(260, 100)); taxaPanel = new TaxaPanel(this, dataList); treePanel = new TreePanel(this, dataList); partitionsPanel = new PartitionsPanel(this, dataList); simulationPanel = new SimulationPanel( this, dataList); tabbedPane.addTab("Taxa", null, taxaPanel); tabbedPane.addTab("Tree", null, treePanel); tabbedPane.addTab("Partitions", null, partitionsPanel); tabbedPane.addTab("Simulation", null, simulationPanel); statusLabel = new JLabel("No taxa loaded"); JPanel progressPanel = new JPanel(new BorderLayout(0, 0)); progressBar = new JProgressBar(); progressPanel.add(progressBar, BorderLayout.CENTER); JPanel statusPanel = new JPanel(new BorderLayout(0, 0)); statusPanel.add(statusLabel, BorderLayout.CENTER); statusPanel.add(progressPanel, BorderLayout.EAST); statusPanel.setBorder(new BorderUIResource.EmptyBorderUIResource( new Insets(0, 6, 0, 6))); JPanel tabbedPanePanel = new JPanel(new BorderLayout(0, 0)); tabbedPanePanel.add(tabbedPane, BorderLayout.CENTER); tabbedPanePanel.add(statusPanel, BorderLayout.SOUTH); tabbedPanePanel.setBorder(new BorderUIResource.EmptyBorderUIResource( new Insets(12, 12, 12, 12))); getContentPane().setLayout(new java.awt.BorderLayout(0, 0)); getContentPane().add(tabbedPanePanel, BorderLayout.CENTER); tabbedPane.setSelectedComponent(treePanel); } catch (NumberFormatException e) { e.printStackTrace(); } }// END: initializeComponents public void fireTaxaChanged() { SwingUtilities.invokeLater(new Runnable() { public void run() { taxaPanel.updateUI(); setStatus(Integer.toString(dataList.taxonList.getTaxonCount()) + " taxa loaded."); } }); }// END: fireTaxaChanged // //////////////// // ---SIMULATE---// // //////////////// public Action getExportAction() { return simulateAction; }// END: getExportAction private AbstractAction simulateAction = new AbstractAction("Simulate...") { public void actionPerformed(ActionEvent ae) { doExport(); }// END: actionPerformed }; public final void doExport() { try { if (dataList.forestMap.size() == 0) { tabbedPane.setSelectedComponent(treePanel); treePanel.doImport(); } else { JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("Simulate..."); chooser.setMultiSelectionEnabled(false); chooser.setCurrentDirectory(workingDirectory); chooser.showSaveDialog(Utils.getActiveFrame()); File file = chooser.getSelectedFile(); if (file != null) { collectAllSettings(); generateFile(file); File tmpDir = chooser.getCurrentDirectory(); if (tmpDir != null) { workingDirectory = tmpDir; } }// END: file selected check }// END: tree loaded check } catch (Exception e) { Utils.handleException(e); } // END: try catch block }// END: doExport private void generateFile(final File outFile) throws IOException, ImportException { setBusy(); SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { // Executed in background thread public Void doInBackground() { try { if (BeagleSequenceSimulatorApp.DEBUG) { Utils.printDataList(dataList); } PrintWriter writer; writer = new PrintWriter(new FileWriter(outFile)); ArrayList<Partition> partitionsList = new ArrayList<Partition>(); for (PartitionData data : dataList) { // create partition Partition partition = new Partition(data.treeModel, // data.createBranchModel(), // data.createSiteRateModel(), // data.createBranchRateModel(), // data.createFrequencyModel(), // 0, // from data.to - 1, // to 1 // every ); partitionsList.add(partition); }// END: data list loop BeagleSequenceSimulator beagleSequenceSimulator = new BeagleSequenceSimulator( partitionsList, dataList.sequenceLength); writer.println(beagleSequenceSimulator.simulate().toString()); writer.close(); } catch (Exception e) { Utils.handleException(e); } return null; }// END: doInBackground // Executed in event dispatch thread public void done() { setStatus("Generated " + dataList.sequenceLength + " replicates."); setIdle(); }// END: done }; worker.execute(); }// END: generateFile @Override public JComponent getExportableComponent() { JComponent exportable = null; Component component = tabbedPane.getSelectedComponent(); if (component instanceof Exportable) { exportable = ((Exportable) component).getExportableComponent(); } else if (component instanceof JComponent) { exportable = (JComponent) component; } return exportable; }// END: getExportableComponent @Override protected boolean readFromFile(File arg0) throws IOException { return false; } @Override protected boolean writeToFile(File arg0) throws IOException { return false; } private void collectAllSettings() { // frequencyPanel.collectSettings(); // substModelPanel.collectSettings(); // clockPanel.collectSettings(); // sitePanel.collectSettings(); simulationPanel.collectSettings(); }// END: collectAllSettings public void dataSelectionChanged(boolean isSelected) { if (isSelected) { getDeleteAction().setEnabled(true); } else { getDeleteAction().setEnabled(false); } }// END: dataSelectionChanged public File getWorkingDirectory() { return workingDirectory; }// END: getWorkingDirectory public void setWorkingDirectory(File workingDirectory) { this.workingDirectory = workingDirectory; }// END: setWorkingDirectory public void fireModelChanged() { collectAllSettings(); }// END: fireModelChanged public void setBusy() { progressBar.setIndeterminate(true); } public void setIdle() { progressBar.setIndeterminate(false); } public void setStatus(String status) { statusLabel.setText(status); } }// END: class