void () { AppUIExecutor.onUiThread().expireWith(this).submit(() -> { TreePath[] currentPaths = myTree.getSelectionPaths(); List<TreePath> selectedPaths = currentPaths == null || currentPaths.length == 0 ? Collections.emptyList() : Arrays.asList(currentPaths); myTreeModel.rootsChanged(); if (selectedPaths.isEmpty()) return; myTreeModel.getInvoker().invokeLater(() -> { List<Promise<TreePath>> pathPromises = ContainerUtil.mapNotNull(selectedPaths, path -> { ServiceViewItem item = ObjectUtils.tryCast(path.getLastPathComponent(), ServiceViewItem.class); return item == null ? null : myTreeModel.findPathSafe(item.getValue(), item.getRootContributor().getClass()); }); Promises.collectResults(pathPromises, true).onProcessed(paths -> { if (paths != null && !paths.isEmpty()) { if (!paths.equals(selectedPaths)) { Promise<?> newSelectPromise = TreeUtil.promiseSelect(myTree, paths.stream().map(PathSelectionVisitor::new)); cancelSelectionUpdate(); if (newSelectPromise instanceof AsyncPromise) { ((AsyncPromise<?>)newSelectPromise).onError(t -> { if (t instanceof CancellationException) { TreeUtil.promiseExpand(myTree, paths.stream().map(path -> new PathSelectionVisitor(path.getParentPath()))); } }); } myUpdateSelectionPromise = newSelectPromise; } else { AppUIExecutor.onUiThread().expireWith(this).submit(() -> { TreePath[] selectionPaths = myTree.getSelectionPaths(); if (selectionPaths != null && isSelectionUpdateNeeded(new SmartList<>(selectionPaths), paths)) { myTree.setSelectionPaths(paths.toArray(new TreePath[0])); } }); } } }); }); }); }