Hierarchy providers refactored
[fedora-idea.git] / source / com / intellij / ide / hierarchy / call / CallHierarchyBrowser.java
blob24495cbf6c0fcaf180952580e119c243af2bfc4b
1 package com.intellij.ide.hierarchy.call;
3 import com.intellij.ide.hierarchy.CallHierarchyBrowserBase;
4 import com.intellij.ide.hierarchy.HierarchyNodeDescriptor;
5 import com.intellij.ide.hierarchy.HierarchyTreeStructure;
6 import com.intellij.ide.hierarchy.JavaHierarchyUtil;
7 import com.intellij.ide.util.treeView.NodeDescriptor;
8 import com.intellij.openapi.actionSystem.ActionGroup;
9 import com.intellij.openapi.actionSystem.ActionManager;
10 import com.intellij.openapi.actionSystem.ActionPlaces;
11 import com.intellij.openapi.actionSystem.IdeActions;
12 import com.intellij.openapi.diagnostic.Logger;
13 import com.intellij.openapi.project.Project;
14 import com.intellij.psi.PsiElement;
15 import com.intellij.psi.PsiMethod;
16 import com.intellij.ui.PopupHandler;
17 import org.jetbrains.annotations.NotNull;
19 import javax.swing.*;
20 import javax.swing.tree.DefaultMutableTreeNode;
21 import java.util.Comparator;
22 import java.util.Map;
24 public final class CallHierarchyBrowser extends CallHierarchyBrowserBase {
26 private static final Logger LOG = Logger.getInstance("#com.intellij.ide.hierarchy.call.CallHierarchyBrowser");
28 public CallHierarchyBrowser(final Project project, final PsiMethod method) {
29 super(project, method);
32 protected void createTrees(@NotNull final Map<String, JTree> type2TreeMap) {
33 ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_CALL_HIERARCHY_POPUP);
34 final JTree tree1 = createTree(false);
35 PopupHandler.installPopupHandler(tree1, group, ActionPlaces.CALL_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
36 final BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction();
37 baseOnThisMethodAction
38 .registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_CALL_HIERARCHY).getShortcutSet(), tree1);
39 type2TreeMap.put(CALLEE_TYPE, tree1);
41 final JTree tree2 = createTree(false);
42 PopupHandler.installPopupHandler(tree2, group, ActionPlaces.CALL_HIERARCHY_VIEW_POPUP, ActionManager.getInstance());
43 baseOnThisMethodAction
44 .registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_CALL_HIERARCHY).getShortcutSet(), tree2);
45 type2TreeMap.put(CALLER_TYPE, tree2);
48 protected PsiElement getElementFromDescriptor(@NotNull HierarchyNodeDescriptor descriptor) {
49 if (descriptor instanceof CallHierarchyNodeDescriptor) {
50 CallHierarchyNodeDescriptor nodeDescriptor = (CallHierarchyNodeDescriptor)descriptor;
51 return nodeDescriptor.getEnclosingElement();
53 return null;
56 @Override
57 protected PsiElement getOpenFileElementFromDescriptor(@NotNull HierarchyNodeDescriptor descriptor) {
58 if (descriptor instanceof CallHierarchyNodeDescriptor) {
59 CallHierarchyNodeDescriptor nodeDescriptor = (CallHierarchyNodeDescriptor)descriptor;
60 return nodeDescriptor.getTargetElement();
62 return null;
65 protected PsiElement getEnclosingElementFromNode(final DefaultMutableTreeNode node) {
66 if (node == null) return null;
67 final Object userObject = node.getUserObject();
68 if (!(userObject instanceof CallHierarchyNodeDescriptor)) return null;
69 return ((CallHierarchyNodeDescriptor)userObject).getEnclosingElement();
72 protected boolean isApplicableElement(@NotNull final PsiElement element) {
73 return element instanceof PsiMethod;
76 protected HierarchyTreeStructure createHierarchyTreeStructure(@NotNull final String typeName, @NotNull final PsiElement psiElement) {
77 if (CALLER_TYPE.equals(typeName)) {
78 return new CallerMethodsTreeStructure(myProject, (PsiMethod)psiElement, getCurrentScopeType());
80 else if (CALLEE_TYPE.equals(typeName)) {
81 return new CalleeMethodsTreeStructure(myProject, (PsiMethod)psiElement, getCurrentScopeType());
83 else {
84 LOG.error("unexpected type: " + typeName);
85 return null;
89 protected Comparator<NodeDescriptor> getComparator() {
90 return JavaHierarchyUtil.getComparator(myProject);
93 public static final class BaseOnThisMethodAction extends CallHierarchyBrowserBase.BaseOnThisMethodAction {