The RowObjectRemover is an algorithm that removes a row. There is a variant, ExtendedRowObjectRemover, that checks whether a row can be removed or not. The RowObjectCreator is an algorithm that adds a row. There is a variant, ExtendedRowObjectCreator, that checks whether a row can be added or not.
Improvement
There should be no separate interfaces; the RowObjectRemover should check whether a row can be removed and, if the result is negative, return a ResKey. The same applies to the RowObjectCreator.
Code Migration
Convert implementations of ` ExtendedRowObjectCreator ` and ` ExtendedRowObjectRemover ` to `RowObjectCreator ` and `RowObjectRemover`.
Instead of `allowCreateNewRow(int, Object, Control)`, `allowCreateNewRow(int, TableData, Control) ` must now be implemented. Instead of `allowRemoveRow(int, Object, Control) `, `allowRemoveRow(int, TableData, Control)` must now be implemented.
Note that TableData is now passed instead of the row object. The row object can be retrieved via tableData.getTableModel().getRowObject(row).
According to the documentation, the return value must be adjusted: ` null ` if creation or removal is allowed, and a matching ` ResKey ` if not.
Test
Used by #24540 in TestCompositeAttribute.script.xml.