Class ThreadedTableModel<ROW_OBJECT,DATA_SOURCE>
- java.lang.Object
- 
- javax.swing.table.AbstractTableModel
- 
- docking.widgets.table.AbstractGTableModel<T>
- 
- docking.widgets.table.AbstractSortedTableModel<ROW_TYPE>
- 
- docking.widgets.table.GDynamicColumnTableModel<ROW_OBJECT,DATA_SOURCE>
- 
- docking.widgets.table.threaded.ThreadedTableModel<ROW_OBJECT,DATA_SOURCE>
 
 
 
 
 
- 
- Type Parameters:
- ROW_OBJECT- the row object class for this table model.
- DATA_SOURCE- the type of data that will be returned from- GDynamicColumnTableModel.getDataSource(). This object will be given to the- DynamicTableColumnobjects used by this table model when- DynamicTableColumn.getValue(Object, ghidra.docking.settings.Settings, Object, ServiceProvider)is called.
 - All Implemented Interfaces:
- ConfigurableColumnTableModel,- DynamicColumnTableModel<ROW_OBJECT>,- RowObjectFilterModel<ROW_OBJECT>,- RowObjectTableModel<ROW_OBJECT>,- SelectionStorage<ROW_OBJECT>,- SortedTableModel,- VariableColumnTableModel,- java.io.Serializable,- java.util.EventListener,- javax.swing.event.ChangeListener,- javax.swing.table.TableModel
 - Direct Known Subclasses:
- GhidraProgramTableModel,- ProjectDataTableModel,- ThreadedTableModelStub
 
 public abstract class ThreadedTableModel<ROW_OBJECT,DATA_SOURCE> extends GDynamicColumnTableModel<ROW_OBJECT,DATA_SOURCE> implements RowObjectFilterModel<ROW_OBJECT> The base implementation of the threaded table model.You can optionally set this model to load data incrementally by passing the correct constructor argument. Note, if you make this model incremental, then you need to set an incremental task monitor in order to get feedback about loading (see setIncrementalTaskMonitor(TaskMonitor). Alternatively, you can use aGThreadedTablePanel, which will install the proper monitor for you.- See Also:
- Serialized Form
 
- 
- 
Nested Class SummaryNested Classes Modifier and Type Class Description protected classThreadedTableModel.IncrementalLoadJobListenerA special internal listener for the model to know when incremental jobs begin and end.
 - 
Field SummaryFields Modifier and Type Field Description protected TableData<ROW_OBJECT>allDataprotected TableData<ROW_OBJECT>filteredData- 
Fields inherited from class docking.widgets.table.GDynamicColumnTableModelcolumnSettings, serviceProvider, tableColumns
 - 
Fields inherited from class docking.widgets.table.AbstractSortedTableModelhasEverSorted
 - 
Fields inherited from class docking.widgets.table.AbstractGTableModelWIDTH_UNDEFINED
 - 
Fields inherited from interface docking.widgets.table.RowObjectFilterModelSUB_FILTERING_DISABLED_PROPERTY
 - 
Fields inherited from interface docking.widgets.table.SortedTableModelASCENDING_ORDER, DESCENDING_ORDER
 
- 
 - 
Constructor SummaryConstructors Modifier Constructor Description protectedThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider)protectedThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider, TaskMonitor monitor)protectedThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider, TaskMonitor monitor, boolean loadIncrementally)The constructor through which all others pass.
 - 
