package com.intellij.refactoring; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.refactoring.lang.ElementsHandler; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.util.PsiNavigateUtil; import org.jetbrains.annotations.NotNull; /** * @author Dennis.Ushakov */ public abstract class ClassRefactoringHandlerBase implements RefactoringActionHandler, ElementsHandler { @Override public boolean isEnabledOnElements(PsiElement[] elements) { return elements.length == 1 && acceptsElement(elements[0]); } protected static void navigate(final PsiElement element) { PsiNavigateUtil.navigate(element); } @Override public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { int offset = editor.getCaretModel().getOffset(); editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); final PsiElement position = file.findElementAt(offset); PsiElement element = position; while (true) { if (element == null || element instanceof PsiFile) { String message = RefactoringBundle .getCannotRefactorMessage(getInvalidPositionMessage()); CommonRefactoringUtil.showErrorHint(project, editor, message, getTitle(), getHelpId()); return; } if (!CommonRefactoringUtil.checkReadOnlyStatus(project, element)) return; if (acceptsElement(element)) { invoke(project, new PsiElement[]{position}, dataContext); return; } element = element.getParent(); } } @Override public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) { final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext); final Editor editor = CommonDataKeys.EDITOR.getData(dataContext); showDialog(project, elements[0], editor, file, dataContext); } protected abstract boolean acceptsElement(PsiElement element); protected abstract void showDialog(Project project, PsiElement element, Editor editor, PsiFile file, DataContext dataContext); protected abstract String getHelpId(); protected abstract String getTitle(); protected abstract String getInvalidPositionMessage(); }