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