blob: d8faacd23946f6a28f166149932534dd71258b48 [file] [log] [blame]
package com.jetbrains.python.edu.projectView;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.ui.JBColor;
import com.intellij.ui.SimpleTextAttributes;
import com.jetbrains.python.edu.StudyTaskManager;
import com.jetbrains.python.edu.StudyUtils;
import com.jetbrains.python.edu.course.*;
import icons.StudyIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.util.Set;
public class StudyDirectoryNode extends PsiDirectoryNode {
private final PsiDirectory myValue;
private final Project myProject;
public StudyDirectoryNode(@NotNull final Project project,
PsiDirectory value,
ViewSettings viewSettings) {
super(project, value, viewSettings);
myValue = value;
myProject = project;
}
@Override
protected void updateImpl(PresentationData data) {
data.setIcon(StudyIcons.Task);
String valueName = myValue.getName();
StudyTaskManager studyTaskManager = StudyTaskManager.getInstance(myProject);
Course course = studyTaskManager.getCourse();
if (course == null) {
return;
}
if (valueName.equals(myProject.getName())) {
data.clearText();
data.addText(course.getName(), new SimpleTextAttributes(SimpleTextAttributes.STYLE_PLAIN, JBColor.BLACK));
data.addText(" (" + valueName + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
return;
}
if (valueName.contains(Task.TASK_DIR)) {
TaskFile file = null;
for (PsiElement child : myValue.getChildren()) {
VirtualFile virtualFile = child.getContainingFile().getVirtualFile();
file = studyTaskManager.getTaskFile(virtualFile);
if (file != null) {
break;
}
}
if (file != null) {
Task task = file.getTask();
setStudyAttributes(task, data, task.getName());
}
}
if (valueName.contains(Lesson.LESSON_DIR)) {
int lessonIndex = Integer.parseInt(valueName.substring(Lesson.LESSON_DIR.length())) - 1;
Lesson lesson = course.getLessons().get(lessonIndex);
setStudyAttributes(lesson, data, lesson.getName());
}
if (valueName.contains(Course.PLAYGROUND_DIR)) {
if (myValue.getParent() != null) {
if (!myValue.getParent().getName().contains(Course.PLAYGROUND_DIR)) {
data.setPresentableText(Course.PLAYGROUND_DIR);
data.setIcon(StudyIcons.Playground);
return;
}
}
}
data.setPresentableText(valueName);
}
@Override
public int getTypeSortWeight(boolean sortByType) {
String name = myValue.getName();
if (name.contains(Lesson.LESSON_DIR) || name.contains(Task.TASK_DIR)) {
String logicalName = name.contains(Lesson.LESSON_DIR) ? Lesson.LESSON_DIR : Task.TASK_DIR;
return StudyUtils.getIndex(name, logicalName) + 1;
}
return name.contains(Course.PLAYGROUND_DIR) ? 0 : 3;
}
private static void setStudyAttributes(Stateful stateful, PresentationData data, String additionalName) {
StudyStatus taskStatus = stateful.getStatus();
switch (taskStatus) {
case Unchecked: {
updatePresentation(data, additionalName, JBColor.BLACK, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.Task);
break;
}
case Solved: {
updatePresentation(data, additionalName, new JBColor(new Color(0, 134, 0), new Color(98, 150, 85)),
stateful instanceof Lesson ? StudyIcons.LessonCompl : StudyIcons.TaskCompl);
break;
}
case Failed: {
updatePresentation(data, additionalName, JBColor.RED, stateful instanceof Lesson ? StudyIcons.Lesson : StudyIcons.TaskProbl);
}
}
}
private static void updatePresentation(PresentationData data, String additionalName, JBColor color, Icon icon) {
data.clearText();
data.addText(additionalName, new SimpleTextAttributes(Font.PLAIN, color));
data.setIcon(icon);
}
@Override
public boolean canNavigate() {
return true;
}
@Override
public boolean canNavigateToSource() {
return true;
}
@Override
public void navigate(boolean requestFocus) {
if (myValue.getName().contains(Task.TASK_DIR)) {
TaskFile taskFile = null;
VirtualFile virtualFile = null;
for (PsiElement child : myValue.getChildren()) {
VirtualFile childFile = child.getContainingFile().getVirtualFile();
taskFile = StudyTaskManager.getInstance(myProject).getTaskFile(childFile);
if (taskFile != null) {
virtualFile = childFile;
break;
}
}
if (taskFile != null) {
VirtualFile taskDir = virtualFile.getParent();
Task task = taskFile.getTask();
for (VirtualFile openFile : FileEditorManager.getInstance(myProject).getOpenFiles()) {
FileEditorManager.getInstance(myProject).closeFile(openFile);
}
VirtualFile child = null;
Set<String> fileNames = task.getTaskFiles().keySet();
for (String name : fileNames) {
child = taskDir.findChild(name);
if (child != null) {
FileEditorManager.getInstance(myProject).openFile(child, true);
}
}
if (child != null) {
ProjectView.getInstance(myProject).select(child, child, false);
}
}
}
}
@Override
public boolean expandOnDoubleClick() {
if (myValue.getName().contains(Task.TASK_DIR)) {
return false;
}
return super.expandOnDoubleClick();
}
}