eclipseeclipse-plugineclipse-rcpnattable

Added row moves to last position once filter is removed


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?


Solution

  • 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 rowPositionparameter, 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));