Method SummaryAll Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidaddInitialLoadListener(ThreadedTableModelListener listener)Adds a listener that will be notified of the first table load of this model.voidaddObject(ROW_OBJECT obj)Adds the specified object to this model and schedules an update.voidaddThreadedTableModelListener(ThreadedTableModelListener listener)This is a way to know about updates from the table.voidcancelAllUpdates()Cancels all current and pending updates to the model.protected voidclearData()This method will clear all data and trigger fire a table data changed.protected IncrementalLoadJob<ROW_OBJECT>createIncrementalLoadJob()protected java.util.Comparator<ROW_OBJECT>createSortComparator(int columnIndex)An extension point for subclasses to insert their own comparator objects for their data.voiddispose()Disposes this model.protected java.util.List<ROW_OBJECT>doFilter(java.util.List<ROW_OBJECT> data, TableSortingContext<ROW_OBJECT> lastSortingContext, TaskMonitor monitor)Override this to change how filtering is performed.protected abstract voiddoLoad(Accumulator<ROW_OBJECT> accumulator, TaskMonitor monitor)The basic method that all children must implement.voidfireTableChanged(javax.swing.event.TableModelEvent e)protected java.util.List<ROW_OBJECT>getAllData()java.util.List<ROW_OBJECT>getModelData()Implementors should return the current data of the model.intgetModelIndex(ROW_OBJECT t)Returns the model index of the given item.intgetModelRow(int viewRow)Given a row index for the view (filtered) model, return the corresponding index in the raw (unfiltered) model.java.lang.StringgetName()Returns the name of this model.intgetRowCount()java.util.List<ROW_OBJECT>getRowObjects(int[] rows)Returns the corresponding row objects for the specified rows.protected java.lang.Class<?>getSortedColumnClass(int columnIndex)TableFilter<ROW_OBJECT>getTableFilter()Returns the filter for this model.java.util.List<ROW_OBJECT>getUnfilteredData()protected intgetUnfilteredIndexForRowObject(ROW_OBJECT rowObject)Performs a quick search for the given item in the unfiltered data of this model.intgetUnfilteredRowCount()protected ROW_OBJECTgetUnfilteredRowObjectForIndex(int row)Returns the row object at the given index in the unfiltered data of this model; null if the index is negative or larger than the list.java.lang.ObjectgetValueAt(int rowIndex, int columnIndex)The default implementation ofTableModel.getValueAt(int, int)that calls the abstractRowObjectTableModel.getColumnValueForRow(Object, int).intgetViewIndex(ROW_OBJECT t)Returns the view index of the given item.intgetViewRow(int modelRow)Given a row index for the raw (unfiltered) model, return the corresponding index in the view (filtered) model.booleanhasFitler()Returns true if there is a table filter set that is not theNullTableFilter.protected voidinitializeSorting()This method is an attempt to help models that forget to call fireTableDataChanged().booleanisBusy()Returns true if the model is busy.booleanisFiltered()booleanisLoadIncrementally()voidreFilter()Triggers this class to filter the contents of the data.voidreload()Schedules the model to completely reload its underlying data.voidremoveObject(ROW_OBJECT obj)Removes the specified object from this model and schedules an update.voidremoveThreadedTableModelListener(ThreadedTableModelListener listener)voidreSort()Resort the table using the current sort criteria.voidsetIncrementalTaskMonitor(TaskMonitor monitor)protected voidsetModelState(TableData<ROW_OBJECT> allData, TableData<ROW_OBJECT> filteredData)voidsetTableFilter(TableFilter<ROW_OBJECT> tableFitler)Sets the given TableFitler on this model.protected voidsort(java.util.List<ROW_OBJECT> data, TableSortingContext<ROW_OBJECT> tableSortingContext)A default sort method that uses theCollections.sort(List, Comparator)method for sorting.protected voidupdateNow()voidupdateObject(ROW_OBJECT obj)Schedules an update for the specified object.- 
Methods inherited from class docking.widgets.table.GDynamicColumnTableModeladdTableColumn, addTableColumn, addTableColumns, createSortComparatorForColumn, createTableColumnDescriptor, getColumn, getColumnClass, getColumnCount, getColumnDescription, getColumnDisplayName, getColumnIndex, getColumnIndex, getColumnName, getColumnSettings, getColumnSettingsDefinitions, getColumnValueForRow, getDataSource, getDefaultColumnCount, getMaxLines, getPreferredColumnWidth, getRenderer, getUniqueIdentifier, isDefaultColumn, isSortable, isVisibleByDefault, loadDiscoveredTableColumns, removeTableColumn, removeTableColumns, setAllColumnSettings, setColumnSettings, stateChanged
 - 
Methods inherited from class docking.widgets.table.AbstractSortedTableModeladdSortListener, createSortingContext, getIndexForRowObject, getIndexForRowObject, getPendingSortState, getPrimarySortColumnIndex, getRowIndex, getRowObject, getTableSortState, isSorted, isSortPending, notifyModelSorted, setDefaultTableSortState, setTableSortState, sortCompleted
 - 
Methods inherited from class docking.widgets.table.AbstractGTableModelgetLastSelectedObjects, refresh, setLastSelectedObjects
 - 
Methods inherited from class javax.swing.table.AbstractTableModeladdTableModelListener, findColumn, fireTableCellUpdated, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, isCellEditable, removeTableModelListener, setValueAt
 - 
Methods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 - 
Methods inherited from interface docking.widgets.table.RowObjectTableModelfireTableDataChanged, getColumnValueForRow, getRowIndex, getRowObject
 
- 
 
- 
- 
- 
Field Detail- 
allDataprotected TableData<ROW_OBJECT> allData 
 - 
