package dr.app.tracer.traces;
import dr.inference.trace.TraceAnalysis;
import jam.framework.Exportable;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import java.awt.*;
/**
* A panel that displays correlation plots of 2 traces in integer and category type
*
* @author Andrew Rambaut
* @author Alexei Drummond
* @author Walter Xie
* @version $Id: TableScrollPane.java,v 1.1.1.2 2006/04/25 23:00:09 rambaut Exp $
*/
public class TableScrollPane extends JScrollPane implements Exportable {
Object[] rowNames;
Object[] columnNames;
double[][] data;
ListModel lm = new RowHeaderModel();
DataTableModel dataTableModel = new DataTableModel();
JTable dataTable = new JTable(dataTableModel);
private boolean defaultNumberFormat = true;
public TableScrollPane() {
super();
setViewportView(dataTable);
setOpaque(false);
}
public void setTable(Object[] rowNames, Object[] columnNames, double[][] data, boolean defaultNumberFormat) {
this.rowNames = rowNames;
this.columnNames = columnNames;
this.data = data;
this.defaultNumberFormat = defaultNumberFormat;
dataTableModel = new DataTableModel();
dataTable = new JTable(dataTableModel);
setViewportView(dataTable);
lm = new RowHeaderModel();
JList rowHeader = new JList(lm);
rowHeader.setFixedCellWidth(50);
rowHeader.setFixedCellHeight(dataTable.getRowHeight() + dataTable.getRowMargin());
// + table.getIntercellSpacing().height);
rowHeader.setCellRenderer(new RowHeaderRenderer(dataTable));
setRowHeaderView(rowHeader);
// removeAll();
dataTableModel.fireTableDataChanged();
validate();
repaint();
}
public JComponent getExportableComponent() {
return this;
}
class RowHeaderModel extends AbstractListModel {
public int getSize() {
if (rowNames == null) return 0;
return rowNames.length;
}
public Object getElementAt(int index) {
return rowNames[index];
}
}
class RowHeaderRenderer extends JLabel implements ListCellRenderer {
RowHeaderRenderer(JTable table) {
JTableHeader header = table.getTableHeader();
setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
setHorizontalAlignment(CENTER);
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
setText((value == null) ? "" : value.toString());
return this;
}
}
class DataTableModel extends DefaultTableModel {
// public DataTableModel(int rowCount, int columnCount) {
// super(rowCount, columnCount);
// }
public DataTableModel() {
}
public int getColumnCount() {
if (columnNames == null) return 0;
return columnNames.length;
}
public int getRowCount() {
if (lm == null) {
return 0;
}
return lm.getSize();
}
public Object getValueAt(int row, int col) {
if (defaultNumberFormat) {
return TraceAnalysis.formattedNumber(data[row][col]);
}
return data[row][col];
}
public boolean isCellEditable(int row, int col) {
return false;
}
public String getColumnName(int column) {
return columnNames[column].toString();
}
// public Class getColumnClass(int c) {
// if (getRowCount() == 0) {
// return Object.class;
// }
// 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();
// }
}
}