package de.jigp.plugin;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiAnonymousClass;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementFactory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.util.PsiTreeUtil;
public class PsiHelper {
private final Project project;
private PsiElementFactory elementFactory;
public PsiHelper(Project project) {
this.project = project;
}
public PsiHelper(DataContext dataContext) {
project = DataKeys.PROJECT.getData(dataContext);
}
public Project getProject() {
return project;
}
public Module getModule(DataContext dataContext) {
return DataKeys.MODULE.getData(dataContext);
}
public Editor getEditor() {
return FileEditorManager.getInstance(getProject()).getSelectedTextEditor();
}
public PsiElement findElementAtCursorPosition() {
return getSelectedJavaFile().findElementAt(getEditor().getCaretModel().getOffset());
}
public PsiJavaFile getSelectedJavaFile() {
PsiFile psiFile = getCurrentFile();
if (!(psiFile instanceof PsiJavaFile)) {
return null;
} else {
return (PsiJavaFile) psiFile;
}
}
public PsiFile getCurrentFile() {
Editor editor = getEditor();
if (editor == null) {
return null;
}
VirtualFile vFile = FileDocumentManager.getInstance().getFile(editor.getDocument());
return getPsiManager().findFile(vFile);
}
public PsiJavaFile getCurrentJavaFile() {
return (PsiJavaFile) getCurrentFile();
}
private PsiElement getPsiElement() {
return getCurrentFile().findElementAt(getEditor().getCaretModel().getOffset());
}
public PsiElementFactory getElementFactory() {
return elementFactory;
}
public CodeStyleManager getCodeStyleManager() {
return getPsiManager().getCodeStyleManager();
}
public PsiElement getCurrentElement() {
PsiElement psiElement = getPsiElement();
return (psiElement != null) ? psiElement : getCurrentElementFromEditor();
}
public PsiClass getCurrentClass() {
return findClass(getCurrentElement());
}
public PsiManager getPsiManager() {
return PsiManager.getInstance(getProject());
}
private PsiElement getCurrentElementFromEditor() {
Editor editor = getEditor();
PsiFile psiFile = getCurrentFile();
if (editor != null && psiFile != null) {
return psiFile.findElementAt(editor.getCaretModel().getOffset());
}
return null;
}
public PsiClass findClass(PsiElement element) {
PsiClass psiClass = (element instanceof PsiClass) ? (PsiClass) element : PsiTreeUtil.getParentOfType(element, PsiClass.class);
if (psiClass != null && psiClass.getContainingClass() instanceof PsiAnonymousClass) {
return findClass(psiClass.getParent());
}
return psiClass;
}
public PsiMethod findMethodByName(PsiClass clazz, String name) {
PsiMethod[] methods = clazz.getMethods();
for (PsiMethod method : methods) {
if (name.equals(method.getName()))
return method;
}
return null;
}
public static PsiMethod findParentMethod(PsiElement elem) {
if (elem == null) {
return null;
} else if (elem instanceof PsiMethod) {
return (PsiMethod) elem;
}
return findParentMethod(elem.getParent());
}
public void setElementFactory(PsiElementFactory elementFactory) {
this.elementFactory = elementFactory;
}
}