/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.intentions; import com.intellij.codeInsight.CodeInsightUtilBase; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiEnumConstant; import com.intellij.psi.PsiFile; import gw.plugin.ij.codeInsight.GosuOverrideImplementUtil; import gw.plugin.ij.lang.psi.api.statements.typedef.IGosuTypeDefinition; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class GosuImplementMethodsFix extends LocalQuickFixAndIntentionActionOnPsiElement { public GosuImplementMethodsFix(PsiElement aClass) { super(aClass); } @NotNull @Override public String getText() { return QuickFixBundle.message("implement.methods.fix"); } @NotNull public String getFamilyName() { return QuickFixBundle.message("implement.methods.fix"); } @Override public boolean isAvailable(@NotNull Project project, @NotNull PsiFile file, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { PsiElement myPsiElement = startElement; return myPsiElement.isValid() && myPsiElement.getManager().isInProject(myPsiElement); } @Override public void invoke(@NotNull Project project, @NotNull PsiFile file, @Nullable("is null when called from inspection") final Editor editor, @NotNull PsiElement startElement, @NotNull PsiElement endElement) { final PsiElement myPsiElement = startElement; if (editor == null || !CodeInsightUtilBase.prepareFileForWrite(myPsiElement.getContainingFile())) { return; } if (myPsiElement instanceof PsiEnumConstant) { throw new UnsupportedOperationException("men at work"); // FeatureUsageTracker.getInstance().triggerFeatureUsed(ProductivityFeatureNames.CODEASSISTS_OVERRIDE_IMPLEMENT); // final TreeMap<MethodSignature, CandidateInfo> result = // new TreeMap<MethodSignature, CandidateInfo>(new OverrideImplementUtil.MethodSignatureComparator()); // final HashMap<MethodSignature, PsiMethod> abstracts = new HashMap<MethodSignature, PsiMethod>(); // for (PsiMethod method : ((PsiEnumConstant) myPsiElement).getContainingClass().getMethods()) { // if (method.hasModifierProperty(PsiModifier.ABSTRACT)) { // abstracts.put(method.getHierarchicalMethodSignature(), method); // } // } // final HashMap<MethodSignature, PsiMethod> finals = new HashMap<MethodSignature, PsiMethod>(); // final HashMap<MethodSignature, PsiMethod> concretes = new HashMap<MethodSignature, PsiMethod>(); // OverrideImplementUtil.collectMethodsToImplement(null, abstracts, finals, concretes, result); // // final MemberChooser<PsiMethodMember> chooser = // OverrideImplementUtil.showOverrideImplementChooser(editor, myPsiElement, true, result.values(), Collections.<CandidateInfo>emptyList()); // if (chooser == null) { // return; // } // // final List<PsiMethodMember> selectedElements = chooser.getSelectedElements(); // if (selectedElements == null || selectedElements.isEmpty()) { // return; // } // // new WriteCommandAction(project, file) { // protected void run(final Result result) throws Throwable { // final PsiClass psiClass = ImplementAbstractMethodHandler.addClassInitializer((PsiEnumConstant) myPsiElement); // OverrideImplementUtil.overrideOrImplementMethodsInRightPlace(editor, psiClass, selectedElements, chooser.isCopyJavadoc(), // chooser.isInsertOverrideAnnotation()); // } // }.execute(); } else { PsiClass aClass = findOwningPsiClass(myPsiElement); if(aClass instanceof IGosuTypeDefinition) { IGosuTypeDefinition gosuPsiClass = (IGosuTypeDefinition) aClass; GosuOverrideImplementUtil.invokeOverrideImplement(editor, gosuPsiClass, true); } } } @NotNull private PsiClass findOwningPsiClass(PsiElement element) { PsiElement current = element; while(current != null && !(current instanceof PsiClass)) { current = current.getParent(); } return (PsiClass) current; } public boolean startInWriteAction() { return false; } }