package data.swing;
import data.*;
import data.events.*;
import util.*;
import util.swing.*;
import java.util.*;
import java.io.*;
public class DataBasketTableModel extends AbstractTableModel implements DataBasketListener,
HelpableListener,
Serializable {
protected DataBasket m_dbBasket;
protected DataBasketCondition m_dbcCondition;
protected DataBasketEntryGrouper m_dbegGrouper;
protected Comparator m_cmpComparator = new SerializableComparator() {
public int compare (Object o1, Object o2) {
DataBasketEntry dbe1 = (DataBasketEntry) o1;
DataBasketEntry dbe2 = (DataBasketEntry) o2;
int nRet = dbe1.getMainKey().compareTo (dbe2.getMainKey());
if (nRet != 0) {
return nRet;
}
if ((dbe1.getSecondaryKey() instanceof Comparable) &&
(dbe2.getSecondaryKey() instanceof Comparable)) {
return ((Comparable) dbe1.getSecondaryKey()).compareTo (dbe2.getSecondaryKey());
}
return 0;
}
};
protected List m_lEntries;
public DataBasketTableModel (DataBasket db,
DataBasketCondition dbc,
DataBasketEntryGrouper dbeg,
Comparator cmp,
TableEntryDescriptor ted) {
super (ted);
m_dbBasket = db;
m_dbcCondition = dbc;
m_dbegGrouper = dbeg;
if (cmp != null) {
m_cmpComparator = cmp;
}
updateModel();
listenerList = new ListenerHelper (this);
}
public Object getRecord (int row) {
((ListenerHelper) listenerList).needModelUpdate();
if ((row > -1) && (row < getRowCount())) {
return m_lEntries.get (row);
}
else {
return null;
}
}
public int getRowCount() {
((ListenerHelper) listenerList).needModelUpdate();
return m_lEntries.size();
}
public void subscribe() {
if (m_dbBasket instanceof ListenableDataBasket) {
((ListenableDataBasket) m_dbBasket).addDataBasketListener (this);
}
}
public void unsubscribe() {
if (m_dbBasket instanceof ListenableDataBasket) {
((ListenableDataBasket) m_dbBasket).removeDataBasketListener (this);
}
}
public synchronized void updateModel() {
List lEntries = new LinkedList();
for (Iterator i = m_dbBasket.iterator (m_dbcCondition); i.hasNext();) {
lEntries.add (i.next());
}
List lGroupedEntries = null;
if (m_dbegGrouper != null) {
lGroupedEntries = new LinkedList();
while (true) {
Iterator i = lEntries.iterator();
if (i.hasNext()) {
DataBasketEntry dbeGrouped = (DataBasketEntry) i.next();
i.remove();
while (i.hasNext()) {
DataBasketEntry dbe2 = (DataBasketEntry) i.next();
if (m_dbegGrouper.canGroup (dbeGrouped, dbe2)) {
i.remove();
dbeGrouped = m_dbegGrouper.group (dbeGrouped, dbe2);
}
}
lGroupedEntries.add (dbeGrouped);
}
else {
break;
}
}
}
else {
lGroupedEntries = lEntries;
}
Collections.sort (lGroupedEntries, m_cmpComparator);
m_lEntries = lGroupedEntries;
}
public void addedDBE (DataBasketEvent e) {
updateModel();
fireTableDataChanged();
}
public void removedDBE (DataBasketEvent e) {
updateModel();
fireTableDataChanged();
}
public void dataBasketChanged (DataBasketEvent e) {
updateModel();
fireTableDataChanged();
}
}