1 package com.jetbrains.edu.coursecreator.actions;
3 import com.intellij.ide.projectView.ProjectView;
4 import com.intellij.openapi.application.ApplicationManager;
5 import com.intellij.openapi.command.undo.DocumentReference;
6 import com.intellij.openapi.command.undo.UndoableAction;
7 import com.intellij.openapi.command.undo.UnexpectedUndoException;
8 import com.intellij.openapi.diagnostic.Logger;
9 import com.intellij.openapi.editor.Editor;
10 import com.intellij.openapi.fileEditor.FileEditor;
11 import com.intellij.openapi.fileEditor.FileEditorManager;
12 import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl;
13 import com.intellij.openapi.project.Project;
14 import com.intellij.openapi.vfs.VirtualFile;
15 import com.jetbrains.edu.coursecreator.CCUtils;
16 import com.jetbrains.edu.learning.StudyUtils;
17 import com.jetbrains.edu.learning.core.EduUtils;
18 import com.jetbrains.edu.learning.courseFormat.Course;
19 import com.jetbrains.edu.learning.courseFormat.Task;
20 import com.jetbrains.edu.learning.courseFormat.TaskFile;
21 import org.jetbrains.annotations.Nullable;
23 import java.io.IOException;
26 public class CCHideFromStudent extends CCTaskFileActionBase {
28 private static final Logger LOG = Logger.getInstance(CCHideFromStudent.class);
29 private static final String ACTION_NAME = "Hide from Student";
31 public CCHideFromStudent() {
36 protected void performAction(VirtualFile file, Task task, Course course, Project project) {
37 TaskFile taskFile = StudyUtils.getTaskFile(project, file);
38 if (taskFile == null) {
41 EduUtils.runUndoableAction(project, ACTION_NAME, new HideTaskFile(project, course, file, task, taskFile));
44 private static class HideTaskFile implements UndoableAction {
46 private final Project myProject;
47 private final Course myCourse;
48 private final VirtualFile myFile;
49 private final Task myTask;
50 private final TaskFile myTaskFile;
52 public HideTaskFile(Project project, Course course, VirtualFile file, Task task, TaskFile taskFile) {
57 myTaskFile = taskFile;
61 public void undo() throws UnexpectedUndoException {
62 myTask.getTaskFiles().put(myFile.getName(), myTaskFile);
63 CCUtils.createResourceFile(myFile, myCourse, StudyUtils.getTaskDir(myFile));
64 if (!myTaskFile.getAnswerPlaceholders().isEmpty() && FileEditorManager.getInstance(myProject).isFileOpen(myFile)) {
65 for (FileEditor fileEditor : FileEditorManager.getInstance(myProject).getEditors(myFile)) {
66 if (fileEditor instanceof PsiAwareTextEditorImpl) {
67 Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor();
68 StudyUtils.drawAllWindows(editor, myTaskFile);
72 ProjectView.getInstance(myProject).refresh();
76 public void redo() throws UnexpectedUndoException {
77 hideFromStudent(myFile, myProject, myTask.getTaskFiles(), myTaskFile);
78 ProjectView.getInstance(myProject).refresh();
83 public DocumentReference[] getAffectedDocuments() {
84 return new DocumentReference[0];
88 public boolean isGlobal() {
93 public static void hideFromStudent(VirtualFile file, Project project, Map<String, TaskFile> taskFiles, TaskFile taskFile) {
94 if (!taskFile.getAnswerPlaceholders().isEmpty() && FileEditorManager.getInstance(project).isFileOpen(file)) {
95 for (FileEditor fileEditor : FileEditorManager.getInstance(project).getEditors(file)) {
96 if (fileEditor instanceof PsiAwareTextEditorImpl) {
97 Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor();
98 editor.getMarkupModel().removeAllHighlighters();
102 String name = file.getName();
103 VirtualFile patternFile = StudyUtils.getPatternFile(taskFile, name);
104 ApplicationManager.getApplication().runWriteAction(() -> {
105 if (patternFile != null) {
107 patternFile.delete(CCHideFromStudent.class);
109 catch (IOException e) {
114 taskFiles.remove(name);
118 protected boolean isAvailable(Project project, VirtualFile file) {
119 return StudyUtils.getTaskFile(project, file) != null;