package prefuse.data.tuple;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.event.SwingPropertyChangeSupport;
import prefuse.data.Schema;
import prefuse.data.Table;
import prefuse.data.Tuple;
import prefuse.data.event.EventConstants;
import prefuse.data.event.TupleSetListener;
import prefuse.data.expression.Expression;
import prefuse.data.expression.Predicate;
import prefuse.data.util.FilterIteratorFactory;
import prefuse.util.collections.CopyOnWriteArrayList;
/**
* Abstract base class for TupleSet implementations. Provides mechanisms for
* generating filtered tuple iterators, maintain listeners, and supporting
* bound client properties.
*
* @author jeffrey heer
*/
public abstract class AbstractTupleSet implements TupleSet {
/**
* @see prefuse.data.tuple.TupleSet#tuples(prefuse.data.expression.Predicate)
*/
public Iterator tuples(Predicate filter) {
if ( filter == null ) {
return tuples();
} else {
return FilterIteratorFactory.tuples(this, filter);
}
}
// -- TupleSet Methods ----------------------------------------------------
private CopyOnWriteArrayList m_tupleListeners;
/**
* @see prefuse.data.tuple.TupleSet#addTupleSetListener(prefuse.data.event.TupleSetListener)
*/
public void addTupleSetListener(TupleSetListener tsl) {
if ( m_tupleListeners == null )
m_tupleListeners = new CopyOnWriteArrayList();
if ( !m_tupleListeners.contains(tsl) )
m_tupleListeners.add(tsl);
}
/**
* @see prefuse.data.tuple.TupleSet#removeTupleSetListener(prefuse.data.event.TupleSetListener)
*/
public void removeTupleSetListener(TupleSetListener tsl) {
if ( m_tupleListeners != null ) {
m_tupleListeners.remove(tsl);
}
}
/**
* Fire a Tuple event.
* @param t the Table on which the event has occurred
* @param start the first row changed
* @param end the last row changed
* @param type the type of event, one of
* {@link prefuse.data.event.EventConstants#INSERT} or
* {@link prefuse.data.event.EventConstants#DELETE}.
*/
protected void fireTupleEvent(Table t, int start, int end, int type) {
if ( m_tupleListeners != null && m_tupleListeners.size() > 0 ) {
Object[] lstnrs = m_tupleListeners.getArray();
Tuple[] tuples = new Tuple[end-start+1];
for ( int i=0, r=start; r <= end; ++r, ++i ) {
tuples[i] = t.getTuple(r);
}
for ( int i=0; i 0 ) {
Object[] lstnrs = m_tupleListeners.getArray();
Tuple[] ts = new Tuple[] {t};
for ( int i=0; i 0 ) {
Object[] lstnrs = m_tupleListeners.getArray();
added = added==null ? EMPTY_ARRAY : added;
removed = removed==null ? EMPTY_ARRAY : removed;
for ( int i=0; i