package com.jetbrains.lang.dart.ide.hierarchy.type; import com.intellij.ide.hierarchy.HierarchyBrowserBaseEx; import com.intellij.ide.hierarchy.HierarchyNodeDescriptor; import com.intellij.ide.hierarchy.HierarchyTreeStructure; import com.intellij.ide.hierarchy.TypeHierarchyBrowserBase; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.jetbrains.lang.dart.ide.hierarchy.DartHierarchyUtil; import com.jetbrains.lang.dart.psi.DartClass; import com.jetbrains.lang.dart.util.DartResolveUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.Comparator; import java.util.Map; public class DartTypeHierarchyBrowser extends TypeHierarchyBrowserBase { private static final Logger LOG = Logger.getInstance("#com.jetbrains.lang.dart.ide.hierarchy.type.DartTypeHierarchyBrowser"); public DartTypeHierarchyBrowser(final Project project, final DartClass dartClass) { super(project, dartClass); } protected boolean isInterface(PsiElement psiElement) { return false; } protected void createTrees(@NotNull final Map<String, JTree> trees) { createTreeAndSetupCommonActions(trees, "DartClassHierarchyPopupMenu"); } @NotNull @Override protected TypeHierarchyBrowserBase.BaseOnThisTypeAction createBaseOnThisAction() { return new BaseOnThisTypeAction(); } /* Commented out so far as it doesn't work yet. Probably here should be custom Dart specific ChangeScopeAction protected void prependActions(DefaultActionGroup actionGroup) { super.prependActions(actionGroup); actionGroup.add(new ChangeScopeAction() { protected boolean isEnabled() { return !Comparing.strEqual(myCurrentViewType, SUPERTYPES_HIERARCHY_TYPE); } }); } */ protected PsiElement getElementFromDescriptor(@NotNull HierarchyNodeDescriptor descriptor) { if (!(descriptor instanceof DartTypeHierarchyNodeDescriptor)) return null; return ((DartTypeHierarchyNodeDescriptor)descriptor).getDartClass(); } @Nullable protected JPanel createLegendPanel() { return null; } protected boolean isApplicableElement(@NotNull final PsiElement element) { return element instanceof DartClass; } protected Comparator<NodeDescriptor> getComparator() { return DartHierarchyUtil.getComparator(myProject); } protected HierarchyTreeStructure createHierarchyTreeStructure(@NotNull final String typeName, @NotNull final PsiElement psiElement) { if (SUPERTYPES_HIERARCHY_TYPE.equals(typeName)) { return new DartServerSupertypesHierarchyTreeStructure(myProject, (DartClass)psiElement); } else if (SUBTYPES_HIERARCHY_TYPE.equals(typeName)) { return new DartServerSubtypesHierarchyTreeStructure(myProject, (DartClass)psiElement, getCurrentScopeType()); } else if (TYPE_HIERARCHY_TYPE.equals(typeName)) { return new DartServerTypeHierarchyTreeStructure(myProject, (DartClass)psiElement, getCurrentScopeType()); } else { LOG.error("unexpected type: " + typeName); return null; } } protected boolean canBeDeleted(final PsiElement psiElement) { return psiElement instanceof DartClass; } protected String getQualifiedName(final PsiElement psiElement) { if (psiElement instanceof DartClass) { return ((DartClass)psiElement).getName(); } return ""; } public static class BaseOnThisTypeAction extends TypeHierarchyBrowserBase.BaseOnThisTypeAction { protected boolean isEnabled(@NotNull final HierarchyBrowserBaseEx browser, @NotNull final PsiElement psiElement) { return super.isEnabled(browser, psiElement) && !DartResolveUtil.OBJECT.equals(((DartClass)psiElement).getName()); } } }