Favorites: Show children for external (non-project) directories

This commit is contained in:
Vassiliy.Kudryashov
2016-04-01 23:27:37 +03:00
parent 8055096810
commit c6aeb7e59e
@@ -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<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
@@ -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<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent,
@NotNull Collection<AbstractTreeNode> children,
ViewSettings settings) {
if (parent instanceof PsiDirectoryNode && children.isEmpty()) {
VirtualFile virtualFile = ((PsiDirectoryNode)parent).getVirtualFile();
if (virtualFile == null) return children;
VirtualFile[] virtualFiles = virtualFile.getChildren();
List<AbstractTreeNode> 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<AbstractTreeNode> selected, String dataName) {
return null;
}
}
}