package com.haskforce.features.structureview; import com.haskforce.psi.HaskellFile; import com.haskforce.utils.HaskellUtil; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.util.treeView.smartTree.SortableTreeElement; import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.List; /** * Node in the structure view. */ public class HaskellStructureViewElement implements StructureViewTreeElement, SortableTreeElement { private PsiElement element; public HaskellStructureViewElement(PsiElement element) { this.element = element; } @Override public Object getValue() { return element; } @Override public void navigate(boolean requestFocus) { if (element instanceof NavigationItem) { ((NavigationItem) element).navigate(requestFocus); } } @Override public boolean canNavigate() { return element instanceof NavigationItem && ((NavigationItem)element).canNavigate(); } @Override public boolean canNavigateToSource() { return element instanceof NavigationItem && ((NavigationItem)element).canNavigateToSource(); } @NotNull @Override public String getAlphaSortKey() { if (element instanceof PsiNamedElement) { String name = ((PsiNamedElement) element).getName(); return name == null ? "" : name; } return ""; } @NotNull @Override public ItemPresentation getPresentation() { return element instanceof NavigationItem ? ((NavigationItem) element).getPresentation() : null; } /** * Populates the structure view. Uses HaskellUtil to get backing information. */ @NotNull @Override public TreeElement[] getChildren() { if (element instanceof HaskellFile) { List<PsiNamedElement> elems = HaskellUtil.findDefinitionNodes((HaskellFile) element.getContainingFile(), null); List<TreeElement> treeElems = ContainerUtil.newArrayListWithCapacity(elems.size()); for (PsiNamedElement elem : elems) { //noinspection ObjectAllocationInLoop treeElems.add(new HaskellStructureViewElement(elem)); } return treeElems.toArray(new TreeElement[treeElems.size()]); } return EMPTY_ARRAY; } }