diff --git a/java/java-impl/src/com/intellij/lang/java/JavaRefactoringSupportProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaRefactoringSupportProvider.java index c6b29ae7a98f..e14e175978ce 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaRefactoringSupportProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaRefactoringSupportProvider.java @@ -27,6 +27,7 @@ import com.intellij.refactoring.changeSignature.JavaChangeSignatureHandler; import com.intellij.refactoring.extractInterface.ExtractInterfaceHandler; import com.intellij.refactoring.extractMethod.ExtractMethodHandler; import com.intellij.refactoring.extractSuperclass.ExtractSuperclassHandler; +import com.intellij.refactoring.extractclass.ExtractClassHandler; import com.intellij.refactoring.introduceField.IntroduceConstantHandler; import com.intellij.refactoring.introduceField.IntroduceFieldHandler; import com.intellij.refactoring.introduceParameter.IntroduceParameterHandler; @@ -91,6 +92,11 @@ public class JavaRefactoringSupportProvider extends RefactoringSupportProvider { return new JavaChangeSignatureHandler(); } + @Override + public RefactoringActionHandler getExtractClassHandler() { + return new ExtractClassHandler(); + } + public static boolean mayRenameInplace(PsiElement elementToRename, final PsiElement nameSuggestionContext) { if (!(elementToRename instanceof PsiVariable)) return false; if (nameSuggestionContext != null && nameSuggestionContext.getContainingFile() != elementToRename.getContainingFile()) return false; diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassHandler.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassHandler.java index a0df14bbc042..112afbe2df04 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassHandler.java @@ -25,16 +25,21 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactorJBundle; -import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.lang.ElementsHandler; import com.intellij.refactoring.util.CommonRefactoringUtil; import org.jetbrains.annotations.NotNull; -public class ExtractClassHandler implements RefactoringActionHandler { +public class ExtractClassHandler implements ElementsHandler { protected static String getHelpID() { return HelpID.ExtractClass; } + @Override + public boolean isEnabledOnElements(PsiElement[] elements) { + return elements.length == 1 && PsiTreeUtil.getParentOfType(elements[0], PsiClass.class, false) != null; + } + public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { final ScrollingModel scrollingModel = editor.getScrollingModel(); scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE); diff --git a/platform/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java b/platform/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java index 631069baf557..6cf28083cb2a 100644 --- a/platform/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java +++ b/platform/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java @@ -124,4 +124,13 @@ public abstract class RefactoringSupportProvider { public ChangeSignatureHandler getChangeSignatureHandler() { return null; } public boolean isInplaceRenameAvailable(PsiElement element, PsiElement context) { return false; } + + /** + * @return handler for extracting [delegate] class in this language + * @see com.intellij.refactoring.RefactoringActionHandler + */ + @Nullable + public RefactoringActionHandler getExtractClassHandler() { + return null; + } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/actions/ExtractClassAction.java b/platform/lang-impl/src/com/intellij/refactoring/actions/ExtractClassAction.java index c6ad8b7d3d06..131294bf6d53 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/actions/ExtractClassAction.java +++ b/platform/lang-impl/src/com/intellij/refactoring/actions/ExtractClassAction.java @@ -15,24 +15,31 @@ */ package com.intellij.refactoring.actions; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.psi.PsiClass; +import com.intellij.lang.Language; +import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.psi.PsiElement; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.RefactoringActionHandler; -import com.intellij.refactoring.extractclass.ExtractClassHandler; +import com.intellij.refactoring.lang.ElementsHandler; +import org.jetbrains.annotations.NotNull; -public class ExtractClassAction extends BaseRefactoringAction{ +public class ExtractClassAction extends BasePlatformRefactoringAction { - protected RefactoringActionHandler getHandler(DataContext context){ - return new ExtractClassHandler(); - } + @Override + protected RefactoringActionHandler getRefactoringHandler(@NotNull RefactoringSupportProvider provider) { + return provider.getExtractClassHandler(); + } public boolean isAvailableInEditorOnly(){ return false; } public boolean isEnabledOnElements(PsiElement[] elements) { - return elements.length == 1 && PsiTreeUtil.getParentOfType(elements[0], PsiClass.class, false) != null; + if (elements.length > 0) { + final Language language = elements[0].getLanguage(); + final RefactoringActionHandler handler = getRefactoringHandler(LanguageRefactoringSupport.INSTANCE.forLanguage(language)); + return handler instanceof ElementsHandler && ((ElementsHandler)handler).isEnabledOnElements(elements); + } + return false; } } diff --git a/platform/platform-resources/src/idea/LangActions.xml b/platform/platform-resources/src/idea/LangActions.xml index 8e71cac941f0..4875c00769f5 100644 --- a/platform/platform-resources/src/idea/LangActions.xml +++ b/platform/platform-resources/src/idea/LangActions.xml @@ -282,6 +282,7 @@ + diff --git a/resources/src/idea/IdeaActions.xml b/resources/src/idea/IdeaActions.xml index 0902e7662985..c96a93cce3f2 100644 --- a/resources/src/idea/IdeaActions.xml +++ b/resources/src/idea/IdeaActions.xml @@ -186,10 +186,6 @@ - - - -