summaryrefslogtreecommitdiff
path: root/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java')
-rw-r--r--python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java75
1 files changed, 75 insertions, 0 deletions
diff --git a/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java b/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java
new file mode 100644
index 000000000000..1818b658ddfc
--- /dev/null
+++ b/python/edu/course-creator/src/org/jetbrains/plugins/coursecreator/highlighting/CCTaskLineMarkerProvider.java
@@ -0,0 +1,75 @@
+package org.jetbrains.plugins.coursecreator.highlighting;
+
+import com.intellij.codeHighlighting.Pass;
+import com.intellij.codeInsight.daemon.LineMarkerInfo;
+import com.intellij.codeInsight.daemon.LineMarkerProvider;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.editor.markup.GutterIconRenderer;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.IconLoader;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiDocumentManager;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.plugins.coursecreator.CCProjectService;
+import org.jetbrains.plugins.coursecreator.format.*;
+
+import java.util.Collection;
+import java.util.List;
+
+public class CCTaskLineMarkerProvider implements LineMarkerProvider {
+ private static final Logger LOG = Logger.getInstance(CCTaskLineMarkerProvider.class.getName());
+
+ @Nullable
+ @Override
+ public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
+ return null;
+ }
+
+ @Override
+ public void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull final Collection<LineMarkerInfo> result) {
+ for (PsiElement element : elements) {
+ if (element instanceof PsiFile) {
+ final Project project = element.getProject();
+ final Course course = CCProjectService.getInstance(project).getCourse();
+ if (course == null) return;
+ final String taskFileName = ((PsiFile) element).getName();
+ final PsiDirectory taskDir = ((PsiFile) element).getParent();
+ if (taskDir == null) continue;
+ final String taskDirName = taskDir.getName();
+ final PsiDirectory lessonDir = taskDir.getParentDirectory();
+ if (lessonDir == null) continue;
+ final String lessonDirName = lessonDir.getName();
+ final Lesson lesson = course.getLesson(lessonDirName);
+ if (lesson == null) continue;
+ final Task task = lesson.getTask(taskDirName);
+ final TaskFile taskFile = task.getTaskFile(taskFileName);
+ if (taskFile == null) continue;
+ final Document document = PsiDocumentManager.getInstance(project).getDocument((PsiFile) element);
+ if (document == null) continue;
+ for (final TaskWindow taskWindow : taskFile.getTaskWindows()) {
+ if (taskWindow.line > document.getLineCount()) continue;
+ final int lineStartOffset = document.getLineStartOffset(taskWindow.line);
+ final int offset = lineStartOffset + taskWindow.start;
+ if (offset > document.getTextLength()) continue;
+ final TextRange textRange = TextRange.create(offset, offset + taskWindow.getReplacementLength());
+ @SuppressWarnings("unchecked")
+ final LineMarkerInfo info = new LineMarkerInfo(element, textRange,
+ IconLoader.getIcon("/icons/gutter.png"), Pass.UPDATE_OVERRIDEN_MARKERS,
+ null, null, GutterIconRenderer.Alignment.CENTER) {
+ @Nullable
+ @Override
+ public GutterIconRenderer createGutterRenderer() {
+ return new TaskTextGutter(taskWindow, this);
+ }
+ };
+ result.add(info);
+ }
+ }
+ }
+ }
+}