In NatTable I am adding a row in filtered table. After removing the filter, the newly added row moves to last position in the table.
But I want to it to stay in the same position, that is next to the row which I added when the table is filtered.
I am currently using the RowInsertCommand
. I don't want to add row via model or list which used to populated the table. I want to achieve only via NatTable commands. Is it possible?
CodePudding user response:
It is always hard to follow the explanations and the issue without example code. But I assume you simply copied code from the NatTable examples, so I will explain your issue based on that.
First, the RowInsertCommand
has several constructors. If you are using a constructor without a rowIndex
or rowPosition
parameter, the new object will ALWAYS be added at the end of the list.
When using the filter functionality in NatTable with GlazedLists, the list that is wrapped in the body DataLayer
is the FilterList
. If you are operating on the FilterList
for calculating the rowIndex
where the new object should be added and have the FilterList
as base list in the RowInsertCommandHandler
, the place where the new object is added is transformed between the FilterList
and the base EventList
, which might not be the desired result.
To solve this you need to create the RowInsertCommandHandler
by using the base EventList
.
EventList<T> eventList = GlazedLists.eventList(values);
TransformedList<T, T> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
SortedList<T> sortedList = new SortedList<>(rowObjectsGlazedList, null);
this.filterList = new FilterList<>(sortedList);
this.baseList = eventList;
bodyDataLayer.registerCommandHandler(new RowInsertCommandHandler<>(this.baseList));
The action that performs the add operation then of course needs to calculate the index based on the base EventList
. The following code is part of the SelectionAdapter
of an IMenuItemProvider
:
int rowPosition = MenuItemProviders.getNatEventData(event).getRowPosition();
int rowIndex = natTable.getRowIndexByPosition(rowPosition);
Object relative = bodyLayerStack.filterList.get(rowIndex);
int baseIndex = bodyLayerStack.baseList.indexOf(relative);
Object newObject = new ...;
natTable.doCommand(new RowInsertCommand<>(baseIndex 1, newObject));