use last subtask index instead of subtask number
[idea/community.git] / python / educational-core / student / src / com / jetbrains / edu / learning / projectView / TaskDirectoryNode.java
1 package com.jetbrains.edu.learning.projectView;
2
3 import com.intellij.ide.projectView.PresentationData;
4 import com.intellij.ide.projectView.ViewSettings;
5 import com.intellij.ide.util.treeView.AbstractTreeNode;
6 import com.intellij.openapi.project.Project;
7 import com.intellij.openapi.vfs.VirtualFile;
8 import com.intellij.psi.PsiDirectory;
9 import com.intellij.psi.PsiElement;
10 import com.intellij.psi.PsiFile;
11 import com.intellij.ui.JBColor;
12 import com.jetbrains.edu.learning.StudyUtils;
13 import com.jetbrains.edu.learning.core.EduNames;
14 import com.jetbrains.edu.learning.courseFormat.StudyItem;
15 import com.jetbrains.edu.learning.courseFormat.StudyStatus;
16 import com.jetbrains.edu.learning.courseFormat.Task;
17 import com.jetbrains.edu.learning.navigation.StudyNavigator;
18 import icons.InteractiveLearningIcons;
19 import org.jetbrains.annotations.NotNull;
20 import org.jetbrains.annotations.Nullable;
21
22 import javax.swing.*;
23
24 public class TaskDirectoryNode extends StudyDirectoryNode {
25   @NotNull protected final Project myProject;
26   protected final ViewSettings myViewSettings;
27   @NotNull protected final Task myTask;
28
29   public TaskDirectoryNode(@NotNull Project project,
30                            PsiDirectory value,
31                            ViewSettings viewSettings,
32                            @NotNull Task task) {
33     super(project, value, viewSettings);
34     myProject = project;
35     myViewSettings = viewSettings;
36     myTask = task;
37   }
38
39   @Override
40   public int getWeight() {
41     return myTask.getIndex();
42   }
43
44   @Override
45   protected void updateImpl(PresentationData data) {
46     StudyStatus status = myTask.getStatus();
47     String subtaskInfo = myTask.hasSubtasks() ? getSubtaskInfo() : null;
48     if (status == StudyStatus.Unchecked) {
49       updatePresentation(data, myTask.getName(), JBColor.BLACK, InteractiveLearningIcons.Task, subtaskInfo);
50       return;
51     }
52     boolean isSolved = status == StudyStatus.Solved;
53     JBColor color = isSolved ? LIGHT_GREEN : JBColor.RED;
54     Icon icon = isSolved ? InteractiveLearningIcons.TaskCompl : InteractiveLearningIcons.TaskProbl;
55     updatePresentation(data, myTask.getName(), color, icon, subtaskInfo);
56   }
57
58   private String getSubtaskInfo() {
59     int index = myTask.getActiveSubtaskIndex() + 1;
60     int subtasksNum = myTask.getLastSubtaskIndex() + 1;
61     return EduNames.SUBTASK + " " + index + "/" + subtasksNum;
62   }
63
64   @Override
65   public boolean expandOnDoubleClick() {
66     return false;
67   }
68
69   @Override
70   public boolean canNavigate() {
71     return true;
72   }
73
74   @Override
75   public void navigate(boolean requestFocus) {
76     StudyNavigator.navigateToTask(myProject, myTask);
77   }
78
79   @Nullable
80   @Override
81   public AbstractTreeNode modifyChildNode(AbstractTreeNode childNode) {
82     Object value = childNode.getValue();
83     if (value instanceof PsiElement) {
84       PsiFile psiFile = ((PsiElement) value).getContainingFile();
85       VirtualFile virtualFile = psiFile.getVirtualFile();
86       if (virtualFile == null) {
87         return null;
88       }
89       return StudyUtils.getTaskFile(myProject, virtualFile) != null ? childNode : null;
90     }
91     return null;
92   }
93
94   @Override
95   public StudyDirectoryNode createChildDirectoryNode(StudyItem item, PsiDirectory value) {
96     return null;
97   }
98 }