diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBaseToolWindowConfigurator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBaseToolWindowConfigurator.java new file mode 100644 index 000000000000..1790b7ecd3eb --- /dev/null +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyBaseToolWindowConfigurator.java @@ -0,0 +1,90 @@ +package com.jetbrains.edu.learning; + +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.FileEditorManagerEvent; +import com.intellij.openapi.fileEditor.FileEditorManagerListener; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.courseFormat.Task; +import com.jetbrains.edu.courseFormat.TaskFile; +import com.jetbrains.edu.learning.actions.*; +import com.jetbrains.edu.learning.ui.StudyToolWindow; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.util.Collections; +import java.util.Map; + +public abstract class StudyBaseToolWindowConfigurator implements StudyToolWindowConfigurator { + @NotNull + @Override + public DefaultActionGroup getActionGroup(Project project) { + final DefaultActionGroup group = new DefaultActionGroup(); + group.add(new StudyPreviousStudyTaskAction()); + group.add(new StudyNextStudyTaskAction()); + group.add(new StudyRefreshTaskFileAction()); + group.add(new StudyShowHintAction()); + + group.add(new StudyRunAction()); + group.add(new StudyEditInputAction()); + return group; + } + + @NotNull + @Override + public Map getAdditionalPanels(Project project) { + return Collections.emptyMap(); + } + + @NotNull + @Override + public FileEditorManagerListener getFileEditorManagerListener(@NotNull Project project, @NotNull StudyToolWindow toolWindow) { + + return new FileEditorManagerListener() { + + private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description"; + + @Override + public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { + Task task = getTask(file); + setTaskText(task, file.getParent()); + } + + @Override + public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { + toolWindow.setTaskText(EMPTY_TASK_TEXT); + } + + @Override + public void selectionChanged(@NotNull FileEditorManagerEvent event) { + VirtualFile file = event.getNewFile(); + if (file != null) { + Task task = getTask(file); + setTaskText(task, file.getParent()); + } + } + + @Nullable + private Task getTask(@NotNull VirtualFile file) { + TaskFile taskFile = StudyUtils.getTaskFile(project, file); + if (taskFile != null) { + return taskFile.getTask(); + } + else { + return null; + } + } + + private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { + String text = StudyUtils.getTaskTextFromTask(task, taskDirectory); + if (text == null) { + toolWindow.setTaskText(EMPTY_TASK_TEXT); + return; + } + toolWindow.setTaskText(text); + } + }; + } +} diff --git a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java index fd2cc7edad1d..c1440eab9aa9 100644 --- a/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java +++ b/python/educational-core/student/src/com/jetbrains/edu/learning/StudyToolWindowConfigurator.java @@ -4,24 +4,38 @@ import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; -import com.intellij.util.containers.HashMap; import com.jetbrains.edu.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import java.util.Map; public interface StudyToolWindowConfigurator { ExtensionPointName EP_NAME = ExtensionPointName.create("Edu.studyToolWindowConfigurator"); - + + /** + * Provide action group that should be placed on the tool window toolbar. + * @param project + * @return + */ @NotNull DefaultActionGroup getActionGroup(Project project); - + + /** + * Provide panels, that could be added to Task tool window. + * @param project + * @return Map from panel id, i.e. "Task description", to panel itself. + */ @NotNull - HashMap getAdditionalPanels(Project project); + Map getAdditionalPanels(Project project); @NotNull FileEditorManagerListener getFileEditorManagerListener(@NotNull final Project project, @NotNull final StudyToolWindow toolWindow); - + + /** + * + * @return parameter for CodeMirror script. Available languages: @see <@linktourl http://codemirror.net/mode/> + */ @NotNull String getDefaultHighlightingMode(); boolean accept(@NotNull final 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 a725f81da680..f9ebe579e376 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 @@ -28,7 +28,6 @@ import com.intellij.openapi.ui.SimpleToolWindowPanel; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.JBCardLayout; import com.intellij.ui.OnePixelSplitter; -import com.intellij.util.containers.HashMap; import com.intellij.util.ui.JBUI; import com.jetbrains.edu.courseFormat.Course; import com.jetbrains.edu.courseFormat.Task; @@ -37,7 +36,6 @@ import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyToolWindowConfigurator; import com.jetbrains.edu.learning.StudyUtils; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -72,16 +70,16 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D setContent(mySplitPane); - StudyToolWindowConfigurator configurator = getStudyToolWindowConfigurator(project); + StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project); assert configurator != null; final FileEditorManagerListener listener = configurator.getFileEditorManagerListener(project, this); project.getMessageBus().connect().subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener); } private void addAdditionalPanels(Project project) { - StudyToolWindowConfigurator configurator = getStudyToolWindowConfigurator(project); + StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project); assert configurator != null; - HashMap panels = configurator.getAdditionalPanels(project); + Map panels = configurator.getAdditionalPanels(project); for (Map.Entry entry: panels.entrySet()) { myContentPanel.add(entry.getKey(), entry.getValue()); } @@ -155,22 +153,11 @@ public abstract class StudyToolWindow extends SimpleToolWindowPanel implements D LOG.warn("Course is null"); return new DefaultActionGroup(); } - StudyToolWindowConfigurator configurator = getStudyToolWindowConfigurator(project); + StudyToolWindowConfigurator configurator = StudyUtils.getConfigurator(project); assert configurator != null; return configurator.getActionGroup(project); } public abstract void setTaskText(String text) ; - - @Nullable - private static StudyToolWindowConfigurator getStudyToolWindowConfigurator(@NotNull Project project) { - StudyToolWindowConfigurator[] extensions = StudyToolWindowConfigurator.EP_NAME.getExtensions(); - for (StudyToolWindowConfigurator extension: extensions) { - if (extension.accept(project)) { - return extension; - } - } - return null; - } } diff --git a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java index 21e24aeb810c..1a0459b83527 100644 --- a/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java +++ b/python/educational-python/student-python/src/com/jetbrains/edu/learning/PyStudyToolWindowConfigurator.java @@ -1,95 +1,20 @@ package com.jetbrains.edu.learning; import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.FileEditorManagerEvent; -import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.containers.HashMap; import com.jetbrains.edu.courseFormat.Course; -import com.jetbrains.edu.courseFormat.Task; -import com.jetbrains.edu.courseFormat.TaskFile; -import com.jetbrains.edu.learning.actions.*; -import com.jetbrains.edu.learning.ui.StudyToolWindow; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import javax.swing.*; - -public class PyStudyToolWindowConfigurator implements StudyToolWindowConfigurator { +public class PyStudyToolWindowConfigurator extends StudyBaseToolWindowConfigurator { @NotNull @Override public DefaultActionGroup getActionGroup(Project project) { - final DefaultActionGroup group = new DefaultActionGroup(); + final DefaultActionGroup group = super.getActionGroup(project); group.add(new PyStudyCheckAction()); - group.add(new StudyPreviousStudyTaskAction()); - group.add(new StudyNextStudyTaskAction()); - group.add(new StudyRefreshTaskFileAction()); - group.add(new StudyShowHintAction()); - - group.add(new StudyRunAction()); - group.add(new StudyEditInputAction()); return group; } - @NotNull - @Override - public HashMap getAdditionalPanels(Project project) { - return new HashMap<>(); - } - - @NotNull - @Override - public FileEditorManagerListener getFileEditorManagerListener(@NotNull Project project, - @NotNull StudyToolWindow studyToolWindow) { - return new FileEditorManagerListener() { - - private static final String EMPTY_TASK_TEXT = "Please, open any task to see task description"; - - @Override - public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - Task task = getTask(file); - setTaskText(task, file.getParent()); - } - - @Override - public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - studyToolWindow.setTaskText(EMPTY_TASK_TEXT); - } - - @Override - public void selectionChanged(@NotNull FileEditorManagerEvent event) { - VirtualFile file = event.getNewFile(); - if (file != null) { - Task task = getTask(file); - setTaskText(task, file.getParent()); - } - } - - @Nullable - private Task getTask(@NotNull VirtualFile file) { - TaskFile taskFile = StudyUtils.getTaskFile(project, file); - if (taskFile != null) { - return taskFile.getTask(); - } - else { - return null; - } - } - - private void setTaskText(@Nullable final Task task, @Nullable final VirtualFile taskDirectory) { - String text = StudyUtils.getTaskTextFromTask(task, taskDirectory); - if (text == null) { - studyToolWindow.setTaskText(EMPTY_TASK_TEXT); - return; - } - studyToolWindow.setTaskText(text); - } - }; - } - @NotNull @Override public String getDefaultHighlightingMode() { @@ -98,7 +23,9 @@ public class PyStudyToolWindowConfigurator implements StudyToolWindowConfigurato @Override public boolean accept(@NotNull Project project) { - Course course = StudyTaskManager.getInstance(project).getCourse(); - return course != null && course.getLanguage().equals("Python") && course.getCourseType().equals("PyCharm"); + StudyTaskManager taskManager = StudyTaskManager.getInstance(project); + if (taskManager == null) return false; + Course course = taskManager.getCourse(); + return course != null && "Python".equals(course.getLanguage()) && "PyCharm".equals(course.getCourseType()); } }