src/Tools/jEdit/src/simplifier_trace_window.scala
changeset 75393 87ebf5a50283
parent 73340 0ffcad1f6130
child 75809 1dd5d4f4b69e
equal deleted inserted replaced
75388:b3ca4a6ed74b 75393:87ebf5a50283
    21 import javax.swing.SwingUtilities
    21 import javax.swing.SwingUtilities
    22 
    22 
    23 import org.gjt.sp.jedit.View
    23 import org.gjt.sp.jedit.View
    24 
    24 
    25 
    25 
    26 private object Simplifier_Trace_Window
    26 private object Simplifier_Trace_Window {
    27 {
    27   sealed trait Trace_Tree {
    28   sealed trait Trace_Tree
       
    29   {
       
    30     // FIXME replace with immutable tree builder
    28     // FIXME replace with immutable tree builder
    31     var children: SortedMap[Long, Either[Simplifier_Trace.Item.Data, Elem_Tree]] = SortedMap.empty
    29     var children: SortedMap[Long, Either[Simplifier_Trace.Item.Data, Elem_Tree]] = SortedMap.empty
    32     val serial: Long
    30     val serial: Long
    33     val parent: Option[Trace_Tree]
    31     val parent: Option[Trace_Tree]
    34     val markup: String
    32     val markup: String
    37     def tree_children: List[Elem_Tree] = children.values.toList.collect {
    35     def tree_children: List[Elem_Tree] = children.values.toList.collect {
    38       case Right(tree) => tree
    36       case Right(tree) => tree
    39     }
    37     }
    40   }
    38   }
    41 
    39 
    42   final class Root_Tree(val serial: Long) extends Trace_Tree
    40   final class Root_Tree(val serial: Long) extends Trace_Tree {
    43   {
       
    44     val parent = None
    41     val parent = None
    45     val interesting = true
    42     val interesting = true
    46     val markup = ""
    43     val markup = ""
    47 
    44 
    48     def format: XML.Body =
    45     def format: XML.Body =
    49       Pretty.separate(tree_children.flatMap(_.format))
    46       Pretty.separate(tree_children.flatMap(_.format))
    50   }
    47   }
    51 
    48 
    52   final class Elem_Tree(data: Simplifier_Trace.Item.Data, val parent: Option[Trace_Tree])
    49   final class Elem_Tree(data: Simplifier_Trace.Item.Data, val parent: Option[Trace_Tree])
    53     extends Trace_Tree
    50   extends Trace_Tree {
    54   {
       
    55     val serial = data.serial
    51     val serial = data.serial
    56     val markup = data.markup
    52     val markup = data.markup
    57 
    53 
    58     lazy val interesting: Boolean =
    54     lazy val interesting: Boolean =
    59       data.markup == Markup.SIMP_TRACE_STEP ||
    55       data.markup == Markup.SIMP_TRACE_STEP ||
    61       tree_children.exists(_.interesting)
    57       tree_children.exists(_.interesting)
    62 
    58 
    63     private def body_contains(regex: Regex, body: XML.Body): Boolean =
    59     private def body_contains(regex: Regex, body: XML.Body): Boolean =
    64       body.exists(tree => regex.findFirstIn(XML.content(tree)).isDefined)
    60       body.exists(tree => regex.findFirstIn(XML.content(tree)).isDefined)
    65 
    61 
    66     def format: Option[XML.Tree] =
    62     def format: Option[XML.Tree] = {
    67     {
       
    68       def format_hint(data: Simplifier_Trace.Item.Data): XML.Tree =
    63       def format_hint(data: Simplifier_Trace.Item.Data): XML.Tree =
    69         Pretty.block(Pretty.separate(XML.Text(data.text) :: data.content))
    64         Pretty.block(Pretty.separate(XML.Text(data.text) :: data.content))
    70 
    65 
    71       lazy val bodies: XML.Body =
    66       lazy val bodies: XML.Body =
    72         children.values.toList.collect {
    67         children.values.toList.collect {
    92       case Nil =>
    87       case Nil =>
    93         ()
    88         ()
    94       case head :: tail =>
    89       case head :: tail =>
    95         lookup.get(head.parent) match {
    90         lookup.get(head.parent) match {
    96           case Some(parent) =>
    91           case Some(parent) =>
    97             if (head.markup == Markup.SIMP_TRACE_HINT)
    92             if (head.markup == Markup.SIMP_TRACE_HINT) {
    98             {
       
    99               head.props match {
    93               head.props match {
   100                 case Simplifier_Trace.Success(x)
    94                 case Simplifier_Trace.Success(x)
   101                   if x ||
    95                   if x ||
   102                      parent.markup == Markup.SIMP_TRACE_LOG ||
    96                      parent.markup == Markup.SIMP_TRACE_LOG ||
   103                      parent.markup == Markup.SIMP_TRACE_STEP =>
    97                      parent.markup == Markup.SIMP_TRACE_STEP =>
   105                 case _ =>
    99                 case _ =>
   106                   // ignore
   100                   // ignore
   107               }
   101               }
   108               walk_trace(tail, lookup)
   102               walk_trace(tail, lookup)
   109             }
   103             }
   110             else if (head.markup == Markup.SIMP_TRACE_IGNORE)
   104             else if (head.markup == Markup.SIMP_TRACE_IGNORE) {
   111             {
       
   112               parent.parent match {
   105               parent.parent match {
   113                 case None =>
   106                 case None =>
   114                   Output.error_message(
   107                   Output.error_message(
   115                     "Simplifier_Trace_Window: malformed ignore message with parent " + head.parent)
   108                     "Simplifier_Trace_Window: malformed ignore message with parent " + head.parent)
   116                 case Some(tree) =>
   109                 case Some(tree) =>
   117                   tree.children -= head.parent
   110                   tree.children -= head.parent
   118                   walk_trace(tail, lookup)
   111                   walk_trace(tail, lookup)
   119               }
   112               }
   120             }
   113             }
   121             else
   114             else {
   122             {
       
   123               val entry = new Elem_Tree(head, Some(parent))
   115               val entry = new Elem_Tree(head, Some(parent))
   124               parent.children += ((head.serial, Right(entry)))
   116               parent.children += ((head.serial, Right(entry)))
   125               walk_trace(tail, lookup + (head.serial -> entry))
   117               walk_trace(tail, lookup + (head.serial -> entry))
   126             }
   118             }
   127 
   119 
   132 
   124 
   133 }
   125 }
   134 
   126 
   135 
   127 
   136 class Simplifier_Trace_Window(
   128 class Simplifier_Trace_Window(
   137   view: View, snapshot: Document.Snapshot, trace: Simplifier_Trace.Trace) extends Frame
   129   view: View,
   138 {
   130   snapshot: Document.Snapshot,
       
   131   trace: Simplifier_Trace.Trace
       
   132 ) extends Frame {
   139   GUI_Thread.require {}
   133   GUI_Thread.require {}
   140 
   134 
   141   private val pretty_text_area = new Pretty_Text_Area(view)
   135   private val pretty_text_area = new Pretty_Text_Area(view)
   142   private val zoom = new Font_Info.Zoom_Box { def changed = do_paint() }
   136   private val zoom = new Font_Info.Zoom_Box { def changed = do_paint() }
   143 
   137 
   157 
   151 
   158   do_update()
   152   do_update()
   159   open()
   153   open()
   160   do_paint()
   154   do_paint()
   161 
   155 
   162   def do_update(): Unit =
   156   def do_update(): Unit = {
   163   {
       
   164     val xml = tree.format
   157     val xml = tree.format
   165     pretty_text_area.update(snapshot, Command.Results.empty, xml)
   158     pretty_text_area.update(snapshot, Command.Results.empty, xml)
   166   }
   159   }
   167 
   160 
   168   def do_paint(): Unit =
   161   def do_paint(): Unit = {
   169   {
       
   170     GUI_Thread.later {
   162     GUI_Thread.later {
   171       pretty_text_area.resize(
   163       pretty_text_area.resize(
   172         Font_Info.main(PIDE.options.real("jedit_font_scale") * zoom.factor / 100))
   164         Font_Info.main(PIDE.options.real("jedit_font_scale") * zoom.factor / 100))
   173     }
   165     }
   174   }
   166   }