src/Tools/VSCode/src/vscode_rendering.scala
changeset 65913 f330f538dae6
parent 65488 331f09d9535e
child 65925 4a1b666b6362
--- a/src/Tools/VSCode/src/vscode_rendering.scala	Tue May 23 14:23:26 2017 +0200
+++ b/src/Tools/VSCode/src/vscode_rendering.scala	Tue May 23 20:38:34 2017 +0200
@@ -12,6 +12,8 @@
 
 import java.io.{File => JFile}
 
+import scala.annotation.tailrec
+
 
 object VSCode_Rendering
 {
@@ -128,6 +130,37 @@
   }
 
 
+  /* text overview color */
+
+  private sealed case class Color_Info(
+    color: Rendering.Color.Value, offset: Text.Offset, end_offset: Text.Offset, end_line: Int)
+
+  def text_overview_color: List[Text.Info[Rendering.Color.Value]] =
+  {
+    @tailrec def loop(offset: Text.Offset, line: Int, lines: List[Line], colors: List[Color_Info])
+      : List[Text.Info[Rendering.Color.Value]] =
+    {
+      if (lines.nonEmpty) {
+        val end_offset = offset + lines.head.text.length
+        val colors1 =
+          (overview_color(Text.Range(offset, end_offset)), colors) match {
+            case (Some(color), old :: rest) if color == old.color && line == old.end_line =>
+              old.copy(end_offset = end_offset, end_line = line + 1) :: rest
+            case (Some(color), _) =>
+              Color_Info(color, offset, end_offset, line + 1) :: colors
+            case (None, _) => colors
+          }
+        loop(end_offset + 1, line + 1, lines.tail, colors1)
+      }
+      else {
+        colors.reverse.map(info =>
+          Text.Info(Text.Range(info.offset, info.end_offset), info.color))
+      }
+    }
+    loop(0, 0, model.content.doc.lines, Nil)
+  }
+
+
   /* dotted underline */
 
   def dotted(range: Text.Range): List[Text.Info[Rendering.Color.Value]] =
@@ -158,6 +191,8 @@
       foreground(model.content.text_range)) :::
     VSCode_Rendering.color_decorations("text_", Rendering.Color.text_colors,
       text_color(model.content.text_range)) :::
+    VSCode_Rendering.color_decorations("text_overview_", Rendering.Color.text_overview_colors,
+      text_overview_color) :::
     VSCode_Rendering.color_decorations("dotted_", VSCode_Rendering.dotted_colors,
       dotted(model.content.text_range)) :::
     List(spell_checker)