add action to create course in course creator mode

This commit is contained in:
Ekaterina Tuzova
2017-05-18 11:45:20 +03:00
parent 987caaf26d
commit ce0c8252a8
16 changed files with 77 additions and 43 deletions
@@ -15,7 +15,9 @@ public class EducationalCoreIcons {
public static final Icon CheckTask = load("/icons/com/jetbrains/edu/learning/CheckTask.png"); // 16x16
public static final Icon Course = load("/icons/com/jetbrains/edu/learning/Course.png"); // 16x16
public static final Icon CourseCreationProjectType = load("/icons/com/jetbrains/edu/learning/CourseCreationProjectType.png"); // 16x16
public static final Icon CourseProgress = load("/icons/com/jetbrains/edu/learning/CourseProgress.png"); // 13x13
public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16
public static final Icon InterpreterGear = load("/icons/com/jetbrains/edu/learning/interpreterGear.png"); // 16x16
public static final Icon Lesson = load("/icons/com/jetbrains/edu/learning/Lesson.png"); // 16x16
public static final Icon LessonCompl = load("/icons/com/jetbrains/edu/learning/LessonCompl.png"); // 16x16
@@ -45,6 +45,11 @@
<add-to-group group-id="CCProjectViewGroup" anchor="last"/>
</action>
<action class="com.jetbrains.edu.coursecreator.PyCCChangeCourseInfo" id="ChangeCourseInfo" overrides="true"/>
<action id="Edu.CCNewCourse" class="com.jetbrains.edu.coursecreator.PyCCCreateCourseAction">
<add-to-group group-id="WelcomeScreen.QuickStart" anchor="after" relative-to-action="Edu.StartCourse"/>
<add-to-group group-id="FileMenu" anchor="after" relative-to-action="Edu.StartCourse"/>
</action>
</actions>
<project-components>
@@ -0,0 +1,32 @@
package com.jetbrains.edu.coursecreator;
import com.intellij.ide.util.projectWizard.AbstractNewProjectDialog;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.actionSystem.Presentation;
import com.jetbrains.edu.learning.StudySettings;
import icons.EducationalCoreIcons;
public class PyCCCreateCourseAction extends AnAction {
public PyCCCreateCourseAction() {
super("Create New Course", "Create New Course", EducationalCoreIcons.EducationalProjectType);
}
@Override
public void actionPerformed(AnActionEvent e) {
AbstractNewProjectDialog dialog = new AbstractNewProjectDialog() {
@Override
protected DefaultActionGroup createRootStep() {
return new PyCCCreateCourseProjectStep();
}
};
dialog.show();
}
@Override
public void update(AnActionEvent e) {
Presentation presentation = e.getPresentation();
presentation.setEnabledAndVisible(StudySettings.getInstance().isCourseCreatorEnabled());
}
}
@@ -0,0 +1,30 @@
package com.jetbrains.edu.coursecreator;
import com.intellij.platform.DirectoryProjectGenerator;
import com.jetbrains.python.newProject.steps.PyCharmNewProjectStep;
import org.jetbrains.annotations.NotNull;
class PyCCCreateCourseProjectStep extends PyCharmNewProjectStep {
public PyCCCreateCourseProjectStep() {
super(new MyCustomization());
}
protected static class MyCustomization extends Customization {
private final PyCCProjectGenerator myGenerator = new PyCCProjectGenerator();
public MyCustomization() {
}
@NotNull
@Override
protected DirectoryProjectGenerator[] getProjectGenerators() {
return new DirectoryProjectGenerator[] {};
}
@NotNull
@Override
protected DirectoryProjectGenerator createEmptyProjectGenerator() {
return myGenerator;
}
}
}
@@ -27,7 +27,7 @@ import com.jetbrains.python.PythonLanguage;
import com.jetbrains.python.newProject.PyNewProjectSettings;
import com.jetbrains.python.newProject.PythonProjectGenerator;
import com.jetbrains.python.remote.PyProjectSynchronizer;
import icons.InteractiveLearningPythonIcons;
import icons.EducationalCoreIcons;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -48,7 +48,7 @@ public class PyCCProjectGenerator extends PythonProjectGenerator<PyNewProjectSet
@Nullable
@Override
public Icon getLogo() {
return InteractiveLearningPythonIcons.CourseCreationProjectType;
return EducationalCoreIcons.CourseCreationProjectType;
}
@Override
@@ -2,18 +2,12 @@ package com.jetbrains.edu.learning;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.extensions.ExtensionsArea;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.platform.DirectoryProjectGenerator;
import com.intellij.util.messages.MessageBus;
import com.jetbrains.edu.coursecreator.PyCCProjectGenerator;
import org.jetbrains.annotations.NonNls;
import java.io.File;
@@ -21,7 +15,6 @@ import java.io.File;
@SuppressWarnings({"UtilityClassWithoutPrivateConstructor", "UtilityClassWithPublicConstructor"})
public class PyStudyInitialConfigurator implements ApplicationComponent {
@NonNls private static final String CONFIGURED_V40 = "StudyPyCharm.InitialConfiguration40";
private final PyCCProjectGenerator myGenerator = new PyCCProjectGenerator();
/**
* @noinspection UnusedParameters
@@ -36,20 +29,5 @@ public class PyStudyInitialConfigurator implements ApplicationComponent {
FileUtil.delete(courses);
propertiesComponent.setValue(CONFIGURED_V40, "true");
}
ApplicationManager.getApplication().getMessageBus().connect().subscribe(StudySettings.SETTINGS_CHANGED, () -> {
ExtensionsArea rootArea = Extensions.getArea(null);
final boolean creatorEnabled = StudySettings.getInstance().isCourseCreatorEnabled();
final ExtensionPoint<DirectoryProjectGenerator> extensionPoint = rootArea.getExtensionPoint(DirectoryProjectGenerator.EP_NAME);
if (creatorEnabled) {
if (!extensionPoint.hasExtension(myGenerator)) {
extensionPoint.registerExtension(myGenerator);
}
}
else {
if (extensionPoint.hasExtension(myGenerator)) {
extensionPoint.unregisterExtension(myGenerator);
}
}
});
}
}
@@ -1,18 +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 InteractiveLearningPythonIcons {
private static Icon load(String path) {
return IconLoader.getIcon(path, InteractiveLearningPythonIcons.class);
}
public static final Icon CourseCreationProjectType = load("/icons/com/jetbrains/edu/learning/CourseCreationProjectType.png"); // 16x16
public static final Icon EducationalProjectType = load("/icons/com/jetbrains/edu/learning/EducationalProjectType.png"); // 16x16
}
@@ -61,6 +61,7 @@ import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.startup.StartupManager;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.*;
@@ -201,11 +202,15 @@ public class PyCharmEduInitialConfigurator {
if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) {
GeneralSettings.getInstance().setShowTipsOnStartup(false);
patchKeymap();
showInitialConfigurationDialog();
propertiesComponent.setValue(DISPLAYED_PROPERTY, "true");
}
});
}
@Override
public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) {
showInitialConfigurationDialog();
}
});
}