1 package com.jetbrains.edu.coursecreator.actions;
3 import com.intellij.ide.IdeView;
4 import com.intellij.ide.fileTemplates.FileTemplate;
5 import com.intellij.ide.fileTemplates.FileTemplateManager;
6 import com.intellij.ide.fileTemplates.FileTemplateUtil;
7 import com.intellij.ide.util.DirectoryChooserUtil;
8 import com.intellij.ide.util.DirectoryUtil;
9 import com.intellij.ide.util.EditorHelper;
10 import com.intellij.lang.Language;
11 import com.intellij.openapi.actionSystem.AnActionEvent;
12 import com.intellij.openapi.actionSystem.CommonDataKeys;
13 import com.intellij.openapi.actionSystem.LangDataKeys;
14 import com.intellij.openapi.actionSystem.Presentation;
15 import com.intellij.openapi.application.ApplicationManager;
16 import com.intellij.openapi.diagnostic.Logger;
17 import com.intellij.openapi.fileEditor.FileEditorManager;
18 import com.intellij.openapi.project.DumbAwareAction;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.ui.Messages;
21 import com.intellij.openapi.util.io.FileUtil;
22 import com.intellij.openapi.vfs.VirtualFile;
23 import com.intellij.psi.PsiDirectory;
24 import com.intellij.psi.PsiElement;
25 import com.intellij.util.PlatformIcons;
26 import com.jetbrains.edu.coursecreator.CCProjectService;
27 import com.jetbrains.edu.coursecreator.CCUtils;
28 import com.jetbrains.edu.coursecreator.StudyLanguageManager;
29 import com.jetbrains.edu.coursecreator.format.Course;
30 import com.jetbrains.edu.coursecreator.format.Lesson;
31 import com.jetbrains.edu.coursecreator.format.Task;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
35 public class CCCreateTask extends DumbAwareAction {
36 private static final Logger LOG = Logger.getInstance(CCCreateTask.class.getName());
38 public CCCreateTask() {
39 super("Task", "Create new Task", PlatformIcons.DIRECTORY_CLOSED_ICON);
43 public void actionPerformed(final AnActionEvent e) {
44 final IdeView view = e.getData(LangDataKeys.IDE_VIEW);
45 final Project project = e.getData(CommonDataKeys.PROJECT);
47 if (project == null || view == null) {
50 final PsiDirectory directory = DirectoryChooserUtil.getOrChooseDirectory(view);
52 if (directory == null) return;
53 createTask(view, project, directory, true);
56 public static void createTask(final IdeView view, final Project project, final PsiDirectory lessonDir, boolean showDialog) {
57 final CCProjectService service = CCProjectService.getInstance(project);
58 final Course course = service.getCourse();
59 final Lesson lesson = course.getLesson(lessonDir.getName());
60 final int size = lesson.getTaskList().size();
61 final String taskName;
63 taskName = Messages.showInputDialog("Name:", "Task Name", null, "task" + (size + 1), null);
66 taskName = "task" + (size + 1);
69 if (taskName == null) {
72 ApplicationManager.getApplication().runWriteAction(new Runnable() {
75 final PsiDirectory taskDirectory = DirectoryUtil.createSubdirectories("task" + (size + 1), lessonDir, "\\/");
76 if (taskDirectory != null) {
77 Language language = Language.findLanguageByID(course.getLanguage());
78 if (language == null) {
81 final StudyLanguageManager studyLanguageManager = StudyLanguageManager.INSTANCE.forLanguage(language);
82 CCUtils.markDirAsSourceRoot(taskDirectory.getVirtualFile(), project);
84 final Task task = new Task(taskName);
85 task.setIndex(size + 1);
86 lesson.addTask(task, taskDirectory);
88 createFromTemplateAndOpen(taskDirectory, studyLanguageManager.getTestsTemplate(project), view);
89 createFromTemplateAndOpen(taskDirectory, FileTemplateManager.getInstance(project).getInternalTemplate("task.html"), view);
90 String defaultExtension = studyLanguageManager.getDefaultTaskFileExtension();
91 if (defaultExtension != null) {
92 FileTemplate taskFileTemplate = studyLanguageManager.getTaskFileTemplateForExtension(project,
94 createFromTemplateAndOpen(taskDirectory, taskFileTemplate, view);
95 if (taskFileTemplate != null) {
96 String taskFileName = FileUtil.getNameWithoutExtension(taskFileTemplate.getName());
97 task.addTaskFile(taskFileName + "." + defaultExtension, size + 1);
101 ApplicationManager.getApplication().invokeLater(new Runnable() {
104 FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
105 for (VirtualFile virtualFile : fileEditorManager.getOpenFiles()) {
106 fileEditorManager.closeFile(virtualFile);
115 private static void createFromTemplateAndOpen(@NotNull final PsiDirectory taskDirectory,
116 @Nullable final FileTemplate template,
117 @Nullable IdeView view) {
118 if (template == null) {
122 final PsiElement file = FileTemplateUtil.createFromTemplate(template, template.getName(), null, taskDirectory);
124 EditorHelper.openInEditor(file, false);
125 view.selectElement(file);
128 catch (Exception e) {
134 public void update(@NotNull AnActionEvent event) {
135 if (!CCProjectService.setCCActionAvailable(event)) {
138 final Presentation presentation = event.getPresentation();
139 final Project project = event.getData(CommonDataKeys.PROJECT);
140 if (project == null) {
141 presentation.setVisible(false);
142 presentation.setEnabled(false);
146 final IdeView view = event.getData(LangDataKeys.IDE_VIEW);
148 presentation.setVisible(false);
149 presentation.setEnabled(false);
153 final PsiDirectory[] directories = view.getDirectories();
154 if (directories.length == 0) {
155 presentation.setVisible(false);
156 presentation.setEnabled(false);
159 final PsiDirectory directory = DirectoryChooserUtil.getOrChooseDirectory(view);
160 final CCProjectService service = CCProjectService.getInstance(project);
161 final Course course = service.getCourse();
162 if (course != null && directory != null && course.getLesson(directory.getName()) == null) {
163 presentation.setVisible(false);
164 presentation.setEnabled(false);
168 presentation.setVisible(true);
169 presentation.setEnabled(true);