package de.plushnikov.intellij.plugin.action;
import com.intellij.codeInsight.CodeInsightUtilBase;
import com.intellij.codeInsight.generation.ClassMember;
import com.intellij.codeInsight.generation.EncapsulatableClassMember;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
import com.intellij.codeInsight.hint.HintManager;
import com.intellij.ide.util.MemberChooser;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiFile;
import java.util.List;
/**
* Date: 15.12.13 Time: 23:06
*/
public abstract class BaseRefactorHandler implements Runnable {
protected final Project project;
protected final Editor editor;
protected final MemberChooser<ClassMember> chooser;
public BaseRefactorHandler(DataContext dataContext, Project project) {
this.project = project;
editor = PlatformDataKeys.EDITOR.getData(dataContext);
PsiFile psiFile = DataKeys.PSI_FILE.getData(dataContext);
PsiClass psiClass = OverrideImplementUtil.getContextClass(project, editor, psiFile, false);
List<EncapsulatableClassMember> classMembers = getEncapsulatableClassMembers(psiClass);
chooser = new MemberChooser<ClassMember>(
classMembers.toArray(new ClassMember[classMembers.size()]), true, true, project);
chooser.setTitle(getChooserTitle());
chooser.setCopyJavadocVisible(false);
}
public boolean processChooser() {
chooser.show();
List<ClassMember> selectedElements = chooser.getSelectedElements();
if (selectedElements == null) {
HintManager.getInstance().showErrorHint(editor, getNothingFoundMessage());
return false;
}
if (selectedElements.isEmpty()) {
HintManager.getInstance().showErrorHint(editor, getNothingAcceptedMessage());
return false;
}
return true;
}
protected abstract String getChooserTitle();
protected abstract String getNothingFoundMessage();
protected abstract String getNothingAcceptedMessage();
protected abstract List<EncapsulatableClassMember> getEncapsulatableClassMembers(PsiClass psiClass);
@Override
public void run() {
if (!CodeInsightUtilBase.prepareEditorForWrite(editor)) {
return;
}
if (!FileDocumentManager.getInstance().requestWriting(editor.getDocument(), project)) {
return;
}
process(chooser.getSelectedElements());
}
protected abstract void process(List<ClassMember> classMembers);
}