diff --git a/python/educational-core/resources/META-INF/plugin.xml b/python/educational-core/resources/META-INF/plugin.xml index 838d3d077cbb..d1523e23db1d 100644 --- a/python/educational-core/resources/META-INF/plugin.xml +++ b/python/educational-core/resources/META-INF/plugin.xml @@ -83,6 +83,10 @@ text="Fill Answer Placeholders"> + + + @@ -170,7 +174,7 @@ - + diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java new file mode 100644 index 000000000000..0a6202110dea --- /dev/null +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/actions/CCPluginToggleAction.java @@ -0,0 +1,17 @@ +package com.jetbrains.edu.coursecreator.actions; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.jetbrains.edu.learning.StudySettings; + +public class CCPluginToggleAction extends ToggleAction { + @Override + public boolean isSelected(AnActionEvent e) { + return StudySettings.getInstance().isCourseCreatorEnabled(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + StudySettings.getInstance().setCourseCreatorEnabled(state); + } +} \ No newline at end of file diff --git a/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java b/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java index c61a866b0fc6..6f5e3cd7768b 100644 --- a/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java +++ b/python/educational-core/src/com/jetbrains/edu/coursecreator/settings/CCOptions.java @@ -2,6 +2,7 @@ package com.jetbrains.edu.coursecreator.settings; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.wm.IdeFocusManager; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.settings.StudyOptionsProvider; import org.jetbrains.annotations.Nullable; @@ -15,6 +16,7 @@ public class CCOptions implements StudyOptionsProvider { @Nullable @Override public JComponent createComponent() { + if (!StudySettings.getInstance().isCourseCreatorEnabled()) return null; if (CCSettings.getInstance().useHtmlAsDefaultTaskFormat()) { myHtmlRadioButton.setSelected(true); IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java b/python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java similarity index 64% rename from python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java rename to python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java index 94b2d9b6c817..60a44d7c546f 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicUpdateSettings.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/StudySettings.java @@ -1,19 +1,21 @@ -package com.jetbrains.edu.learning.stepic; +package com.jetbrains.edu.learning; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.util.xmlb.XmlSerializerUtil; +import com.jetbrains.edu.learning.stepic.StepicUser; import org.jetbrains.annotations.Nullable; @State(name = "StepicUpdateSettings", storages = @Storage("other.xml")) -public class StepicUpdateSettings implements PersistentStateComponent { +public class StudySettings implements PersistentStateComponent { private StepicUser myUser; public long LAST_TIME_CHECKED = 0; private boolean myEnableTestingFromSamples = false; + private boolean isCourseCreatorEnabled = false; - public StepicUpdateSettings() { + public StudySettings() { } public long getLastTimeChecked() { @@ -26,17 +28,17 @@ public class StepicUpdateSettings implements PersistentStateComponent @@ -185,7 +187,7 @@ public class StudyCheckTask extends com.intellij.openapi.progress.Task.Backgroun if (testOutput != null) { // As tests in adaptive courses are created from // samples and stored in task, to disable it we should ignore local testing results - if (StepicUpdateSettings.getInstance().isEnableTestingFromSamples() && !testOutput.isSuccess()) { + if (StudySettings.getInstance().isEnableTestingFromSamples() && !testOutput.isSuccess()) { onTaskFailed(testOutput.getMessage()); } else { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java b/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java index 58c82ec9b24f..86297e048d58 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/courseGeneration/StudyProjectGenerator.java @@ -23,6 +23,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.util.containers.ContainerUtil; import com.jetbrains.edu.learning.StudySerializationUtils; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.core.EduNames; @@ -35,7 +36,6 @@ import com.jetbrains.edu.learning.courseFormat.tasks.Task; import com.jetbrains.edu.learning.editor.StudyEditor; import com.jetbrains.edu.learning.statistics.EduUsagesCollector; import com.jetbrains.edu.learning.stepic.EduStepicConnector; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.stepic.StepicUser; import org.apache.commons.codec.binary.Base64; import org.jetbrains.annotations.NotNull; @@ -65,7 +65,7 @@ public class StudyProjectGenerator { } public boolean isLoggedIn() { - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); return user != null; } @@ -121,7 +121,7 @@ public class StudyProjectGenerator { return getCourseFromStepic(project); } else { - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user != null) { final File adaptiveCourseFile = new File(new File(OUR_COURSES_DIR, ADAPTIVE_COURSE_PREFIX + mySelectedCourseInfo.getName() + "_" + @@ -405,7 +405,7 @@ public class StudyProjectGenerator { myCourses = getCoursesFromCache(); } if (force || myCourses.isEmpty()) { - myCourses = execCancelable(() -> EduStepicConnector.getCourses(StepicUpdateSettings.getInstance().getUser())); + myCourses = execCancelable(() -> EduStepicConnector.getCourses(StudySettings.getInstance().getUser())); flushCache(myCourses); } if (myCourses.isEmpty() || (myCourses.size() == 1 && myCourses.contains(CourseInfo.INVALID_COURSE))) { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java index db1dc541e2ce..2938f63bd0bc 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduAdaptiveStepicConnector.java @@ -20,6 +20,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.checker.StudyExecutor; @@ -83,7 +84,7 @@ public class EduAdaptiveStepicConnector { return null; } - StepicUser user = StepicUpdateSettings.getInstance().getUser(); + StepicUser user = StudySettings.getInstance().getUser(); if (user == null) { LOG.warn("User is null"); return null; @@ -303,7 +304,7 @@ public class EduAdaptiveStepicConnector { final Course course = StudyTaskManager.getInstance(project).getCourse(); if (course != null && editor != null && editor.getTaskFile() != null) { indicator.checkCanceled(); - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user == null) { LOG.warn("Can't get next recommendation: user is null"); ApplicationManager.getApplication().invokeLater(() -> StudyUtils.showErrorPopupOnToolbar(project, diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java index e94b9b39108b..3a2986023484 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicAuthorizedClient.java @@ -5,6 +5,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.jetbrains.edu.learning.StudySettings; import org.apache.http.*; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; @@ -36,13 +37,12 @@ public class EduStepicAuthorizedClient { return ourClient; } - StepicUpdateSettings stepicUpdateSettings = StepicUpdateSettings.getInstance(); + StudySettings studySettings = StudySettings.getInstance(); - - if (stepicUpdateSettings.getUser() == null) { + if (studySettings.getUser() == null) { final StepicUser user = showLoginDialog(); if (user != null) { - stepicUpdateSettings.setUser(user); + studySettings.setUser(user); } else { LOG.warn("Unable to login"); @@ -50,7 +50,7 @@ public class EduStepicAuthorizedClient { } } - StepicUser stepicUser = stepicUpdateSettings.getUser(); + StepicUser stepicUser = studySettings.getUser(); assert stepicUser != null; if (!EduStepicClient.isTokenUpToDate(stepicUser.getAccessToken())) { diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java index b4e2f8b4107e..1931f7a2e768 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicConnector.java @@ -9,6 +9,7 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.core.EduNames; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.CourseInfo; @@ -259,7 +260,7 @@ public class EduStepicConnector { } private static T getFromStepic(String link, final Class container) throws IOException{ - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); final boolean isAuthorized = user != null; if (isAuthorized) { return EduStepicAuthorizedClient.getFromStepic(link, container, user); @@ -355,7 +356,7 @@ public class EduStepicConnector { public static String postAttempt(int id) throws IOException { final CloseableHttpClient client = EduStepicAuthorizedClient.getHttpClient(); - if (client == null || StepicUpdateSettings.getInstance().getUser() == null) return ""; + if (client == null || StudySettings.getInstance().getUser() == null) return ""; final HttpPost attemptRequest = new HttpPost(EduStepicNames.STEPIC_API_URL + EduStepicNames.ATTEMPTS); String attemptRequestBody = new Gson().toJson(new StepicWrappers.AttemptWrapper(id)); attemptRequest.setEntity(new StringEntity(attemptRequestBody, ContentType.APPLICATION_JSON)); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java index b84efb073aa2..ed8afb093f92 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/EduStepicUpdater.java @@ -10,6 +10,7 @@ import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Alarm; import com.intellij.util.text.DateFormatUtil; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.courseFormat.CourseInfo; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import org.jetbrains.annotations.NotNull; @@ -34,7 +35,7 @@ public class EduStepicUpdater { @Override public void appFrameCreated(String[] commandLineArgs, @NotNull Ref willOpenProject) { - long timeToNextCheck = StepicUpdateSettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); + long timeToNextCheck = StudySettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); if (timeToNextCheck <= 0) { myCheckRunnable.run(); } @@ -51,7 +52,7 @@ public class EduStepicUpdater { final List courses = EduStepicConnector.getCourses(null); final List cachedCourses = StudyProjectGenerator.getCoursesFromCache(); StudyProjectGenerator.flushCache(courses); - StepicUpdateSettings.getInstance().setLastTimeChecked(System.currentTimeMillis()); + StudySettings.getInstance().setLastTimeChecked(System.currentTimeMillis()); courses.removeAll(cachedCourses); if (!courses.isEmpty() && !cachedCourses.isEmpty()) { @@ -79,7 +80,7 @@ public class EduStepicUpdater { private static boolean checkNeeded() { final List courses = StudyProjectGenerator.getCoursesFromCache(); - long timeToNextCheck = StepicUpdateSettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); + long timeToNextCheck = StudySettings.getInstance().getLastTimeChecked() + CHECK_INTERVAL - System.currentTimeMillis(); return courses.isEmpty() || timeToNextCheck <= 0; } } diff --git a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java b/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java index 14ee91102936..a45c53652962 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/stepic/StepicStudyOptions.java @@ -20,6 +20,7 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBCheckBox; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.settings.StudyOptionsProvider; import org.jetbrains.annotations.NotNull; @@ -79,7 +80,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { @Override public void reset() { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); myEnableTestingFromSamples.setSelected(stepikSettings.isEnableTestingFromSamples()); final StepicUser user = stepikSettings.getUser(); if (user != null) { @@ -95,7 +96,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { @Override public void apply() throws ConfigurationException { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); if (isTestingFromSamplesEnabled() != stepikSettings.isEnableTestingFromSamples()) { stepikSettings.setEnableTestingFromSamples(isTestingFromSamplesEnabled()); } @@ -131,7 +132,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { } private static void removeCredentials() { - StepicUpdateSettings.getInstance().setUser(null); + StudySettings.getInstance().setUser(null); EduStepicAuthorizedClient.invalidateClient(); } @@ -142,7 +143,7 @@ public class StepicStudyOptions implements StudyOptionsProvider { } public boolean isModified() { - final StepicUpdateSettings stepikSettings = StepicUpdateSettings.getInstance(); + final StudySettings stepikSettings = StudySettings.getInstance(); boolean isTestOptionModified = !isTestingFromSamplesEnabled() == stepikSettings.isEnableTestingFromSamples(); final StepicUser user = stepikSettings.getUser(); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java b/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java index aa3ea057a709..f71f2df18e9a 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/ui/LoginPanel.java @@ -3,9 +3,9 @@ package com.jetbrains.edu.learning.ui; import com.intellij.ide.BrowserUtil; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBLabel; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.stepic.EduStepicNames; import com.jetbrains.edu.learning.stepic.LoginDialog; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.stepic.StepicUser; import javax.swing.*; @@ -49,7 +49,7 @@ public class LoginPanel { e.getComponent().setCursor(Cursor.getDefaultCursor()); } }); - final StepicUser user = StepicUpdateSettings.getInstance().getUser(); + final StepicUser user = StudySettings.getInstance().getUser(); if (user != null) { myLoginField.setText(user.getEmail()); myPasswordField.setText(user.getPassword()); diff --git a/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java b/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java index 46216fcb45c7..e236b5487fa3 100644 --- a/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java +++ b/python/educational-core/src/com/jetbrains/edu/learning/ui/StudyNewProjectPanel.java @@ -26,11 +26,15 @@ import com.intellij.ui.AncestorListenerAdapter; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.components.JBScrollPane; import com.intellij.util.ui.UIUtil; +import com.jetbrains.edu.learning.StudySettings; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.CourseInfo; import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; -import com.jetbrains.edu.learning.stepic.*; +import com.jetbrains.edu.learning.stepic.EduAdaptiveStepicConnector; +import com.jetbrains.edu.learning.stepic.EduStepicAuthorizedClient; +import com.jetbrains.edu.learning.stepic.LoginDialog; +import com.jetbrains.edu.learning.stepic.StepicUser; import icons.EducationalCoreIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -361,7 +365,7 @@ public class StudyNewProjectPanel extends JPanel implements PanelWithAnchor { if (stepicUser != null) { stepicUser.setEmail(myLoginPanel.getLogin()); stepicUser.setPassword(myLoginPanel.getPassword()); - StepicUpdateSettings.getInstance().setUser(stepicUser); + StudySettings.getInstance().setUser(stepicUser); myGenerator.setEnrolledCoursesIds(EduAdaptiveStepicConnector.getEnrolledCoursesIds(stepicUser)); final List courses = myGenerator.getCourses(true); if (courses != null && myRefreshCourseList) { diff --git a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java index 5e079da7d852..a9d7e496138f 100644 --- a/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java +++ b/python/educational-python/Edu-Python/src/com/jetbrains/edu/learning/PyStudyDirectoryProjectGenerator.java @@ -24,10 +24,9 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiManager; import com.intellij.util.BooleanFunction; import com.jetbrains.edu.learning.courseFormat.Course; -import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import com.jetbrains.edu.learning.courseFormat.CourseInfo; +import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator; import com.jetbrains.edu.learning.stepic.EduStepicConnector; -import com.jetbrains.edu.learning.stepic.StepicUpdateSettings; import com.jetbrains.edu.learning.ui.StudyNewProjectPanel; import com.jetbrains.python.configuration.PyConfigurableInterpreterList; import com.jetbrains.python.newProject.PyNewProjectSettings; @@ -190,7 +189,7 @@ public class PyStudyDirectoryProjectGenerator extends PythonProjectGenerator { ProgressManager.getInstance().getProgressIndicator().setIndeterminate(true); return StudyUtils.execCancelable(() -> EduStepicConnector.enrollToCourse(course.getId(), - StepicUpdateSettings.getInstance().getUser())); + StudySettings.getInstance().getUser())); }, "Creating Course", true, ProjectManager.getInstance().getDefaultProject()); } diff --git a/python/educational-python/educational-python.iml b/python/educational-python/educational-python.iml index 92200056b482..3d354ed20918 100644 --- a/python/educational-python/educational-python.iml +++ b/python/educational-python/educational-python.iml @@ -26,5 +26,6 @@ + \ No newline at end of file diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/student.png b/python/educational-python/resources/icons/com/jetbrains/edu/student.png new file mode 100644 index 000000000000..f5b75f2167a6 Binary files /dev/null and b/python/educational-python/resources/icons/com/jetbrains/edu/student.png differ diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/teacher.png b/python/educational-python/resources/icons/com/jetbrains/edu/teacher.png new file mode 100644 index 000000000000..221e396ff599 Binary files /dev/null and b/python/educational-python/resources/icons/com/jetbrains/edu/teacher.png differ diff --git a/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java b/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java index 989c750681f3..f9c27f5fde05 100644 --- a/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java +++ b/python/educational-python/src/com/intellij/openapi/application/PyCharmEduConfigImportSettings.java @@ -6,7 +6,8 @@ import com.intellij.ide.plugins.PluginManagerCore; @SuppressWarnings("UnusedDeclaration") public class PyCharmEduConfigImportSettings extends ConfigImportSettings { public PyCharmEduConfigImportSettings() { - PluginManagerCore.disablePlugin("org.jetbrains.plugins.coursecreator"); + PluginManagerCore.disablePlugin("com.jetbrains.edu.coursecreator"); + PluginManagerCore.disablePlugin("com.jetbrains.edu.coursecreator.python"); } } diff --git a/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java b/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java new file mode 100644 index 000000000000..603deb9c8605 --- /dev/null +++ b/python/educational-python/src/com/jetbrains/python/edu/CustomizeEduStepPanel.java @@ -0,0 +1,49 @@ +package com.jetbrains.python.edu; + +import com.intellij.ide.customize.AbstractCustomizeWizardStep; +import com.intellij.openapi.ui.VerticalFlowLayout; +import com.intellij.openapi.util.IconLoader; +import com.jetbrains.edu.learning.StudySettings; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class CustomizeEduStepPanel extends AbstractCustomizeWizardStep { + + public CustomizeEduStepPanel() { + final JPanel studentPanel = new JPanel(new VerticalFlowLayout()); + final JButton student = new JButton(IconLoader.findIcon("/icons/com/jetbrains/edu/student.png")); + student.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudySettings.getInstance().setCourseCreatorEnabled(false); + } + }); + studentPanel.add(student); + studentPanel.add(new JLabel("Student", SwingConstants.CENTER)); + add(studentPanel); + + final JButton teacher = new JButton(IconLoader.findIcon("/icons/com/jetbrains/edu/teacher.png")); + final JPanel teacherPanel = new JPanel(new VerticalFlowLayout()); + teacherPanel.add(teacher); + teacherPanel.add(new JLabel("Teacher", SwingConstants.CENTER)); + teacher.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + StudySettings.getInstance().setCourseCreatorEnabled(true); + } + }); + add(teacherPanel); + } + + @Override + protected String getTitle() { + return "Are you student or teacher?"; + } + + @Override + protected String getHTMLHeader() { + return ""; + } +} diff --git a/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java b/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java index 0037d1b3048e..380da1c7bb79 100644 --- a/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java +++ b/python/educational-python/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java @@ -25,6 +25,9 @@ import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.ide.AppLifecycleListener; import com.intellij.ide.GeneralSettings; import com.intellij.ide.SelectInTarget; +import com.intellij.ide.customize.AbstractCustomizeWizardStep; +import com.intellij.ide.customize.CustomizeIDEWizardDialog; +import com.intellij.ide.customize.CustomizeIDEWizardStepsProvider; import com.intellij.ide.projectView.impl.AbstractProjectViewPane; import com.intellij.ide.scopeView.ScopeViewPane; import com.intellij.ide.ui.UISettings; @@ -87,6 +90,7 @@ import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -194,9 +198,9 @@ public class PyCharmEduInitialConfigurator { ApplicationManager.getApplication().invokeLater(() -> { if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) { GeneralSettings.getInstance().setShowTipsOnStartup(false); - propertiesComponent.setValue(DISPLAYED_PROPERTY, "true"); - patchKeymap(); + showInitialConfigurationDialog(); + propertiesComponent.setValue(DISPLAYED_PROPERTY, "true"); } }); } @@ -396,5 +400,12 @@ public class PyCharmEduInitialConfigurator { } } } - + private static void showInitialConfigurationDialog() { + new CustomizeIDEWizardDialog(new CustomizeIDEWizardStepsProvider() { + @Override + public void initSteps(@NotNull CustomizeIDEWizardDialog dialog, @NotNull List steps) { + steps.add(new CustomizeEduStepPanel()); + } + }).show(); + } }