diff --git a/python/educational-core/student/resources/META-INF/plugin.xml b/python/educational-core/student/resources/META-INF/plugin.xml
index 7bc361944f2e..9b25c93ab323 100644
--- a/python/educational-core/student/resources/META-INF/plugin.xml
+++ b/python/educational-core/student/resources/META-INF/plugin.xml
@@ -32,6 +32,7 @@
+
diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyActionProvider.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyActionProvider.java
new file mode 100644
index 000000000000..b40a796175fa
--- /dev/null
+++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyActionProvider.java
@@ -0,0 +1,15 @@
+package com.jetbrains.edu.learning;
+
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface StudyActionProvider {
+ ExtensionPointName EP_NAME = ExtensionPointName.create("Edu.studyActionProvider");
+
+ @Nullable
+ DefaultActionGroup getActionGroup(@NotNull Project project);
+
+}
diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java
index 5b597aabf265..b114fdd9ff17 100644
--- a/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java
+++ b/python/educational-core/student/src/com/jetbrains/edu/learning/ui/StudyToolWindow.java
@@ -35,8 +35,10 @@ import com.intellij.ui.components.JBScrollPane;
import com.intellij.util.ui.JBUI;
import com.intellij.util.ui.UIUtil;
import com.jetbrains.edu.EduNames;
+import com.jetbrains.edu.courseFormat.Course;
import com.jetbrains.edu.courseFormat.Task;
import com.jetbrains.edu.courseFormat.TaskFile;
+import com.jetbrains.edu.learning.StudyActionProvider;
import com.jetbrains.edu.learning.StudyTaskManager;
import com.jetbrains.edu.learning.StudyUtils;
import com.jetbrains.edu.learning.actions.*;
@@ -116,18 +118,38 @@ public class StudyToolWindow extends SimpleToolWindowPanel implements DataProvid
}
private static JPanel createToolbarPanel(@NotNull final Project project) {
+ final DefaultActionGroup group = getActionGroup(project);
+
+ final ActionToolbar actionToolBar = ActionManager.getInstance().createActionToolbar("Study", group, true);
+ return JBUI.Panels.simplePanel(actionToolBar.getComponent());
+ }
+
+ private static DefaultActionGroup getActionGroup(@NotNull final Project project) {
+ StudyActionProvider[] extensions = StudyActionProvider.EP_NAME.getExtensions();
+ DefaultActionGroup actionGroup = null;
+ Course course = StudyTaskManager.getInstance(project).getCourse();
+ if (course == null) {
+ return createDefaultActionGroup(project);
+ }
+ for (StudyActionProvider actionProvider: extensions) {
+ actionGroup = actionProvider.getActionGroup(project);
+ if (actionGroup != null) break;
+ }
+
+ return actionGroup == null ? createDefaultActionGroup(project) : actionGroup;
+ }
+
+ @NotNull
+ private static DefaultActionGroup createDefaultActionGroup(@NotNull Project project) {
final DefaultActionGroup group = new DefaultActionGroup();
group.add(StudyCheckAction.createCheckAction(StudyTaskManager.getInstance(project).getCourse()));
group.add(new StudyPreviousStudyTaskAction());
group.add(new StudyNextStudyTaskAction());
group.add(new StudyRefreshTaskFileAction());
group.add(new StudyShowHintAction());
-
group.add(new StudyRunAction());
group.add(new StudyEditInputAction());
-
- final ActionToolbar actionToolBar = ActionManager.getInstance().createActionToolbar("Study", group, true);
- return JBUI.Panels.simplePanel(actionToolBar.getComponent());
+ return group;
}
static class StudyFileEditorManagerListener implements FileEditorManagerListener {
diff --git a/python/educational-python/student-python/resources/META-INF/plugin.xml b/python/educational-python/student-python/resources/META-INF/plugin.xml
index 8638261999fb..b349e508405b 100644
--- a/python/educational-python/student-python/resources/META-INF/plugin.xml
+++ b/python/educational-python/student-python/resources/META-INF/plugin.xml
@@ -32,6 +32,7 @@
+