/*
* TreesTableModel.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.bss;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;
import dr.evolution.tree.Tree;
import dr.evolution.util.Taxa;
import dr.evolution.util.Taxon;
/**
* @author Filip Bielejec
* @version $Id$
*/
@SuppressWarnings("serial")
public class TreesTableModel extends AbstractTableModel {
private PartitionDataList dataList;
private MainFrame frame;
public final static int TREE_FILE_INDEX = 0;
public final static int TAXA_SET_INDEX = 1;
public final static int TAXA_COUNT_INDEX = 2;
public static String[] COLUMN_NAMES = { "Tree File", "Taxa Set",
"Taxa count" };
private static final Class<?>[] COLUMN_TYPES = new Class<?>[] {
JButton.class, // Tree File
JButton.class, // Taxa Set
Integer.class // Taxa
};
private TaxaEditor taxaEditor;
public TreesTableModel(PartitionDataList dataList, MainFrame frame) {
this.dataList = dataList;
this.frame = frame;
addDefaultRow();
}// END: Constructor
public void addDefaultRow() {
dataList.recordsList.add(new TreesTableRecord());
fireTableDataChanged();
}// END: addDefaultRow
public void deleteRow(int row) {
// remove taxa connected to this row from Taxa panel
String value = dataList.recordsList.get(row).getName();
Utils.removeTaxaWithAttributeValue(dataList, Utils.TREE_FILENAME, value);
dataList.recordsList.remove(row);
fireTableDataChanged();
}// END: deleteRow
public void setRow(int row, TreesTableRecord record) {
// remove taxa connected to this row from Taxa panel
String value = dataList.recordsList.get(row).getName();
Utils.removeTaxaWithAttributeValue(dataList, Utils.TREE_FILENAME, value);
// add taxa with attributes
if(record.isTreeSet()) {
applyTaxa(record.getTree());
}
dataList.recordsList.set(row, record);
fireTableDataChanged();
}// END: setRow
public void applyTaxa(Tree tree) {
// set attributes to be parsed later in Taxa panel
Taxa taxa = new Taxa();
for (Taxon taxon : tree.asList()) {
double absoluteHeight = Utils.getAbsoluteTaxonHeight(taxon, tree);
taxon.setAttribute(Utils.ABSOLUTE_HEIGHT, absoluteHeight);
taxon.setAttribute(Utils.TREE_FILENAME, tree.getId());
taxa.addTaxon(taxon);
dataList.allTaxa.addTaxon(taxon);
}// END: taxon loop
}// END: applyTaxa
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public int getRowCount() {
return dataList.recordsList.size();
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_TYPES[columnIndex];
}// END: getColumnClass
public boolean isCellEditable(int row, int column) {
switch (column) {
case TREE_FILE_INDEX:
return false;
case TAXA_COUNT_INDEX:
return false;
case TAXA_SET_INDEX:
return false;
default:
return false;
}
}// END: isCellEditable
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}// END: getColumnName
@Override
public Object getValueAt(int row, int column) {
switch (column) {
case TREE_FILE_INDEX:
JButton treeFileButton = new JButton(Utils.CHOOSE_FILE);
treeFileButton.addActionListener(new ListenLoadTreeFile(row));
return treeFileButton;
case TAXA_SET_INDEX:
JButton taxaEditorButton = new JButton(Utils.EDIT_TAXA_SET);
taxaEditorButton.addActionListener(new ListenOpenTaxaEditor(row));
return taxaEditorButton;
case TAXA_COUNT_INDEX:
return dataList.recordsList.get(row).getTaxaCount();
default:
return "Error";
}
}// END: getValueAt
private class ListenOpenTaxaEditor implements ActionListener {
private int row;
public ListenOpenTaxaEditor(int row) {
this.row = row;
}
public void actionPerformed(ActionEvent ev) {
try {
taxaEditor = new TaxaEditor(frame, dataList, row);
taxaEditor.launch();
} catch (Exception e) {
Utils.handleException(e);
}
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenLoadTreeFile implements ActionListener {
private int row;
public ListenLoadTreeFile(int row) {
this.row = row;
}// END: Constructor
public void actionPerformed(ActionEvent ev) {
doLoadTreeFile(row);
}// END: actionPerformed
}// END: ListenLoadTreeFile
private void doLoadTreeFile(int row) {
try {
JFileChooser chooser = new JFileChooser();
chooser.setDialogTitle("Select trees 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) {
loadTreeFile(file, row);
File tmpDir = chooser.getCurrentDirectory();
if (tmpDir != null) {
frame.setWorkingDirectory(tmpDir);
}
}// END: file opened check
}// END: dialog cancelled check
} catch (Exception e) {
Utils.handleException(e);
}// END: try-catch block
}// END: doLoadTreeFile
private void loadTreeFile(final File file, final int row) {
frame.setBusy();
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
// Executed in background thread
public Void doInBackground() {
try {
Tree tree = Utils.importTreeFromFile(file);
tree.setId(file.getName());
setRow(row, new TreesTableRecord(tree.getId(), tree));
} 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: loadTreeFile
public void setDataList(PartitionDataList dataList) {
this.dataList = dataList;
}
}// END: class