EDU-364 "Introduction to Python" action often opens wrong project
[idea/community.git] / python / edu / interactive-learning-python / src / com / jetbrains / edu / learning / actions / PyStudyIntroductionCourseAction.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.edu.learning.actions;
17
18 import com.intellij.ide.impl.ProjectUtil;
19 import com.intellij.openapi.actionSystem.AnAction;
20 import com.intellij.openapi.actionSystem.AnActionEvent;
21 import com.intellij.openapi.actionSystem.Presentation;
22 import com.intellij.openapi.project.Project;
23 import com.intellij.openapi.project.ProjectManager;
24 import com.intellij.openapi.projectRoots.Sdk;
25 import com.jetbrains.edu.learning.PyStudyDirectoryProjectGenerator;
26 import com.jetbrains.edu.stepic.CourseInfo;
27 import com.jetbrains.python.configuration.PyConfigurableInterpreterList;
28 import com.jetbrains.python.newProject.actions.GenerateProjectCallback;
29 import com.jetbrains.python.newProject.actions.ProjectSpecificSettingsStep;
30 import icons.InteractiveLearningPythonIcons;
31 import org.jetbrains.annotations.NotNull;
32 import org.jetbrains.annotations.Nullable;
33
34 import java.io.File;
35 import java.util.List;
36
37 public class PyStudyIntroductionCourseAction extends AnAction {
38
39   public static final String INTRODUCTION_TO_PYTHON = "Introduction to Python";
40   public static final String INTRODUCTION_FOLDER = "PythonIntroduction";
41
42   public PyStudyIntroductionCourseAction() {
43     super(INTRODUCTION_TO_PYTHON, INTRODUCTION_TO_PYTHON, InteractiveLearningPythonIcons.EducationalProjectType);
44   }
45
46   @Override
47   public void update(AnActionEvent e) {
48     final File projectDir = new File(ProjectUtil.getBaseDir(), INTRODUCTION_FOLDER);
49     if (projectDir.exists()) {
50       return;
51     }
52     final PyStudyDirectoryProjectGenerator generator = new PyStudyDirectoryProjectGenerator();
53     if (getIntroCourseInfo(generator.getCourses()) != null) {
54       return;
55     }
56     Presentation presentation = e.getPresentation();
57     presentation.setVisible(false);
58     presentation.setEnabled(false);
59   }
60
61   @Override
62   public void actionPerformed(@NotNull AnActionEvent e) {
63     final File projectDir = new File(ProjectUtil.getBaseDir(), INTRODUCTION_FOLDER);
64     if (projectDir.exists()) {
65       ProjectUtil.openProject(projectDir.getPath(), null, false);
66     }
67     else {
68       final PyStudyDirectoryProjectGenerator generator = new PyStudyDirectoryProjectGenerator();
69       CourseInfo introCourse = getIntroCourseInfo(generator.getCourses());
70       if (introCourse == null) {
71         return;
72       }
73       final GenerateProjectCallback callback = new GenerateProjectCallback();
74       final ProjectSpecificSettingsStep step = new ProjectSpecificSettingsStep(generator, callback);
75       step.createPanel(); // initialize panel to set location
76       step.setLocation(projectDir.toString());
77       generator.setSelectedCourse(introCourse);
78
79       final Project project = ProjectManager.getInstance().getDefaultProject();
80       final List<Sdk> sdks = PyConfigurableInterpreterList.getInstance(project).getAllPythonSdks();
81       Sdk sdk = sdks.isEmpty() ? null : sdks.iterator().next();
82       step.setSdk(sdk);
83       callback.consume(step);
84     }
85   }
86
87   @Nullable
88   private static CourseInfo getIntroCourseInfo(final List<CourseInfo> courses) {
89     for (CourseInfo courseInfo : courses) {
90       if (INTRODUCTION_TO_PYTHON.equals(courseInfo.getName())) {
91         return courseInfo;
92       }
93     }
94     return null;
95   }
96 }