Hierarchy providers refactored
[fedora-idea.git] / source / com / intellij / ide / hierarchy / method / OverrideImplementMethodAction.java
blob2f7e5ef8003655d5545d535ae7e9960578237845
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_KEY);
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() {
39 public void run() {
40 CommandProcessor.getInstance().executeCommand(project, new Runnable() {
41 public void run() {
43 try{
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();
51 if (vFile != null) {
52 files.add(vFile);
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();
63 else {
64 ApplicationManager.getApplication().invokeLater(new Runnable() {
65 public void run() {
66 Messages.showErrorDialog(project, status.getReadonlyFilesMessage(), commandName);
68 });
72 catch(IncorrectOperationException e){
73 LOG.error(e);
76 }, commandName, null);
78 });
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_KEY);
86 if (methodHierarchyBrowser == null) {
87 presentation.setEnabled(false);
88 presentation.setVisible(false);
89 return;
91 final Project project = PlatformDataKeys.PROJECT.getData(dataContext);
92 if (project == null) {
93 presentation.setEnabled(false);
94 presentation.setVisible(false);
95 return;
98 final HierarchyNodeDescriptor[] selectedDescriptors = methodHierarchyBrowser.getSelectedDescriptors();
99 int toImplement = 0;
100 int toOverride = 0;
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);
108 return;
110 toImplement++;
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);
117 return;
119 toOverride++;
121 else {
122 // no action is applicable to this node
123 presentation.setEnabled(false);
124 presentation.setVisible(false);
125 return;
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)) {
148 return true;
152 return false;