RFR: 8193800: TreeTableView selection changes on sorting [v5]

Jeanette Winzenburg fastegal at openjdk.java.net
Tue Jun 23 13:11:55 UTC 2020


On Fri, 19 Jun 2020 23:04:51 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

>> Marked as reviewed by kcr (Lead).
>
> Pending a second reviewer.
> 
> @aghaisas or @kleopatra can one of you review it?

confirmed test failures before and passing after the fix - impressive :)

While digging a bit (mainly around my [earlier
concerns](https://github.com/openjdk/jfx/pull/244#issuecomment-638702570) - which still hold but could be discussed in
a follow-up issue :) I came up with a NPE thrown by the newly added code block ins sort (the one walking up the parent
hierarchy).

    @Test
    public void testNPEOnSortAfterSetAll() {
        // stand-alone setup
        TreeTableView<String> treeTableView = new TreeTableView<>();
        TreeTableColumn<String, String> col = new TreeTableColumn<String, String>("column");
        col.setSortType(ASCENDING);
        col.setCellValueFactory(param -> new ReadOnlyObjectWrapper<String>(param.getValue().getValue()));
        treeTableView.getColumns().add(col);

        TreeItem<String> root = new TreeItem<String>("root");
        root.setExpanded(true);
        root.getChildren().addAll(
                new TreeItem("Apple"),
                new TreeItem("Orange"),
                new TreeItem("Banana"));

        treeTableView.setRoot(root);
        // add expanded children
        root.getChildren().forEach(child -> {
            child.setExpanded(true);
            String value = child.getValue();
            for (int i = 1; i <= 3; i++) {
                child.getChildren().add(new TreeItem<>(value + i));
            }
        });
        assertEquals("sanity", 13, treeTableView.getExpandedItemCount());
        TreeTableViewSelectionModel<String> selectionModel = treeTableView.getSelectionModel();
        selectionModel.setSelectionMode(SelectionMode.MULTIPLE);
        selectionModel.selectIndices(2, 5, 8, 10);
        assertEquals(10, selectionModel.getSelectedIndex());
        TreeItem<String> lastRootChild = root.getChildren().get(2);
        assertEquals("sanity: selectedItem child of last",
                lastRootChild, selectionModel.getSelectedItem().getParent());
        // replace children of last root child
        List<TreeItem<String>> childrenOfLastRootChild = new ArrayList<>(lastRootChild.getChildren());
        childrenOfLastRootChild.remove(0);
        lastRootChild.getChildren().setAll(childrenOfLastRootChild);
        treeTableView.sort();
    }

(before the fix it throws an IOOB, plus the behavior completely rotten in a visual test)

Did nothing to go to the bottom of this - looks like somehow the state of the selection is (still?) broken after
setAll.

Which might bring us back to the replace != permutation (can't resist to try :)  actually there's no reason to special
case a replace with all same items against a replace with only some same items (doing so introduces a discontinuity in
behavior) - we should either try to keep selected items or not.

-------------

PR: https://git.openjdk.java.net/jfx/pull/244


More information about the openjfx-dev mailing list