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);