1 package com
.intellij
.ide
.hierarchy
.actions
;
3 import com
.intellij
.ide
.IdeBundle
;
4 import com
.intellij
.ide
.hierarchy
.HierarchyBrowserManager
;
5 import com
.intellij
.ide
.hierarchy
.call
.CallHierarchyBrowser
;
6 import com
.intellij
.ide
.hierarchy
.call
.CallerMethodsTreeStructure
;
7 import com
.intellij
.openapi
.Disposable
;
8 import com
.intellij
.openapi
.actionSystem
.*;
9 import com
.intellij
.openapi
.project
.Project
;
10 import com
.intellij
.openapi
.util
.Disposer
;
11 import com
.intellij
.openapi
.wm
.ToolWindowId
;
12 import com
.intellij
.openapi
.wm
.ToolWindowManager
;
13 import com
.intellij
.psi
.PsiDocumentManager
;
14 import com
.intellij
.psi
.PsiElement
;
15 import com
.intellij
.psi
.PsiMethod
;
16 import com
.intellij
.psi
.util
.PsiTreeUtil
;
17 import com
.intellij
.ui
.content
.Content
;
18 import com
.intellij
.ui
.content
.ContentFactory
;
19 import com
.intellij
.ui
.content
.ContentManager
;
23 public final class BrowseCallHierarchyAction
extends AnAction
{
24 public final void actionPerformed(final AnActionEvent e
) {
25 final DataContext dataContext
= e
.getDataContext();
26 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
27 if (project
== null) return;
29 PsiDocumentManager
.getInstance(project
).commitAllDocuments(); // prevents problems with smart pointers creation
31 final PsiMethod method
= getMethod(dataContext
);
32 if (method
== null) return;
33 final CallHierarchyBrowser hierarchyBrowser
= new CallHierarchyBrowser(project
, method
);
35 final Content content
;
37 final HierarchyBrowserManager hierarchyBrowserManager
= HierarchyBrowserManager
.getInstance(project
);
39 final ContentManager contentManager
= hierarchyBrowserManager
.getContentManager();
40 final Content selectedContent
= contentManager
.getSelectedContent();
41 if (selectedContent
!= null && !selectedContent
.isPinned()) {
42 content
= selectedContent
;
43 final Component component
= content
.getComponent();
44 if (component
instanceof Disposable
) {
45 Disposer
.dispose((Disposable
)component
);
47 content
.setComponent(hierarchyBrowser
);
50 content
= ContentFactory
.SERVICE
.getInstance().createContent(hierarchyBrowser
, null, true);
51 contentManager
.addContent(content
);
53 contentManager
.setSelectedContent(content
);
54 hierarchyBrowser
.setContent(content
);
56 final String name
= method
.getName();
57 content
.setDisplayName(name
);
59 final Runnable runnable
= new Runnable() {
61 hierarchyBrowser
.changeView(CallerMethodsTreeStructure
.TYPE
);
64 ToolWindowManager
.getInstance(project
).getToolWindow(ToolWindowId
.HIERARCHY
).activate(runnable
);
67 public final void update(final AnActionEvent event
){
68 final Presentation presentation
= event
.getPresentation();
69 if (!ActionPlaces
.MAIN_MENU
.equals(event
.getPlace())) {
70 presentation
.setText(IdeBundle
.message("action.browse.call.hierarchy"));
73 final DataContext dataContext
= event
.getDataContext();
74 final PsiMethod method
= getMethod(dataContext
);
75 presentation
.setEnabled(method
!= null);
78 private static PsiMethod
getMethod(final DataContext dataContext
) {
79 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
80 if (project
== null) return null;
82 final PsiElement element
= LangDataKeys
.PSI_ELEMENT
.getData(dataContext
);
83 return PsiTreeUtil
.getParentOfType(element
, PsiMethod
.class, false);