private TableModelEvent translateEventForFilter(TableModelEvent event) {
			int rowCount = rowObjectFilterModel.getUnfilteredRowCount();
			if (rowCount == 0) {
				return event; // nothing to translate--no data
			}

			int firstRow = event.getFirstRow();
			int lastRow = event.getLastRow();

			if (firstRow == 0 && lastRow == Integer.MAX_VALUE) {
				// MAX_VALUE signals all rows (from TableModelEvent)--nothing to translate
				return event;
			}

			if (firstRow == 0 && lastRow == rowCount - 1) {
				firstRow = 0;
				lastRow = Math.max(0, rowObjectFilterModel.getRowCount() - 1);
			}
			else {
				// translate to the filtered view (from the wrapped model's full universe)
				firstRow = getViewRow(firstRow);
				lastRow = getViewRow(lastRow);
			}
			return new TableModelEvent(rowObjectFilterModel, firstRow, lastRow, event.getColumn(),
				event.getType());
		}
A listener to translate TableModelEvents from the <b>wrapped</b> model's indices to that
 of the view, which may be filtered.  This listener will make sure the indices are
 correct for the view and then broadcast the event to any listeners that have been added
 (including the Table itself).
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableFilterPanel.java