From 01c96de0b7530e3438005e24126d9178fd9fc660 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 14 Jan 2015 17:18:47 +0300 Subject: [PATCH] refactoring pycharm educational second iteration extracted interactive-learning (language independent) and interactive-learning-python modules --- .../learn-python/gen/icons/StudyIcons.java | 27 ---- python/edu/learn-python/learn-python.iml | 21 --- .../resources/META-INF/plugin.xml | 82 ----------- .../python/edu/StudyResourceManger.java | 5 - .../python/edu/actions/StudyRunAction.java | 96 ------------- python/edu/main_pycharm_edu.iml | 3 +- .../interactive-learning-python.iml | 18 +++ .../resources/META-INF/plugin.xml | 43 ++++++ .../com/jetbrains/python/edu/user_tester.py | 0 .../resources/courses/introduction_course.zip | Bin .../edu/learning}/EducationalProjectType.png | Bin .../learning}/EducationalProjectType@2x.png | Bin .../learning}/EducationalProjectType_dark.png | Bin .../EducationalProjectType_dark@2x.png | Bin .../PyStudyDirectoryProjectGenerator.java | 95 +++++++++++++ .../edu/learning/PyStudyTestRunner.java} | 40 +----- .../jetbrains/edu/learning/PyStudyUtils.java | 76 ++++++++++ .../PyStudyIntroductionCourseAction.java} | 18 +-- .../actions/PyStudyWatchTutorialAction.java} | 6 +- .../highlighting/PyStudyVisitorFilter.java} | 6 +- .../icons/InteractiveLearningPythonIcons.java | 17 +++ .../testData/course.json | 0 .../testData/helloworld.py | 0 .../tests/JsonParserTest.java | 23 +-- .../tests/StudyDocumentListenerTest.java | 6 +- .../tests/StudyTestCase.java | 0 .../coursecreator/CCProjectGeneratorUtil.java | 3 + .../interactive-learning.iml | 3 + .../resources/META-INF/plugin.xml | 74 ++++++++++ .../com/jetbrains/edu/learning}/Lesson.png | Bin .../com/jetbrains/edu/learning}/Lesson@2x.png | Bin .../jetbrains/edu/learning}/LessonComp@2x.png | Bin .../jetbrains/edu/learning}/LessonCompl.png | Bin .../com/jetbrains/edu/learning}/Sandbox.png | Bin .../jetbrains/edu/learning}/Sandbox@2x.png | Bin .../com/jetbrains/edu/learning}/Task.png | Bin .../com/jetbrains/edu/learning}/Task@2x.png | Bin .../jetbrains/edu/learning}/Task@2x_dark.png | Bin .../com/jetbrains/edu/learning}/TaskCompl.png | Bin .../jetbrains/edu/learning}/TaskCompl@2x.png | Bin .../edu/learning}/TaskCompl@2x_dark.png | Bin .../edu/learning}/TaskCompl_dark.png | Bin .../com/jetbrains/edu/learning}/TaskProbl.png | Bin .../jetbrains/edu/learning}/TaskProbl@2x.png | Bin .../edu/learning}/TaskProbl@2x_dark.png | Bin .../edu/learning}/TaskProbl_dark.png | Bin .../com/jetbrains/edu/learning}/Task_dark.png | Bin .../jetbrains/edu/learning}/WatchInput.png | Bin .../com/jetbrains/edu/learning}/prev.png | Bin .../com/jetbrains/edu/learning}/resolve.png | Bin .../jetbrains/edu/learning}/resolve_dark.png | Bin .../com/jetbrains/edu/learning}/showHint.png | Bin .../jetbrains/edu/learning}/showHint@2x.png | Bin .../edu/learning}/StudyDocumentListener.java | 6 +- .../learning}/StudyEditorFactoryListener.java | 8 +- .../learning}/StudyInitialConfigurator.java | 2 +- .../learning}/StudyInstructionPainter.java | 6 +- .../jetbrains/edu/learning}/StudyNames.java | 5 +- .../edu/learning/StudyProjectGenerator.java} | 132 ++++++------------ .../jetbrains/edu/learning}/StudyState.java | 8 +- .../edu/learning}/StudyTaskManager.java | 21 ++- .../edu/learning/StudyTestRunner.java | 38 +++++ .../jetbrains/edu/learning}/StudyUtils.java | 64 +++++++-- .../learning/StudyUtilsExtensionPoint.java | 46 ++++++ .../learning}/TaskWindowDeleteHandler.java | 2 +- .../learning}/actions/StudyCheckAction.java | 25 ++-- .../actions/StudyEditInputAction.java | 18 +-- .../actions/StudyNextStudyTaskAction.java | 6 +- .../actions/StudyNextWindowAction.java | 6 +- .../actions/StudyPrevWindowAction.java | 10 +- .../actions/StudyPreviousStudyTaskAction.java | 6 +- .../actions/StudyRefreshTaskFileAction.java | 12 +- .../edu/learning/actions/StudyRunAction.java | 82 +++++++++++ .../actions/StudyShowHintAction.java | 18 +-- .../actions/StudyTaskNavigationAction.java | 12 +- .../actions/StudyWindowNavigationAction.java | 12 +- .../edu/learning}/course/Course.java | 2 +- .../edu/learning}/course/CourseInfo.java | 2 +- .../edu/learning}/course/Lesson.java | 4 +- .../edu/learning}/course/LessonInfo.java | 2 +- .../edu/learning}/course/Stateful.java | 2 +- .../edu/learning}/course/StudyStatus.java | 2 +- .../jetbrains/edu/learning}/course/Task.java | 6 +- .../edu/learning}/course/TaskFile.java | 8 +- .../edu/learning}/course/TaskWindow.java | 8 +- .../edu/learning}/course/UserTest.java | 2 +- .../edu/learning}/editor/StudyEditor.java | 26 ++-- .../editor/StudyFileEditorProvider.java | 6 +- .../projectView/StudyDirectoryNode.java | 20 +-- .../StudyTreeStructureProvider.java | 10 +- .../edu/learning}/ui/StudyCondition.java | 4 +- .../learning}/ui/StudyNewProjectPanel.form | 2 +- .../learning}/ui/StudyNewProjectPanel.java | 17 +-- .../edu/learning}/ui/StudyProgressBar.java | 2 +- .../learning}/ui/StudyTestContentPanel.java | 4 +- .../learning}/ui/StudyToolWindowFactory.java | 12 +- 96 files changed, 796 insertions(+), 552 deletions(-) delete mode 100644 python/edu/learn-python/gen/icons/StudyIcons.java delete mode 100644 python/edu/learn-python/learn-python.iml delete mode 100644 python/edu/learn-python/resources/META-INF/plugin.xml delete mode 100644 python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java delete mode 100644 python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java create mode 100644 python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml rename python/{edu/learn-python => educational-python/interactive-learning-python}/resources/com/jetbrains/python/edu/user_tester.py (100%) rename python/{edu/learn-python => educational-python/interactive-learning-python}/resources/courses/introduction_course.zip (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning}/EducationalProjectType.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning}/EducationalProjectType@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning}/EducationalProjectType_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning}/EducationalProjectType_dark@2x.png (100%) create mode 100644 python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java rename python/{edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java => educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java} (62%) create mode 100644 python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java rename python/{edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java => educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java} (81%) rename python/{edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java => educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java} (74%) rename python/{edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java => educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java} (76%) create mode 100644 python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java rename python/{edu/learn-python => educational-python/interactive-learning-python}/testData/course.json (100%) rename python/{edu/learn-python => educational-python/interactive-learning-python}/testData/helloworld.py (100%) rename python/{edu/learn-python => educational-python/interactive-learning-python}/tests/JsonParserTest.java (63%) rename python/{edu/learn-python => educational-python/interactive-learning-python}/tests/StudyDocumentListenerTest.java (91%) rename python/{edu/learn-python => educational-python/interactive-learning-python}/tests/StudyTestCase.java (100%) create mode 100644 python/educational/interactive-learning/resources/META-INF/plugin.xml rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Lesson.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Lesson@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/LessonComp@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/LessonCompl.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Sandbox.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Sandbox@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Task.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Task@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Task@2x_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskCompl.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskCompl@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskCompl@2x_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskCompl_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskProbl.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskProbl@2x.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskProbl@2x_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/TaskProbl_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/Task_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/WatchInput.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/prev.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/resolve.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/resolve_dark.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/showHint.png (100%) rename python/{edu/learn-python/resources/icons/com/jetbrains/python/edu => educational/interactive-learning/resources/icons/com/jetbrains/edu/learning}/showHint@2x.png (100%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyDocumentListener.java (94%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyEditorFactoryListener.java (94%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyInitialConfigurator.java (98%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyInstructionPainter.java (95%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyNames.java (85%) rename python/{edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java => educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java} (87%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyState.java (88%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyTaskManager.java (95%) create mode 100644 python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/StudyUtils.java (76%) create mode 100644 python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/TaskWindowDeleteHandler.java (95%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyCheckAction.java (96%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyEditInputAction.java (94%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyNextStudyTaskAction.java (81%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyNextWindowAction.java (87%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyPrevWindowAction.java (75%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyPreviousStudyTaskAction.java (81%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyRefreshTaskFileAction.java (95%) create mode 100644 python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyShowHintAction.java (89%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyTaskNavigationAction.java (92%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/actions/StudyWindowNavigationAction.java (87%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/Course.java (98%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/CourseInfo.java (96%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/Lesson.java (97%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/LessonInfo.java (96%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/Stateful.java (73%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/StudyStatus.java (70%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/Task.java (98%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/TaskFile.java (97%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/TaskWindow.java (97%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/course/UserTest.java (94%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/editor/StudyEditor.java (95%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/editor/StudyFileEditorProvider.java (93%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/projectView/StudyDirectoryNode.java (89%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/projectView/StudyTreeStructureProvider.java (91%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyCondition.java (86%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyNewProjectPanel.form (98%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyNewProjectPanel.java (93%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyProgressBar.java (98%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyTestContentPanel.java (96%) rename python/{edu/learn-python/src/com/jetbrains/python/edu => educational/interactive-learning/src/com/jetbrains/edu/learning}/ui/StudyToolWindowFactory.java (91%) diff --git a/python/edu/learn-python/gen/icons/StudyIcons.java b/python/edu/learn-python/gen/icons/StudyIcons.java deleted file mode 100644 index f1db45d83e73..000000000000 --- a/python/edu/learn-python/gen/icons/StudyIcons.java +++ /dev/null @@ -1,27 +0,0 @@ -package icons; - -import com.intellij.openapi.util.IconLoader; - -import javax.swing.*; - -/** - * NOTE THIS FILE IS AUTO-GENERATED - * DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead - */ -public class StudyIcons { - private static Icon load(String path) { - return IconLoader.getIcon(path, StudyIcons.class); - } - - public static final Icon EducationalProjectType = load("/icons/com/jetbrains/python/edu/EducationalProjectType.png"); // 16x16 - public static final Icon Lesson = load("/icons/com/jetbrains/python/edu/Lesson.png"); // 16x16 - public static final Icon LessonCompl = load("/icons/com/jetbrains/python/edu/LessonCompl.png"); // 16x16 - public static final Icon Prev = load("/icons/com/jetbrains/python/edu/prev.png"); // 16x16 - public static final Icon Resolve = load("/icons/com/jetbrains/python/edu/resolve.png"); // 16x16 - public static final Icon Sandbox = load("/icons/com/jetbrains/python/edu/Sandbox.png"); // 16x16 - public static final Icon ShowHint = load("/icons/com/jetbrains/python/edu/showHint.png"); // 16x16 - public static final Icon Task = load("/icons/com/jetbrains/python/edu/Task.png"); // 16x16 - public static final Icon TaskCompl = load("/icons/com/jetbrains/python/edu/TaskCompl.png"); // 16x16 - public static final Icon TaskProbl = load("/icons/com/jetbrains/python/edu/TaskProbl.png"); // 16x16 - public static final Icon WatchInput = load("/icons/com/jetbrains/python/edu/WatchInput.png"); // 24x24 -} diff --git a/python/edu/learn-python/learn-python.iml b/python/edu/learn-python/learn-python.iml deleted file mode 100644 index f2b46e9e5479..000000000000 --- a/python/edu/learn-python/learn-python.iml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/python/edu/learn-python/resources/META-INF/plugin.xml b/python/edu/learn-python/resources/META-INF/plugin.xml deleted file mode 100644 index a8e99c9506ec..000000000000 --- a/python/edu/learn-python/resources/META-INF/plugin.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - com.jetbrains.python.edu.learn-python - Educational plugin for PyCharm - 1.2 - - - - - - - - - - - com.intellij.modules.lang - com.intellij.modules.python - - - - com.jetbrains.python.edu.StudyTaskManager - com.jetbrains.python.edu.StudyTaskManager - - - - - - com.jetbrains.python.edu.StudyInitialConfigurator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java b/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java deleted file mode 100644 index 38f1c2ff2cde..000000000000 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyResourceManger.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.jetbrains.python.edu; - -public interface StudyResourceManger { - String USER_TESTER = "user_tester.py"; -} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java deleted file mode 100644 index c1398a9a585a..000000000000 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRunAction.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.jetbrains.python.edu.actions; - -import com.intellij.execution.ExecutionException; -import com.intellij.execution.RunContentExecutor; -import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.OSProcessHandler; -import com.intellij.execution.process.ProcessHandler; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileEditor.FileDocumentManager; -import com.intellij.openapi.project.DumbAwareAction; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.projectRoots.Sdk; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.StudyResourceManger; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.editor.StudyEditor; -import com.jetbrains.python.run.PythonTracebackFilter; -import org.jetbrains.annotations.NotNull; - -import java.io.File; - -public class StudyRunAction extends DumbAwareAction { - private static final Logger LOG = Logger.getInstance(StudyRunAction.class.getName()); - public static final String ACTION_ID = "StudyRunAction"; - private ProcessHandler myHandler; - - public void run(@NotNull final Project project, @NotNull final Sdk sdk) { - if (myHandler != null && !myHandler.isProcessTerminated()) return; - Editor selectedEditor = StudyEditor.getSelectedEditor(project); - FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - assert selectedEditor != null; - VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); - StudyTaskManager taskManager = StudyTaskManager.getInstance(project); - if (openedFile != null && openedFile.getCanonicalPath() != null) { - String filePath = openedFile.getCanonicalPath(); - GeneralCommandLine cmd = new GeneralCommandLine(); - cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath()); - String pythonPath = sdk.getHomePath(); - if (pythonPath != null) { - cmd.setExePath(pythonPath); - TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); - assert selectedTaskFile != null; - Task currentTask = selectedTaskFile.getTask(); - if (!currentTask.getUserTests().isEmpty()) { - cmd.addParameter(new File(project.getBaseDir().getPath(), StudyResourceManger.USER_TESTER).getPath()); - cmd.addParameter(pythonPath); - cmd.addParameter(filePath); - Process process; - try { - process = cmd.createProcess(); - } - catch (ExecutionException e) { - LOG.error(e); - return; - } - myHandler = new OSProcessHandler(process); - RunContentExecutor executor = new RunContentExecutor(project, myHandler).withFilter(new PythonTracebackFilter(project)); - Disposer.register(project, executor); - executor.run(); - return; - } - try { - cmd.addParameter(filePath); - Process p = cmd.createProcess(); - myHandler = new OSProcessHandler(p); - - RunContentExecutor executor = new RunContentExecutor(project, myHandler).withFilter(new PythonTracebackFilter(project)); - Disposer.register(project, executor); - executor.run(); - } - - catch (ExecutionException e) { - LOG.error(e); - } - } - } - } - - public void actionPerformed(@NotNull AnActionEvent e) { - Project project = e.getProject(); - if (project == null) { - return; - } - Sdk sdk = StudyUtils.findPythonSdk(project); - if (sdk == null) { - return; - } - run(project, sdk); - } -} diff --git a/python/edu/main_pycharm_edu.iml b/python/edu/main_pycharm_edu.iml index c29ec159fc09..7dbfb712fc9c 100644 --- a/python/edu/main_pycharm_edu.iml +++ b/python/edu/main_pycharm_edu.iml @@ -15,9 +15,10 @@ - + + \ No newline at end of file diff --git a/python/educational-python/interactive-learning-python/interactive-learning-python.iml b/python/educational-python/interactive-learning-python/interactive-learning-python.iml index c90834f2d607..96fc1b873f54 100644 --- a/python/educational-python/interactive-learning-python/interactive-learning-python.iml +++ b/python/educational-python/interactive-learning-python/interactive-learning-python.iml @@ -4,8 +4,26 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml b/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml new file mode 100644 index 000000000000..be0490b7ba79 --- /dev/null +++ b/python/educational-python/interactive-learning-python/resources/META-INF/plugin.xml @@ -0,0 +1,43 @@ + + + com.jetbrains.python.edu.interactivelearning.python + Educational plugin for PyCharm + 2.0 + + + + + + + + + + + com.intellij.modules.lang + com.intellij.modules.python + com.jetbrains.edu.interactivelearning + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/python/edu/learn-python/resources/com/jetbrains/python/edu/user_tester.py b/python/educational-python/interactive-learning-python/resources/com/jetbrains/python/edu/user_tester.py similarity index 100% rename from python/edu/learn-python/resources/com/jetbrains/python/edu/user_tester.py rename to python/educational-python/interactive-learning-python/resources/com/jetbrains/python/edu/user_tester.py diff --git a/python/edu/learn-python/resources/courses/introduction_course.zip b/python/educational-python/interactive-learning-python/resources/courses/introduction_course.zip similarity index 100% rename from python/edu/learn-python/resources/courses/introduction_course.zip rename to python/educational-python/interactive-learning-python/resources/courses/introduction_course.zip diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType.png rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType@2x.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType@2x.png rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark.png rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark@2x.png b/python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/EducationalProjectType_dark@2x.png rename to python/educational-python/interactive-learning-python/resources/icons/com/jetbrains/edu/learning/EducationalProjectType_dark@2x.png diff --git a/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java new file mode 100644 index 000000000000..293282be29e3 --- /dev/null +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java @@ -0,0 +1,95 @@ +package com.jetbrains.edu.learning; + +import com.intellij.facet.ui.FacetEditorValidator; +import com.intellij.facet.ui.FacetValidatorsManager; +import com.intellij.facet.ui.ValidationResult; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.progress.ProcessCanceledException; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.platform.DirectoryProjectGenerator; +import com.jetbrains.edu.learning.course.CourseInfo; +import com.jetbrains.edu.learning.ui.StudyNewProjectPanel; +import com.jetbrains.python.newProject.PythonProjectGenerator; +import icons.InteractiveLearningPythonIcons; +import org.jetbrains.annotations.Nls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.io.File; +import java.util.Map; + + +public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator implements DirectoryProjectGenerator { + private final StudyProjectGenerator myGenerator; + public ValidationResult myValidationResult = new ValidationResult("selected course is not valid"); + + public PyStudyDirectoryProjectGenerator() { + myGenerator = new StudyProjectGenerator(); + myGenerator.addSettingsStateListener(new StudyProjectGenerator.SettingsListener() { + @Override + public void stateChanged(ValidationResult result) { + setValidationResult(result); + } + }); + } + + @Nls + @NotNull + @Override + public String getName() { + return "Educational"; + } + + @Nullable + @Override + public Object showGenerationSettings(VirtualFile baseDir) throws ProcessCanceledException { + return null; + } + + @Nullable + @Override + public Icon getLogo() { + return InteractiveLearningPythonIcons.EducationalProjectType; + } + + + @Override + public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, + @Nullable Object settings, @NotNull Module module) { + myGenerator.generateProject(project, baseDir); + } + @NotNull + @Override + public ValidationResult validate(@NotNull String s) { + return myValidationResult; + } + + public void setValidationResult(ValidationResult validationResult) { + myValidationResult = validationResult; + } + + @Nullable + @Override + public JPanel extendBasePanel() throws ProcessCanceledException { + StudyNewProjectPanel settingsPanel = new StudyNewProjectPanel(myGenerator); + settingsPanel.registerValidators(new FacetValidatorsManager() { + public void registerValidator(FacetEditorValidator validator, JComponent... componentsToWatch) { + throw new UnsupportedOperationException(); + } + public void validate() { + fireStateChanged(); + } + }); + return settingsPanel.getContentPanel(); + } + + public Map getCourses() { + return myGenerator.getCourses(); + } + + public void setSelectedCourse(CourseInfo course) { + myGenerator.setSelectedCourse(course); + } +} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java similarity index 62% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java index 78eadcbfe8b2..bc0e563d80c9 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTestRunner.java +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyTestRunner.java @@ -1,36 +1,26 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.execution.ExecutionException; import com.intellij.execution.configurations.GeneralCommandLine; -import com.intellij.execution.process.ProcessOutput; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.course.Course; -import com.jetbrains.python.edu.course.Task; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.edu.learning.course.Task; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; -import java.io.*; +import java.io.File; import java.util.Map; -public class StudyTestRunner { - public static final String STUDY_PREFIX="#educational_plugin"; - public static final String TEST_OK = "test OK"; - private static final String TEST_FAILED = "FAILED + "; +public class PyStudyTestRunner extends StudyTestRunner { private static final String PYTHONPATH = "PYTHONPATH"; - private static final Logger LOG = Logger.getInstance(StudyTestRunner.class); - private final Task myTask; - private final VirtualFile myTaskDir; - public StudyTestRunner(Task task, VirtualFile taskDir) { - myTask = task; - myTaskDir = taskDir; + PyStudyTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskfile) { + super(task, taskfile); } - public Process createCheckProcess(Project project, String executablePath) throws ExecutionException { Sdk sdk = PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); File testRunner = new File(myTaskDir.getPath(), myTask.getTestFile()); @@ -61,20 +51,4 @@ public class StudyTestRunner { } return null; } - - - @NotNull - public String getTestsOutput(@NotNull final ProcessOutput processOutput) { - for (String line : processOutput.getStdoutLines()) { - if (line.contains(STUDY_PREFIX)) { - if (line.contains(TEST_OK)) { - continue; - } - int messageStart = line.indexOf(TEST_FAILED); - return line.substring(messageStart + TEST_FAILED.length()); - } - } - - return TEST_OK; - } } diff --git a/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java new file mode 100644 index 000000000000..524510e97e6c --- /dev/null +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/PyStudyUtils.java @@ -0,0 +1,76 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.edu.learning; + +import com.intellij.execution.RunContentExecutor; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.python.run.PythonTracebackFilter; +import com.jetbrains.python.sdk.PythonSdkType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; + +public class PyStudyUtils implements StudyUtilsExtensionPoint { + + @Override + public Sdk findSdk(@NotNull final Project project) { + return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); + } + + @Nullable + @Override + public String getLinkToTutorial() { + return "If you'd like to learn" + + " more about PyCharm " + + "Educational Edition, " + + "click here to watch a tutorial"; + } + + @Override + public StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) { + return new PyStudyTestRunner(task, taskDir); + } + + @Override + public RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler) { + return new RunContentExecutor(project, handler).withFilter(new PythonTracebackFilter(project)); + } + + @Override + public void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, + @NotNull final Project project, + @NotNull final String filePath, + @NotNull final String pythonPath, + @NotNull final Task currentTask) { + if (!currentTask.getUserTests().isEmpty()) { + cmd.addParameter(new File(project.getBaseDir().getPath(), StudyNames.USER_TESTER).getPath()); + cmd.addParameter(pythonPath); + cmd.addParameter(filePath); + } + else { + cmd.addParameter(filePath); + } + } + + +} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java similarity index 81% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java index a03dc6acec3b..a7785e16838c 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyIntroductionCourseAction.java +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyIntroductionCourseAction.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.ide.impl.ProjectUtil; import com.intellij.openapi.actionSystem.AnAction; @@ -21,23 +21,23 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.projectRoots.Sdk; +import com.jetbrains.edu.learning.PyStudyDirectoryProjectGenerator; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.CourseInfo; import com.jetbrains.python.configuration.PyConfigurableInterpreterList; -import com.jetbrains.python.edu.StudyDirectoryProjectGenerator; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.CourseInfo; import com.jetbrains.python.newProject.actions.GenerateProjectCallback; import com.jetbrains.python.newProject.actions.ProjectSpecificSettingsStep; -import icons.StudyIcons; +import icons.InteractiveLearningPythonIcons; import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.List; import java.util.Map; -public class StudyIntroductionCourseAction extends AnAction { +public class PyStudyIntroductionCourseAction extends AnAction { - public StudyIntroductionCourseAction() { - super("Introduction to Python", "Introduction to Python", StudyIcons.EducationalProjectType); + public PyStudyIntroductionCourseAction() { + super("Introduction to Python", "Introduction to Python", InteractiveLearningPythonIcons.EducationalProjectType); } @Override @@ -48,7 +48,7 @@ public class StudyIntroductionCourseAction extends AnAction { } else { final GenerateProjectCallback callback = new GenerateProjectCallback(); - final StudyDirectoryProjectGenerator generator = new StudyDirectoryProjectGenerator(); + final PyStudyDirectoryProjectGenerator generator = new PyStudyDirectoryProjectGenerator(); final Map courses = generator.getCourses(); CourseInfo introCourse = null; for (CourseInfo info : courses.keySet()) { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java similarity index 74% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java index cae18e2457ad..e9e1b2b378bb 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWatchTutorialAction.java +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/actions/PyStudyWatchTutorialAction.java @@ -1,12 +1,12 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.project.DumbAwareAction; import org.jetbrains.annotations.NotNull; -public class StudyWatchTutorialAction extends DumbAwareAction { - public StudyWatchTutorialAction() { +public class PyStudyWatchTutorialAction extends DumbAwareAction { + public PyStudyWatchTutorialAction() { super("Learn more about PyCharm Educational Edition", null, null); } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java similarity index 76% rename from python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java rename to python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java index dc7495adb16e..4b849da0bf7a 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/highlighting/StudyVisitorFilter.java +++ b/python/educational-python/interactive-learning-python/src/com/jetbrains/edu/learning/highlighting/PyStudyVisitorFilter.java @@ -1,12 +1,12 @@ -package com.jetbrains.python.edu.highlighting; +package com.jetbrains.edu.learning.highlighting; import com.intellij.psi.PsiFile; -import com.jetbrains.python.edu.StudyTaskManager; +import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.python.inspections.PythonVisitorFilter; import com.jetbrains.python.inspections.unresolvedReference.PyUnresolvedReferencesInspection; import org.jetbrains.annotations.NotNull; -public class StudyVisitorFilter implements PythonVisitorFilter { +public class PyStudyVisitorFilter implements PythonVisitorFilter { @Override public boolean isSupported(@NotNull final Class visitorClass, @NotNull final PsiFile file) { if (StudyTaskManager.getInstance(file.getProject()).getCourse() == null) return true; diff --git a/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java b/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java new file mode 100644 index 000000000000..08b0bdd2acd8 --- /dev/null +++ b/python/educational-python/interactive-learning-python/src/icons/InteractiveLearningPythonIcons.java @@ -0,0 +1,17 @@ +package icons; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.*; + +/** + * NOTE THIS FILE IS AUTO-GENERATED + * DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead + */ +public class InteractiveLearningPythonIcons { + private static Icon load(String path) { + return IconLoader.getIcon(path, InteractiveLearningPythonIcons.class); + } + + public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16 +} diff --git a/python/edu/learn-python/testData/course.json b/python/educational-python/interactive-learning-python/testData/course.json similarity index 100% rename from python/edu/learn-python/testData/course.json rename to python/educational-python/interactive-learning-python/testData/course.json diff --git a/python/edu/learn-python/testData/helloworld.py b/python/educational-python/interactive-learning-python/testData/helloworld.py similarity index 100% rename from python/edu/learn-python/testData/helloworld.py rename to python/educational-python/interactive-learning-python/testData/helloworld.py diff --git a/python/edu/learn-python/tests/JsonParserTest.java b/python/educational-python/interactive-learning-python/tests/JsonParserTest.java similarity index 63% rename from python/edu/learn-python/tests/JsonParserTest.java rename to python/educational-python/interactive-learning-python/tests/JsonParserTest.java index df8ee03a6c39..b9fd9654a90e 100644 --- a/python/edu/learn-python/tests/JsonParserTest.java +++ b/python/educational-python/interactive-learning-python/tests/JsonParserTest.java @@ -1,32 +1,30 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import org.junit.Before; -import org.junit.Test; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.Course; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.python.PythonHelpersLocator; +import junit.framework.TestCase; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.Reader; -import static org.junit.Assert.assertEquals; /** * author: liana * data: 7/4/14. */ -public class JsonParserTest { +public class JsonParserTest extends TestCase { private Course myCourse = null; - @Before - public void setUp() throws FileNotFoundException { - Reader reader = new InputStreamReader(new FileInputStream("testData/course.json")); + + public void setUp() throws Exception { + super.setUp(); + Reader reader = new InputStreamReader(new FileInputStream(getTestDataPath() + "/course.json")); Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); myCourse = gson.fromJson(reader, Course.class); } - @Test public void testCourseLevel() { assertEquals(myCourse.getName(), "Python для начинающих"); assertEquals(StudyUtils.getFirst(myCourse.getLessons().get(1).getTaskList().get(0).getUserTests()).getInput(), "sum-input.txt"); @@ -34,4 +32,7 @@ public class JsonParserTest { assertEquals(myCourse.getLessons().get(0).getTaskList().size(), 2); assertEquals(myCourse.getLessons().get(1).getTaskList().size(), 1); } + protected String getTestDataPath() { + return PythonHelpersLocator.getPythonCommunityPath() + "/edu/learn-python/testData"; + } } diff --git a/python/edu/learn-python/tests/StudyDocumentListenerTest.java b/python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java similarity index 91% rename from python/edu/learn-python/tests/StudyDocumentListenerTest.java rename to python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java index 9a89d12d670a..1004bd643dd9 100644 --- a/python/edu/learn-python/tests/StudyDocumentListenerTest.java +++ b/python/educational-python/interactive-learning-python/tests/StudyDocumentListenerTest.java @@ -3,9 +3,9 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.psi.PsiFile; -import com.jetbrains.python.edu.StudyDocumentListener; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.TaskWindow; +import com.jetbrains.edu.learning.StudyDocumentListener; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.TaskWindow; import java.util.ArrayList; import java.util.List; diff --git a/python/edu/learn-python/tests/StudyTestCase.java b/python/educational-python/interactive-learning-python/tests/StudyTestCase.java similarity index 100% rename from python/edu/learn-python/tests/StudyTestCase.java rename to python/educational-python/interactive-learning-python/tests/StudyTestCase.java diff --git a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java index 7ccd9a8d7f6a..2d7d03f1dc9e 100644 --- a/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java +++ b/python/educational/course-creator/src/com/jetbrains/edu/coursecreator/CCProjectGeneratorUtil.java @@ -16,6 +16,9 @@ import org.jetbrains.annotations.NotNull; public class CCProjectGeneratorUtil { + private CCProjectGeneratorUtil() { + } + public static void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, @NotNull final String name, @NotNull final String author, @NotNull final String description) { diff --git a/python/educational/interactive-learning/interactive-learning.iml b/python/educational/interactive-learning/interactive-learning.iml index c90834f2d607..7413f5da4ba1 100644 --- a/python/educational/interactive-learning/interactive-learning.iml +++ b/python/educational/interactive-learning/interactive-learning.iml @@ -4,8 +4,11 @@ + + + \ No newline at end of file diff --git a/python/educational/interactive-learning/resources/META-INF/plugin.xml b/python/educational/interactive-learning/resources/META-INF/plugin.xml new file mode 100644 index 000000000000..8374db06e8ed --- /dev/null +++ b/python/educational/interactive-learning/resources/META-INF/plugin.xml @@ -0,0 +1,74 @@ + + + com.jetbrains.edu.interactivelearning + Educational plugin core + 2.0 + + + + + + + + + + + com.intellij.modules.lang + + + + com.jetbrains.edu.learning.StudyTaskManager + com.jetbrains.edu.learning.StudyTaskManager + + + + + + com.jetbrains.edu.learning.StudyInitialConfigurator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Lesson@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Lesson@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonComp@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonComp@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonComp@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonComp@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonCompl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonCompl.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/LessonCompl.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/LessonCompl.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Sandbox@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Sandbox@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task@2x_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task@2x_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl@2x_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl@2x_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskCompl_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskCompl_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl@2x_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl@2x_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/TaskProbl_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/TaskProbl_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/Task_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/Task_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/WatchInput.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/WatchInput.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/WatchInput.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/WatchInput.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/prev.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/prev.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/prev.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/prev.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve_dark.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve_dark.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/resolve_dark.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/resolve_dark.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint.png diff --git a/python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint@2x.png b/python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint@2x.png similarity index 100% rename from python/edu/learn-python/resources/icons/com/jetbrains/python/edu/showHint@2x.png rename to python/educational/interactive-learning/resources/icons/com/jetbrains/edu/learning/showHint@2x.png diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java similarity index 94% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java index 848becfae1b1..9714472a5649 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDocumentListener.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyDocumentListener.java @@ -1,12 +1,12 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.impl.event.DocumentEventImpl; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.TaskWindow; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.TaskWindow; import java.util.ArrayList; import java.util.List; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java similarity index 94% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java index 8d580923f6e4..78da60815e4a 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyEditorFactoryListener.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyEditorFactoryListener.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.openapi.application.ApplicationManager; @@ -12,9 +12,9 @@ import com.intellij.openapi.editor.event.EditorMouseEvent; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.TaskWindow; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import java.awt.*; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java similarity index 98% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java index 6078025e9492..fef9cc78bd8a 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInitialConfigurator.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInitialConfigurator.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.ide.RecentProjectsManager; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java similarity index 95% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java index 95ecfb49651f..38266615e0cb 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyInstructionPainter.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyInstructionPainter.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.AnAction; @@ -12,7 +12,7 @@ import com.intellij.ui.JBColor; import com.intellij.util.PairFunction; import com.intellij.util.ui.GraphicsUtil; import com.intellij.util.ui.UIUtil; -import com.jetbrains.python.edu.actions.*; +import com.jetbrains.edu.learning.actions.*; import javax.swing.*; import java.awt.*; @@ -32,7 +32,7 @@ public class StudyInstructionPainter extends EditorEmptyTextPainter { UIUtil.TextPainter painter = new UIUtil.TextPainter().withLineSpacing(1.5f); - painter.appendLine("PyCharm Educational Edition").underlined(new JBColor(Gray._150, Gray._180)); + painter.appendLine("Educational Edition").underlined(new JBColor(Gray._150, Gray._180)); addAction(painter, "Navigate to the next answer placeholder", StudyNextWindowAction.ACTION_ID, StudyNextWindowAction.SHORTCUT2, true); String shortcut1 = getShortcutText(StudyPrevWindowAction.ACTION_ID, StudyPrevWindowAction.SHORTCUT, false, false); String shortcut2 = getShortcutText(StudyNextWindowAction.ACTION_ID, StudyNextWindowAction.SHORTCUT, false, false); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java similarity index 85% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java index 348ce36e6d9c..893f0d3b59ac 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyNames.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyNames.java @@ -13,18 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import org.jetbrains.annotations.NonNls; @NonNls public class StudyNames { - public static final String INTRODUCTION_COURSE = "introduction_course"; public static final String TASK_HTML = "task.html"; public static final String TASK_TESTS = "tests.py"; - public static final String COURSES = "courses"; public static final String LESSON = "lesson"; public static final String TEST_HELPER = "test_helper.py"; + public static final String USER_TESTER = "user_tester.py"; private StudyNames() { } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java similarity index 87% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java index cc2bc803f0ea..c6954c6e60d6 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyDirectoryProjectGenerator.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyProjectGenerator.java @@ -1,9 +1,7 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.google.gson.*; import com.google.gson.stream.JsonReader; -import com.intellij.facet.ui.FacetEditorValidator; -import com.intellij.facet.ui.FacetValidatorsManager; import com.intellij.facet.ui.ValidationResult; import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.impl.AbstractProjectViewPane; @@ -13,8 +11,6 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.LocalFileSystem; @@ -24,29 +20,26 @@ import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl; import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter; import com.intellij.openapi.wm.ex.ToolWindowManagerEx; -import com.intellij.platform.DirectoryProjectGenerator; import com.intellij.platform.templates.github.GeneratorException; import com.intellij.platform.templates.github.ZipUtil; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.jetbrains.python.edu.course.*; -import com.jetbrains.python.edu.ui.StudyNewProjectPanel; -import com.jetbrains.python.newProject.PythonProjectGenerator; -import icons.StudyIcons; -import org.jetbrains.annotations.Nls; +import com.intellij.util.containers.ContainerUtil; +import com.jetbrains.edu.learning.course.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.io.*; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; - -public class StudyDirectoryProjectGenerator extends PythonProjectGenerator implements DirectoryProjectGenerator { - private static final Logger LOG = Logger.getInstance(StudyDirectoryProjectGenerator.class.getName()); +public class StudyProjectGenerator { + private static final Logger LOG = Logger.getInstance(StudyProjectGenerator.class.getName()); + private final List myListeners = ContainerUtil.newArrayList(); private static final String REPO_URL = "https://github.com/JetBrains/pycharm-courses/archive/master.zip"; private static final String USER_NAME = "PyCharm"; private static final String COURSE_META_FILE = "course.json"; @@ -59,15 +52,6 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple private Map myCourses = new HashMap(); private File mySelectedCourseFile; private Project myProject; - public ValidationResult myValidationResult = new ValidationResult("selected course is not valid"); - - @Nls - @NotNull - @Override - public String getName() { - return "Educational"; - } - public void setCourses(Map courses) { myCourses = courses; @@ -140,22 +124,7 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple return null; } - @Nullable - @Override - public Object showGenerationSettings(VirtualFile baseDir) throws ProcessCanceledException { - return null; - } - - @Nullable - @Override - public Icon getLogo() { - return StudyIcons.EducationalProjectType; - } - - - @Override - public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir, - @Nullable Object settings, @NotNull Module module) { + public void generateProject(@NotNull final Project project, @NotNull final VirtualFile baseDir) { myProject = project; Reader reader = null; @@ -336,42 +305,6 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple return courseInfo; } - @NotNull - @Override - public ValidationResult validate(@NotNull String s) { - return myValidationResult; - } - - public void setValidationResult(ValidationResult validationResult) { - myValidationResult = validationResult; - } - - /** - * @return courses from memory or from cash file or parses course directory - */ - public Map getCourses() { - if (!myCourses.isEmpty()) { - return myCourses; - } - if (myCoursesDir.exists()) { - File cacheFile = new File(myCoursesDir, CACHE_NAME); - if (cacheFile.exists()) { - myCourses = getCoursesFromCache(cacheFile); - if (!myCourses.isEmpty()) { - return myCourses; - } - } - myCourses = loadCourses(); - if (!myCourses.isEmpty()) { - return myCourses; - } - } - downloadAndUnzip(false); - myCourses = loadCourses(); - flushCache(); - return myCourses; - } - /** * Writes courses to cash file {@link com.jetbrains.python.edu.StudyDirectoryProjectGenerator#CACHE_NAME} */ @@ -417,7 +350,7 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple Map coursesFromCash = new HashMap(); BufferedReader reader = null; try { - reader = new BufferedReader(new InputStreamReader(new FileInputStream(cashFile))); + reader = new BufferedReader(new InputStreamReader(new FileInputStream(cashFile))); String line; while ((line = reader.readLine()) != null) { @@ -446,18 +379,43 @@ public class StudyDirectoryProjectGenerator extends PythonProjectGenerator imple return coursesFromCash; } - @Nullable - @Override - public JPanel extendBasePanel() throws ProcessCanceledException { - StudyNewProjectPanel settingsPanel = new StudyNewProjectPanel(this); - settingsPanel.registerValidators(new FacetValidatorsManager() { - public void registerValidator(FacetEditorValidator validator, JComponent... componentsToWatch) { - throw new UnsupportedOperationException(); + /** + * @return courses from memory or from cash file or parses course directory + */ + public Map getCourses() { + if (!myCourses.isEmpty()) { + return myCourses; + } + if (myCoursesDir.exists()) { + File cacheFile = new File(myCoursesDir, CACHE_NAME); + if (cacheFile.exists()) { + myCourses = getCoursesFromCache(cacheFile); + if (!myCourses.isEmpty()) { + return myCourses; + } } - public void validate() { - fireStateChanged(); + myCourses = loadCourses(); + if (!myCourses.isEmpty()) { + return myCourses; } - }); - return settingsPanel.getContentPanel(); + } + downloadAndUnzip(false); + myCourses = loadCourses(); + flushCache(); + return myCourses; + } + + public void addSettingsStateListener(@NotNull SettingsListener listener) { + myListeners.add(listener); + } + + public interface SettingsListener { + void stateChanged(ValidationResult result); + } + + public void fireStateChanged(ValidationResult result) { + for (SettingsListener listener : myListeners) { + listener.stateChanged(result); + } } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java similarity index 88% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java index 96dc3d906472..4c382e0cc622 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyState.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyState.java @@ -1,11 +1,11 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.editor.StudyEditor; public class StudyState { private final StudyEditor myStudyEditor; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java similarity index 95% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java index d44c251d5bb4..16996c0fb331 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyTaskManager.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTaskManager.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.ide.BrowserUtil; import com.intellij.ide.ui.UISettings; @@ -32,13 +32,13 @@ import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.wm.*; import com.intellij.util.ui.update.UiNotifyConnector; import com.intellij.util.xmlb.XmlSerializer; -import com.jetbrains.python.edu.actions.*; -import com.jetbrains.python.edu.course.Course; -import com.jetbrains.python.edu.course.Lesson; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.ui.StudyCondition; -import com.jetbrains.python.edu.ui.StudyToolWindowFactory; +import com.jetbrains.edu.learning.actions.*; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.edu.learning.course.Lesson; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.ui.StudyCondition; +import com.jetbrains.edu.learning.ui.StudyToolWindowFactory; import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -201,10 +201,7 @@ public class StudyTaskManager implements ProjectComponent, PersistentStateCompon @Override public void run() { if (PropertiesComponent.getInstance().getBoolean("StudyShowPopup", true)) { - String content = "If you'd like to learn" + - " more about PyCharm " + - "Educational Edition, " + - "click here to watch a tutorial"; + String content = StudyUtils.getLinkToTutorial(); final Notification notification = new Notification("Watch Tutorials!", "", content, NotificationType.INFORMATION, new UrlOpeningListener(true)); Notifications.Bus.notify(notification); diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java new file mode 100644 index 000000000000..366a8df7faf4 --- /dev/null +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyTestRunner.java @@ -0,0 +1,38 @@ +package com.jetbrains.edu.learning; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.process.ProcessOutput; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.course.Task; +import org.jetbrains.annotations.NotNull; + +public abstract class StudyTestRunner { + public static final String STUDY_PREFIX="#educational_plugin"; + public static final String TEST_OK = "test OK"; + private static final String TEST_FAILED = "FAILED + "; + protected final Task myTask; + protected final VirtualFile myTaskDir; + + public StudyTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) { + myTask = task; + myTaskDir = taskDir; + } + + public abstract Process createCheckProcess(Project project, String executablePath) throws ExecutionException; + + @NotNull + public String getTestsOutput(@NotNull final ProcessOutput processOutput) { + for (String line : processOutput.getStdoutLines()) { + if (line.contains(STUDY_PREFIX)) { + if (line.contains(TEST_OK)) { + continue; + } + int messageStart = line.indexOf(TEST_FAILED); + return line.substring(messageStart + TEST_FAILED.length()); + } + } + + return TEST_OK; + } +} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java similarity index 76% rename from python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java index 324e58aa4b4c..9262ac6c7041 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/StudyUtils.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtils.java @@ -1,5 +1,8 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; +import com.intellij.execution.RunContentExecutor; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.process.ProcessHandler; import com.intellij.ide.SaveAndSyncHandlerImpl; import com.intellij.ide.projectView.actions.MarkRootActionBase; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -11,7 +14,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; @@ -24,10 +26,9 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.util.ui.UIUtil; -import com.jetbrains.python.edu.course.*; -import com.jetbrains.python.edu.editor.StudyEditor; -import com.jetbrains.python.edu.ui.StudyToolWindowFactory; -import com.jetbrains.python.sdk.PythonSdkType; +import com.jetbrains.edu.learning.course.*; +import com.jetbrains.edu.learning.editor.StudyEditor; +import com.jetbrains.edu.learning.ui.StudyToolWindowFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,6 +36,9 @@ import java.io.*; import java.util.Collection; public class StudyUtils { + private StudyUtils() { + } + private static final Logger LOG = Logger.getInstance(StudyUtils.class.getName()); public static void closeSilently(Closeable stream) { @@ -199,8 +203,13 @@ public class StudyUtils { } @Nullable - public static Sdk findPythonSdk(@NotNull final Project project) { - return PythonSdkType.findPythonSdk(ModuleManager.getInstance(project).getModules()[0]); + public static Sdk findSdk(@NotNull final Project project) { + final StudyUtilsExtensionPoint[] extensions = + ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME); + if (extensions.length > 0) { + return extensions[0].findSdk(project); + } + return null; } public static void markDirAsSourceRoot(@NotNull final VirtualFile dir, @NotNull final Project project) { @@ -224,4 +233,43 @@ public class StudyUtils { } }); } + + public static StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir) { + final StudyUtilsExtensionPoint[] extensions = + ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME); + if (extensions.length > 0) { + return extensions[0].getTestRunner(task, taskDir); + } + return null; + } + + public static String getLinkToTutorial() { + final StudyUtilsExtensionPoint[] extensions = + ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME); + if (extensions.length > 0) { + return extensions[0].getLinkToTutorial(); + } + return null; + } + + public static RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler) { + final StudyUtilsExtensionPoint[] extensions = + ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME); + if (extensions.length > 0) { + return extensions[0].getExecutor(project, handler); + } + return null; + } + + public static void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, + @NotNull final Project project, + @NotNull final String filePath, + @NotNull final String pythonPath, + @NotNull final Task currentTask) { + final StudyUtilsExtensionPoint[] extensions = + ApplicationManager.getApplication().getExtensions(StudyUtilsExtensionPoint.EP_NAME); + if (extensions.length > 0) { + extensions[0].setCommandLineParameters(cmd, project, filePath, pythonPath, currentTask); + } + } } diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java new file mode 100644 index 000000000000..2342e5d28e15 --- /dev/null +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/StudyUtilsExtensionPoint.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jetbrains.edu.learning; + +import com.intellij.execution.RunContentExecutor; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.course.Task; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface StudyUtilsExtensionPoint { + ExtensionPointName EP_NAME = ExtensionPointName.create("Edu.StudyUtils"); + + @Nullable + abstract Sdk findSdk(@NotNull final Project project); + + abstract String getLinkToTutorial(); + + abstract StudyTestRunner getTestRunner(@NotNull final Task task, @NotNull final VirtualFile taskDir); + + public RunContentExecutor getExecutor(@NotNull final Project project, @NotNull final ProcessHandler handler); + + public void setCommandLineParameters(@NotNull final GeneralCommandLine cmd, + @NotNull final Project project, + @NotNull final String filePath, + @NotNull final String pythonPath, + @NotNull final Task currentTask); +} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java similarity index 95% rename from python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java index 334d78f550fb..3e3896d26c0c 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/TaskWindowDeleteHandler.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/TaskWindowDeleteHandler.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu; +package com.jetbrains.edu.learning; import com.intellij.codeInsight.hint.HintManager; import com.intellij.openapi.editor.Editor; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java similarity index 96% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java index 1b161278357b..4afe508dbc5a 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyCheckAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.execution.ExecutionException; import com.intellij.execution.process.CapturingProcessHandler; @@ -33,15 +33,15 @@ import com.intellij.openapi.wm.IdeFrame; import com.intellij.openapi.wm.WindowManager; import com.intellij.openapi.wm.ex.StatusBarEx; import com.intellij.openapi.wm.ex.WindowManagerEx; -import com.jetbrains.python.edu.StudyDocumentListener; -import com.jetbrains.python.edu.StudyState; -import com.jetbrains.python.edu.StudyTestRunner; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.StudyStatus; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.StudyDocumentListener; +import com.jetbrains.edu.learning.StudyState; +import com.jetbrains.edu.learning.StudyTestRunner; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.StudyStatus; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.TaskWindow; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -133,7 +133,7 @@ public class StudyCheckAction extends DumbAwareAction { final Task task = studyState.getTask(); final VirtualFile taskDir = studyState.getTaskDir(); flushWindows(task, taskDir); - Sdk sdk = StudyUtils.findPythonSdk(project); + final Sdk sdk = StudyUtils.findSdk(project); if (sdk == null) { createNoPythonInterpreterPopUp(project); return; @@ -149,7 +149,8 @@ public class StudyCheckAction extends DumbAwareAction { IdeFocusManager.getInstance(project).requestFocus(studyState.getEditor().getComponent(), true); } }); - final StudyTestRunner testRunner = new StudyTestRunner(task, taskDir); + + final StudyTestRunner testRunner = StudyUtils.getTestRunner(task, taskDir); Process testProcess = null; try { final VirtualFile executablePath = getTaskVirtualFile(studyState, task, taskDir); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java similarity index 94% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java index 50dcc3a2e69a..b026e18388cd 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyEditInputAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyEditInputAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.icons.AllIcons; import com.intellij.ide.ui.UISettings; @@ -20,13 +20,13 @@ import com.intellij.ui.tabs.TabInfo; import com.intellij.ui.tabs.TabsListener; import com.intellij.ui.tabs.impl.JBEditorTabs; import com.intellij.util.PlatformIcons; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.UserTest; -import com.jetbrains.python.edu.editor.StudyEditor; -import com.jetbrains.python.edu.ui.StudyTestContentPanel; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.UserTest; +import com.jetbrains.edu.learning.editor.StudyEditor; +import com.jetbrains.edu.learning.ui.StudyTestContentPanel; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -154,7 +154,7 @@ public class StudyEditInputAction extends DumbAwareAction { showInput(e.getProject()); } - private class HintClosedListener extends JBPopupAdapter { + private static class HintClosedListener extends JBPopupAdapter { private final Task myTask; private HintClosedListener(@NotNull final Task task) { myTask = task; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java similarity index 81% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java index 27edf22529cd..831208fcf5fa 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextStudyTaskAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextStudyTaskAction.java @@ -1,7 +1,7 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; -import com.jetbrains.python.edu.editor.StudyEditor; -import com.jetbrains.python.edu.course.Task; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import javax.swing.*; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java similarity index 87% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java index e4d3bb79d7a3..6dbcc19cef15 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyNextWindowAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyNextWindowAction.java @@ -1,8 +1,8 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.icons.AllIcons; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.TaskWindow; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.TaskWindow; import org.jetbrains.annotations.NotNull; import java.util.List; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java similarity index 75% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java index 01f6e1688b02..267944a33dc6 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPrevWindowAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPrevWindowAction.java @@ -1,8 +1,8 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.TaskWindow; -import icons.StudyIcons; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.TaskWindow; +import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +17,7 @@ public class StudyPrevWindowAction extends StudyWindowNavigationAction { public static final String SHORTCUT = "ctrl shift pressed COMMA"; public StudyPrevWindowAction() { - super("Navigate to the Previous Answer Placeholder", "Navigate to the previous answer placeholder", StudyIcons.Prev); + super("Navigate to the Previous Answer Placeholder", "Navigate to the previous answer placeholder", InteractiveLearningIcons.Prev); } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java similarity index 81% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java index 02cc36355834..1c3dc5a95cb6 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyPreviousStudyTaskAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyPreviousStudyTaskAction.java @@ -1,8 +1,8 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; -import com.jetbrains.python.edu.editor.StudyEditor; -import com.jetbrains.python.edu.course.Task; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import javax.swing.*; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java similarity index 95% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java index 9ec54b10569e..3458d252a15b 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskFileAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRefreshTaskFileAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -18,11 +18,11 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.IdeFocusManager; -import com.jetbrains.python.edu.StudyDocumentListener; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.*; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.StudyDocumentListener; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.*; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import java.io.File; diff --git a/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java new file mode 100644 index 000000000000..2cd453b0b870 --- /dev/null +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyRunAction.java @@ -0,0 +1,82 @@ +package com.jetbrains.edu.learning.actions; + +import com.intellij.execution.ExecutionException; +import com.intellij.execution.RunContentExecutor; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.process.OSProcessHandler; +import com.intellij.execution.process.ProcessHandler; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.editor.StudyEditor; +import org.jetbrains.annotations.NotNull; + +public class StudyRunAction extends DumbAwareAction { + private static final Logger LOG = Logger.getInstance(StudyRunAction.class.getName()); + public static final String ACTION_ID = "StudyRunAction"; + private ProcessHandler myHandler; + + public void run(@NotNull final Project project, @NotNull final Sdk sdk) { + if (myHandler != null && !myHandler.isProcessTerminated()) return; + Editor selectedEditor = StudyEditor.getSelectedEditor(project); + FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); + assert selectedEditor != null; + VirtualFile openedFile = fileDocumentManager.getFile(selectedEditor.getDocument()); + + if (openedFile != null && openedFile.getCanonicalPath() != null) { + String filePath = openedFile.getCanonicalPath(); + executeFile(project, sdk, openedFile, filePath); + } + } + + private void executeFile(@NotNull final Project project, @NotNull final Sdk sdk, + @NotNull final VirtualFile openedFile, @NotNull final String filePath) { + StudyTaskManager taskManager = StudyTaskManager.getInstance(project); + GeneralCommandLine cmd = new GeneralCommandLine(); + cmd.withWorkDirectory(openedFile.getParent().getCanonicalPath()); + String sdkHomePath = sdk.getHomePath(); + if (sdkHomePath != null) { + cmd.setExePath(sdkHomePath); + TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); + assert selectedTaskFile != null; + Task currentTask = selectedTaskFile.getTask(); + Process process; + StudyUtils.setCommandLineParameters(cmd, project, filePath, sdkHomePath, currentTask); + + try { + process = cmd.createProcess(); + } + catch (ExecutionException e) { + LOG.error(e); + return; + } + myHandler = new OSProcessHandler(process); + RunContentExecutor executor = StudyUtils.getExecutor(project, myHandler); + Disposer.register(project, executor); + executor.run(); + + } + } + + public void actionPerformed(@NotNull AnActionEvent e) { + Project project = e.getProject(); + if (project == null) { + return; + } + Sdk sdk = StudyUtils.findSdk(project); + if (sdk == null) { + return; + } + run(project, sdk); + } +} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java similarity index 89% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java index a5d37cbd2c2e..94e3cc4bd5ef 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyShowHintAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyShowHintAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.codeInsight.documentation.DocumentationComponent; import com.intellij.codeInsight.documentation.DocumentationManager; @@ -13,13 +13,13 @@ import com.intellij.openapi.util.Disposer; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.jetbrains.python.edu.StudyState; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.Course; -import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; -import icons.StudyIcons; +import com.jetbrains.edu.learning.StudyState; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.edu.learning.course.TaskWindow; +import com.jetbrains.edu.learning.editor.StudyEditor; +import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,7 +32,7 @@ public class StudyShowHintAction extends DumbAwareAction { public static final String HINT_NOT_AVAILABLE = "There is no hint for this answer placeholder"; public StudyShowHintAction() { - super("Show hint", "Show hint", StudyIcons.ShowHint); + super("Show hint", "Show hint", InteractiveLearningIcons.ShowHint); } public void actionPerformed(@NotNull AnActionEvent e) { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java similarity index 92% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java index b98bbd098776..721ff2f10ccb 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyTaskNavigationAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyTaskNavigationAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -14,11 +14,11 @@ import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.util.ui.tree.TreeUtil; -import com.jetbrains.python.edu.StudyState; -import com.jetbrains.python.edu.course.Lesson; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.StudyState; +import com.jetbrains.edu.learning.course.Lesson; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import javax.swing.*; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java similarity index 87% rename from python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java index e401fcee021f..cc5fea2dc9ec 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyWindowNavigationAction.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/actions/StudyWindowNavigationAction.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.actions; +package com.jetbrains.edu.learning.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.editor.Editor; @@ -6,11 +6,11 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.TaskFile; -import com.jetbrains.python.edu.course.TaskWindow; -import com.jetbrains.python.edu.editor.StudyEditor; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.TaskFile; +import com.jetbrains.edu.learning.course.TaskWindow; +import com.jetbrains.edu.learning.editor.StudyEditor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java similarity index 98% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java index d461a4807151..94196dd45e26 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Course.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Course.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java similarity index 96% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java index 9f820c12c572..6cf9b18ea6d2 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/CourseInfo.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/CourseInfo.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; /** * Implementation of class which contains information to be shawn in course description in tool window diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java similarity index 97% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java index b4a3286dfd94..34be407bf5ef 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Lesson.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -58,7 +58,7 @@ public class Lesson implements Stateful { * * @param courseDir project directory of course * @param resourceRoot directory where original lesson stored - * @throws java.io.IOException + * @throws IOException */ public void create(@NotNull final VirtualFile courseDir, @NotNull final File resourceRoot, @NotNull final Project project) throws IOException { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java similarity index 96% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java index 85e2eb8be1a9..2de9bad0af6f 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/LessonInfo.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; /** * Implementation of class which contains information about student progress in current lesson diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java similarity index 73% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java index 3a163622f56d..4ba655e5066e 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Stateful.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; public interface Stateful { StudyStatus getStatus(); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java similarity index 70% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java index d95b42b73866..cedcfd0fb01e 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/StudyStatus.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/StudyStatus.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; /** * @see {@link TaskWindow#myStatus} diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java similarity index 98% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java index 0a106ff597ad..abdda07da02f 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/Task.java @@ -1,10 +1,10 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.xmlb.annotations.Transient; -import com.jetbrains.python.edu.StudyUtils; +import com.jetbrains.edu.learning.StudyUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -83,7 +83,7 @@ public class Task implements Stateful { * * @param lessonDir project directory of lesson which task belongs to * @param resourceRoot directory where original task file stored - * @throws java.io.IOException + * @throws IOException */ public void create(@NotNull final VirtualFile lessonDir, @NotNull final File resourceRoot, @NotNull final Project project) throws IOException { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java similarity index 97% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java index b8908b606311..1f5f7ebbbb52 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskFile.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; @@ -13,8 +13,8 @@ import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.xmlb.annotations.Transient; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.TaskWindowDeleteHandler; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.TaskWindowDeleteHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -85,7 +85,7 @@ public class TaskFile implements Stateful { * * @param taskDir project directory of task which task file belongs to * @param resourceRoot directory where original task file stored - * @throws java.io.IOException + * @throws IOException */ public void create(@NotNull final VirtualFile taskDir, @NotNull final File resourceRoot, @NotNull final String name) throws IOException { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java similarity index 97% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java index 2229309092e7..2cd4c4ce7759 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/TaskWindow.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; import com.intellij.execution.ExecutionException; import com.intellij.execution.process.CapturingProcessHandler; @@ -18,9 +18,9 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.JBColor; -import com.jetbrains.python.edu.StudyDocumentListener; -import com.jetbrains.python.edu.StudyTestRunner; -import com.jetbrains.python.edu.StudyUtils; +import com.jetbrains.edu.learning.StudyDocumentListener; +import com.jetbrains.edu.learning.StudyTestRunner; +import com.jetbrains.edu.learning.StudyUtils; import org.jetbrains.annotations.NotNull; import java.io.File; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java similarity index 94% rename from python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java index 8133e9102a14..fdaffc582fff 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/UserTest.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/course/UserTest.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.course; +package com.jetbrains.edu.learning.course; public class UserTest { private String input; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java similarity index 95% rename from python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java index 14f932ede2f0..a5c7edb9291a 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyEditor.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyEditor.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.editor; +package com.jetbrains.edu.learning.editor; import com.intellij.codeHighlighting.BackgroundEditorHighlighter; import com.intellij.icons.AllIcons; @@ -34,13 +34,13 @@ import com.intellij.ui.HideableTitledPanel; import com.intellij.ui.JBColor; import com.intellij.util.ui.EmptyClipboardOwner; import com.intellij.util.ui.UIUtil; -import com.jetbrains.python.edu.StudyDocumentListener; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.actions.*; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; -import icons.StudyIcons; +import com.jetbrains.edu.learning.StudyDocumentListener; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.actions.*; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; +import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -205,13 +205,13 @@ public class StudyEditor implements TextEditor { } private void initializeButtons(@NotNull final JPanel taskActionsPanel, @NotNull final TaskFile taskFile) { - myCheckButton = addButton(taskActionsPanel, StudyCheckAction.ACTION_ID, StudyIcons.Resolve, StudyCheckAction.SHORTCUT); - myPrevTaskButton = addButton(taskActionsPanel, StudyPreviousStudyTaskAction.ACTION_ID, StudyIcons.Prev, StudyPreviousStudyTaskAction.SHORTCUT); + myCheckButton = addButton(taskActionsPanel, StudyCheckAction.ACTION_ID, InteractiveLearningIcons.Resolve, StudyCheckAction.SHORTCUT); + myPrevTaskButton = addButton(taskActionsPanel, StudyPreviousStudyTaskAction.ACTION_ID, InteractiveLearningIcons.Prev, StudyPreviousStudyTaskAction.SHORTCUT); myNextTaskButton = addButton(taskActionsPanel, StudyNextStudyTaskAction.ACTION_ID, AllIcons.Actions.Forward, StudyNextStudyTaskAction.SHORTCUT); myRefreshButton = addButton(taskActionsPanel, StudyRefreshTaskFileAction.ACTION_ID, AllIcons.Actions.Refresh, StudyRefreshTaskFileAction.SHORTCUT); - JButton myShowHintButton = addButton(taskActionsPanel, StudyShowHintAction.ACTION_ID, StudyIcons.ShowHint, StudyShowHintAction.SHORTCUT); + JButton myShowHintButton = addButton(taskActionsPanel, StudyShowHintAction.ACTION_ID, InteractiveLearningIcons.ShowHint, StudyShowHintAction.SHORTCUT); if (!taskFile.getTask().getUserTests().isEmpty()) { - final Sdk sdk = StudyUtils.findPythonSdk(myProject); + final Sdk sdk = StudyUtils.findSdk(myProject); if (sdk != null) { JButton runButton = addButton(taskActionsPanel, StudyRunAction.ACTION_ID, AllIcons.General.Run, null); runButton.addActionListener(new ActionListener() { @@ -221,7 +221,7 @@ public class StudyEditor implements TextEditor { studyRunAction.run(myProject, sdk); } }); - JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", StudyIcons.WatchInput, null); + JButton watchInputButton = addButton(taskActionsPanel, "WatchInputAction", InteractiveLearningIcons.WatchInput, null); watchInputButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java similarity index 93% rename from python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java index 631b5a9eaf4c..ae8df1652681 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/editor/StudyFileEditorProvider.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/editor/StudyFileEditorProvider.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.editor; +package com.jetbrains.edu.learning.editor; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorPolicy; @@ -8,10 +8,10 @@ import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.course.TaskFile; import org.jdom.Element; import org.jetbrains.annotations.NotNull; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.course.TaskFile; /** * User: lia diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java similarity index 89% rename from python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java index 4bd8df9baee7..a76e98ca50de 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyDirectoryNode.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyDirectoryNode.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.projectView; +package com.jetbrains.edu.learning.projectView; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.projectView.ProjectView; @@ -11,10 +11,10 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.*; -import icons.StudyIcons; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.*; +import icons.InteractiveLearningIcons; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -35,7 +35,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode { @Override protected void updateImpl(PresentationData data) { - data.setIcon(StudyIcons.Task); + data.setIcon(InteractiveLearningIcons.Task); String valueName = myValue.getName(); StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(myProject); Course course = studyTaskManager.getCourse(); @@ -72,7 +72,7 @@ public class StudyDirectoryNode extends PsiDirectoryNode { if (myValue.getParent() != null) { if (!myValue.getParent().getName().contains(Course.SANDBOX_DIR)) { data.setPresentableText(Course.SANDBOX_DIR); - data.setIcon(StudyIcons.Sandbox); + data.setIcon(InteractiveLearningIcons.Sandbox); return; } } @@ -94,16 +94,16 @@ public class StudyDirectoryNode extends PsiDirectoryNode { StudyStatus taskStatus = stateful.getStatus(); switch (taskStatus) { case Unchecked: { - updatePresentation(data, additionalName, JBColor.BLACK, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.Task); + updatePresentation(data, additionalName, JBColor.BLACK, stateful instanceof Lesson ? InteractiveLearningIcons.Lesson : InteractiveLearningIcons.Task); break; } case Solved: { updatePresentation(data, additionalName, new JBColor(new Color(0, 134, 0), new Color(98, 150, 85)), - stateful instanceof Lesson ? StudyIcons.LessonCompl : StudyIcons.TaskCompl); + stateful instanceof Lesson ? InteractiveLearningIcons.LessonCompl : InteractiveLearningIcons.TaskCompl); break; } case Failed: { - updatePresentation(data, additionalName, JBColor.RED, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.TaskProbl); + updatePresentation(data, additionalName, JBColor.RED, stateful instanceof Lesson ? InteractiveLearningIcons.Lesson : InteractiveLearningIcons.TaskProbl); } } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java similarity index 91% rename from python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java index 29b328a5da45..375a350f8bbb 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/projectView/StudyTreeStructureProvider.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/projectView/StudyTreeStructureProvider.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.projectView; +package com.jetbrains.edu.learning.projectView; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; @@ -8,10 +8,10 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.course.Course; -import com.jetbrains.python.edu.course.Task; -import com.jetbrains.python.edu.course.TaskFile; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.edu.learning.course.Task; +import com.jetbrains.edu.learning.course.TaskFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java similarity index 86% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java index 5add6c934ecd..9d82fa4813a3 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyCondition.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyCondition.java @@ -1,9 +1,9 @@ -package com.jetbrains.python.edu.ui; +package com.jetbrains.edu.learning.ui; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; -import com.jetbrains.python.edu.StudyTaskManager; +import com.jetbrains.edu.learning.StudyTaskManager; /** * author: liana diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form similarity index 98% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form index 8dd6506d710c..e6d745da6a7b 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.form +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.form @@ -1,5 +1,5 @@ -
+ diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java similarity index 93% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java index 6edad63586f0..b7064784e0bf 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyNewProjectPanel.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.ui; +package com.jetbrains.edu.learning.ui; import com.intellij.facet.ui.FacetValidatorsManager; import com.intellij.facet.ui.ValidationResult; @@ -7,9 +7,9 @@ import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; -import com.jetbrains.python.edu.StudyDirectoryProjectGenerator; -import com.jetbrains.python.edu.StudyUtils; -import com.jetbrains.python.edu.course.CourseInfo; +import com.jetbrains.edu.learning.StudyProjectGenerator; +import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.course.CourseInfo; import javax.swing.*; import java.awt.event.ActionEvent; @@ -33,12 +33,12 @@ public class StudyNewProjectPanel{ private JLabel myAuthorLabel; private JLabel myDescriptionLabel; private JLabel myLabel; - private final StudyDirectoryProjectGenerator myGenerator; + private final StudyProjectGenerator myGenerator; private static final String CONNECTION_ERROR = "Failed to download courses.
Check your Internet connection."; private static final String INVALID_COURSE = "Selected course is invalid"; private FacetValidatorsManager myValidationManager; - public StudyNewProjectPanel(StudyDirectoryProjectGenerator generator) { + public StudyNewProjectPanel(StudyProjectGenerator generator) { myGenerator = generator; Map courses = myGenerator.getCourses(); if (courses.isEmpty()) { @@ -110,14 +110,14 @@ public class StudyNewProjectPanel{ } private void setError(String errorMessage) { - myGenerator.setValidationResult(new ValidationResult(errorMessage)); + myGenerator.fireStateChanged(new ValidationResult(errorMessage)); if (myValidationManager != null) { myValidationManager.validate(); } } private void setOK() { - myGenerator.setValidationResult(ValidationResult.OK); + myGenerator.fireStateChanged(ValidationResult.OK); if (myValidationManager != null) { myValidationManager.validate(); } @@ -196,4 +196,5 @@ public class StudyNewProjectPanel{ setOK(); } } + } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyProgressBar.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyProgressBar.java similarity index 98% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyProgressBar.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyProgressBar.java index a25c98b99e35..e7ae06b6e363 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyProgressBar.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyProgressBar.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.ui; +package com.jetbrains.edu.learning.ui; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.GraphicsConfig; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyTestContentPanel.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyTestContentPanel.java similarity index 96% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyTestContentPanel.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyTestContentPanel.java index dee4fbaf9d01..6863ad597992 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyTestContentPanel.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyTestContentPanel.java @@ -1,9 +1,9 @@ -package com.jetbrains.python.edu.ui; +package com.jetbrains.edu.learning.ui; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBScrollPane; +import com.jetbrains.edu.learning.course.UserTest; import org.jetbrains.annotations.NotNull; -import com.jetbrains.python.edu.course.UserTest; import javax.swing.*; import javax.swing.event.DocumentEvent; diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyToolWindowFactory.java b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java similarity index 91% rename from python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyToolWindowFactory.java rename to python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java index 1c312af6e5d9..73930ab662dd 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/ui/StudyToolWindowFactory.java +++ b/python/educational/interactive-learning/src/com/jetbrains/edu/learning/ui/StudyToolWindowFactory.java @@ -1,4 +1,4 @@ -package com.jetbrains.python.edu.ui; +package com.jetbrains.edu.learning.ui; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -8,11 +8,11 @@ import com.intellij.ui.JBColor; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.util.ui.UIUtil; -import com.jetbrains.python.edu.StudyTaskManager; -import com.jetbrains.python.edu.course.Course; -import com.jetbrains.python.edu.course.Lesson; -import com.jetbrains.python.edu.course.LessonInfo; -import com.jetbrains.python.edu.course.StudyStatus; +import com.jetbrains.edu.learning.StudyTaskManager; +import com.jetbrains.edu.learning.course.Course; +import com.jetbrains.edu.learning.course.Lesson; +import com.jetbrains.edu.learning.course.LessonInfo; +import com.jetbrains.edu.learning.course.StudyStatus; import org.jetbrains.annotations.NotNull; import javax.swing.*;