src/Tools/jEdit/src/rendering.scala
changeset 62986 9d2fae6b31cc
parent 62806 de9bf8171626
child 62988 224e8d8a4fb8
--- a/src/Tools/jEdit/src/rendering.scala	Thu Apr 14 20:47:44 2016 +0200
+++ b/src/Tools/jEdit/src/rendering.scala	Thu Apr 14 22:55:53 2016 +0200
@@ -151,6 +151,8 @@
 
   private val breakpoint_elements = Markup.Elements(Markup.ML_BREAKPOINT)
 
+  private val caret_focus_elements = Markup.Elements(Markup.ENTITY)
+
   private val highlight_elements =
     Markup.Elements(Markup.EXPRESSION, Markup.CITATION, Markup.LANGUAGE, Markup.ML_TYPING,
       Markup.TOKEN_RANGE, Markup.ENTITY, Markup.PATH, Markup.DOC, Markup.URL, Markup.SORTING,
@@ -206,7 +208,8 @@
       Markup.STATE_MESSAGE + Markup.INFORMATION_MESSAGE +
       Markup.TRACING_MESSAGE + Markup.WARNING_MESSAGE +
       Markup.LEGACY_MESSAGE + Markup.ERROR_MESSAGE +
-      Markup.BAD + Markup.INTENSIFY + Markup.Markdown_Item.name ++ active_elements
+      Markup.BAD + Markup.INTENSIFY + Markup.ENTITY +
+      Markup.Markdown_Item.name ++ active_elements
 
   private val foreground_elements =
     Markup.Elements(Markup.STRING, Markup.ALT_STRING, Markup.VERBATIM,
@@ -250,6 +253,8 @@
   val spell_checker_color = color_value("spell_checker_color")
   val bad_color = color_value("bad_color")
   val intensify_color = color_value("intensify_color")
+  val entity_def_color = color_value("entity_def_color")
+  val entity_ref_color = color_value("entity_ref_color")
   val breakpoint_disabled_color = color_value("breakpoint_disabled_color")
   val breakpoint_enabled_color = color_value("breakpoint_enabled_color")
   val caret_debugger_color = color_value("caret_debugger_color")
@@ -392,6 +397,37 @@
   }
 
 
+  /* caret focus */
+
+  def caret_focus(caret_range: Text.Range, visible_range: Text.Range): Set[Long] =
+  {
+    val focus_results =
+      snapshot.cumulate[Set[Long]](caret_range, Set.empty, Rendering.caret_focus_elements, _ =>
+          {
+            case (serials, Text.Info(_, XML.Elem(Markup(Markup.ENTITY, props), _))) =>
+              props match {
+                case Markup.Entity.Def(i) => Some(serials + i)
+                case Markup.Entity.Ref(i) => Some(serials + i)
+                case _ => None
+              }
+            case _ => None
+          })
+    val focus = (Set.empty[Long] /: focus_results){ case (s1, Text.Info(_, s2)) => s1 ++ s2 }
+
+    val visible =
+      focus.nonEmpty &&
+        snapshot.cumulate[Boolean](visible_range, false, Rendering.caret_focus_elements, _ =>
+            {
+              case (_, Text.Info(_, XML.Elem(Markup(Markup.ENTITY, props), _))) =>
+                props match {
+                  case Markup.Entity.Def(i) if focus(i) => Some(true)
+                  case _ => None
+                }
+            }).exists({ case Text.Info(_, visible) => visible })
+    if (visible) focus else Set.empty[Long]
+  }
+
+
   /* highlighted area */
 
   def highlight(range: Text.Range): Option[Text.Info[Color]] =
@@ -697,7 +733,7 @@
 
   /* text background */
 
-  def background(range: Text.Range): List[Text.Info[Color]] =
+  def background(range: Text.Range, focus: Set[Long]): List[Text.Info[Color]] =
   {
     for {
       Text.Info(r, result) <-
@@ -712,6 +748,14 @@
                 Some((Nil, Some(bad_color)))
               case (_, Text.Info(_, XML.Elem(Markup(Markup.INTENSIFY, _), _))) =>
                 Some((Nil, Some(intensify_color)))
+              case (_, Text.Info(_, XML.Elem(Markup(Markup.ENTITY, props), _))) =>
+                props match {
+                  case Markup.Entity.Def(i) if focus(i) =>
+                    Some((Nil, Some(entity_def_color)))
+                  case Markup.Entity.Ref(i) if focus(i) =>
+                    Some((Nil, Some(entity_ref_color)))
+                  case _ => None
+                }
               case (_, Text.Info(_, XML.Elem(Markup.Markdown_Item(depth), _))) =>
                 val color =
                   depth match {