diff options
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.java | 75 |
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); + } + } + } + } +} |