project leak fixed
[fedora-idea.git] / source / com / intellij / ide / hierarchy / actions / BrowseCallHierarchyAction.java
blob51a9d918d7d0b9653a80ff1b2b8656e7fb6a7855
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;
21 import java.awt.*;
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);
49 else {
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() {
60 public void run() {
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);