1 package com
.intellij
.ide
.hierarchy
.method
;
3 import com
.intellij
.codeInsight
.generation
.OverrideImplementUtil
;
4 import com
.intellij
.ide
.hierarchy
.HierarchyNodeDescriptor
;
5 import com
.intellij
.ide
.hierarchy
.MethodHierarchyBrowserBase
;
6 import com
.intellij
.openapi
.actionSystem
.*;
7 import com
.intellij
.openapi
.application
.ApplicationManager
;
8 import com
.intellij
.openapi
.command
.CommandProcessor
;
9 import com
.intellij
.openapi
.diagnostic
.Logger
;
10 import com
.intellij
.openapi
.project
.Project
;
11 import com
.intellij
.openapi
.ui
.Messages
;
12 import com
.intellij
.openapi
.vfs
.ReadonlyStatusHandler
;
13 import com
.intellij
.openapi
.vfs
.VirtualFile
;
14 import com
.intellij
.openapi
.wm
.ToolWindowManager
;
15 import com
.intellij
.psi
.PsiClass
;
16 import com
.intellij
.psi
.PsiFile
;
17 import com
.intellij
.psi
.PsiMethod
;
18 import com
.intellij
.psi
.PsiSubstitutor
;
19 import com
.intellij
.psi
.impl
.source
.jsp
.jspJava
.JspClass
;
20 import com
.intellij
.psi
.util
.MethodSignature
;
21 import com
.intellij
.util
.IncorrectOperationException
;
23 import java
.util
.ArrayList
;
24 import java
.util
.Collection
;
25 import java
.util
.List
;
27 abstract class OverrideImplementMethodAction
extends AnAction
{
28 private static final Logger LOG
= Logger
.getInstance("#com.intellij.ide.hierarchy.method.OverrideImplementMethodAction");
30 public final void actionPerformed(final AnActionEvent event
) {
31 final DataContext dataContext
= event
.getDataContext();
32 final MethodHierarchyBrowser methodHierarchyBrowser
= (MethodHierarchyBrowser
)dataContext
.getData(MethodHierarchyBrowserBase
.METHOD_HIERARCHY_BROWSER_DATA_CONSTANT
);
33 if (methodHierarchyBrowser
== null) return;
34 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
35 if (project
== null) return;
37 final String commandName
= event
.getPresentation().getText();
38 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
40 CommandProcessor
.getInstance().executeCommand(project
, new Runnable() {
44 final HierarchyNodeDescriptor
[] selectedDescriptors
= methodHierarchyBrowser
.getSelectedDescriptors();
45 if (selectedDescriptors
.length
> 0) {
46 final List
<VirtualFile
> files
= new ArrayList
<VirtualFile
>(selectedDescriptors
.length
);
47 for (HierarchyNodeDescriptor selectedDescriptor
: selectedDescriptors
) {
48 final PsiFile containingFile
= ((MethodHierarchyNodeDescriptor
)selectedDescriptor
).getPsiClass().getContainingFile();
49 if (containingFile
!= null) {
50 final VirtualFile vFile
= containingFile
.getVirtualFile();
56 final ReadonlyStatusHandler
.OperationStatus status
= ReadonlyStatusHandler
.getInstance(project
).ensureFilesWritable(files
.toArray(new VirtualFile
[files
.size()]));
57 if (!status
.hasReadonlyFiles()) {
58 for (HierarchyNodeDescriptor selectedDescriptor
: selectedDescriptors
) {
59 OverrideImplementUtil
.overrideOrImplement(((MethodHierarchyNodeDescriptor
)selectedDescriptor
).getPsiClass(), methodHierarchyBrowser
.getBaseMethod());
61 ToolWindowManager
.getInstance(project
).activateEditorComponent();
64 ApplicationManager
.getApplication().invokeLater(new Runnable() {
66 Messages
.showErrorDialog(project
, status
.getReadonlyFilesMessage(), commandName
);
72 catch(IncorrectOperationException e
){
76 }, commandName
, null);
81 public final void update(final AnActionEvent e
) {
82 final Presentation presentation
= e
.getPresentation();
83 final DataContext dataContext
= e
.getDataContext();
85 final MethodHierarchyBrowser methodHierarchyBrowser
= (MethodHierarchyBrowser
)dataContext
.getData(MethodHierarchyBrowser
.METHOD_HIERARCHY_BROWSER_DATA_CONSTANT
);
86 if (methodHierarchyBrowser
== null) {
87 presentation
.setEnabled(false);
88 presentation
.setVisible(false);
91 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
92 if (project
== null) {
93 presentation
.setEnabled(false);
94 presentation
.setVisible(false);
98 final HierarchyNodeDescriptor
[] selectedDescriptors
= methodHierarchyBrowser
.getSelectedDescriptors();
102 for (final HierarchyNodeDescriptor descriptor
: selectedDescriptors
) {
103 if (canImplementOverride((MethodHierarchyNodeDescriptor
)descriptor
, methodHierarchyBrowser
, true)) {
104 if (toOverride
> 0) {
105 // no mixed actions allowed
106 presentation
.setEnabled(false);
107 presentation
.setVisible(false);
112 else if (canImplementOverride((MethodHierarchyNodeDescriptor
)descriptor
, methodHierarchyBrowser
, false)) {
113 if (toImplement
> 0) {
114 // no mixed actions allowed
115 presentation
.setEnabled(false);
116 presentation
.setVisible(false);
122 // no action is applicable to this node
123 presentation
.setEnabled(false);
124 presentation
.setVisible(false);
129 presentation
.setVisible(true);
131 update(presentation
, toImplement
, toOverride
);
134 protected abstract void update(Presentation presentation
, int toImplement
, int toOverride
);
136 private static boolean canImplementOverride(final MethodHierarchyNodeDescriptor descriptor
, final MethodHierarchyBrowser methodHierarchyBrowser
, final boolean toImplement
) {
137 final PsiClass psiClass
= descriptor
.getPsiClass();
138 if (psiClass
== null || psiClass
instanceof JspClass
) return false;
139 final PsiMethod baseMethod
= methodHierarchyBrowser
.getBaseMethod();
140 if (baseMethod
== null) return false;
141 final MethodSignature signature
= baseMethod
.getSignature(PsiSubstitutor
.EMPTY
);
143 Collection
<MethodSignature
> allOriginalSignatures
= toImplement
144 ? OverrideImplementUtil
.getMethodSignaturesToImplement(psiClass
)
145 : OverrideImplementUtil
.getMethodSignaturesToOverride(psiClass
);
146 for (final MethodSignature originalSignature
: allOriginalSignatures
) {
147 if (originalSignature
.equals(signature
)) {