From 9262f725045d9dcbf476a63738b20b831819e488 Mon Sep 17 00:00:00 2001 From: "Liana.Bakradze" Date: Thu, 16 Feb 2017 19:08:56 +0300 Subject: [PATCH] merge Edu-Intellij plugin into student plugin --- .idea/modules.xml | 2 +- python/educational-core/build.gradle | 1 + .../edu-intellij/edu-intellij.iml | 15 +++++ .../internal/EduTestRunner.java.ft | 18 ++++++ .../edu/intellij/EduCourseConfigurator.java | 13 ++++ .../intellij/EduIntelliJProjectTemplate.java | 9 +++ .../intellij/EduIntelliJTemplateFactory.java | 33 ++++++++++ .../android/EduSelectCourseProjectWizard.java | 61 +++++++++++++++++++ .../android/EduStartLearningAction.java | 28 +++++++++ python/educational-core/settings.gradle | 2 +- .../META-INF/android-dependencies.xml | 9 +++ .../resources/META-INF/edu-intellij.xml | 6 ++ .../student/resources/META-INF/plugin.xml | 6 ++ 13 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 python/educational-core/edu-intellij/edu-intellij.iml create mode 100644 python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft create mode 100644 python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java create mode 100644 python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java create mode 100644 python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java create mode 100644 python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java create mode 100644 python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java create mode 100644 python/educational-core/student/resources/META-INF/android-dependencies.xml create mode 100644 python/educational-core/student/resources/META-INF/edu-intellij.xml diff --git a/.idea/modules.xml b/.idea/modules.xml index e77f8476248e..8eebf8d5e687 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -56,7 +56,6 @@ - @@ -257,6 +256,7 @@ + diff --git a/python/educational-core/build.gradle b/python/educational-core/build.gradle index 5f9a6f47c265..0fd4879a267a 100644 --- a/python/educational-core/build.gradle +++ b/python/educational-core/build.gradle @@ -79,6 +79,7 @@ private static String getIdeaPath() { project(':student') { dependencies { + compile project(':edu-intellij') compile fileTree(dir: 'lib', include: ['*.jar']) } diff --git a/python/educational-core/edu-intellij/edu-intellij.iml b/python/educational-core/edu-intellij/edu-intellij.iml new file mode 100644 index 000000000000..e63dbeeada21 --- /dev/null +++ b/python/educational-core/edu-intellij/edu-intellij.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft b/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft new file mode 100644 index 000000000000..3d99c65140bd --- /dev/null +++ b/python/educational-core/edu-intellij/resources/fileTemplates/internal/EduTestRunner.java.ft @@ -0,0 +1,18 @@ +import org.junit.runner.Description; +import org.junit.runner.JUnitCore; +import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunListener; + +public class EduTestRunner { + public static void main(String[] args) throws ClassNotFoundException { + Class testClass = EduTestRunner.class.getClassLoader().loadClass(args[0]); + JUnitCore runner = new JUnitCore(); + runner.addListener(new RunListener() { + @Override + public void testFailure(Failure failure) throws Exception { + System.out.println("#educational_plugin FAILED + " + failure.getMessage()); + } + }); + runner.run(testClass); + } +} \ No newline at end of file diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java new file mode 100644 index 000000000000..5934ad168102 --- /dev/null +++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduCourseConfigurator.java @@ -0,0 +1,13 @@ +package com.jetbrains.edu.intellij; + +import com.intellij.lang.LanguageExtension; +import com.intellij.openapi.project.Project; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings("unused") //used in other educational plugins that are stored in separate repository +public interface EduCourseConfigurator { + String EP_NAME = "com.jetbrains.edu.intellij.courseConfigurator"; + LanguageExtension INSTANCE = new LanguageExtension<>(EP_NAME); + + default void configureModule(@NotNull final Project project) {} +} diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java new file mode 100644 index 000000000000..99501d9b40a1 --- /dev/null +++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJProjectTemplate.java @@ -0,0 +1,9 @@ +package com.jetbrains.edu.intellij; + +import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.platform.ProjectTemplate; + +public interface EduIntelliJProjectTemplate extends ProjectTemplate { + ExtensionPointName EP_NAME = + ExtensionPointName.create("Edu.eduIntelliJProjectTemplate"); +} diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java new file mode 100644 index 000000000000..cd234fbccf6c --- /dev/null +++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/EduIntelliJTemplateFactory.java @@ -0,0 +1,33 @@ +package com.jetbrains.edu.intellij; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.platform.ProjectTemplate; +import com.intellij.platform.ProjectTemplatesFactory; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; + +@SuppressWarnings("unused") //used in other educational plugins that are stored in separate repository +public class EduIntelliJTemplateFactory extends ProjectTemplatesFactory { + private static final String GROUP_NAME = "Education"; + + @NotNull + @Override + public String[] getGroups() { + return new String[]{GROUP_NAME}; + } + + @NotNull + @Override + public ProjectTemplate[] createTemplates(@Nullable String group, WizardContext context) { + return ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME); + } + + @Override + public Icon getGroupIcon(String group) { + return AllIcons.Modules.Types.UserDefined; + } +} diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java new file mode 100644 index 000000000000..7b910943c002 --- /dev/null +++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduSelectCourseProjectWizard.java @@ -0,0 +1,61 @@ +package com.jetbrains.edu.intellij.android; + +import com.intellij.ide.projectWizard.ProjectSettingsStep; +import com.intellij.ide.projectWizard.ProjectTemplateList; +import com.intellij.ide.util.newProjectWizard.AbstractProjectWizard; +import com.intellij.ide.util.newProjectWizard.StepSequence; +import com.intellij.ide.util.projectWizard.ModuleWizardStep; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.platform.ProjectTemplate; +import com.jetbrains.edu.intellij.EduIntelliJProjectTemplate; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +class EduSelectCourseProjectWizard extends AbstractProjectWizard { + + private StepSequence mySequence = new StepSequence(); + + EduSelectCourseProjectWizard() { + super("New Course", null, (String)null); + init(); + } + + protected void init() { + myWizardContext.setModulesProvider(ModulesProvider.EMPTY_MODULES_PROVIDER); + MyChooseCourseStep step = new MyChooseCourseStep(); + mySequence.addCommonStep(step); + mySequence.addCommonFinishingStep(new ProjectSettingsStep(myWizardContext), null); + mySequence.getAllSteps().forEach(this::addStep); + super.init(); + } + + @Override + public StepSequence getSequence() { + return mySequence; + } + + private class MyChooseCourseStep extends ModuleWizardStep { + private ProjectTemplateList myTemplateList = new ProjectTemplateList(); + + @Override + public JComponent getComponent() { + return myTemplateList; + } + + @Override + public void updateDataModel() { + myWizardContext.setProjectTemplate(myTemplateList.getSelectedTemplate()); + } + + @Override + public void updateStep() { + List templates = new ArrayList<>(); + Collections.addAll(templates, ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME)); + myTemplateList.setTemplates(templates, false); + } + } +} diff --git a/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java new file mode 100644 index 000000000000..4b7d35f75a45 --- /dev/null +++ b/python/educational-core/edu-intellij/src/com/jetbrains/edu/intellij/android/EduStartLearningAction.java @@ -0,0 +1,28 @@ +package com.jetbrains.edu.intellij.android; + +import com.intellij.icons.AllIcons; +import com.intellij.ide.impl.NewProjectUtil; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ApplicationManager; +import com.jetbrains.edu.intellij.EduIntelliJProjectTemplate; + +public class EduStartLearningAction extends AnAction { + + public EduStartLearningAction() { + super(AllIcons.Modules.Types.UserDefined); + } + + @Override + public void actionPerformed(AnActionEvent e) { + EduSelectCourseProjectWizard wizard = new EduSelectCourseProjectWizard(); + NewProjectUtil.createNewProject(AnAction.getEventProject(e), wizard); + } + + @Override + public void update(AnActionEvent e) { + if (ApplicationManager.getApplication().getExtensions(EduIntelliJProjectTemplate.EP_NAME).length < 1) { + e.getPresentation().setEnabledAndVisible(false); + } + } +} diff --git a/python/educational-core/settings.gradle b/python/educational-core/settings.gradle index 8377fed16671..9089b7568c38 100644 --- a/python/educational-core/settings.gradle +++ b/python/educational-core/settings.gradle @@ -1 +1 @@ -include 'student', 'course-creator' \ No newline at end of file +include 'student', 'course-creator', 'edu-intellij' \ No newline at end of file diff --git a/python/educational-core/student/resources/META-INF/android-dependencies.xml b/python/educational-core/student/resources/META-INF/android-dependencies.xml new file mode 100644 index 000000000000..0d220c720017 --- /dev/null +++ b/python/educational-core/student/resources/META-INF/android-dependencies.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/python/educational-core/student/resources/META-INF/edu-intellij.xml b/python/educational-core/student/resources/META-INF/edu-intellij.xml new file mode 100644 index 000000000000..5737fe0ace7c --- /dev/null +++ b/python/educational-core/student/resources/META-INF/edu-intellij.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/python/educational-core/student/resources/META-INF/plugin.xml b/python/educational-core/student/resources/META-INF/plugin.xml index e66e65581561..cfdebc5729f6 100644 --- a/python/educational-core/student/resources/META-INF/plugin.xml +++ b/python/educational-core/student/resources/META-INF/plugin.xml @@ -20,6 +20,8 @@ on how to target different products --> com.intellij.modules.lang + com.intellij.modules.androidstudio + com.intellij.modules.java @@ -35,6 +37,10 @@ + + + +