more careful cumulation of tooltips -- ensure uniform range;
authorwenzelm
Mon, 16 Jan 2012 20:32:33 +0100
changeset 46235 e4e0b5190f3d
parent 46234 de441d4ff1be
child 46236 ae79f2978a67
more careful cumulation of tooltips -- ensure uniform range;
src/Tools/jEdit/src/isabelle_rendering.scala
--- a/src/Tools/jEdit/src/isabelle_rendering.scala	Mon Jan 16 13:19:44 2012 +0100
+++ b/src/Tools/jEdit/src/isabelle_rendering.scala	Mon Jan 16 20:32:33 2012 +0100
@@ -137,33 +137,32 @@
       Isabelle_Markup.ML_SOURCE -> "ML source",
       Isabelle_Markup.DOC_SOURCE -> "document source")
 
+  private val tooltip_elements =
+    Set(Isabelle_Markup.ENTITY, Isabelle_Markup.TYPING, Isabelle_Markup.ML_TYPING) ++
+    tooltips.keys
+
   private def string_of_typing(kind: String, body: XML.Body): String =
     Pretty.string_of(List(Pretty.block(XML.Text(kind) :: Pretty.Break(1) :: body)),
       margin = Isabelle.Int_Property("tooltip-margin"))
 
   def tooltip(snapshot: Document.Snapshot, range: Text.Range): Option[String] =
   {
-    val tip1 =
-      snapshot.select_markup(range,
-        Some(Set(Isabelle_Markup.ENTITY, Isabelle_Markup.ML_TYPING) ++ tooltips.keys),
-        {
-          case Text.Info(_, XML.Elem(Isabelle_Markup.Entity(kind, name), _)) =>
-            kind + " " + quote(name)
-          case Text.Info(_, XML.Elem(Markup(Isabelle_Markup.ML_TYPING, _), body)) =>
-            string_of_typing("ML:", body)
-          case Text.Info(_, XML.Elem(Markup(name, _), _))
-          if tooltips.isDefinedAt(name) => tooltips(name)
-        })
-    val tip2 =
-      snapshot.select_markup(range, Some(Set(Isabelle_Markup.TYPING)),
-        {
-          case Text.Info(_, XML.Elem(Markup(Isabelle_Markup.TYPING, _), body)) =>
-            string_of_typing("::", body)
-        })
+    def add(prev: Text.Info[List[String]], r: Text.Range, s: String) =
+      if (prev.range == r) Text.Info(r, s :: prev.info) else Text.Info(r, List(s))
 
     val tips =
-      (tip1 match { case Text.Info(_, text) #:: _ => List(text) case _ => Nil }) :::
-      (tip2 match { case Text.Info(_, text) #:: _ => List(text) case _ => Nil })
+      snapshot.cumulate_markup[Text.Info[List[String]]](
+        range, Text.Info(range, Nil), Some(tooltip_elements),
+        {
+          case (prev, Text.Info(r, XML.Elem(Isabelle_Markup.Entity(kind, name), _))) =>
+            add(prev, r, kind + " " + quote(name))
+          case (prev, Text.Info(r, XML.Elem(Markup(Isabelle_Markup.TYPING, _), body))) =>
+            add(prev, r, string_of_typing("::", body))
+          case (prev, Text.Info(r, XML.Elem(Markup(Isabelle_Markup.ML_TYPING, _), body))) =>
+            add(prev, r, string_of_typing("ML:", body))
+          case (prev, Text.Info(r, XML.Elem(Markup(name, _), _)))
+          if tooltips.isDefinedAt(name) => add (prev, r, tooltips(name))
+        }).toList.flatMap(_.info.info)
 
     if (tips.isEmpty) None else Some(cat_lines(tips))
   }