added idea support
[idea/community.git] / python / edu / interactive-learning-intellij-py / src / PyEduProjectTemplate.java
1 import com.intellij.ide.fileTemplates.FileTemplate;
2 import com.intellij.ide.fileTemplates.FileTemplateManager;
3 import com.intellij.ide.fileTemplates.FileTemplateUtil;
4 import com.intellij.ide.util.projectWizard.AbstractModuleBuilder;
5 import com.intellij.ide.util.projectWizard.WizardInputField;
6 import com.intellij.openapi.diagnostic.Logger;
7 import com.intellij.openapi.module.ModifiableModuleModel;
8 import com.intellij.openapi.module.Module;
9 import com.intellij.openapi.options.ConfigurationException;
10 import com.intellij.openapi.project.Project;
11 import com.intellij.openapi.projectRoots.Sdk;
12 import com.intellij.openapi.roots.ModifiableRootModel;
13 import com.intellij.openapi.startup.StartupManager;
14 import com.intellij.openapi.ui.ValidationInfo;
15 import com.intellij.openapi.vfs.VirtualFile;
16 import com.intellij.psi.PsiDirectory;
17 import com.intellij.psi.PsiManager;
18 import com.jetbrains.edu.learning.courseGeneration.StudyProjectGenerator;
19 import com.jetbrains.edu.learning.ui.StudyNewProjectPanel;
20 import com.jetbrains.python.facet.PythonSdkComboBox;
21 import com.jetbrains.python.module.PythonModuleBuilder;
22 import org.jetbrains.annotations.NotNull;
23 import org.jetbrains.annotations.Nullable;
24
25 import javax.swing.*;
26 import java.util.ArrayList;
27 import java.util.List;
28
29 public class PyEduProjectTemplate extends EduProjectTemplate {
30   private static final Logger LOG = Logger.getInstance(PyEduProjectTemplate.class);
31
32   @NotNull
33   @Override
34   public String getName() {
35     return "Python";
36   }
37
38   @Nullable
39   @Override
40   public String getDescription() {
41     return null;
42   }
43
44   @Override
45   public Icon getIcon() {
46     return null;
47   }
48
49   @NotNull
50   @Override
51   public AbstractModuleBuilder createModuleBuilder() {
52     return new PythonEduModuleBuilder();
53   }
54
55   @Nullable
56   @Override
57   public ValidationInfo validateSettings() {
58     return null;
59   }
60
61   private static class PythonEduModuleBuilder extends PythonModuleBuilder {
62
63     final StudyProjectGenerator studyProjectGenerator = new StudyProjectGenerator();
64     final PythonSdkComboBox mySdkComboBox = new PythonSdkComboBox();
65
66     @Override
67     public void setupRootModel(ModifiableRootModel rootModel) throws ConfigurationException {
68       super.setupRootModel(rootModel);
69       Sdk sdk = mySdkComboBox.getSelectedSdk();
70       if (sdk != null) {
71         rootModel.setSdk(sdk);
72       }
73     }
74
75     @Override
76     protected List<WizardInputField> getAdditionalFields() {
77       final StudyNewProjectPanel panel = new StudyNewProjectPanel(studyProjectGenerator);
78       List<WizardInputField> wizardInputFields = new ArrayList<WizardInputField>();
79       wizardInputFields.add(createWizardInputField("Edu.ProjectSdk", "Python Interpreter:", mySdkComboBox));
80       wizardInputFields.add(createWizardInputField("Edu.Courses", "Courses:", panel.getCoursesComboBox()));
81       wizardInputFields.add(createWizardInputField("Edu.InfoPanel", "", panel.getInfoPanel()));
82       return wizardInputFields;
83     }
84
85     @Nullable
86     @Override
87     public Module commitModule(@NotNull final Project project, @Nullable ModifiableModuleModel model) {
88       Module module = super.commitModule(project, model);
89       if (module != null) {
90         final VirtualFile baseDir = project.getBaseDir();
91         studyProjectGenerator.generateProject(project, baseDir);
92         final FileTemplate template = FileTemplateManager.getInstance(project).getInternalTemplate("test_helper.py");
93
94         StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() {
95           @Override
96           public void run() {
97             final PsiDirectory projectDir = PsiManager.getInstance(project).findDirectory(baseDir);
98             if (projectDir != null) {
99               try {
100                 FileTemplateUtil.createFromTemplate(template, "test_helper.py", null, projectDir);
101               }
102               catch (Exception e) {
103                 LOG.error("Failed to create test_helper", e);
104               }
105             }
106           }
107         });
108       }
109       return module;
110     }
111   }
112 }