<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>
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;
+ }
+ }
}
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;
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;
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) {
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;
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) {
}
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);