@Override
	protected void sort(List<ROW_OBJECT> data,
			TableSortingContext<ROW_OBJECT> tableSortingContext) {
		if (data.isEmpty() && !updateManager.isBusy()) {
			// Unusual Code Alert!:
			// Empty data implies we may have been cancelled before any data was loaded.  Therefore,
			// we must trigger a new load of data before we can sort.  Loading data will trigger a
			// sort, and we want to use the new sorting data we've just been given.  By calling
			// sortCompleted() here, we are making sure that the follow-on sort will use this
			// new sort data.
			sortCompleted(tableSortingContext);
			updateManager.reload();
			return;
		}

		pendingSortContext = tableSortingContext;
		updateManager.sort(tableSortingContext, false);
	}
Returns the row object at the given index in the <b>unfiltered data</b> of this model;
null if the index is negative or larger than the list.  To search only for object
that are visible in the GUI, use {@link #getRowObject(int)}.

@param row The row index for which to get a row object
@return Returns the row object at the given index in the <b>unfiltered data</b> of this model;
        null if the index is negative or larger than the list.
@see #getRowObject(int)
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModel.java