diff --git a/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectNode.java b/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectNode.java index aaec6b798..f8aa18036 100644 --- a/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectNode.java +++ b/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectNode.java @@ -6,6 +6,7 @@ import com.intellij.icons.AllIcons; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.util.treeView.AbstractTreeNode; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectUtil; @@ -43,14 +44,23 @@ public class ImagesProjectNode extends AbstractTreeNode { addAllByExt(project, "svg"); } + // Creates a collection of image files asynchronously private void addAllByExt(Project project, String ext) { final Set imagesFiles = getImagesFiles(project); final VirtualFile projectDir = ProjectUtil.guessProjectDir(project); - for (VirtualFile file : FilenameIndex.getAllFilesByExt(project, ext)) { - while (file != null && !file.equals(projectDir)) { - imagesFiles.add(file); - file = file.getParent(); + + try { + final Collection files = ReadAction.compute(() -> FilenameIndex.getAllFilesByExt(project, ext)); + + for (VirtualFile file : files) { + while (file != null && !file.equals(projectDir)) { + imagesFiles.add(file); + file = file.getParent(); + } } + + } catch (Throwable throwable) { + throwable.printStackTrace(); } } diff --git a/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectViewPane.java b/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectViewPane.java index 78e4ed0f4..2e7fb9f09 100644 --- a/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectViewPane.java +++ b/project_view_pane/src/main/java/org/intellij/sdk/view/pane/ImagesProjectViewPane.java @@ -5,6 +5,7 @@ package org.intellij.sdk.view.pane; import com.intellij.icons.AllIcons; import com.intellij.ide.SelectInTarget; import com.intellij.ide.impl.ProjectViewSelectInTarget; +import com.intellij.ide.projectView.BaseProjectTreeBuilder; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.AbstractProjectViewPSIPane; import com.intellij.ide.projectView.impl.ProjectAbstractTreeStructureBase; @@ -54,12 +55,12 @@ public class ImagesProjectViewPane extends AbstractProjectViewPSIPane { @Override public String toString() { - return "images"; + return ID; } @Override public String getMinorViewId() { - return "images"; + return ID; } @Override @@ -78,10 +79,10 @@ public class ImagesProjectViewPane extends AbstractProjectViewPSIPane { return new ImagesProjectNode(project); } - @NotNull + // Children will be searched in async mode @Override - public Object[] getChildElements(@NotNull Object element) { - return super.getChildElements(element); + public boolean isToBuildChildrenInBackground(@NotNull Object element) { + return true; } }; } @@ -89,7 +90,7 @@ public class ImagesProjectViewPane extends AbstractProjectViewPSIPane { @NotNull @Override protected ProjectViewTree createTree(@NotNull DefaultTreeModel model) { - return new ProjectViewTree(myProject, model) { + return new ProjectViewTree(model) { @Override public boolean isRootVisible() { return true; @@ -97,11 +98,17 @@ public class ImagesProjectViewPane extends AbstractProjectViewPSIPane { }; } - // Awaiting refactoring of AbstractProjectViewPSIPane#createTreeUpdater + // Legacy code, awaiting refactoring of AbstractProjectViewPSIPane#createBuilder + @Override + protected BaseProjectTreeBuilder createBuilder(@NotNull DefaultTreeModel treeModel) { + return null; + } + + // Legacy code, awaiting refactoring of AbstractProjectViewPSIPane#createTreeUpdater @NotNull @Override protected AbstractTreeUpdater createTreeUpdater(@NotNull AbstractTreeBuilder builder) { - return new AbstractTreeUpdater(builder); + throw new IllegalStateException("ImagesProjectViewPane tree is async now"); } }