mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EDU-555 Add As Task File action should be undoable and revertable
This commit is contained in:
@@ -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>
|
||||
|
||||
+59
-2
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+65
-1
@@ -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) {
|
||||
|
||||
+4
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user