EDU-555 Add As Task File action should be undoable and revertable

This commit is contained in:
Liana Bakradze
2016-08-05 19:45:17 +03:00
parent 4cc79624d5
commit 40cb22fb1f
4 changed files with 130 additions and 7 deletions
@@ -56,8 +56,8 @@
<action id="ChangeCourseInfo" class="com.jetbrains.edu.coursecreator.actions.CCChangeCourseInfo"/>
<group id="CCProjectViewGroup" popup="true" text="Course Creator" class="com.jetbrains.edu.coursecreator.actions.CCProjectViewActionGroup">
<action id="AddTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCAddAsTaskFile" text="Make Visible to Student"/>
<action id="HideTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCHideFromStudent" text="Hide from Student"/>
<action id="AddTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCAddAsTaskFile"/>
<action id="HideTaskFile" class="com.jetbrains.edu.coursecreator.actions.CCHideFromStudent"/>
<action id="ShowPreview" class="com.jetbrains.edu.coursecreator.actions.CCShowPreview">
<add-to-group group-id="EditorTabPopupMenu"/>
</action>
@@ -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;
}
}
}
@@ -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<String, TaskFile> 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<String, TaskFile> taskFiles, TaskFile taskFile) {
if (!taskFile.getAnswerPlaceholders().isEmpty() && FileEditorManager.getInstance(project).isFileOpen(file)) {
for (FileEditor fileEditor : FileEditorManager.getInstance(project).getEditors(file)) {
if (fileEditor instanceof PsiAwareTextEditorImpl) {
@@ -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);