in src/main/java/org/apache/log4j/chainsaw/ChainsawCyclicBufferTableModel.java [130:190]
public void reFilter() {
final int previousSize;
final int newSize;
synchronized (mutex) {
//post refilter with newValue of TRUE (filtering is about to begin)
propertySupport.firePropertyChange("refilter", Boolean.FALSE, Boolean.TRUE);
previousSize = filteredList.size();
filteredList.clear();
if (ruleMediator == null) {
LoggingEventWrapper lastEvent = null;
for (Object anUnfilteredList : unfilteredList) {
LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) anUnfilteredList;
loggingEventWrapper.setDisplayed(true);
updateEventMillisDelta(loggingEventWrapper, lastEvent);
filteredList.add(loggingEventWrapper);
lastEvent = loggingEventWrapper;
}
} else {
Iterator iter = unfilteredList.iterator();
LoggingEventWrapper lastEvent = null;
while (iter.hasNext()) {
LoggingEventWrapper loggingEventWrapper = (LoggingEventWrapper) iter.next();
if (ruleMediator.evaluate(loggingEventWrapper.getLoggingEvent(), null)) {
loggingEventWrapper.setDisplayed(true);
filteredList.add(loggingEventWrapper);
updateEventMillisDelta(loggingEventWrapper, lastEvent);
lastEvent = loggingEventWrapper;
} else {
loggingEventWrapper.setDisplayed(false);
}
}
}
newSize = filteredList.size();
}
SwingHelper.invokeOnEDT(() -> {
if (newSize > 0) {
if (previousSize == newSize) {
//same - update all
fireTableRowsUpdated(0, newSize - 1);
} else if (previousSize > newSize) {
//less now..update and delete difference
fireTableRowsUpdated(0, newSize - 1);
//swing bug exposed by variable height rows when calling fireTableRowsDeleted..use tabledatacchanged
fireTableDataChanged();
} else if (previousSize < newSize) {
//more now..update and insert difference
if (previousSize > 0) {
fireTableRowsUpdated(0, previousSize - 1);
}
fireTableRowsInserted(Math.max(0, previousSize), newSize - 1);
}
} else {
//no rows to show
fireTableDataChanged();
}
notifyCountListeners();
//post refilter with newValue of FALSE (filtering is complete)
SwingHelper.invokeOnEDT(() -> propertySupport.firePropertyChange("refilter", Boolean.TRUE, Boolean.FALSE));
});
}