From 59457e668b4e383bffb8618eeabe01aac446dc1e Mon Sep 17 00:00:00 2001 From: medvector Date: Mon, 18 Aug 2014 19:23:28 +0400 Subject: [PATCH] course description window fixed and checker updated --- .../python/edu/actions/StudyCheckAction.java | 102 +++++++++++++----- .../edu/actions/StudyRefreshTaskAction.java | 9 +- .../jetbrains/python/edu/course/Lesson.java | 4 +- .../python/edu/course/LessonInfo.java | 17 +++ .../jetbrains/python/edu/course/Stateful.java | 2 +- .../com/jetbrains/python/edu/course/Task.java | 19 ++-- .../jetbrains/python/edu/course/TaskFile.java | 4 +- .../python/edu/course/TaskWindow.java | 2 +- 8 files changed, 106 insertions(+), 53 deletions(-) diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java index ad3df265ccda..f8e10c9c4521 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyCheckAction.java @@ -11,6 +11,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.fileEditor.FileEditor; +import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; @@ -33,7 +35,8 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; import java.io.*; -import java.util.Map; +import java.util.*; +import java.util.List; public class StudyCheckAction extends DumbAwareAction { @@ -111,13 +114,26 @@ public class StudyCheckAction extends DumbAwareAction { if (openedFile != null) { StudyTaskManager taskManager = StudyTaskManager.getInstance(project); final TaskFile selectedTaskFile = taskManager.getTaskFile(openedFile); + List filesToDelete = new ArrayList(); if (selectedTaskFile != null) { - VirtualFile windowsDescription = StudyUtils.flushWindows(selectedEditor.getDocument(), selectedTaskFile, openedFile); - FileDocumentManager.getInstance().saveAllDocuments(); final VirtualFile taskDir = openedFile.getParent(); Task currentTask = selectedTaskFile.getTask(); + StudyStatus oldStatus = currentTask.getStatus(); + Map taskFiles = selectedTaskFile.getTask().getTaskFiles(); + for (Map.Entry entry : taskFiles.entrySet()) { + String name = entry.getKey(); + TaskFile taskFile = entry.getValue(); + VirtualFile virtualFile = taskDir.findChild(name); + if (virtualFile == null) { + continue; + } + VirtualFile windowFile = StudyUtils.flushWindows(FileDocumentManager.getInstance().getDocument(virtualFile), taskFile, virtualFile); + filesToDelete.add(windowFile); + FileDocumentManager.getInstance().saveAllDocuments(); + } + StudyRunAction runAction = (StudyRunAction)ActionManager.getInstance().getAction(StudyRunAction.ACTION_ID); - if (runAction != null) { + if (runAction != null && currentTask.getTaskFiles().size() == 1) { runAction.run(project); } final StudyTestRunner testRunner = new StudyTestRunner(currentTask, taskDir); @@ -131,36 +147,68 @@ public class StudyCheckAction extends DumbAwareAction { if (testProcess != null) { String failedMessage = testRunner.getPassedTests(testProcess); if (failedMessage.equals(StudyTestRunner.TEST_OK)) { - currentTask.setStatus(StudyStatus.Solved); + currentTask.setStatus(StudyStatus.Solved, oldStatus); StudyUtils.updateStudyToolWindow(project); selectedTaskFile.drawAllWindows(selectedEditor); ProjectView.getInstance(project).refresh(); + for (VirtualFile file:filesToDelete) { + try { + file.delete(this); + } + catch (IOException e) { + LOG.error(e); + } + } createTestResultPopUp("Congratulations!", JBColor.GREEN, project); return; } - - final TaskFile taskFileCopy = new TaskFile(); - final VirtualFile copyWithAnswers = getCopyWithAnswers(taskDir, openedFile, selectedTaskFile, taskFileCopy); - for (final TaskWindow taskWindow : taskFileCopy.getTaskWindows()) { - if (!taskWindow.isValid(selectedEditor.getDocument())) { + for (Map.Entry entry : taskFiles.entrySet()) { + String name = entry.getKey(); + TaskFile taskFile = entry.getValue(); + TaskFile answerTaskFile = new TaskFile(); + VirtualFile virtualFile = taskDir.findChild(name); + if (virtualFile == null) { continue; } - check(project, taskWindow, copyWithAnswers, taskFileCopy, selectedTaskFile, selectedEditor.getDocument(), testRunner, - openedFile); + VirtualFile answerFile = getCopyWithAnswers(taskDir, virtualFile, taskFile, answerTaskFile); + for (TaskWindow taskWindow : answerTaskFile.getTaskWindows()) { + Document document = FileDocumentManager.getInstance().getDocument(virtualFile); + if (document == null) { + continue; + } + if (!taskWindow.isValid(document)) { + continue; + } + check(project, taskWindow, answerFile, answerTaskFile, taskFile, document, testRunner, virtualFile); + } + FileEditor fileEditor = FileEditorManager.getInstance(project).getSelectedEditor(virtualFile); + Editor editor = null; + if (fileEditor instanceof StudyEditor) { + StudyEditor studyEditor = (StudyEditor) fileEditor; + editor = studyEditor.getEditor(); + } + + if (editor != null) { + taskFile.drawAllWindows(editor); + StudyUtils.synchronize(); + } + try { + answerFile.delete(this); + } + catch (IOException e) { + LOG.error(e); + } } - try { - copyWithAnswers.delete(this); + for (VirtualFile file:filesToDelete) { + try { + file.delete(this); + } + catch (IOException e) { + LOG.error(e); + } } - catch (IOException e) { - LOG.error(e); - } - try { - windowsDescription.delete(this); - } - catch (IOException e) { - LOG.error("failed to delete windows description", e); - } - selectedTaskFile.drawAllWindows(selectedEditor); + currentTask.setStatus(StudyStatus.Failed, oldStatus); + StudyUtils.updateStudyToolWindow(project); createTestResultPopUp(failedMessage, JBColor.RED, project); } } @@ -183,7 +231,7 @@ public class StudyCheckAction extends DumbAwareAction { VirtualFile openedFile) { try { - VirtualFile windowCopy = answerFile.copy(this, answerFile.getParent(), "window" + taskWindow.getIndex() + ".py"); + VirtualFile windowCopy = answerFile.copy(this, answerFile.getParent(), answerFile.getNameWithoutExtension() + "_window" + taskWindow.getIndex() + ".py"); final FileDocumentManager documentManager = FileDocumentManager.getInstance(); final Document windowDocument = documentManager.getDocument(windowCopy); if (windowDocument != null) { @@ -216,7 +264,7 @@ public class StudyCheckAction extends DumbAwareAction { VirtualFile fileWindows = StudyUtils.flushWindows(windowDocument, windowTaskFile, windowCopy); Process smartTestProcess = testRunner.launchTests(project, windowCopy.getPath()); boolean res = testRunner.getPassedTests(smartTestProcess).equals(StudyTestRunner.TEST_OK); - userTaskWindow.setStatus(res ? StudyStatus.Solved : StudyStatus.Failed); + userTaskWindow.setStatus(res ? StudyStatus.Solved : StudyStatus.Failed, StudyStatus.Unchecked); windowCopy.delete(this); fileWindows.delete(this); if (!resourceFile.delete()) { @@ -240,7 +288,7 @@ public class StudyCheckAction extends DumbAwareAction { VirtualFile copy = null; try { - copy = file.copy(this, taskDir, "answers.py"); + copy = file.copy(this, taskDir, file.getNameWithoutExtension() +"_answers.py"); final FileDocumentManager documentManager = FileDocumentManager.getInstance(); final Document document = documentManager.getDocument(copy); if (document != null) { diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java index b245b46f90ef..f8abb0b63365 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/actions/StudyRefreshTaskAction.java @@ -81,13 +81,8 @@ public class StudyRefreshTaskAction extends DumbAwareAction { document.setText(patternText); StudyStatus oldStatus = currentTask.getStatus(); LessonInfo lessonInfo = currentTask.getLesson().getLessonInfo(); - if (oldStatus == StudyStatus.Failed) { - lessonInfo.setTaskFailed(lessonInfo.getTaskFailed() - 1); - } - if (oldStatus == StudyStatus.Solved) { - lessonInfo.setTaskSolved(lessonInfo.getTaskSolved() - 1); - } - lessonInfo.setTaskUnchecked(lessonInfo.getTaskUnchecked() + 1); + lessonInfo.update(oldStatus, -1); + lessonInfo.update(StudyStatus.Unchecked, +1); StudyUtils.updateStudyToolWindow(project); for (TaskWindow taskWindow : selectedTaskFile.getTaskWindows()) { taskWindow.reset(); diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java index 84396ea404d4..3879d519957e 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Lesson.java @@ -33,9 +33,9 @@ public class Lesson implements Stateful{ } @Override - public void setStatus(StudyStatus status) { + public void setStatus(StudyStatus status, StudyStatus oldStatus) { for (Task task : taskList) { - task.setStatus(status); + task.setStatus(status, oldStatus); } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java index 9431632c2edd..85e2eb8be1a9 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/LessonInfo.java @@ -40,4 +40,21 @@ public class LessonInfo { public void setTaskUnchecked(int taskUnchecked) { myTaskUnchecked = taskUnchecked; } + + public void update(StudyStatus status, int delta) { + switch (status) { + case Solved: { + myTaskSolved += delta; + break; + } + case Failed: { + myTaskFailed += delta; + break; + } + case Unchecked: { + myTaskUnchecked += delta; + break; + } + } + } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java index 10374bd94d9a..3a163622f56d 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Stateful.java @@ -2,5 +2,5 @@ package com.jetbrains.python.edu.course; public interface Stateful { StudyStatus getStatus(); - void setStatus(StudyStatus status); + void setStatus(StudyStatus status, StudyStatus oldStatus); } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java index a493b0ebfe8e..2323412f4374 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/Task.java @@ -55,21 +55,14 @@ public class Task implements Stateful{ this.name = name; } - public void setStatus(@NotNull final StudyStatus status) { + public void setStatus(@NotNull final StudyStatus status, @NotNull final StudyStatus oldStatus) { LessonInfo lessonInfo = myLesson.getLessonInfo(); - StudyStatus oldStatus = getStatus(); if (status != oldStatus) { - if (status == StudyStatus.Failed) { - lessonInfo.setTaskFailed(lessonInfo.getTaskFailed() + 1); - lessonInfo.setTaskUnchecked(lessonInfo.getTaskUnchecked() - 1); - } - if (status == StudyStatus.Solved) { - lessonInfo.setTaskSolved(lessonInfo.getTaskSolved() + 1); - lessonInfo.setTaskUnchecked(lessonInfo.getTaskUnchecked() - 1); - } - for (TaskFile taskFile : taskFiles.values()) { - taskFile.setStatus(status); - } + lessonInfo.update(oldStatus, -1); + lessonInfo.update(status, +1); + } + for (TaskFile taskFile : taskFiles.values()) { + taskFile.setStatus(status, oldStatus); } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java index 06d5736bd81a..4f17fc0d27f3 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskFile.java @@ -200,9 +200,9 @@ public class TaskFile implements Stateful{ this.taskWindows = taskWindows; } - public void setStatus(@NotNull final StudyStatus status) { + public void setStatus(@NotNull final StudyStatus status, @NotNull final StudyStatus oldStatus) { for (TaskWindow taskWindow : taskWindows) { - taskWindow.setStatus(status); + taskWindow.setStatus(status, oldStatus); } } diff --git a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java index 04e65c3abb59..6a5a01c7b9c8 100644 --- a/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java +++ b/python/edu/learn-python/src/com/jetbrains/python/edu/course/TaskWindow.java @@ -34,7 +34,7 @@ public class TaskWindow implements Comparable, Stateful { return myStatus; } - public void setStatus(StudyStatus status) { + public void setStatus(StudyStatus status, StudyStatus oldStatus) { myStatus = status; }