package org.seqcode.viz.components;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.*;
import java.util.*;
public class ObjectTableModel<X> implements TableModel {
private Vector<X> objects;
private LinkedList<TableModelListener> listeners;
public ObjectTableModel() {
objects = new Vector<X>();
listeners = new LinkedList<TableModelListener>();
}
public void clear() {
if (objects.size() > 0) {
TableModelEvent evt =
new TableModelEvent(this, 0, objects.size()-1, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
objects.clear();
notifyListeners(evt);
}
}
public boolean contains(X o) {
return objects.contains(o);
}
public int indexOf(X o) { return objects.indexOf(o); }
public int getSize() { return objects.size(); }
public void addObject(X o) {
if (!contains(o)) {
objects.add(o);
sort();
TableModelEvent evt = new TableModelEvent(this, objects.size()-1, objects.size()-1, TableModelEvent.ALL_COLUMNS, TableModelEvent.INSERT);
notifyListeners(evt);
}
}
public X getObject(int i) {
return objects.get(i);
}
public Collection<X> getObjects() {
return (Collection<X>)objects.clone();
}
public void deleteObject(int i) {
objects.remove(i);
TableModelEvent evt = new TableModelEvent(this, i, i, TableModelEvent.ALL_COLUMNS, TableModelEvent.DELETE);
notifyListeners(evt);
}
private void notifyListeners(TableModelEvent evt) {
for(TableModelListener tml : listeners) {
tml.tableChanged(evt);
}
}
public void addTableModelListener(TableModelListener arg0) {
listeners.addLast(arg0);
}
public int getColumnCount() {
return 1;
}
public Class getColumnClass(int i) {
if(i==0) { return String.class; }
return null;
}
public String getColumnName(int i) {
if(i==0) { return "Name";}
return null;
}
public int getRowCount() {
return objects.size();
}
public Object getValueAt(int rowIndex, int c) {
if(c==0) { return objects.get(rowIndex).toString(); }
return null;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
throw new UnsupportedOperationException();
}
public void sortByColumn(int index) {
Collections.sort(objects,new OTMColumnComparator(this,objects,index));
}
public void sort() {
}
public void sort(Comparator<X> comparator) {
Collections.sort(objects,comparator);
}
}
class OTMColumnComparator implements Comparator {
private int col;
private TableModel model;
private Vector vector;
public OTMColumnComparator(TableModel tm, Vector v, int c) {
col = c;
model = tm;
vector = v;
}
public int compare(Object first, Object second) {
int listposfirst = vector.indexOf(first);
int listpossecond = vector.indexOf(second);
if (listposfirst == -1 || listpossecond == -1) {
return 0;
}
first = model.getValueAt(listposfirst,col);
second = model.getValueAt(listpossecond,col);
if (first instanceof Comparable) {
return ((Comparable)first).compareTo(second);
} else {
return 0;
}
}
}