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 @@
-
-