filteredDataprotected TableData<ROW_OBJECT> filteredData 
 
- 
 - 
Constructor Detail- 
ThreadedTableModelprotected ThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider)
 - 
ThreadedTableModelprotected ThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider, TaskMonitor monitor)
 - 
ThreadedTableModelprotected ThreadedTableModel(java.lang.String modelName, ServiceProvider serviceProvider, TaskMonitor monitor, boolean loadIncrementally)The constructor through which all others pass.This class must be created on the Swing Thread (see SwingUtilities.isEventDispatchThread()).- Parameters:
- modelName- The name of the table model. This value will appear as the name of the thread that manipulates the table data.
- serviceProvider- The service provider of the environment. This will be used to allow column objects to have access to services. This man not be null.
- monitor- The task monitor to use when manipulating table data (i.e., loading, sorting, filtering).
- loadIncrementally- When true, the table's results will be displayed as they are loaded; when false, the table's results will be displayed after all items have been loaded. Passing true is helpful for models that take a long time to run and periodically find data. Alternatively, for quick loading tables, the overhead of loading incrementally is wasteful.
 
 
- 
 - 
Method Detail- 
isLoadIncrementallypublic boolean isLoadIncrementally() 
 - 
initializeSortingprotected void initializeSorting() Description copied from class:AbstractSortedTableModelThis method is an attempt to help models that forget to call fireTableDataChanged(). It is expected that tables will fire the notification when they are ready to display data, even if they have that data at construction time. We put this call here so that the forgetful subclasses will have their data sorted for them the first time that this table tries to render itself.- Overrides:
- initializeSortingin class- AbstractSortedTableModel<ROW_OBJECT>
 
 - 
createIncrementalLoadJobprotected IncrementalLoadJob<ROW_OBJECT> createIncrementalLoadJob() 
 - 
doLoadprotected abstract void doLoad(Accumulator<ROW_OBJECT> accumulator, TaskMonitor monitor) throws CancelledException The basic method that all children must implement. This is where children load their data.- Parameters:
- accumulator- the datastructure into which you should incrementally place you table row data
- monitor- the task monitor to check for cancellations and to update progress
- Throws:
- CancelledException- if the task monitor has been cancelled and a call is made to- monitor.checkCancelled();.
 
 - 
getModelDatapublic java.util.List<ROW_OBJECT> getModelData() Description copied from interface:RowObjectTableModelImplementors should return the current data of the model. For models that support filtering, this will be the filtered version of the data. Furthermore, the data should be the underlying data and not a copy, as this method will potentially sort the given data.For those subclasses using an array, you may use the Arrays class to create a list backed by the array ( Arrays.asList(Object...)).- Specified by:
- getModelDatain interface- RowObjectTableModel<ROW_OBJECT>
- Returns:
- the model data.
 
 - 
getUnfilteredDatapublic java.util.List<ROW_OBJECT> getUnfilteredData() - Specified by:
- getUnfilteredDatain interface- RowObjectFilterModel<ROW_OBJECT>
 
 - 
getUnfilteredIndexForRowObjectprotected int getUnfilteredIndexForRowObject(ROW_OBJECT rowObject) Performs a quick search for the given item in the unfiltered data of this model. To search only for object that are visible in the GUI, useAbstractSortedTableModel.getIndexForRowObject(Object).- Parameters:
- rowObject- The object for which to search
- Returns:
- The index for the given object; a negative value if the object is not in the list
- See Also:
- AbstractSortedTableModel.getIndexForRowObject(Object)
 
 - 
getUnfilteredRowObjectForIndexprotected ROW_OBJECT getUnfilteredRowObjectForIndex(int row) Returns the row object at the given index in the unfiltered data 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, useAbstractSortedTableModel.getRowObject(int).- Parameters:
- row- The row index for which to get a row object
- Returns:
- Returns the row object at the given index in the unfiltered data of this model; null if the index is negative or larger than the list.
- See Also:
- AbstractSortedTableModel.getRowObject(int)
 
 - 
createSortComparatorprotected java.util.Comparator<ROW_OBJECT> createSortComparator(int columnIndex) Description copied from class:AbstractSortedTableModelAn extension point for subclasses to insert their own comparator objects for their data. Subclasses can create comparators for a single or multiple columns, as desired.- Overrides:
- createSortComparatorin class- GDynamicColumnTableModel<ROW_OBJECT,DATA_SOURCE>
- Parameters:
- columnIndex- the column index
- Returns:
- the comparator
 
 - 
