private List<ExplorerNode> update() {
        // Build the row list from the tree structure.
        final List<ExplorerNode> rows = new ArrayList<>();
        if (currentRootNodes != null) {
            addToRows(currentRootNodes, rows, openItems.getAllOpenItems());
        }

        // If we are allowing null selection then insert a node at the root to make it
        // possible.
        if (includeNullSelection) {
            if (rows.isEmpty() || rows.get(0) != NULL_SELECTION) {
                // If there is any quick filter then NULL_SELECTION is a non-match
                final boolean isFilterMatch = NullSafe.isBlankString(NullSafe.get(
                        currentCriteria,
                        FetchExplorerNodesRequest::getFilter,
                        ExplorerTreeFilter::getNameFilter));

                rows.add(0, NULL_SELECTION.copy()
                        .setGroupedNodeFlag(NodeFlagGroups.FILTER_MATCH_PAIR, isFilterMatch)
                        .build());
            }
        }

        explorerTree.setData(rows);

        return rows;
    }
For use when setting an initial value for the filter.
stroom-core-client/src/main/java/stroom/explorer/client/presenter/ExplorerTreeModel.java