package com.jetbrains.lang.dart.ide.hierarchy.method;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
import com.intellij.ide.hierarchy.HierarchyTreeStructure;
import com.intellij.ide.hierarchy.MethodHierarchyBrowserBase;
import com.intellij.ide.util.treeView.NodeDescriptor;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionPlaces;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.ui.PopupHandler;
import com.jetbrains.lang.dart.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Comparator;
import java.util.Map;
public class DartMethodHierarchyBrowser extends MethodHierarchyBrowserBase {
private static final Logger LOG = Logger.getInstance("#com.jetbrains.lang.dart.ide.hierarchy.method.DartMethodHierarchyBrowser");
private static final String GROUP_DART_METHOD_HIERARCHY_POPUP = "DartMethodHierarchyPopupMenu";
public DartMethodHierarchyBrowser(Project project, PsiElement target) {
super(project, target);
}
@Nullable
@Override
protected PsiElement getElementFromDescriptor(@NotNull HierarchyNodeDescriptor descriptor) {
if (descriptor instanceof DartMethodHierarchyNodeDescriptor) {
return descriptor.getPsiElement();
}
return null;
}
@Override
protected void createTrees(@NotNull Map<String, JTree> trees) {
final JTree tree = createTree(false);
ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(GROUP_DART_METHOD_HIERARCHY_POPUP);
PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
trees.put(METHOD_TYPE, tree);
}
@Nullable
@Override
protected JPanel createLegendPanel() {
return createStandardLegendPanel(IdeBundle.message("hierarchy.legend.method.is.defined.in.class"),
IdeBundle.message("hierarchy.legend.method.defined.in.superclass"),
IdeBundle.message("hierarchy.legend.method.should.be.defined"));
}
@Override
protected boolean isApplicableElement(@NotNull PsiElement element) {
return (element instanceof DartMethodDeclaration ||
element instanceof DartGetterDeclaration ||
element instanceof DartSetterDeclaration) &&
PsiTreeUtil.getParentOfType(element, DartClass.class) != null;
}
@Nullable
@Override
protected HierarchyTreeStructure createHierarchyTreeStructure(@NotNull String type, @NotNull PsiElement psiElement) {
if (!METHOD_TYPE.equals(type)) {
LOG.error("unexpected type: " + type);
return null;
}
return new DartMethodHierarchyTreeStructure(myProject, (DartComponent)psiElement);
}
@Nullable
@Override
protected Comparator<NodeDescriptor> getComparator() {
return null;
}
}