private List<ColumnConstraint<T>> initializeConstraints(RowObjectFilterModel<?> model,
			Class<T> columnClass) {

		// 
		// Case 1: the column is not dynamic and thus has no way of overriding the column 
		//         constraint filtering mechanism.
		// 
		Collection<ColumnConstraint<T>> defaultConstraints =
			DiscoverableTableUtils.getColumnConstraints(columnClass);
		if (!(model instanceof DynamicColumnTableModel)) {
			return new ArrayList<>(defaultConstraints);
		}

		//
		// Case 2: the column is dynamic, but does not supply a specialized column renderer, 
		//         which is the means for overriding the column constraint filtering mechanism.
		//
		DynamicColumnTableModel<?> columnBasedModel = (DynamicColumnTableModel<?>) model;
		DynamicTableColumn<?, ?, ?> column = columnBasedModel.getColumn(modelIndex);
		GColumnRenderer<?> columnRenderer = column.getColumnRenderer();
		if (columnRenderer == null) {
			return new ArrayList<>(defaultConstraints);
		}

		//
		// Case 3: the column renderer has signaled that it uses only column constraint filtering
		//         and does not support the traditional text based filtering.
		//
		ColumnConstraintFilterMode mode = columnRenderer.getColumnConstraintFilterMode();
		if (mode == ColumnConstraintFilterMode.ALLOW_CONSTRAINTS_FILTER_ONLY) {
			return new ArrayList<>(defaultConstraints);
		}

		//
		// Case 4: the column supports text filtering.   Find any column constraints for the 
		//         column's type.  Then, create string-based constraints that will filter on
		//         the column's conversion from its type to a string (via 
		//         GColumnRenderer.getFilterString()).
		//
		@SuppressWarnings("unchecked") // See type note on the class below
		GColumnRenderer<T> asT = (GColumnRenderer<T>) columnRenderer;
		ColumnRendererMapper mapper = new ColumnRendererMapper(asT, columnBasedModel, modelIndex);
		Collection<ColumnConstraint<T>> rendererStringConstraints =
			DiscoverableTableUtils.getColumnConstraints(mapper);
		if (mode == ColumnConstraintFilterMode.ALLOW_RENDERER_STRING_FILTER_ONLY) {
			return new ArrayList<>(rendererStringConstraints);
		}

		// 
		// Case 5: the renderer supports both text filtering and column constraint filtering.
		//
		// assume: mode == ColumnConstraintFilterMode.ALLOW_ALL_FILTERS
		List<ColumnConstraint<T>> results = new ArrayList<>(rendererStringConstraints);
		results.addAll(defaultConstraints);
		return results;
	}
Constructs a new ColumnFilterData for a table column

@param model the table model
@param columnModelIndex the model index of the column 
@param columnViewIndex the view index of the column
@param columnClass the class (type) of the column
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterData.java