getValueAtpublic java.lang.Object getValueAt(int rowIndex, int columnIndex)Description copied from class:AbstractSortedTableModelThe default implementation ofTableModel.getValueAt(int, int)that calls the abstractRowObjectTableModel.getColumnValueForRow(Object, int).- Specified by:
- getValueAtin interface- javax.swing.table.TableModel
- Overrides:
- getValueAtin class- AbstractSortedTableModel<ROW_OBJECT>
 
 - 
sortprotected void sort(java.util.List<ROW_OBJECT> data, TableSortingContext<ROW_OBJECT> tableSortingContext) Description copied from class:AbstractSortedTableModelA default sort method that uses theCollections.sort(List, Comparator)method for sorting. Implementors with reasonably sized data sets can rely on this method. For data sets that can become large, the ThreadedTableModel is the recommended base class, as it handles loading/sorting/filtering in a threaded way.- Overrides:
- sortin class- AbstractSortedTableModel<ROW_OBJECT>
- Parameters:
- data- The data to be sorted
- tableSortingContext- The context required to sort (it contains the sorting columns, a comparator for sorting, etc...).
 
 - 
getTableFilterpublic TableFilter<ROW_OBJECT> getTableFilter() Returns the filter for this model. The value returned from this method will not be null, but will instead be an instanceofNullTableFilterwhen no filter is applied. The value returned from this method may not actually yet be applied, depending upon when the background thread finishes loading.- Specified by:
- getTableFilterin interface- RowObjectFilterModel<ROW_OBJECT>
- Returns:
- the filter
 
 - 
hasFitlerpublic boolean hasFitler() Returns true if there is a table filter set that is not theNullTableFilter.- Returns:
- true if there is a table filter set.
 
 - 
doFilterprotected java.util.List<ROW_OBJECT> doFilter(java.util.List<ROW_OBJECT> data, TableSortingContext<ROW_OBJECT> lastSortingContext, TaskMonitor monitor) throws CancelledException Override this to change how filtering is performed. This implementation will do nothing if a TableFilter has not been set via a call tosetTableFilter(TableFilter).- Parameters:
- data- The list of data to be filtered.
- monitor- the progress monitor to check for cancellation.
- lastSortingContext- the comparator used to sort data. This can be used by overridden filter methods that need to query data about how the table is sorted.
- Returns:
- The new filtered list of data. If no filtering takes place, then the original list should be returned.
- Throws:
- CancelledException- If the filter operation is cancelled.
 
 - 
getUnfilteredRowCountpublic int getUnfilteredRowCount() - Specified by:
- getUnfilteredRowCountin interface- RowObjectFilterModel<ROW_OBJECT>
 
 - 
isFilteredpublic boolean isFiltered() - Specified by:
- isFilteredin interface- RowObjectFilterModel<ROW_OBJECT>
 
 - 
setTableFilterpublic void setTableFilter(TableFilter<ROW_OBJECT> tableFitler) Sets the given TableFitler on this model. This table filter will then be used by this model in the defaultdoFilter(List, TableSortingContext, TaskMonitor)method.- Specified by:
- setTableFilterin interface- RowObjectFilterModel<ROW_OBJECT>
- Parameters:
- tableFitler- The filter to use for table filtering.
 
 - 
updateObjectpublic void updateObject(ROW_OBJECT obj) Schedules an update for the specified object.- Parameters:
- obj- the object for which to schedule the update
 
 - 
addObjectpublic void addObject(ROW_OBJECT obj) Adds the specified object to this model and schedules an update.- Parameters:
- obj- the object to add
 
 - 
removeObjectpublic void removeObject(ROW_OBJECT obj) Removes the specified object from this model and schedules an update.- Parameters:
- obj- the object to remove
 
 - 
updateNowprotected void updateNow() 
 - 
setModelStateprotected void setModelState(TableData<ROW_OBJECT> allData, TableData<ROW_OBJECT> filteredData) 
 - 
getAllDataprotected java.util.List<ROW_OBJECT> getAllData() 
 - 
isBusypublic boolean isBusy() Returns true if the model is busy. "Busy" means the model is either loading or updating.- Returns:
- true if the model is busy
 
 - 
reSortpublic void reSort() Resort the table using the current sort criteria. This is useful if the data in the table has changed and is no longer sorted properly. If the setSort method is used, nothing will happen because the table will think it is already sorted on that criteria.- Overrides:
- reSortin class- AbstractSortedTableModel<ROW_OBJECT>
 
 - 
reFilterpublic void reFilter() Triggers this class to filter the contents of the data.
 - 
