2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.ide
.hierarchy
.method
;
18 import com
.intellij
.codeInsight
.generation
.OverrideImplementUtil
;
19 import com
.intellij
.ide
.hierarchy
.HierarchyNodeDescriptor
;
20 import com
.intellij
.ide
.hierarchy
.MethodHierarchyBrowserBase
;
21 import com
.intellij
.openapi
.actionSystem
.*;
22 import com
.intellij
.openapi
.application
.ApplicationManager
;
23 import com
.intellij
.openapi
.command
.CommandProcessor
;
24 import com
.intellij
.openapi
.diagnostic
.Logger
;
25 import com
.intellij
.openapi
.project
.Project
;
26 import com
.intellij
.openapi
.ui
.Messages
;
27 import com
.intellij
.openapi
.vfs
.ReadonlyStatusHandler
;
28 import com
.intellij
.openapi
.vfs
.VirtualFile
;
29 import com
.intellij
.openapi
.wm
.ToolWindowManager
;
30 import com
.intellij
.psi
.PsiClass
;
31 import com
.intellij
.psi
.PsiFile
;
32 import com
.intellij
.psi
.PsiMethod
;
33 import com
.intellij
.psi
.PsiSubstitutor
;
34 import com
.intellij
.psi
.impl
.source
.jsp
.jspJava
.JspClass
;
35 import com
.intellij
.psi
.util
.MethodSignature
;
36 import com
.intellij
.util
.IncorrectOperationException
;
38 import java
.util
.ArrayList
;
39 import java
.util
.Collection
;
40 import java
.util
.List
;
42 abstract class OverrideImplementMethodAction
extends AnAction
{
43 private static final Logger LOG
= Logger
.getInstance("#com.intellij.ide.hierarchy.method.OverrideImplementMethodAction");
45 public final void actionPerformed(final AnActionEvent event
) {
46 final DataContext dataContext
= event
.getDataContext();
47 final MethodHierarchyBrowser methodHierarchyBrowser
= (MethodHierarchyBrowser
)dataContext
.getData(MethodHierarchyBrowserBase
.METHOD_HIERARCHY_BROWSER_DATA_KEY
);
48 if (methodHierarchyBrowser
== null) return;
49 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
50 if (project
== null) return;
52 final String commandName
= event
.getPresentation().getText();
53 ApplicationManager
.getApplication().runWriteAction(new Runnable() {
55 CommandProcessor
.getInstance().executeCommand(project
, new Runnable() {
59 final HierarchyNodeDescriptor
[] selectedDescriptors
= methodHierarchyBrowser
.getSelectedDescriptors();
60 if (selectedDescriptors
.length
> 0) {
61 final List
<VirtualFile
> files
= new ArrayList
<VirtualFile
>(selectedDescriptors
.length
);
62 for (HierarchyNodeDescriptor selectedDescriptor
: selectedDescriptors
) {
63 final PsiFile containingFile
= ((MethodHierarchyNodeDescriptor
)selectedDescriptor
).getPsiClass().getContainingFile();
64 if (containingFile
!= null) {
65 final VirtualFile vFile
= containingFile
.getVirtualFile();
71 final ReadonlyStatusHandler
.OperationStatus status
= ReadonlyStatusHandler
.getInstance(project
).ensureFilesWritable(files
.toArray(new VirtualFile
[files
.size()]));
72 if (!status
.hasReadonlyFiles()) {
73 for (HierarchyNodeDescriptor selectedDescriptor
: selectedDescriptors
) {
74 OverrideImplementUtil
.overrideOrImplement(((MethodHierarchyNodeDescriptor
)selectedDescriptor
).getPsiClass(), methodHierarchyBrowser
.getBaseMethod());
76 ToolWindowManager
.getInstance(project
).activateEditorComponent();
79 ApplicationManager
.getApplication().invokeLater(new Runnable() {
81 Messages
.showErrorDialog(project
, status
.getReadonlyFilesMessage(), commandName
);
87 catch(IncorrectOperationException e
){
91 }, commandName
, null);
96 public final void update(final AnActionEvent e
) {
97 final Presentation presentation
= e
.getPresentation();
98 final DataContext dataContext
= e
.getDataContext();
100 final MethodHierarchyBrowser methodHierarchyBrowser
= (MethodHierarchyBrowser
)dataContext
.getData(MethodHierarchyBrowser
.METHOD_HIERARCHY_BROWSER_DATA_KEY
);
101 if (methodHierarchyBrowser
== null) {
102 presentation
.setEnabled(false);
103 presentation
.setVisible(false);
106 final Project project
= PlatformDataKeys
.PROJECT
.getData(dataContext
);
107 if (project
== null) {
108 presentation
.setEnabled(false);
109 presentation
.setVisible(false);
113 final HierarchyNodeDescriptor
[] selectedDescriptors
= methodHierarchyBrowser
.getSelectedDescriptors();
117 for (final HierarchyNodeDescriptor descriptor
: selectedDescriptors
) {
118 if (canImplementOverride((MethodHierarchyNodeDescriptor
)descriptor
, methodHierarchyBrowser
, true)) {
119 if (toOverride
> 0) {
120 // no mixed actions allowed
121 presentation
.setEnabled(false);
122 presentation
.setVisible(false);
127 else if (canImplementOverride((MethodHierarchyNodeDescriptor
)descriptor
, methodHierarchyBrowser
, false)) {
128 if (toImplement
> 0) {
129 // no mixed actions allowed
130 presentation
.setEnabled(false);
131 presentation
.setVisible(false);
137 // no action is applicable to this node
138 presentation
.setEnabled(false);
139 presentation
.setVisible(false);
144 presentation
.setVisible(true);
146 update(presentation
, toImplement
, toOverride
);
149 protected abstract void update(Presentation presentation
, int toImplement
, int toOverride
);
151 private static boolean canImplementOverride(final MethodHierarchyNodeDescriptor descriptor
, final MethodHierarchyBrowser methodHierarchyBrowser
, final boolean toImplement
) {
152 final PsiClass psiClass
= descriptor
.getPsiClass();
153 if (psiClass
== null || psiClass
instanceof JspClass
) return false;
154 final PsiMethod baseMethod
= methodHierarchyBrowser
.getBaseMethod();
155 if (baseMethod
== null) return false;
156 final MethodSignature signature
= baseMethod
.getSignature(PsiSubstitutor
.EMPTY
);
158 Collection
<MethodSignature
> allOriginalSignatures
= toImplement
159 ? OverrideImplementUtil
.getMethodSignaturesToImplement(psiClass
)
160 : OverrideImplementUtil
.getMethodSignaturesToOverride(psiClass
);
161 for (final MethodSignature originalSignature
: allOriginalSignatures
) {
162 if (originalSignature
.equals(signature
)) {