mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Favorites: Show children for external (non-project) directories
This commit is contained in:
+53
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user