diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java new file mode 100644 index 000000000000..be3695794db6 --- /dev/null +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java @@ -0,0 +1,55 @@ +package com.jetbrains.edu.learning.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.KeyboardShortcut; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.keymap.KeymapUtil; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.util.Ref; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.checker.StudyCheckUtils; +import icons.InteractiveLearningIcons; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; + +public abstract class StudyCheckAction extends StudyToolbarAction { + public static final String SHORTCUT = "ctrl alt pressed ENTER"; + + protected Ref myCheckInProgress = new Ref<>(false); + + public StudyCheckAction() { + super("Check Task (" + KeymapUtil.getShortcutText(new KeyboardShortcut(KeyStroke.getKeyStroke(SHORTCUT), null)) + ")", "Check current task", InteractiveLearningIcons.Resolve); + } + + public abstract void check(@NotNull final Project project); + + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + return; + } + if (DumbService.isDumb(project)) { + StudyCheckUtils.showTestResultPopUp("Checking is not available while indexing is in progress", MessageType.WARNING.getPopupBackground(), project); + return; + } + check(project); + } + + @Override + public void update(AnActionEvent e) { + final Presentation presentation = e.getPresentation(); + StudyUtils.updateAction(e); + if (presentation.isEnabled()) { + presentation.setEnabled(!myCheckInProgress.get()); + } + } + + @Override + public String[] getShortcuts() { + return new String[] {SHORTCUT}; + } +} diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java index cc7742e9981b..1cd6548274f3 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java @@ -6,6 +6,7 @@ import com.intellij.openapi.keymap.KeymapUtil; import com.jetbrains.edu.learning.courseFormat.Task; import com.jetbrains.edu.learning.navigation.StudyNavigator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -28,11 +29,13 @@ public class StudyNextStudyTaskAction extends StudyTaskNavigationAction { return StudyNavigator.nextTask(sourceTask); } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java index 5380d96de17b..01fd8dcbceec 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java @@ -4,6 +4,7 @@ import com.intellij.icons.AllIcons; import com.jetbrains.edu.learning.courseFormat.AnswerPlaceholder; import com.jetbrains.edu.learning.StudyUtils; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -30,11 +31,13 @@ public class StudyNextWindowAction extends StudyWindowNavigationAction { return null; } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT, SHORTCUT2}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java index 717a287e8946..572d1c26b69d 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java @@ -32,11 +32,13 @@ public class StudyPrevWindowAction extends StudyWindowNavigationAction { return null; } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java index 4ddfd57691be..653f00fd4b7d 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java @@ -7,6 +7,7 @@ import com.jetbrains.edu.learning.courseFormat.Task; import com.jetbrains.edu.learning.navigation.StudyNavigator; import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -28,11 +29,13 @@ public class StudyPreviousStudyTaskAction extends StudyTaskNavigationAction { return StudyNavigator.previousTask(sourceTask); } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java index 4fcf9fd0c3ae..110feeee370f 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java @@ -10,7 +10,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.keymap.KeymapUtil; -import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; @@ -30,10 +29,11 @@ import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.editor.StudyEditor; import com.jetbrains.edu.learning.navigation.StudyNavigator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; -public class StudyRefreshTaskFileAction extends StudyToolbarAction implements DumbAware { +public class StudyRefreshTaskFileAction extends StudyToolbarAction { public static final String ACTION_ID = "RefreshTaskAction"; public static final String SHORTCUT = "ctrl shift pressed X"; private static final Logger LOG = Logger.getInstance(StudyRefreshTaskFileAction.class.getName()); @@ -164,11 +164,13 @@ public class StudyRefreshTaskFileAction extends StudyToolbarAction implements Du } } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java index 13e540091a3e..25642dc0cf87 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java @@ -7,7 +7,6 @@ import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.keymap.KeymapUtil; -import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -22,10 +21,11 @@ import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.swing.*; -public class StudyShowHintAction extends StudyToolbarAction implements DumbAware { +public class StudyShowHintAction extends StudyToolbarAction { public static final String ACTION_ID = "ShowHintAction"; public static final String SHORTCUT = "ctrl pressed 7"; private static final String ourWarningMessage = "Put the caret in the answer placeholder to get hint"; @@ -90,11 +90,13 @@ public class StudyShowHintAction extends StudyToolbarAction implements DumbAware StudyUtils.updateAction(e); } + @NotNull @Override public String getActionId() { return ACTION_ID; } + @Nullable @Override public String[] getShortcuts() { return new String[]{SHORTCUT}; diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java index 5b041dff128c..580bc3557d64 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java @@ -3,7 +3,6 @@ package com.jetbrains.edu.learning.actions; import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.popup.Balloon; @@ -28,7 +27,7 @@ import javax.swing.tree.TreePath; import java.util.Map; -abstract public class StudyTaskNavigationAction extends StudyToolbarAction implements DumbAware { +abstract public class StudyTaskNavigationAction extends StudyToolbarAction { public StudyTaskNavigationAction(@Nullable String text, @Nullable String description, @Nullable Icon icon) { super(text, description, icon); } diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyToolbarAction.java b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyToolbarAction.java index e4bd3d08c14b..a74e547984ef 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyToolbarAction.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/actions/StudyToolbarAction.java @@ -1,16 +1,19 @@ package com.jetbrains.edu.learning.actions; -import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.project.DumbAwareAction; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -public abstract class StudyToolbarAction extends AnAction { +public abstract class StudyToolbarAction extends DumbAwareAction { public StudyToolbarAction(@Nullable String text, @Nullable String description, @Nullable Icon icon) { super(text, description, icon); } + @NotNull public abstract String getActionId(); + @Nullable public abstract String[] getShortcuts(); } diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java index 0188a46a2048..43f5fc5645f4 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyCheckAction.java @@ -2,22 +2,16 @@ package com.jetbrains.edu.learning; import com.intellij.execution.ExecutionException; import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.KeyboardShortcut; -import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.progress.ProgressManager; -import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; +import com.jetbrains.edu.learning.actions.StudyCheckAction; import com.jetbrains.edu.learning.actions.StudyRunAction; -import com.jetbrains.edu.learning.actions.StudyToolbarAction; import com.jetbrains.edu.learning.checker.StudyCheckTask; import com.jetbrains.edu.learning.checker.StudyCheckUtils; import com.jetbrains.edu.learning.checker.StudyTestRunner; @@ -26,39 +20,16 @@ import com.jetbrains.edu.learning.courseFormat.StudyStatus; import com.jetbrains.edu.learning.courseFormat.Task; import com.jetbrains.edu.learning.courseFormat.TaskFile; import com.jetbrains.edu.learning.editor.StudyEditor; -import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; import java.util.Map; -public class PyStudyCheckAction extends StudyToolbarAction { +public class PyStudyCheckAction extends StudyCheckAction { private static final Logger LOG = Logger.getInstance(PyStudyCheckAction.class); - public static final String ACTION_ID = "PyCheckAction"; - public static final String SHORTCUT = "ctrl alt pressed ENTER"; - - protected Ref myCheckInProgress = new Ref<>(false); - - public PyStudyCheckAction() { - super("Check Task (" + KeymapUtil.getShortcutText(new KeyboardShortcut(KeyStroke.getKeyStroke(SHORTCUT), null)) + ")", "Check current task", InteractiveLearningIcons.Resolve); - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - Project project = e.getProject(); - if (project == null) { - return; - } - if (DumbService.isDumb(project)) { - StudyCheckUtils.showTestResultPopUp("Checking is not available while indexing is in progress", MessageType.WARNING.getPopupBackground(), project); - return; - } - check(project); - } - - protected void check(@NotNull Project project) { + + public void check(@NotNull Project project) { ApplicationManager.getApplication().runWriteAction(() -> { CommandProcessor.getInstance().runUndoTransparentAction(() -> { final StudyEditor selectedEditor = StudyUtils.getSelectedStudyEditor(project); @@ -161,25 +132,10 @@ public class PyStudyCheckAction extends StudyToolbarAction { } return taskVirtualFile; } - - - + + @NotNull @Override public String getActionId() { return ACTION_ID; } - - @Override - public String[] getShortcuts() { - return new String[]{SHORTCUT}; - } - - @Override - public void update(AnActionEvent e) { - final Presentation presentation = e.getPresentation(); - StudyUtils.updateAction(e); - if (presentation.isEnabled()) { - presentation.setEnabled(!myCheckInProgress.get()); - } - } }