package dr.app.bss; import jam.framework.Exportable; import jam.table.HeaderRenderer; import jam.table.TableRenderer; import java.awt.BorderLayout; import java.awt.Insets; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.BorderUIResource; import javax.swing.table.AbstractTableModel; import dr.app.gui.table.DateCellEditor; import dr.app.gui.table.TableEditorStopper; import dr.app.gui.table.TableSorter; @SuppressWarnings("serial") public class TaxaPanel extends JPanel implements Exportable { private BeagleSequenceSimulatorFrame frame = null; private PartitionDataList dataList = null; private JScrollPane scrollPane = new JScrollPane(); private JTable dataTable = null; private TaxaTableModel taxaTableModel = null; private double[] heights = null; public TaxaPanel(BeagleSequenceSimulatorFrame frame, PartitionDataList dataList) { this.frame = frame; this.dataList = dataList; taxaTableModel = new TaxaTableModel(); TableSorter sorter = new TableSorter(taxaTableModel); dataTable = new JTable(sorter); sorter.setTableHeader(dataTable.getTableHeader()); dataTable.getTableHeader().setReorderingAllowed(false); dataTable.getTableHeader() .setDefaultRenderer( new HeaderRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable .getColumnModel() .getColumn(0) .setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(0).setPreferredWidth(80); dataTable .getColumnModel() .getColumn(1) .setCellRenderer( new TableRenderer(SwingConstants.LEFT, new Insets(0, 4, 0, 4))); dataTable.getColumnModel().getColumn(1).setPreferredWidth(80); dataTable.getColumnModel().getColumn(1) .setCellEditor(new DateCellEditor()); TableEditorStopper.ensureEditingStopWhenTableLosesFocus(dataTable); dataTable.getSelectionModel().addListSelectionListener( new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { selectionChanged(); } }); scrollPane = new JScrollPane(dataTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scrollPane.setOpaque(false); setOpaque(false); setBorder(new BorderUIResource.EmptyBorderUIResource( new java.awt.Insets(12, 12, 12, 12))); setLayout(new BorderLayout(0, 0)); add(scrollPane, "Center"); } public JComponent getExportableComponent() { return dataTable; } public void selectionChanged() { int[] selRows = dataTable.getSelectedRows(); if (selRows == null || selRows.length == 0) { frame.dataSelectionChanged(false); } else { frame.dataSelectionChanged(true); } } // TODO: multiple partitions private void getHeights() { System.out.println("Parsing heights"); heights = new double[dataList.taxonList.getTaxonCount()];; for (int i = 0; i < dataList.taxonList.getTaxonCount(); i++) { heights[i] = dataList.taxonList.getTaxon(i).getHeight(); }// END: taxon loop taxaTableModel.fireTableDataChanged(); }//END: getHeights private class TaxaTableModel extends AbstractTableModel { String[] columnNames = { "Name", "Height" }; public TaxaTableModel() { } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return dataList.taxonList.getTaxonCount(); } public Object getValueAt(int row, int col) { switch (col) { case 0: return dataList.taxonList.getTaxonId(row); case 1: // getHeights(); if (heights != null) { return heights[row]; } else { return "0.0"; } default: return null; } }//END: getValueAt public void setValueAt(Object value, int row, int col) { getHeights(); if (col == 0) { dataList.taxonList.getTaxon(row).setId(value.toString()); } // if (col == 1) { // // dataList.get(0).taxonList.getTaxon(row).getHeight(); // // } } public boolean isCellEditable(int row, int col) { return false; } public String getColumnName(int column) { return columnNames[column]; } public Class<? extends Object> getColumnClass(int c) { return getValueAt(0, c).getClass(); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append(getColumnName(0)); for (int j = 1; j < getColumnCount(); j++) { buffer.append("\t"); buffer.append(getColumnName(j)); } buffer.append("\n"); for (int i = 0; i < getRowCount(); i++) { buffer.append(getValueAt(i, 0)); for (int j = 1; j < getColumnCount(); j++) { buffer.append("\t"); buffer.append(getValueAt(i, j)); } buffer.append("\n"); } return buffer.toString(); } }// END: TaxaTableModel class }// END: class