diff --git a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java index 96a103d0e49c..765c234b23d5 100644 --- a/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java +++ b/platform/lang-impl/src/com/intellij/ide/favoritesTreeView/FavoritesTreeStructure.java @@ -18,17 +18,27 @@ package com.intellij.ide.favoritesTreeView; import com.intellij.ide.IdeBundle; import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.projectView.SettingsProvider; +import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.ProjectTreeStructure; +import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; +import com.intellij.ide.projectView.impl.nodes.PsiFileNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiManager; import com.intellij.psi.SmartPsiElementPointer; +import com.intellij.psi.impl.PsiManagerImpl; +import com.intellij.psi.impl.file.PsiDirectoryImpl; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -41,9 +51,10 @@ import java.util.List; public class FavoritesTreeStructure extends ProjectTreeStructure { private static final Logger LOGGER = Logger.getInstance(FavoritesTreeStructure.class); - + private TreeStructureProvider myNonProjectProvider = null; public FavoritesTreeStructure(Project project) { super(project, FavoritesProjectViewPane.ID); + myNonProjectProvider = new MyProvider(project); } @Override @@ -65,7 +76,11 @@ public class FavoritesTreeStructure extends ProjectTreeStructure { final AbstractTreeNode favTreeElement = (AbstractTreeNode)element; try { if (!(element instanceof FavoritesListNode)) { - return super.getChildElements(favTreeElement); + Object[] elements = super.getChildElements(favTreeElement); + if (elements.length > 0) return elements; + + ViewSettings settings = favTreeElement instanceof SettingsProvider ? ((SettingsProvider)favTreeElement).getSettings() : ViewSettings.DEFAULT; + return ArrayUtil.toObjectArray(myNonProjectProvider.modify(favTreeElement, new ArrayList<>(), settings)); } final List result = new ArrayList(); @@ -140,4 +155,40 @@ public class FavoritesTreeStructure extends ProjectTreeStructure { public NodeDescriptor createDescriptor(Object element, NodeDescriptor parentDescriptor) { return new FavoritesTreeNodeDescriptor(myProject, parentDescriptor, (AbstractTreeNode)element); } + + private static class MyProvider implements TreeStructureProvider { + private Project myProject; + + public MyProvider(Project project) { + myProject = project; + } + + @NotNull + @Override + public Collection modify(@NotNull AbstractTreeNode parent, + @NotNull Collection children, + ViewSettings settings) { + if (parent instanceof PsiDirectoryNode && children.isEmpty()) { + VirtualFile virtualFile = ((PsiDirectoryNode)parent).getVirtualFile(); + if (virtualFile == null) return children; + VirtualFile[] virtualFiles = virtualFile.getChildren(); + List result = new ArrayList<>(); + for (VirtualFile file : virtualFiles) { + AbstractTreeNode child; + if (file.isDirectory()) child = new PsiDirectoryNode(myProject, new PsiDirectoryImpl((PsiManagerImpl)PsiManager.getInstance(myProject), file), settings); + else child = new PsiFileNode(myProject, PsiUtilCore.getPsiFile(myProject, file), settings); + child.setParent(parent); + result.add(child); + } + return result; + } + return children; + } + + @Nullable + @Override + public Object getData(Collection selected, String dataName) { + return null; + } + } }