package com.google.jstestdriver.idea.assertFramework.codeInsight;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class AbstractJsGenerateAction extends AnAction {
@NotNull
public abstract String getHumanReadableDescription();
public abstract boolean isEnabled(@NotNull GenerateActionContext context);
public abstract void actionPerformed(@NotNull GenerateActionContext context);
@Override
public final void actionPerformed(AnActionEvent e) {
final GenerateActionContext generateContext = fetchContext(e.getDataContext());
if (generateContext != null) {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
generateContext.getEditor().getSelectionModel().removeSelection();
}
});
actionPerformed(generateContext);
}
}
@Override
public final void update(AnActionEvent e) {
Presentation presentation = e.getPresentation();
GenerateActionContext generateContext = fetchContext(e.getDataContext());
boolean enabled = generateContext != null;
if (enabled) {
enabled = isEnabled(generateContext);
}
if (enabled) {
enabled = CommonRefactoringUtil.checkReadOnlyStatus(generateContext.getJsFile());
}
if (!enabled) {
presentation.setVisible(false);
return;
}
presentation.setVisible(true);
presentation.setText(getHumanReadableDescription(), true);
presentation.setEnabled(true);
}
@Nullable
private static GenerateActionContext fetchContext(DataContext dataContext) {
Editor editor = PlatformDataKeys.EDITOR.getData(dataContext);
if (editor == null) {
return null;
}
PsiFile psiFile = LangDataKeys.PSI_FILE.getData(dataContext);
if (!(psiFile instanceof JSFile)) {
return null;
}
return new GenerateActionContext((JSFile)psiFile, editor);
}
}