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.JComboBox;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.BadLocationException;
@SuppressWarnings("serial")
public class PartitionTableModel extends AbstractTableModel {
private BranchSubstitutionModelEditor branchSubstitutionModelEditor;
private SiteRateModelEditor siteRateModelEditor;
private ClockRateModelEditor clockRateModelEditor;
private FrequencyModelEditor frequencyModelEditor;
public final static int PARTITION_TREE_INDEX = 0;
public final static int FROM_INDEX = 1;
public final static int TO_INDEX = 2;
public final static int EVERY_INDEX = 3;
public final static int BRANCH_SUBSTITUTION_MODEL_INDEX = 4;
public final static int SITE_RATE_MODEL_INDEX = 5;
public final static int CLOCK_RATE_MODEL_INDEX = 6;
public final static int FREQUENCY_MODEL_INDEX = 7;
private String[] COLUMN_NAMES = { "Partition Tree", "From", "To", "Every",
"Branch Substitution Model", "Site Rate Model", "Clock Rate Model",
"Frequency Model" };
private static final Class<?>[] COLUMN_TYPES = new Class<?>[] {
JComboBox.class, Integer.class, Integer.class, Integer.class,
JButton.class, JButton.class, JButton.class, JButton.class };
private PartitionDataList dataList;
public PartitionTableModel(PartitionDataList dataList) {
this.dataList = dataList;
}// END: Constructor
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}// END: getColumnCount
@Override
public int getRowCount() {
return dataList.size();
}// END: getRowCount
@Override
public Class<?> getColumnClass(int columnIndex) {
return COLUMN_TYPES[columnIndex];
}// END: getColumnClass
@Override
public Object getValueAt(final int row, final int column) {
switch (column) {
case PARTITION_TREE_INDEX:
return dataList.get(row).treeFile == null ? new File("") : dataList.get(row).treeFile;
case FROM_INDEX:
return dataList.get(row).from;
case TO_INDEX:
return dataList.get(row).to;
case EVERY_INDEX:
return dataList.get(row).every;
case BRANCH_SUBSTITUTION_MODEL_INDEX:
branchSubstitutionModelEditor = new BranchSubstitutionModelEditor(
dataList, row);
final JButton branchSubstModelButton = new JButton(
COLUMN_NAMES[column]);
branchSubstModelButton
.addActionListener(new ListenOpenBranchSubstitutionModelEditor());
return branchSubstModelButton;
case SITE_RATE_MODEL_INDEX:
try {
siteRateModelEditor = new SiteRateModelEditor(dataList, row);
final JButton siteRateModelButton = new JButton(
COLUMN_NAMES[column]);
siteRateModelButton
.addActionListener(new ListenOpenSiteRateModelEditor());
return siteRateModelButton;
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (BadLocationException e) {
e.printStackTrace();
}
case CLOCK_RATE_MODEL_INDEX:
clockRateModelEditor = new ClockRateModelEditor(dataList, row);
final JButton clockRateModelButton = new JButton(
COLUMN_NAMES[column]);
clockRateModelButton
.addActionListener(new ListenOpenClockRateModelEditor());
return clockRateModelButton;
case FREQUENCY_MODEL_INDEX:
frequencyModelEditor = new FrequencyModelEditor(dataList, row);
final JButton frequencyModelButton = new JButton(
COLUMN_NAMES[column]);
frequencyModelButton
.addActionListener(new ListenOpenFrequencyModelEditor());
return frequencyModelButton;
default:
return "Error";
}
}// END: getValueAt
public void setValueAt(Object value, int row, int column) {
switch (column) {
case PARTITION_TREE_INDEX:
dataList.get(row).treeFile = (File) value;
break;
case FROM_INDEX:
dataList.get(row).from = (Integer) value;
break;
case TO_INDEX:
dataList.get(row).to = (Integer) value;
break;
case EVERY_INDEX:
dataList.get(row).every = (Integer) value;
break;
case BRANCH_SUBSTITUTION_MODEL_INDEX:
dataList.get(row).substitutionModel = (Integer) value;
case SITE_RATE_MODEL_INDEX:
dataList.get(row).siteModel = (Integer) value;
case CLOCK_RATE_MODEL_INDEX:
dataList.get(row).clockModel = (Integer) value;
case FREQUENCY_MODEL_INDEX:
dataList.get(row).frequencyModel = (Integer) value;
default:
System.out.println("invalid index");
}
fireTableCellUpdated(row, column);
}// END: setValueAt
public void addRow(PartitionData row) {
dataList.add(row);
this.fireTableDataChanged();
}
public void addDefaultRow() {
//TODO: this could copy the previous line (new constructor that takes all the elements)
dataList.add(new PartitionData());
fireTableRowsInserted(dataList.size() - 1, dataList.size() - 1);
}
public void deleteRow(int row) {
dataList.remove(row);
this.fireTableDataChanged();
}
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}// END: getColumnName
public String[] getColumn(int index) {
String[] column = new String[dataList.size()];
for (int i = 0; i < dataList.size(); i++) {
column[i] = String.valueOf(getValueAt(i, index));
}
return column;
}// END: getColumn
public boolean isCellEditable(int row, int column) {
switch (column) {
case PARTITION_TREE_INDEX:
return true;
case FROM_INDEX:
return true;
case TO_INDEX:
return true;
case EVERY_INDEX:
return true;
case BRANCH_SUBSTITUTION_MODEL_INDEX:
return false;
case SITE_RATE_MODEL_INDEX:
return false;
case CLOCK_RATE_MODEL_INDEX:
return false;
case FREQUENCY_MODEL_INDEX:
return false;
default:
return false;
}
}// END: isCellEditable
private class ListenOpenBranchSubstitutionModelEditor implements
ActionListener {
public void actionPerformed(ActionEvent ev) {
branchSubstitutionModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenBranchSubstitutionModelEditor
private class ListenOpenSiteRateModelEditor implements ActionListener {
public void actionPerformed(ActionEvent ev) {
siteRateModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenOpenClockRateModelEditor implements ActionListener {
public void actionPerformed(ActionEvent ev) {
clockRateModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenOpenFrequencyModelEditor implements ActionListener {
public void actionPerformed(ActionEvent ev) {
frequencyModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
}// END: class