package de.jigp.plugin.actions.menu; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataKeys; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiClass; public abstract class HandleAnnotatedClassAction extends AnAction { private DataContext dataContext; public void actionPerformed(AnActionEvent actionEvent) { dataContext = actionEvent.getDataContext(); Project project = DataKeys.PROJECT.getData(dataContext); final Application application = ApplicationManager.getApplication(); Runnable runnable = new Runnable() { public void run() { Computable<PsiClass> psiClassComputable = createComputable(dataContext); application.runWriteAction(psiClassComputable); } }; CommandProcessor.getInstance().executeCommand(project, runnable, null, null); } protected Computable<PsiClass> createComputable(DataContext dataContext) { return new FindAndHandleClassComputable(dataContext, this, getAnnotationName(), getTargetClassChooser(dataContext)); } protected abstract String getAnnotationName(); protected abstract void handleClass(DataContext dataContext, PsiClass annotatedClass, String targetClassSuffix); protected abstract DetermineTargetClassChooser getTargetClassChooser(DataContext dataContext); }