package com.dmarcotte.handlebars.structure; import com.dmarcotte.handlebars.psi.HbPsiElement; import com.dmarcotte.handlebars.psi.HbStatements; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; import com.intellij.psi.PsiElement; import com.intellij.util.ReflectionUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; class HbTreeElement extends PsiTreeElementBase<HbPsiElement> { private final HbPsiElement myElement; private HbTreeElement(HbPsiElement psiElement) { super(psiElement); myElement = psiElement; } @NotNull @Override public Collection<StructureViewTreeElement> getChildrenBase() { return getStructureViewTreeElements(myElement); } static List<StructureViewTreeElement> getStructureViewTreeElements(PsiElement psiElement) { List<StructureViewTreeElement> children = new ArrayList<>(); for (PsiElement childElement : psiElement.getChildren()) { if (!(childElement instanceof HbPsiElement)) { continue; } if (childElement instanceof HbStatements) { // HbStatments elements transparently wrap other elements, so we don't add // this element to the tree, but we add its children children.addAll(new HbTreeElement((HbPsiElement)childElement).getChildrenBase()); } for (Class suitableClass : HbStructureViewModel.ourSuitableClasses) { if (ReflectionUtil.isAssignable(suitableClass, childElement.getClass())) { children.add(new HbTreeElement((HbPsiElement)childElement)); break; } } } return children; } @Nullable @Override public String getPresentableText() { return myElement.getName(); } @Override public Icon getIcon(boolean open) { return myElement.getIcon(0); } }