in src/main/java/org/apache/log4j/chainsaw/LogPanel.java [3142:3225]
public void receiveChainsawEventBatch(List<ChainsawLoggingEvent> events){
SwingHelper.invokeOnEDT(() -> {
/*
* if this panel is paused, we totally ignore events
*/
if (isPaused()) {
return;
}
final int selectedRow = table.getSelectedRow();
final int startingRow = table.getRowCount();
final LoggingEventWrapper selectedEvent;
if (selectedRow >= 0) {
selectedEvent = tableModel.getRow(selectedRow);
} else {
selectedEvent = null;
}
final int startingSearchRow = searchTable.getRowCount();
boolean rowAdded = false;
boolean searchRowAdded = false;
int addedRowCount = 0;
int searchAddedRowCount = 0;
for (ChainsawLoggingEvent event1 : events) {
//create two separate loggingEventWrappers (main table and search table), as they have different info on display state
LoggingEventWrapper loggingEventWrapper1 = new LoggingEventWrapper(event1);
//if the clearTableExpressionRule is not null, evaluate & clear the table if it matches
if (clearTableExpressionRule != null && clearTableExpressionRule.evaluate(event1, null)) {
logger.info("clear table expression matched - clearing table - matching event msg - " + event1.m_message);
clearEvents();
}
updateOtherModels(event1);
boolean isCurrentRowAdded = tableModel.isAddRow(loggingEventWrapper1);
if (isCurrentRowAdded) {
addedRowCount++;
}
rowAdded = rowAdded || isCurrentRowAdded;
//create a new loggingEventWrapper via copy constructor to ensure same IDs
LoggingEventWrapper loggingEventWrapper2 = new LoggingEventWrapper(loggingEventWrapper1);
boolean isSearchCurrentRowAdded = searchModel.isAddRow(loggingEventWrapper2);
if (isSearchCurrentRowAdded) {
searchAddedRowCount++;
}
searchRowAdded = searchRowAdded || isSearchCurrentRowAdded;
}
//fire after adding all events
if (rowAdded) {
tableModel.fireTableEvent(startingRow, startingRow + addedRowCount, addedRowCount);
}
if (searchRowAdded) {
searchModel.fireTableEvent(startingSearchRow, startingSearchRow + searchAddedRowCount, searchAddedRowCount);
}
//tell the model to notify the count listeners
tableModel.notifyCountListeners();
if (rowAdded) {
if (tableModel.isSortEnabled()) {
tableModel.sort();
}
//always update detail pane (since we may be using a cyclic buffer which is full)
detailPaneUpdater.setSelectedRow(table.getSelectedRow());
}
if (searchRowAdded) {
if (searchModel.isSortEnabled()) {
searchModel.sort();
}
}
if (!isScrollToBottom() && selectedEvent != null) {
final int newIndex = tableModel.getRowIndex(selectedEvent);
if (newIndex >= 0) {
// Don't scroll, just maintain selection...
table.setRowSelectionInterval(newIndex, newIndex);
}
}
});
}