/*
* PartitionTableModel.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 javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.BadLocationException;
/**
* @author Filip Bielejec
* @version $Id$
*/
@SuppressWarnings("serial")
public class PartitionTableModel extends AbstractTableModel {
private PartitionDataList dataList;
public final static int DATA_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 DATA_TYPE_INDEX = 4;
public final static int DEMOGRAPHIC_MODEL_INDEX = 5;
public final static int BRANCH_SUBSTITUTION_MODEL_INDEX = 6;
public final static int FREQUENCY_MODEL_INDEX = 7;
public final static int SITE_RATE_MODEL_INDEX = 8;
public final static int CLOCK_RATE_MODEL_INDEX = 9;
public final static int ROOT_SEQUENCE_INDEX = 10;
public static String[] COLUMN_NAMES = { "Input", //
"From", //
"To", //
"Every", //
"Data Type", //
"Tree model", //
"Substitution Model", //
"Frequencies", //
"Site Rate Model", //
"Clock Rate Model", //
"Root Sequence" //
};
private static final Class<?>[] COLUMN_TYPES = new Class<?>[] {
JComboBox.class, // Input
Integer.class, // From
Integer.class, // To
Integer.class, // Every
JComboBox.class, // Data type
JButton.class, // Demographic model
JButton.class, // Substitution Model
JButton.class, // Frequencies
JButton.class, // Site Rate Model
JButton.class, // Clock Rate Model
JButton.class // Ancestral Sequence
};
private DemographicModelEditor demographicModelEditor;
private BranchSubstitutionModelEditor branchSubstitutionModelEditor;
private SiteRateModelEditor siteRateModelEditor;
private ClockRateModelEditor clockRateModelEditor;
private FrequencyModelEditor frequencyModelEditor;
private RootSequenceEditor rootSequenceEditor;
public PartitionTableModel(PartitionDataList dataList) {
this.dataList = dataList;
}// END: Constructor
public void addRow(PartitionData row) {
dataList.add(row);
fireTableRowsInserted(dataList.size() - 1, dataList.size() - 1);
}
public void addDefaultRow() {
dataList.add(new PartitionData());
fireTableRowsInserted(dataList.size() - 1, dataList.size() - 1);
}
public void deleteRow(int row) {
dataList.remove(row);
fireTableDataChanged();
}
@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
public boolean isCellEditable(int row, int column) {
switch (column) {
case DATA_INDEX:
return true;
case DEMOGRAPHIC_MODEL_INDEX:
return false;
case DATA_TYPE_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;
case ROOT_SEQUENCE_INDEX:
return false;
default:
return false;
}
}// END: isCellEditable
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}// END: getColumnName
@Override
public Object getValueAt(final int row, final int column) {
switch (column) {
case DATA_INDEX:
return dataList.get(row).record == null ? new TreesTableRecord() : dataList
.get(row).record;
case DEMOGRAPHIC_MODEL_INDEX:
final JButton topologyButton = new JButton(COLUMN_NAMES[column]);
topologyButton
.addActionListener(new ListenOpenDemographicModelEditor(row));
return topologyButton;
case DATA_TYPE_INDEX:
return PartitionData.dataTypes[dataList.get(row).dataTypeIndex];
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:
final JButton branchSubstModelButton = new JButton(
COLUMN_NAMES[column]);
branchSubstModelButton
.addActionListener(new ListenOpenBranchSubstitutionModelEditor(
row));
return branchSubstModelButton;
case SITE_RATE_MODEL_INDEX:
final JButton siteRateModelButton = new JButton(
COLUMN_NAMES[column]);
siteRateModelButton
.addActionListener(new ListenOpenSiteRateModelEditor(row));
return siteRateModelButton;
case CLOCK_RATE_MODEL_INDEX:
final JButton clockRateModelButton = new JButton(
COLUMN_NAMES[column]);
clockRateModelButton
.addActionListener(new ListenOpenClockRateModelEditor(row));
return clockRateModelButton;
case FREQUENCY_MODEL_INDEX:
final JButton frequencyModelButton = new JButton(
COLUMN_NAMES[column]);
frequencyModelButton
.addActionListener(new ListenOpenFrequencyModelEditor(row));
return frequencyModelButton;
case ROOT_SEQUENCE_INDEX:
final JButton ancestralSequenceButton = new JButton(COLUMN_NAMES[column]);
ancestralSequenceButton.addActionListener(new ListenOpenRootSequenceEditor(row));
return ancestralSequenceButton;
default:
return "Error";
}
}// END: getValueAt
public void setValueAt(Object value, int row, int column) {
switch (column) {
case DATA_INDEX:
dataList.get(row).record = (TreesTableRecord) value;
break;
case DATA_TYPE_INDEX:
dataList.get(row).dataTypeIndex = (Integer) Utils.arrayIndex(
PartitionData.dataTypes, (String) 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).substitutionModelIndex = (Integer) value;
break;
case SITE_RATE_MODEL_INDEX:
dataList.get(row).siteRateModelIndex = (Integer) value;
break;
case CLOCK_RATE_MODEL_INDEX:
dataList.get(row).clockModelIndex = (Integer) value;
break;
case FREQUENCY_MODEL_INDEX:
dataList.get(row).frequencyModelIndex = (Integer) value;
break;
default:
throw new RuntimeException("Invalid index.");
}
fireTableCellUpdated(row, column);
}// END: setValueAt
private class ListenOpenDemographicModelEditor implements ActionListener {
private int row;
public ListenOpenDemographicModelEditor(int row) {
this.row = row;
}// END: Constructor
public void actionPerformed(ActionEvent ev) {
demographicModelEditor = new DemographicModelEditor(dataList, row);
demographicModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenDemographicModelEditor
private class ListenOpenBranchSubstitutionModelEditor implements
ActionListener {
private int row;
public ListenOpenBranchSubstitutionModelEditor(int row) {
this.row = row;
}// END: Constructor
public void actionPerformed(ActionEvent ev) {
branchSubstitutionModelEditor = new BranchSubstitutionModelEditor(
dataList, row);
branchSubstitutionModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenBranchSubstitutionModelEditor
private class ListenOpenSiteRateModelEditor implements ActionListener {
private int row;
public ListenOpenSiteRateModelEditor(int row) {
this.row = row;
}
public void actionPerformed(ActionEvent ev) {
try {
siteRateModelEditor = new SiteRateModelEditor(dataList, row);
siteRateModelEditor.launch();
} catch (NumberFormatException e) {
Utils.handleException(e);
} catch (BadLocationException e) {
Utils.handleException(e);
}
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenOpenClockRateModelEditor implements ActionListener {
private int row;
public ListenOpenClockRateModelEditor(int row) {
this.row = row;
}
public void actionPerformed(ActionEvent ev) {
clockRateModelEditor = new ClockRateModelEditor(dataList, row);
clockRateModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenOpenFrequencyModelEditor implements ActionListener {
private int row;
public ListenOpenFrequencyModelEditor(int row) {
this.row = row;
}
public void actionPerformed(ActionEvent ev) {
frequencyModelEditor = new FrequencyModelEditor(dataList, row);
frequencyModelEditor.launch();
}// END: actionPerformed
}// END: ListenOpenSiteRateModelEditor
private class ListenOpenRootSequenceEditor implements ActionListener {
private int row;
public ListenOpenRootSequenceEditor(int row) {
this.row = row;
}
public void actionPerformed(ActionEvent ev) {
rootSequenceEditor = new RootSequenceEditor(dataList, row);
rootSequenceEditor.launch();
}// END: actionPerformed
}// END: ListenOpenAncestralSequenceEditor
public void setDataList(PartitionDataList dataList) {
this.dataList = dataList;
}
}// END: class