HierarchyBrowserManager is a service
[fedora-idea.git] / source / com / intellij / ide / hierarchy / actions / BrowseTypeHierarchyAction.java
bloba406741ed8720ac85a2bf601059e588f9a00b1a6
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.type.SubtypesHierarchyTreeStructure;
6 import com.intellij.ide.hierarchy.type.TypeHierarchyBrowser;
7 import com.intellij.ide.hierarchy.type.TypeHierarchyTreeStructure;
8 import com.intellij.openapi.actionSystem.*;
9 import com.intellij.openapi.editor.Editor;
10 import com.intellij.openapi.project.Project;
11 import com.intellij.openapi.wm.ToolWindowId;
12 import com.intellij.openapi.wm.ToolWindowManager;
13 import com.intellij.peer.PeerFactory;
14 import com.intellij.psi.*;
15 import com.intellij.psi.util.PsiUtil;
16 import com.intellij.ui.content.Content;
17 import com.intellij.ui.content.ContentManager;
18 import com.intellij.ui.content.ContentManagerAdapter;
19 import com.intellij.ui.content.ContentManagerEvent;
21 import java.awt.*;
23 public final class BrowseTypeHierarchyAction 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 PsiClass psiClass = getPsiClass(dataContext);
32 if (psiClass == null) return;
33 final TypeHierarchyBrowser hierarchyBrowser = new TypeHierarchyBrowser(project, psiClass);
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 TypeHierarchyBrowser) {
45 ((TypeHierarchyBrowser)component).dispose();
47 content.setComponent(hierarchyBrowser);
49 else {
50 content = PeerFactory.getInstance().getContentFactory().createContent(hierarchyBrowser, null, true);
51 contentManager.addContent(content);
52 contentManager.addContentManagerListener(new ContentManagerAdapter() {
53 public void contentRemoved(final ContentManagerEvent event) {
54 final Content content = event.getContent();
55 final Component component = content.getComponent();
56 if (component instanceof TypeHierarchyBrowser) {
57 ((TypeHierarchyBrowser)component).dispose();
58 content.release();
61 });
63 contentManager.setSelectedContent(content);
64 hierarchyBrowser.setContent(content);
66 final String name = psiClass.getName();
67 content.setDisplayName(name);
69 final Runnable runnable = new Runnable() {
70 public void run() {
71 final String typeName = psiClass.isInterface() ? SubtypesHierarchyTreeStructure.TYPE : TypeHierarchyTreeStructure.TYPE;
72 hierarchyBrowser.changeView(typeName);
73 }};
74 ToolWindowManager.getInstance(project).getToolWindow(ToolWindowId.HIERARCHY).activate(runnable);
75 // new Alarm().addRequest(runnable, 300);
78 public final void update(final AnActionEvent event){
79 final Presentation presentation = event.getPresentation();
80 if (!ActionPlaces.MAIN_MENU.equals(event.getPlace())) {
81 presentation.setText(IdeBundle.message("action.browse.type.hierarchy"));
84 final DataContext dataContext = event.getDataContext();
85 final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
86 if (editor != null) {
87 final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
88 final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
89 final boolean enabled = file instanceof PsiJavaFile || PsiUtil.isInJspFile(file);
90 presentation.setVisible(enabled);
91 presentation.setEnabled(enabled);
93 else {
94 final boolean enabled = getPsiClass(dataContext) != null;
95 presentation.setEnabled(enabled);
96 presentation.setVisible(enabled);
100 private static PsiClass getPsiClass(final DataContext dataContext) {
101 final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
102 if (project == null) return null;
104 final Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
105 if (editor != null) {
106 final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
107 if (file == null) return null;
109 final int offset = editor.getCaretModel().getOffset();
110 PsiElement element = file.findElementAt(offset);
111 while (element != null) {
112 if (element instanceof PsiFile) {
113 if (!(element instanceof PsiJavaFile)) return null;
114 final PsiClass[] classes = ((PsiJavaFile)element).getClasses();
115 return classes.length == 1 ? classes[0] : null;
117 if (element instanceof PsiClass && !(element instanceof PsiAnonymousClass)) {
118 return (PsiClass)element;
120 element = element.getParent();
123 return null;
125 else {
126 final PsiElement element = LangDataKeys.PSI_ELEMENT.getData(dataContext);
127 return element instanceof PsiClass ? (PsiClass)element : null;