package org.fandev.lang.fan.projectView;
import com.intellij.ide.projectView.TreeStructureProvider;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.SelectableTreeStructureProvider;
import com.intellij.ide.projectView.impl.nodes.ClassTreeNode;
import com.intellij.ide.projectView.impl.nodes.NamedLibraryElement;
import com.intellij.ide.projectView.impl.nodes.LibraryGroupNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiElement;
import com.intellij.codeInsight.CodeInsightBundle;
import java.util.Collection;
import java.util.ArrayList;
import java.util.Set;
import org.fandev.index.FanIndex;
import org.fandev.lang.fan.psi.FanFile;
/**
* Date: Mar 13, 2009
* Time: 4:09:00 PM
* @author Dror Bereznitsky
*/
public class FanTreeStructureProvider implements SelectableTreeStructureProvider {
private Project myProject;
private FanIndex fanIndex;
public FanTreeStructureProvider(final Project project) {
myProject = project;
this.fanIndex = (FanIndex) project.getComponent(FanIndex.COMPONENT_NAME);
}
public Collection<AbstractTreeNode> modify(final AbstractTreeNode parent, final Collection<AbstractTreeNode> children, final ViewSettings settings) {
final Collection<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>();
// Add pod types to library tree view
if (parent != null) {
Object o = parent.getValue();
if (o instanceof NamedLibraryElement) {
addLibraryTypes(settings, result, o);
}
}
result.addAll(children);
return result;
}
private void addLibraryTypes(final ViewSettings settings, final Collection<AbstractTreeNode> result, final Object o) {
final NamedLibraryElement libraryElement = (NamedLibraryElement) o;
final Set<PsiFile> types = fanIndex.getLibraryPsiFiles(libraryElement.getName());
for (final PsiFile typeVirtualFile : types) {
final FanFile psiFile = (FanFile) typeVirtualFile;
final PsiClass[] classes = psiFile.getClasses();
for (final PsiClass aClass : classes) {
result.add(new FanTypeTreeNode(myProject, aClass, settings));
}
}
}
public Object getData(final Collection<AbstractTreeNode> selected, final String dataName) {
return null;
}
public PsiElement getTopLevelElement(final PsiElement element) {
return null;
}
private class FanTypeTreeNode extends ClassTreeNode {
private FanTypeTreeNode(final Project project, final PsiClass psiClass, final ViewSettings viewSettings) {
super(project, psiClass, viewSettings);
}
// original calcTooltip causes a major slow down
@Override
protected String calcTooltip() {
return ""; //TODO [Dror] return a proper tooltip value
}
}
}