package org.jetbrains.plugins.clojure.structure;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiNamedElement;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.navigation.NavigationItem;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.Iconable;
import org.jetbrains.plugins.clojure.psi.ClojurePsiElement;
import org.jetbrains.plugins.clojure.psi.api.defs.ClDef;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author ilyas
*/
public class ClojureStructureViewElement implements StructureViewTreeElement {
private PsiElement myElement;
public ClojureStructureViewElement(PsiElement element) {
myElement = element;
}
public PsiElement getValue() {
return myElement;
}
public void navigate(boolean requestFocus) {
((NavigationItem) myElement).navigate(requestFocus);
}
public boolean canNavigate() {
return ((NavigationItem) myElement).canNavigate();
}
public boolean canNavigateToSource() {
return ((NavigationItem) myElement).canNavigateToSource();
}
public StructureViewTreeElement[] getChildren() {
final List<ClojurePsiElement> childrenElements = new ArrayList<ClojurePsiElement>();
myElement.acceptChildren(new PsiElementVisitor() {
public void visitElement(PsiElement element) {
if (isBrowsableElement(element)) {
childrenElements.add((ClojurePsiElement) element);
} else {
element.acceptChildren(this);
}
}
});
StructureViewTreeElement[] children = new StructureViewTreeElement[childrenElements.size()];
for (int i = 0; i < children.length; i++) {
children[i] = new ClojureStructureViewElement(childrenElements.get(i));
}
return children;
}
private boolean isBrowsableElement(PsiElement element) {
return element instanceof ClDef &&
((ClDef) element).getNameSymbol() != null;
}
public ItemPresentation getPresentation() {
return new ItemPresentation() {
public String getPresentableText() {
if (myElement instanceof ClDef) {
return ((ClDef) myElement).getPresentationText();
}
return ((PsiNamedElement) myElement).getName();
}
public TextAttributesKey getTextAttributesKey() {
return null;
}
public String getLocationString() {
return null;
}
public Icon getIcon(boolean open) {
return myElement.getIcon(Iconable.ICON_FLAG_OPEN);
}
};
}
}