/* * TaxonListTable.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.gui.table; import dr.evolution.util.*; import jam.table.*; import javax.swing.*; import javax.swing.table.AbstractTableModel; import java.awt.*; import java.util.Iterator; import java.util.TreeSet; public class TaxonListTable extends JTable implements MutableTaxonListListener { /** * */ private static final long serialVersionUID = -5706027520036473157L; final static String TAXON_NAME = "Taxon"; TaxaTableModel taxaTableModel = null; TaxonList taxonList = null; public TaxonListTable(TaxonList taxonList) { this.taxonList = taxonList; if (taxonList instanceof MutableTaxonList) { ((MutableTaxonList)taxonList).addMutableTaxonListListener(this); } String[] names = getColumnNames(); // Create a model of the data. taxaTableModel = new TaxaTableModel(names, taxonList); // Create the table //JTable tableView = new JTable(dataModel); TableSorter sorter = new TableSorter(taxaTableModel); //ADDED THIS setModel(sorter); sorter.addTableModelListener(this); //ADDED THIS // Turn off auto-resizing so that we can set column sizes programmatically. // In this mode, all columns will get their preferred widths, as set below. setAutoResizeMode(JTable.AUTO_RESIZE_OFF); setColumnSelectionAllowed(true); // Set the widths of the columns. getColumn(TAXON_NAME).setPreferredWidth(120); for (int i = 0; i < getColumnCount(); i++) { getColumnModel().getColumn(i).setCellRenderer( new TableRenderer(true, SwingConstants.LEFT, new Insets(0, 4, 0, 0))); } setDefaultEditor(dr.evolution.util.Date.class, new DateCellEditor()); } public void updateColumns() { taxaTableModel.setColumnNames(getColumnNames()); } private String[] getColumnNames() { TreeSet attributes = new TreeSet(); for (int i = 0; i < taxonList.getTaxonCount(); i++) { Taxon taxon = taxonList.getTaxon(i); Iterator iter = taxon.getAttributeNames(); while (iter.hasNext()) { Object attribute = iter.next(); attributes.add(attribute); } } String[] names = new String[attributes.size() + 1]; names[0] = "Taxon"; Iterator iter = attributes.iterator(); int i = 1; while (iter.hasNext()) { names[i] = iter.next().toString(); i++; } return names; } //******************************************************************** // MutableTaxonListListener interface //******************************************************************** public void taxonAdded(TaxonList taxonList, Taxon taxon) { taxaTableModel.fireTableDataChanged(); } public void taxonRemoved(TaxonList taxonList, Taxon taxon) { taxaTableModel.fireTableDataChanged(); } public void taxaChanged(TaxonList taxonList) { updateColumns(); } //************************************************************************ // TableModel inner class //************************************************************************ class TaxaTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 367162013042095775L; String[] names = null; TaxonList taxonList; public TaxaTableModel(String[] names, TaxonList taxonList) { this.names = names; this.taxonList = taxonList; } public void setColumnNames(String[] names) { this.names = names; fireTableStructureChanged(); } // These methods always need to be implemented. public int getColumnCount() { return names.length; } public int getRowCount() { return taxonList.getTaxonCount();} public Object getValueAt(int row, int column) { if (column == 0) { return taxonList.getTaxon(row).getId(); } else { return taxonList.getTaxonAttribute(row, names[column]); } } // The default implementations of these methods in // AbstractTableModel would work, but we can refine them. public String getColumnName(int column) {return names[column];} public Class getColumnClass(int c) {return getValueAt(0, c).getClass();} public boolean isCellEditable(int row, int column) { if (taxonList instanceof MutableTaxonList) { if (column == 0) return true; Object item = taxonList.getTaxonAttribute(row, names[column]); if (item instanceof String) return true; if (item instanceof dr.evolution.util.Date) return true; } return false; } public void setValueAt(Object aValue, int row, int column) { if (taxonList instanceof MutableTaxonList) { if (column == 0) { ((MutableTaxonList)taxonList).setTaxonId(row, (String)aValue); } else { ((MutableTaxonList)taxonList).setTaxonAttribute(row, names[column], aValue); } } } } }