From afb6e4fae2b077427373794579ecf66c049fc5d6 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Fri, 12 May 2017 21:54:27 +0200 Subject: [PATCH] build structure view nodes in background (with registry option to switch off) --- .../newStructureView/StructureViewComponent.java | 4 +++- .../structureView/impl/common/PsiTreeElementBase.java | 6 ++++++ .../treeView/smartTree/CachingChildrenTreeNode.java | 10 ++++++++-- platform/structure-view-impl/structure-view-impl.iml | 1 + platform/util/resources/misc/registry.properties | 2 ++ 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java index ec8824457a18..3b02dec356da 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/newStructureView/StructureViewComponent.java @@ -38,6 +38,7 @@ import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.SimpleToolWindowPanel; import com.intellij.openapi.util.*; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiDocumentManager; @@ -116,7 +117,8 @@ public class StructureViewComponent extends SimpleToolWindowPanel implements Tre @Override public boolean isToBuildChildrenInBackground(final Object element) { - return getRootElement() == element; + return Registry.is("ide.structureView.StructureViewTreeStructure.BuildChildrenInBackground") || + getRootElement() == element; } @Override diff --git a/platform/structure-view-impl/src/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java b/platform/structure-view-impl/src/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java index d0bd82ae2c66..2e58ef25cc31 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java +++ b/platform/structure-view-impl/src/com/intellij/ide/structureView/impl/common/PsiTreeElementBase.java @@ -19,6 +19,7 @@ import com.intellij.ide.structureView.StructureViewExtension; import com.intellij.ide.structureView.StructureViewFactoryEx; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.customRegions.CustomRegionStructureUtil; +import com.intellij.ide.util.treeView.AbstractTreeUi; import com.intellij.ide.util.treeView.NodeDescriptorProvidingKey; import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.util.Iconable; @@ -99,6 +100,11 @@ public abstract class PsiTreeElementBase implements Struc @NotNull @Override public final StructureViewTreeElement[] getChildren() { + return AbstractTreeUi.calculateYieldingToWriteAction(this::doGetChildren); + } + + @NotNull + private StructureViewTreeElement[] doGetChildren() { final T element = getElement(); if (element == null) return EMPTY_ARRAY; List result = new ArrayList<>(); diff --git a/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java b/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java index e86870dfb5ad..824fb15538df 100644 --- a/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java +++ b/platform/structure-view-impl/src/com/intellij/ide/util/treeView/smartTree/CachingChildrenTreeNode.java @@ -19,6 +19,7 @@ package com.intellij.ide.util.treeView.smartTree; import com.intellij.ide.structureView.impl.StructureViewElementWrapper; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.pom.Navigatable; import gnu.trove.THashMap; @@ -47,8 +48,13 @@ public abstract class CachingChildrenTreeNode extends AbstractTreeNode(); - rebuildSubtree(); + try { + myChildren = new ArrayList<>(); + rebuildSubtree(); + } catch (ProcessCanceledException pce) { + myChildren = null; + throw pce; + } } } diff --git a/platform/structure-view-impl/structure-view-impl.iml b/platform/structure-view-impl/structure-view-impl.iml index b7f0815825c2..17e99a106d03 100644 --- a/platform/structure-view-impl/structure-view-impl.iml +++ b/platform/structure-view-impl/structure-view-impl.iml @@ -17,5 +17,6 @@ + \ No newline at end of file diff --git a/platform/util/resources/misc/registry.properties b/platform/util/resources/misc/registry.properties index 29f300b3f0de..11d91bb7f9b9 100644 --- a/platform/util/resources/misc/registry.properties +++ b/platform/util/resources/misc/registry.properties @@ -1069,6 +1069,8 @@ ide.abstractTreeUi.BuildChildrenInBackgroundYieldingToWriteAction=true ide.abstractTreeUi.BuildChildrenInBackgroundYieldingToWriteAction.description=Temporary ability to control a interruptible tree building ide.projectView.PackageViewTreeStructure.BuildChildrenInBackground=true ide.projectView.PackageViewTreeStructure.BuildChildrenInBackground.description=Temporary ability to control a tree building for the Package View pane +ide.structureView.StructureViewTreeStructure.BuildChildrenInBackground=true +ide.structureView.StructureViewTreeStructure.BuildChildrenInBackground.description=Temporary ability to control a tree building for the Structure View pane ide.projectView.show.visibility=false ide.projectView.show.visibility.description=Shows visibility icon in Project View nodes