diff --git a/python/educational-core/course-creator/resources/META-INF/plugin.xml b/python/educational-core/course-creator/resources/META-INF/plugin.xml index b46da939f1b4..7ba0e8107a88 100644 --- a/python/educational-core/course-creator/resources/META-INF/plugin.xml +++ b/python/educational-core/course-creator/resources/META-INF/plugin.xml @@ -56,8 +56,8 @@ - - + + diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCAddAsTaskFile.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCAddAsTaskFile.java index c62bd5e1e069..f98a0223f451 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCAddAsTaskFile.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCAddAsTaskFile.java @@ -1,20 +1,77 @@ package com.jetbrains.edu.coursecreator.actions; +import com.intellij.ide.projectView.ProjectView; +import com.intellij.openapi.command.undo.DocumentReference; +import com.intellij.openapi.command.undo.UndoableAction; +import com.intellij.openapi.command.undo.UnexpectedUndoException; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.jetbrains.edu.coursecreator.CCUtils; import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.core.EduUtils; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.Task; +import com.jetbrains.edu.learning.courseFormat.TaskFile; +import org.jetbrains.annotations.Nullable; public class CCAddAsTaskFile extends CCTaskFileActionBase { + public static final String ACTION_NAME = "Make Visible to Student"; + + public CCAddAsTaskFile() { + super(ACTION_NAME); + } + protected void performAction(VirtualFile file, Task task, Course course, Project project) { - task.addTaskFile(file.getName(), task.getTaskFiles().size()); - CCUtils.createResourceFile(file, course, StudyUtils.getTaskDir(file)); + EduUtils.runUndoableAction(project, ACTION_NAME, new AddTaskFile(file, null, course, project, task)); } protected boolean isAvailable(Project project, VirtualFile file) { return StudyUtils.getTaskFile(project, file) == null && !CCUtils.isTestsFile(project, file); } + + private static class AddTaskFile implements UndoableAction { + private final VirtualFile myFile; + private TaskFile myTaskFile; + private final Course myCourse; + private final Project myProject; + private final Task myTask; + + public AddTaskFile(VirtualFile file, TaskFile taskFile, Course course, Project project, Task task) { + myFile = file; + myTaskFile = taskFile; + myCourse = course; + myProject = project; + myTask = task; + } + + @Override + public void undo() throws UnexpectedUndoException { + CCHideFromStudent.hideFromStudent(myFile, myProject, myTask.getTaskFiles(), myTaskFile); + ProjectView.getInstance(myProject).refresh(); + } + + @Override + public void redo() throws UnexpectedUndoException { + if (myTaskFile != null) { + myTask.addTaskFile(myTaskFile); + } else { + myTask.addTaskFile(myFile.getName(), myTask.getTaskFiles().size()); + myTaskFile = myTask.getTaskFile(myFile.getName()); + } + CCUtils.createResourceFile(myFile, myCourse, StudyUtils.getTaskDir(myFile)); + ProjectView.getInstance(myProject).refresh(); + } + + @Nullable + @Override + public DocumentReference[] getAffectedDocuments() { + return new DocumentReference[0]; + } + + @Override + public boolean isGlobal() { + return true; + } + } } diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCHideFromStudent.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCHideFromStudent.java index f794e69d0ea2..3ce85b39d7f8 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCHideFromStudent.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCHideFromStudent.java @@ -1,6 +1,10 @@ package com.jetbrains.edu.coursecreator.actions; +import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.command.undo.DocumentReference; +import com.intellij.openapi.command.undo.UndoableAction; +import com.intellij.openapi.command.undo.UnexpectedUndoException; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditor; @@ -8,10 +12,13 @@ import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.impl.text.PsiAwareTextEditorImpl; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.jetbrains.edu.coursecreator.CCUtils; import com.jetbrains.edu.learning.StudyUtils; +import com.jetbrains.edu.learning.core.EduUtils; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.Task; import com.jetbrains.edu.learning.courseFormat.TaskFile; +import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Map; @@ -19,14 +26,71 @@ import java.util.Map; public class CCHideFromStudent extends CCTaskFileActionBase { private static final Logger LOG = Logger.getInstance(CCHideFromStudent.class); + private static final String ACTION_NAME = "Hide from Student"; + + public CCHideFromStudent() { + super(ACTION_NAME); + } @Override protected void performAction(VirtualFile file, Task task, Course course, Project project) { - Map taskFiles = task.getTaskFiles(); TaskFile taskFile = StudyUtils.getTaskFile(project, file); if (taskFile == null) { return; } + EduUtils.runUndoableAction(project, ACTION_NAME, new HideTaskFile(project, course, file, task, taskFile)); + } + + private static class HideTaskFile implements UndoableAction { + + private final Project myProject; + private final Course myCourse; + private final VirtualFile myFile; + private final Task myTask; + private final TaskFile myTaskFile; + + public HideTaskFile(Project project, Course course, VirtualFile file, Task task, TaskFile taskFile) { + myProject = project; + myCourse = course; + myFile = file; + myTask = task; + myTaskFile = taskFile; + } + + @Override + public void undo() throws UnexpectedUndoException { + myTask.getTaskFiles().put(myFile.getName(), myTaskFile); + CCUtils.createResourceFile(myFile, myCourse, StudyUtils.getTaskDir(myFile)); + if (!myTaskFile.getAnswerPlaceholders().isEmpty() && FileEditorManager.getInstance(myProject).isFileOpen(myFile)) { + for (FileEditor fileEditor : FileEditorManager.getInstance(myProject).getEditors(myFile)) { + if (fileEditor instanceof PsiAwareTextEditorImpl) { + Editor editor = ((PsiAwareTextEditorImpl)fileEditor).getEditor(); + StudyUtils.drawAllWindows(editor, myTaskFile); + } + } + } + ProjectView.getInstance(myProject).refresh(); + } + + @Override + public void redo() throws UnexpectedUndoException { + hideFromStudent(myFile, myProject, myTask.getTaskFiles(), myTaskFile); + ProjectView.getInstance(myProject).refresh(); + } + + @Nullable + @Override + public DocumentReference[] getAffectedDocuments() { + return new DocumentReference[0]; + } + + @Override + public boolean isGlobal() { + return true; + } + } + + public static void hideFromStudent(VirtualFile file, Project project, Map taskFiles, TaskFile taskFile) { if (!taskFile.getAnswerPlaceholders().isEmpty() && FileEditorManager.getInstance(project).isFileOpen(file)) { for (FileEditor fileEditor : FileEditorManager.getInstance(project).getEditors(file)) { if (fileEditor instanceof PsiAwareTextEditorImpl) { diff --git a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCTaskFileActionBase.java b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCTaskFileActionBase.java index 4f0632e82ee8..649db137a19a 100644 --- a/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCTaskFileActionBase.java +++ b/python/educational-core/course-creator/src/com/jetbrains/edu/coursecreator/actions/CCTaskFileActionBase.java @@ -1,6 +1,5 @@ package com.jetbrains.edu.coursecreator.actions; -import com.intellij.ide.projectView.ProjectView; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -12,8 +11,12 @@ import com.jetbrains.edu.learning.StudyTaskManager; import com.jetbrains.edu.learning.StudyUtils; import com.jetbrains.edu.learning.courseFormat.Course; import com.jetbrains.edu.learning.courseFormat.Task; +import org.jetbrains.annotations.Nullable; public abstract class CCTaskFileActionBase extends AnAction { + public CCTaskFileActionBase(@Nullable String text) { + super(text); + } @Override public void actionPerformed(final AnActionEvent e) { @@ -35,7 +38,6 @@ public abstract class CCTaskFileActionBase extends AnAction { } Course course = StudyTaskManager.getInstance(project).getCourse(); performAction(file, task, course, project); - ProjectView.getInstance(project).refresh(); } protected abstract void performAction(VirtualFile file, Task task, Course course, Project project);