Class GDynamicColumnTableModel<ROW_TYPE,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_TYPE,DATA_SOURCE>
-
- Type Parameters:
ROW_TYPE
- the row object class for this table model.DATA_SOURCE
- the type of data that will be returned fromgetDataSource()
. This object will be given to theDynamicTableColumn
objects used by this table model whenDynamicTableColumn.getValue(Object, ghidra.docking.settings.Settings, Object, ServiceProvider)
is called.
- All Implemented Interfaces:
ConfigurableColumnTableModel
,DynamicColumnTableModel<ROW_TYPE>
,RowObjectTableModel<ROW_TYPE>
,SelectionStorage<ROW_TYPE>
,SortedTableModel
,VariableColumnTableModel
,java.io.Serializable
,java.util.EventListener
,javax.swing.event.ChangeListener
,javax.swing.table.TableModel
- Direct Known Subclasses:
AnyObjectTableModel
,SetEquateTableModel
,ThreadedTableModel
public abstract class GDynamicColumnTableModel<ROW_TYPE,DATA_SOURCE> extends AbstractSortedTableModel<ROW_TYPE> implements javax.swing.event.ChangeListener, VariableColumnTableModel, DynamicColumnTableModel<ROW_TYPE>
An abstract table model for showing DynamicTableColumns where each row is based on an object of type ROW_TYPE. The client is responsible for implementingcreateTableColumnDescriptor()
. This method specifies which default columns the table should have and whether they should be visible or hidden. Hidden columns can be made visible through the UI.This model will also discover other system columns that understand how to render
ROW_TYPE
data directly. Also, if you create amapper
(s) for your row type, then this model will load columns for each type for which a mapper was created, all as optional, hidden columns.The various attributes of the columns of this model (visibility, position, size, etc) are saved to disk as tool preferences when the user exits the tool.
Implementation Note: this model loads all columns, specific and discovered, as being visible. Then, during initialization, the
TableColumnModelState
class will either hide all non-default columns, or reload the column state if any previous saved state is found.- See Also:
- Serialized Form
-
-
Field Summary
Fields Modifier and Type Field Description protected java.util.Map<DynamicTableColumn<ROW_TYPE,?,?>,Settings>
columnSettings
protected ServiceProvider
serviceProvider
protected java.util.List<DynamicTableColumn<ROW_TYPE,?,?>>
tableColumns
-
Fields inherited from class docking.widgets.table.AbstractSortedTableModel
hasEverSorted
-
Fields inherited from class docking.widgets.table.AbstractGTableModel
WIDTH_UNDEFINED
-
Fields inherited from interface docking.widgets.table.SortedTableModel
ASCENDING_ORDER, DESCENDING_ORDER
-
-
Constructor Summary
Constructors Constructor Description GDynamicColumnTableModel(ServiceProvider serviceProvider)
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected void
addTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column)
Adds the given column at the end of the list of columns.protected void
addTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column, int index, boolean isDefault)
Adds the given field at the given index to the list of fields in this class.protected void
addTableColumns(java.util.Set<DynamicTableColumn<ROW_TYPE,?,?>> columns)
Adds the given columns to the end of the list of columns.protected java.util.Comparator<ROW_TYPE>
createSortComparator(int columnIndex)
An extension point for subclasses to insert their own comparator objects for their data.protected java.util.Comparator<java.lang.Object>
createSortComparatorForColumn(int columnIndex)
This differs fromcreateSortComparator(int)
in that the other method creates a comparator that operates on a full row value, whereas this method operates on column values.protected abstract TableColumnDescriptor<ROW_TYPE>
createTableColumnDescriptor()
void
dispose()
Call this when the model will no longer be usedprotected void
disposeDynamicColumnData()
DynamicTableColumn<ROW_TYPE,?,?>
getColumn(int index)
Returns the column for the given model indexjava.lang.Class<?>
getColumnClass(int column)
int
getColumnCount()
java.lang.String
getColumnDescription(int column)
java.lang.String
getColumnDisplayName(int columnIndex)
int
getColumnIndex(DynamicTableColumn<ROW_TYPE,?,?> identifier)
Returns the model index for the given columnint
getColumnIndex(java.lang.Class<?> columnClass)
Returns the column index of the given column classjava.lang.String
getColumnName(int column)
Settings
getColumnSettings(int index)
Returns settings for the specified column indexSettingsDefinition[]
getColumnSettingsDefinitions(int index)
Returns settings definitions for the specified column indexjava.lang.Object
getColumnValueForRow(ROW_TYPE t, int columnIndex)
Implementors are expected to return a value at the given column index for the specified row object.abstract DATA_SOURCE
getDataSource()
Returns the table's context for the data.int
getDefaultColumnCount()
Gets the count of the default columns for this model.int
getMaxLines(int index)
Gets the maximum number of text display lines needed for any given cell within the specified column.int
getPreferredColumnWidth(int column)
javax.swing.table.TableCellRenderer
getRenderer(int index)
Gets the special table cell renderer for the specified table field column.java.lang.String
getUniqueIdentifier(int column)
Returns a value that is unique for a given table column.boolean
isDefaultColumn(int modelIndex)
Returns true if the column indicated by the index in the model is a default column (meaning that it was specified by the model and not discovered).boolean
isSortable(int columnIndex)
Returns true if the specified columnIndex is sortable.boolean
isVisibleByDefault(int modelIndex)
Returns true if the column denoted by the given model index is specified by the table model as being visible when the table is loaded for the first time.protected void
loadDiscoveredTableColumns()
protected void
reloadColumns()
Allows clients to defer column creation until after this parent class's constructor has been called.protected void
removeTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column)
Removes the given column from this modelprotected void
removeTableColumns(java.util.Set<DynamicTableColumn<ROW_TYPE,?,?>> columns)
Removes the given columns from this model.void
setAllColumnSettings(Settings[] newSettings)
Allows for the bulk setting of Settings.void
stateChanged(javax.swing.event.ChangeEvent e)
Callback when column settings have changed-
Methods inherited from class docking.widgets.table.AbstractSortedTableModel
addSortListener, cleanupTableSortState, createSortingContext, fireTableChanged, getIndexForRowObject, getIndexForRowObject, getPendingSortState, getPrimarySortColumnIndex, getRowIndex, getRowObject, getTableSortState, getValueAt, initializeSorting, isSorted, isSortPending, notifyModelSorted, reSort, setDefaultTableSortState, setTableSortState, sort, sortCompleted
-
Methods inherited from class docking.widgets.table.AbstractGTableModel
getLastSelectedObjects, getRowCount, refresh, setLastSelectedObjects
-
Methods inherited from class javax.swing.table.AbstractTableModel
addTableModelListener, findColumn, fireTableCellUpdated, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, isCellEditable, removeTableModelListener, setValueAt
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface docking.widgets.table.RowObjectTableModel
fireTableDataChanged, getModelData, getName, getRowIndex, getRowObject
-
-
-
-
Field Detail
-
serviceProvider
protected ServiceProvider serviceProvider
-
tableColumns
protected java.util.List<DynamicTableColumn<ROW_TYPE,?,?>> tableColumns
-
columnSettings
protected java.util.Map<DynamicTableColumn<ROW_TYPE,?,?>,Settings> columnSettings
-
-
Constructor Detail
-
GDynamicColumnTableModel
public GDynamicColumnTableModel(ServiceProvider serviceProvider)
-
-
Method Detail
-
createTableColumnDescriptor
protected abstract TableColumnDescriptor<ROW_TYPE> createTableColumnDescriptor()
-
isSortable
public boolean isSortable(int columnIndex)
Description copied from interface:SortedTableModel
Returns true if the specified columnIndex is sortable.- Specified by:
isSortable
in interfaceSortedTableModel
- Parameters:
columnIndex
- the column index- Returns:
- true if the specified columnIndex is sortable
-
loadDiscoveredTableColumns
protected void loadDiscoveredTableColumns()
-
reloadColumns
protected void reloadColumns()
Allows clients to defer column creation until after this parent class's constructor has been called. This method will not restore any column settings that have been changed after construction. Thus, this method is intended only to be called during the construction process.
-
createSortComparator
protected java.util.Comparator<ROW_TYPE> createSortComparator(int columnIndex)
Description copied from class:AbstractSortedTableModel
An 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:
createSortComparator
in classAbstractSortedTableModel<ROW_TYPE>
- Parameters:
columnIndex
- the column index- Returns:
- the comparator
-
createSortComparatorForColumn
protected java.util.Comparator<java.lang.Object> createSortComparatorForColumn(int columnIndex)
This differs fromcreateSortComparator(int)
in that the other method creates a comparator that operates on a full row value, whereas this method operates on column values.- Parameters:
columnIndex
- the column index- Returns:
- a comparator for the specific column values
-
stateChanged
public void stateChanged(javax.swing.event.ChangeEvent e)
Callback when column settings have changed- Specified by:
stateChanged
in interfacejavax.swing.event.ChangeListener
-
addTableColumn
protected void addTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column)
Adds the given column at the end of the list of columns. This method is intended for implementations to add custom column objects, rather than relying on generic, discovered DynamicTableColumn implementations.Note: this method assumes that the columns have already been sorted
- Parameters:
column
- The field to add
-
addTableColumns
protected void addTableColumns(java.util.Set<DynamicTableColumn<ROW_TYPE,?,?>> columns)
Adds the given columns to the end of the list of columns. This method is intended for implementations to add custom column objects, rather than relying on generic, discovered DynamicTableColumn implementations.Note: this method assumes that the columns have already been sorted.
- Parameters:
columns
- The columns to add
-
addTableColumn
protected void addTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column, int index, boolean isDefault)
Adds the given field at the given index to the list of fields in this class. This method is intended for implementations to add custom column objects, rather than relying on generic, discovered DynamicTableColumn implementations.Note: this method assumes that the columns have already been sorted.
- Parameters:
column
- The field to add.index
- The index at which to add the field. If the index value is invalid (negative or greater than the number of columns), then the column will be added to the end of the columns list.isDefault
- true if this is a default column
-
removeTableColumn
protected void removeTableColumn(DynamicTableColumn<ROW_TYPE,?,?> column)
Removes the given column from this model- Parameters:
column
- the column to remove
-
removeTableColumns
protected void removeTableColumns(java.util.Set<DynamicTableColumn<ROW_TYPE,?,?>> columns)
Removes the given columns from this model. This method allows the client to remove multiple columns at once, firing only one event when the work is finished.- Parameters:
columns
- the columns to remove
-
getDefaultColumnCount
public int getDefaultColumnCount()
Description copied from interface:VariableColumnTableModel
Gets the count of the default columns for this model. This model may have non-default columns added. This method will return the count of columns that have been setup specifically by the table model. This method can be used to iterate of the firstn
columns of this model in order to get information for the default columns by calling methods likeTableModel.getColumnName(int)
.- Specified by:
getDefaultColumnCount
in interfaceVariableColumnTableModel
- Returns:
- Gets the count of the default columns for this model.
-
isVisibleByDefault
public boolean isVisibleByDefault(int modelIndex)
Description copied from interface:VariableColumnTableModel
Returns true if the column denoted by the given model index is specified by the table model as being visible when the table is loaded for the first time.- Specified by:
isVisibleByDefault
in interfaceVariableColumnTableModel
- Parameters:
modelIndex
- The index in the column in the column model.- Returns:
- true if the column denoted by the given model index is visible default.
-
isDefaultColumn
public boolean isDefaultColumn(int modelIndex)
Returns true if the column indicated by the index in the model is a default column (meaning that it was specified by the model and not discovered).- Specified by:
isDefaultColumn
in interfaceVariableColumnTableModel
- Parameters:
modelIndex
- the index of the column in the model.- Returns:
- true if the column is a default.
-
getColumnCount
public final int getColumnCount()
- Specified by:
getColumnCount
in interfacejavax.swing.table.TableModel
-
getColumnClass
public final java.lang.Class<?> getColumnClass(int column)
- Specified by:
getColumnClass
in interfacejavax.swing.table.TableModel
- Overrides:
getColumnClass
in classjavax.swing.table.AbstractTableModel
-
getColumnName
public final java.lang.String getColumnName(int column)
- Specified by:
getColumnName
in interfacejavax.swing.table.TableModel
- Overrides:
getColumnName
in classjavax.swing.table.AbstractTableModel
-
getPreferredColumnWidth
public int getPreferredColumnWidth(int column)
- Overrides:
getPreferredColumnWidth
in classAbstractGTableModel<ROW_TYPE>
-
getColumnDisplayName
public java.lang.String getColumnDisplayName(int columnIndex)
- Specified by:
getColumnDisplayName
in interfaceVariableColumnTableModel
-
getColumnDescription
public java.lang.String getColumnDescription(int column)
- Specified by:
getColumnDescription
in interfaceVariableColumnTableModel
-
getUniqueIdentifier
public java.lang.String getUniqueIdentifier(int column)
Description copied from interface:VariableColumnTableModel
Returns a value that is unique for a given table column. This is different than getting the display name, which may be shared by different columns.- Specified by:
getUniqueIdentifier
in interfaceVariableColumnTableModel
- Parameters:
column
- the index (in the model space) of the column for which to get the identifier
-
getColumnValueForRow
public final java.lang.Object getColumnValueForRow(ROW_TYPE t, int columnIndex)
Description copied from interface:RowObjectTableModel
Implementors are expected to return a value at the given column index for the specified row object. This is essentially a more specific version of theTableModel.getValueAt(int, int)
that allows this class's comparator objects to work.- Specified by:
getColumnValueForRow
in interfaceRowObjectTableModel<ROW_TYPE>
- Parameters:
t
- The object that represents a given row.columnIndex
- The column index for which a value is requested.- Returns:
- a value at the given column index for the specified row object.
-
getDataSource
public abstract DATA_SOURCE getDataSource()
Returns the table's context for the data.- Returns:
- the table's context for the data.
-
getColumnIndex
public int getColumnIndex(java.lang.Class<?> columnClass)
Returns the column index of the given column class- Parameters:
columnClass
- the class for the type of DynamicTableColumn you want to find.- Returns:
- the column index for the specified DynamicTableColumn. -1 if not found.
-
getColumnIndex
public int getColumnIndex(DynamicTableColumn<ROW_TYPE,?,?> identifier)
Description copied from interface:DynamicColumnTableModel
Returns the model index for the given column- Specified by:
getColumnIndex
in interfaceDynamicColumnTableModel<ROW_TYPE>
- Parameters:
identifier
- the column- Returns:
- the model index
-
getColumn
public DynamicTableColumn<ROW_TYPE,?,?> getColumn(int index)
Description copied from interface:DynamicColumnTableModel
Returns the column for the given model index- Specified by:
getColumn
in interfaceDynamicColumnTableModel<ROW_TYPE>
- Parameters:
index
- the model index of the column (this can differ from the view index)- Returns:
- the column
-
getColumnSettingsDefinitions
public SettingsDefinition[] getColumnSettingsDefinitions(int index)
Description copied from interface:ConfigurableColumnTableModel
Returns settings definitions for the specified column index- Specified by:
getColumnSettingsDefinitions
in interfaceConfigurableColumnTableModel
- Parameters:
index
- column index- Returns:
- column settings definitions.
-
getColumnSettings
public Settings getColumnSettings(int index)
Description copied from interface:ConfigurableColumnTableModel
Returns settings for the specified column index- Specified by:
getColumnSettings
in interfaceConfigurableColumnTableModel
- Parameters:
index
- column index- Returns:
- column settings.
-
setAllColumnSettings
public void setAllColumnSettings(Settings[] newSettings)
Description copied from interface:ConfigurableColumnTableModel
Allows for the bulk setting of Settings. This prevents excessive event notification when all settings need to be changed.- Specified by:
setAllColumnSettings
in interfaceConfigurableColumnTableModel
- Parameters:
newSettings
- An array of Settings that contains Settings for each column where the index of the Settings in the array is the index of the column in the model
-
getRenderer
public javax.swing.table.TableCellRenderer getRenderer(int index)
Gets the special table cell renderer for the specified table field column. A null value indicates that this field uses a default cell renderer.- Specified by:
getRenderer
in interfaceConfigurableColumnTableModel
- Parameters:
index
- the model column index- Returns:
- a table cell renderer for this field. Otherwise, null if a default renderer should be used.
-
getMaxLines
public int getMaxLines(int index)
Gets the maximum number of text display lines needed for any given cell within the specified column.- Specified by:
getMaxLines
in interfaceConfigurableColumnTableModel
- Parameters:
index
- column field index- Returns:
- maximum number of lines needed for specified column
-
dispose
public void dispose()
Description copied from class:AbstractGTableModel
Call this when the model will no longer be used- Overrides:
dispose
in classAbstractGTableModel<ROW_TYPE>
-
disposeDynamicColumnData
protected void disposeDynamicColumnData()
-
-