1 package com.jetbrains.edu.learning;
3 import com.intellij.openapi.components.*;
4 import com.intellij.openapi.project.DumbAware;
5 import com.intellij.openapi.project.Project;
6 import com.intellij.ui.JBColor;
7 import com.intellij.util.containers.hash.HashMap;
8 import com.intellij.util.xmlb.XmlSerializerUtil;
9 import com.jetbrains.edu.courseFormat.*;
10 import com.jetbrains.edu.learning.courseFormat.StudyStatus;
11 import com.jetbrains.edu.learning.courseFormat.UserTest;
12 import org.jetbrains.annotations.NotNull;
13 import org.jetbrains.annotations.Nullable;
15 import java.util.ArrayList;
16 import java.util.Collections;
17 import java.util.List;
21 * Implementation of class which contains all the information
22 * about study in context of current project
26 name = "StudySettings",
28 @Storage(file = StoragePathMacros.PROJECT_FILE),
30 file = StoragePathMacros.PROJECT_CONFIG_DIR + "/study_project.xml",
31 scheme = StorageScheme.DIRECTORY_BASED
34 public class StudyTaskManager implements PersistentStateComponent<StudyTaskManager>, DumbAware {
35 private Course myCourse;
36 public Map<AnswerPlaceholder, StudyStatus> myStudyStatusMap = new HashMap<AnswerPlaceholder, StudyStatus>();
37 public Map<TaskFile, StudyStatus> myTaskStatusMap = new HashMap<TaskFile, StudyStatus>();
38 public Map<Task, List<UserTest>> myUserTests = new HashMap<Task, List<UserTest>>();
40 private StudyTaskManager() {
43 public void setCourse(@NotNull final Course course) {
48 public Course getCourse() {
52 public void setStatus(AnswerPlaceholder placeholder, StudyStatus status) {
53 if (myStudyStatusMap == null) {
54 myStudyStatusMap = new HashMap<AnswerPlaceholder, StudyStatus>();
56 myStudyStatusMap.put(placeholder, status);
59 public void addUserTest(@NotNull final Task task, UserTest userTest) {
60 List<UserTest> userTests = myUserTests.get(task);
61 if (userTests == null) {
62 userTests = new ArrayList<UserTest>();
63 myUserTests.put(task, userTests);
65 userTests.add(userTest);
68 public void setUserTests(@NotNull final Task task, @NotNull final List<UserTest> userTests) {
69 myUserTests.put(task, userTests);
73 public List<UserTest> getUserTests(@NotNull final Task task) {
74 final List<UserTest> userTests = myUserTests.get(task);
75 return userTests != null ? userTests : Collections.<UserTest>emptyList();
78 public void removeUserTest(@NotNull final Task task, @NotNull final UserTest userTest) {
79 final List<UserTest> userTests = myUserTests.get(task);
80 if (userTests != null) {
81 userTests.remove(userTest);
86 public void setStatus(Task task, StudyStatus status) {
87 for (TaskFile taskFile : task.getTaskFiles().values()) {
88 setStatus(taskFile, status);
92 public void setStatus(TaskFile file, StudyStatus status) {
93 if (file.getAnswerPlaceholders().isEmpty()) {
94 if (myTaskStatusMap == null) {
95 myTaskStatusMap = new HashMap<TaskFile, StudyStatus>();
97 myTaskStatusMap.put(file, status);
99 for (AnswerPlaceholder answerPlaceholder : file.getAnswerPlaceholders()) {
100 setStatus(answerPlaceholder, status);
104 public StudyStatus getStatus(AnswerPlaceholder placeholder) {
105 StudyStatus status = myStudyStatusMap.get(placeholder);
106 if (status == null) {
107 status = StudyStatus.Unchecked;
108 myStudyStatusMap.put(placeholder, status);
114 public StudyStatus getStatus(@NotNull final Lesson lesson) {
115 for (Task task : lesson.getTaskList()) {
116 StudyStatus taskStatus = getStatus(task);
117 if (taskStatus == StudyStatus.Unchecked || taskStatus == StudyStatus.Failed) {
118 return StudyStatus.Unchecked;
121 return StudyStatus.Solved;
124 public StudyStatus getStatus(@NotNull final Task task) {
125 for (TaskFile taskFile : task.getTaskFiles().values()) {
126 StudyStatus taskFileStatus = getStatus(taskFile);
127 if (taskFileStatus == StudyStatus.Unchecked) {
128 return StudyStatus.Unchecked;
130 if (taskFileStatus == StudyStatus.Failed) {
131 return StudyStatus.Failed;
134 return StudyStatus.Solved;
137 private StudyStatus getStatus(@NotNull final TaskFile file) {
138 if (file.getAnswerPlaceholders().isEmpty()) {
139 if (myTaskStatusMap == null) return StudyStatus.Solved;
140 return myTaskStatusMap.get(file);
143 for (AnswerPlaceholder answerPlaceholder : file.getAnswerPlaceholders()) {
144 StudyStatus placeholderStatus = getStatus(answerPlaceholder);
145 if (placeholderStatus == StudyStatus.Failed) {
146 return StudyStatus.Failed;
148 if (placeholderStatus == StudyStatus.Unchecked) {
149 return StudyStatus.Unchecked;
152 return StudyStatus.Solved;
156 public JBColor getColor(@NotNull final AnswerPlaceholder placeholder) {
157 final StudyStatus status = getStatus(placeholder);
158 if (status == StudyStatus.Solved) {
159 return JBColor.GREEN;
161 if (status == StudyStatus.Failed) {
167 public boolean hasFailedAnswerPlaceholders(@NotNull final TaskFile taskFile) {
168 return taskFile.getAnswerPlaceholders().size() > 0 && getStatus(taskFile) == StudyStatus.Failed;
172 public StudyTaskManager getState() {
177 public void loadState(StudyTaskManager state) {
178 XmlSerializerUtil.copyBean(state, this);
179 if (myCourse != null) {
180 myCourse.initCourse(true);
184 public static StudyTaskManager getInstance(@NotNull final Project project) {
185 return ServiceManager.getService(project, StudyTaskManager.class);