reloadpublic void reload() Schedules the model to completely reload its underlying data.
 - 
fireTableChangedpublic void fireTableChanged(javax.swing.event.TableModelEvent e) - Overrides:
- fireTableChangedin class- AbstractSortedTableModel<ROW_OBJECT>
- See Also:
- AbstractTableModel.fireTableChanged(javax.swing.event.TableModelEvent)
 
 - 
disposepublic void dispose() Disposes this model. Once a model has been disposed, it cannot be reused.- Overrides:
- disposein class- AbstractGTableModel<ROW_OBJECT>
 
 - 
clearDataprotected void clearData() This method will clear all data and trigger fire a table data changed. Use this method to immediately clear all data. This is useful when you want to reload your table data and not have any old data hanging around being painted, which can produce odd results.
 - 
cancelAllUpdatespublic void cancelAllUpdates() Cancels all current and pending updates to the model. Waits until all updates have been cancelled.
 - 
getRowCountpublic int getRowCount() - Specified by:
- getRowCountin interface- javax.swing.table.TableModel
- Overrides:
- getRowCountin class- AbstractGTableModel<ROW_OBJECT>
- See Also:
- TableModel.getRowCount()
 
 - 
getViewRowpublic int getViewRow(int modelRow) Given a row index for the raw (unfiltered) model, return the corresponding index in the view (filtered) model.- Specified by:
- getViewRowin interface- RowObjectFilterModel<ROW_OBJECT>
- Parameters:
- modelRow- The row index that corresponds to unfiltered data
- Returns:
- the index of that row in the filtered data
- See Also:
- getModelRow(int)
 
 - 
getModelRowpublic int getModelRow(int viewRow) Given a row index for the view (filtered) model, return the corresponding index in the raw (unfiltered) model.- Specified by:
- getModelRowin interface- RowObjectFilterModel<ROW_OBJECT>
- Parameters:
- viewRow- The row index that corresponds to filtered data
- Returns:
- the index of that row in the unfiltered data
- See Also:
- getViewRow(int)
 
 - 
getViewIndexpublic int getViewIndex(ROW_OBJECT t) Description copied from interface:RowObjectFilterModelReturns the view index of the given item. When filtered, this is the index is the smaller, visible set of data; when unfiltered, this index is the same as that returned byRowObjectFilterModel.getModelIndex(Object).This operation will be O(n) unless the implementation is sorted, in which case the operation is O(log n), as it uses a binary search. - Specified by:
- getViewIndexin interface- RowObjectFilterModel<ROW_OBJECT>
- Parameters:
- t- the item
- Returns:
- the view index
 
 - 
getModelIndexpublic int getModelIndex(ROW_OBJECT t) Description copied from interface:RowObjectFilterModelReturns the model index of the given item. When filtered, this is the index is the larger, set of data; when unfiltered, this index is the same as that returned byRowObjectFilterModel.getModelIndex(Object).This operation will be O(n) unless the implementation is sorted, in which case the operation is O(log n), as it uses a binary search. - Specified by:
- getModelIndexin interface- RowObjectFilterModel<ROW_OBJECT>
- Parameters:
- t- the item
- Returns:
- the model index
 
 - 
getNamepublic java.lang.String getName() Returns the name of this model.- Specified by:
- getNamein interface- RowObjectTableModel<ROW_OBJECT>
- Returns:
- the name of this model
 
 - 
getRowObjectspublic java.util.List<ROW_OBJECT> getRowObjects(int[] rows) Returns the corresponding row objects for the specified rows.- Parameters:
- rows- the table rows
- Returns:
- the corresponding database keys
 
 - 
getSortedColumnClassprotected java.lang.Class<?> getSortedColumnClass(int columnIndex) 
 - 
setIncrementalTaskMonitorpublic void setIncrementalTaskMonitor(TaskMonitor monitor) 
 - 
addInitialLoadListenerpublic void addInitialLoadListener(ThreadedTableModelListener listener) Adds a listener that will be notified of the first table load of this model. After the initial load, the listener is removed.- Parameters:
- listener- the listener
 
 - 
addThreadedTableModelListenerpublic void addThreadedTableModelListener(ThreadedTableModelListener listener) This is a way to know about updates from the table.- Parameters:
- listener- the listener to add
- See Also:
- addInitialLoadListener(ThreadedTableModelListener),- removeThreadedTableModelListener(ThreadedTableModelListener)
 
 - 
removeThreadedTableModelListenerpublic void removeThreadedTableModelListener(ThreadedTableModelListener listener) 
 
- 
 
-