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
;
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
);
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();
63 contentManager
.setSelectedContent(content
);
64 hierarchyBrowser
.setContent(content
);
66 final String name
= psiClass
.getName();
67 content
.setDisplayName(name
);
69 final Runnable runnable
= new Runnable() {
71 final String typeName
= psiClass
.isInterface() ? SubtypesHierarchyTreeStructure
.TYPE
: TypeHierarchyTreeStructure
.TYPE
;
72 hierarchyBrowser
.changeView(typeName
);
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
);
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
);
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();
126 final PsiElement element
= LangDataKeys
.PSI_ELEMENT
.getData(dataContext
);
127 return element
instanceof PsiClass ?
(PsiClass
)element
: null;