/* Glazed Lists (c) 2003-2008 */
/* http://publicobject.com/glazedlists/ publicobject.com,*/
/* O'Dell Engineering Ltd.*/
package org.limewire.ui.swing.table;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.event.ListEvent;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.DefaultEventTableModel;
import javax.swing.event.TableModelEvent;
/**
* An extension of the {@link EventTableModel} for better integration with
* JXTable.
* <p>
* In particular, this table model implements a different strategy to tranform
* {@link ListEvent}s to {@link TableModelEvent}s. Whereas EventTableModel
* converts each ListEvent block to a TableModelEvent, EventJXTableModel tries
* to create only one TableModelEvent for a ListEvent, that does not represent a
* reorder. If the ListEvent contains multiple blocks, a special
* <em>data changed</em> TableModelEvent will be fired, indicating that all
* row data has changed. Note, that such a <em>data changed</em> TableModelEvent
* can lead to a loss of the table selection.
* </p>
*
* @author Holger Brands
*/
public class DefaultEventJXTableModel<E> extends DefaultEventTableModel<E> {
/**
* {@inheritDoc}
*/
public DefaultEventJXTableModel(EventList<E> source, TableFormat<? super E> tableFormat) {
super(source, tableFormat);
}
/**
* {@inheritDoc}
*/
@Override
protected void handleListChange(ListEvent<E> listChanges) {
if (listChanges.isReordering()) {
super.handleListChange(listChanges);
} else {
fireOneTableModelEvent(listChanges);
}
}
/**
* Ensures that only one TableModelEvent is created and fired for the given ListEvent.
*/
private void fireOneTableModelEvent(ListEvent<E> listChanges) {
// build an "optimized" TableModelEvent describing the precise range of rows in the first block
listChanges.nextBlock();
final int startIndex = listChanges.getBlockStartIndex();
final int endIndex = listChanges.getBlockEndIndex();
final int changeType = listChanges.getType();
getMutableTableModelEvent().setValues(startIndex, endIndex, changeType);
// if another block exists, fallback to using a generic "data changed" TableModelEvent
if (listChanges.nextBlock())
getMutableTableModelEvent().setAllDataChanged();
// fire the single TableModelEvent representing the entire ListEvent
fireTableChanged(getMutableTableModelEvent());
}
}