src/Tools/jEdit/src/jedit/output_dockable.scala
changeset 36989 aaa7cac3e54a
parent 36988 fd641bc85222
child 36990 449628c148cf
equal deleted inserted replaced
36988:fd641bc85222 36989:aaa7cac3e54a
    34   add(html_panel, BorderLayout.CENTER)
    34   add(html_panel, BorderLayout.CENTER)
    35 
    35 
    36 
    36 
    37   /* controls */
    37   /* controls */
    38 
    38 
       
    39   private case class Render(body: List[XML.Tree])
       
    40 
    39   private def handle_update()
    41   private def handle_update()
    40   {
    42   {
    41     Swing_Thread.now {
    43     Swing_Thread.now {
    42       Document_Model(view.getBuffer) match {
    44       Document_Model(view.getBuffer) match {
    43         case Some(model) =>
    45         case Some(model) =>
    44           model.recent_document.command_at(view.getTextArea.getCaretPosition) match {
    46           val document = model.recent_document
    45             case Some((cmd, _)) => output_actor ! cmd
    47           document.command_at(view.getTextArea.getCaretPosition) match {
       
    48             case Some((cmd, _)) =>
       
    49               output_actor ! Render(document.current_state(cmd).map(_.results) getOrElse Nil)
    46             case None =>
    50             case None =>
    47           }
    51           }
    48         case None =>
    52         case None =>
    49       }
    53       }
    50     }
    54     }
    52 
    56 
    53   private val update = new Button("Update") {
    57   private val update = new Button("Update") {
    54     reactions += { case ButtonClicked(_) => handle_update() }
    58     reactions += { case ButtonClicked(_) => handle_update() }
    55   }
    59   }
    56 
    60 
    57   private val freeze = new ToggleButton("Freeze")
    61   val follow = new ToggleButton("Follow")
       
    62   follow.selected = true
    58 
    63 
    59 
    64 
    60   /* actor wiring */
    65   /* actor wiring */
    61 
    66 
    62   private val output_actor = actor {
    67   private val output_actor = actor {
    63     loop {
    68     loop {
    64       react {
    69       react {
       
    70         case Session.Global_Settings => html_panel.init(Isabelle.font_size())
       
    71 
       
    72         case Render(body) => html_panel.render(body)
       
    73 
    65         case cmd: Command =>
    74         case cmd: Command =>
    66           Swing_Thread.now {
    75           Swing_Thread.now {
    67             if (freeze.selected) None else Document_Model(view.getBuffer)
    76             if (follow.selected) Document_Model(view.getBuffer) else None
    68           } match {
    77           } match {
    69             case None =>
    78             case None =>
    70             case Some(model) =>
    79             case Some(model) =>
    71               val body = model.recent_document.current_state(cmd).map(_.results) getOrElse Nil
    80               val body = model.recent_document.current_state(cmd).map(_.results) getOrElse Nil
    72               html_panel.render(body)
    81               html_panel.render(body)
    73           }
    82           }
    74 
       
    75         case Session.Global_Settings => html_panel.init(Isabelle.font_size())
       
    76 
    83 
    77         case bad => System.err.println("output_actor: ignoring bad message " + bad)
    84         case bad => System.err.println("output_actor: ignoring bad message " + bad)
    78       }
    85       }
    79     }
    86     }
    80   }
    87   }
    94   }
   101   }
    95 
   102 
    96 
   103 
    97   /* init controls */
   104   /* init controls */
    98 
   105 
    99   controls.contents ++= List(update, freeze)
   106   controls.contents ++= List(update, follow)
   100   handle_update()
   107   handle_update()
   101 }
   108 }