void (boolean currentBuilderOnly) { ThreadingAssertions.assertEventDispatchThread(); if (currentBuilderOnly) LOG.assertTrue(getCurrentViewType() != null); if (!isValidBase() || isDisposed()) return; if (getCurrentBuilder() == null) return; // seems like we are in the middle of refresh already @Nls String currentViewType = getCurrentViewType(); List<Object> pathsToExpand = new ArrayList<>(); List<Object> selectionPaths = new ArrayList<>(); if (currentViewType != null) { Sheet sheet = myType2Sheet.get(currentViewType); DefaultMutableTreeNode root = (DefaultMutableTreeNode)sheet.myAsyncTreeModel.getRoot(); TreeBuilderUtil.storePaths(sheet.myTree, root, pathsToExpand, selectionPaths, true); } PsiElement element = mySmartPsiElementPointer.getElement(); if (element == null || !isApplicableElement(element)) { return; } if (currentBuilderOnly) { Sheet sheet = myType2Sheet.get(currentViewType); disposeSheet(sheet); } else { disposeAllSheets(); } setHierarchyBase(element); validate(); ApplicationManager.getApplication().invokeLater(() -> { changeView(currentViewType); for (Object p : pathsToExpand) { expandLater(getCurrentTree(), (HierarchyNodeDescriptor)p); } selectLater(getCurrentTree(), (List)selectionPaths); }, __-> isDisposed()); }