src/Pure/System/session.scala
changeset 44182 ecb51b457064
parent 44163 32e0c150c010
child 44183 1de22a7b2a82
equal deleted inserted replaced
44181:bbce0417236d 44182:ecb51b457064
   162 
   162 
   163   /* actor messages */
   163   /* actor messages */
   164 
   164 
   165   private case class Start(timeout: Time, args: List[String])
   165   private case class Start(timeout: Time, args: List[String])
   166   private case object Interrupt
   166   private case object Interrupt
   167   private case class Init_Node(name: String, header: Document.Node.Header, text: String)
   167   private case class Init_Node(
   168   private case class Edit_Node(name: String, header: Document.Node.Header, edits: List[Text.Edit])
   168     name: String, master_dir: String, header: Document.Node_Header, text: String)
       
   169   private case class Edit_Node(
       
   170     name: String, master_dir: String, header: Document.Node_Header, edits: List[Text.Edit])
   169   private case class Change_Node(
   171   private case class Change_Node(
   170     name: String,
   172     name: String,
   171     doc_edits: List[Document.Edit_Command],
   173     doc_edits: List[Document.Edit_Command],
   172     previous: Document.Version,
   174     previous: Document.Version,
   173     version: Document.Version)
   175     version: Document.Version)
   178     var prover: Option[Isabelle_Process with Isar_Document] = None
   180     var prover: Option[Isabelle_Process with Isar_Document] = None
   179 
   181 
   180 
   182 
   181     /* incoming edits */
   183     /* incoming edits */
   182 
   184 
   183     def handle_edits(name: String,
   185     def handle_edits(name: String, master_dir: String,
   184         header: Document.Node.Header, edits: List[Document.Node.Edit[Text.Edit]])
   186         header: Document.Node_Header, edits: List[Document.Node.Edit[Text.Edit]])
   185     //{{{
   187     //{{{
   186     {
   188     {
   187       val syntax = current_syntax()
   189       val syntax = current_syntax()
   188       val previous = global_state().history.tip.version
   190       val previous = global_state().history.tip.version
   189       val doc_edits =
   191       val norm_header =
   190         (name, Document.Node.Update_Header[Text.Edit](header.norm_deps(file_store.append))) ::
   192         Document.Node.norm_header[Text.Edit](file_store.append(master_dir, _), header)
   191           edits.map(edit => (name, edit))
   193       val doc_edits = (name, norm_header) :: edits.map(edit => (name, edit))
   192       val result = Future.fork { Thy_Syntax.text_edits(syntax, previous.join, doc_edits) }
   194       val result = Future.fork { Thy_Syntax.text_edits(syntax, previous.join, doc_edits) }
   193       val change =
   195       val change =
   194         global_state.change_yield(_.extend_history(previous, doc_edits, result.map(_._2)))
   196         global_state.change_yield(_.extend_history(previous, doc_edits, result.map(_._2)))
   195 
   197 
   196       result.map {
   198       result.map {
   323           reply(())
   325           reply(())
   324 
   326 
   325         case Interrupt if prover.isDefined =>
   327         case Interrupt if prover.isDefined =>
   326           prover.get.interrupt
   328           prover.get.interrupt
   327 
   329 
   328         case Init_Node(name, header, text) if prover.isDefined =>
   330         case Init_Node(name, master_dir, header, text) if prover.isDefined =>
   329           // FIXME compare with existing node
   331           // FIXME compare with existing node
   330           handle_edits(name, header,
   332           handle_edits(name, master_dir, header,
   331             List(Document.Node.Remove(), Document.Node.Edits(List(Text.Edit.insert(0, text)))))
   333             List(Document.Node.Remove(), Document.Node.Edits(List(Text.Edit.insert(0, text)))))
   332           reply(())
   334           reply(())
   333 
   335 
   334         case Edit_Node(name, header, text_edits) if prover.isDefined =>
   336         case Edit_Node(name, master_dir, header, text_edits) if prover.isDefined =>
   335           handle_edits(name, header, List(Document.Node.Edits(text_edits)))
   337           handle_edits(name, master_dir, header, List(Document.Node.Edits(text_edits)))
   336           reply(())
   338           reply(())
   337 
   339 
   338         case change: Change_Node if prover.isDefined =>
   340         case change: Change_Node if prover.isDefined =>
   339           handle_change(change)
   341           handle_change(change)
   340 
   342 
   358 
   360 
   359   def stop() { command_change_buffer !? Stop; session_actor !? Stop }
   361   def stop() { command_change_buffer !? Stop; session_actor !? Stop }
   360 
   362 
   361   def interrupt() { session_actor ! Interrupt }
   363   def interrupt() { session_actor ! Interrupt }
   362 
   364 
   363   def init_node(name: String, header: Document.Node.Header, text: String)
   365   def init_node(name: String, master_dir: String, header: Document.Node_Header, text: String)
   364   { session_actor !? Init_Node(name, header, text) }
   366   { session_actor !? Init_Node(name, master_dir, header, text) }
   365 
   367 
   366   def edit_node(name: String, header: Document.Node.Header, edits: List[Text.Edit])
   368   def edit_node(name: String, master_dir: String, header: Document.Node_Header, edits: List[Text.Edit])
   367   { session_actor !? Edit_Node(name, header, edits) }
   369   { session_actor !? Edit_Node(name, master_dir, header, edits) }
   368 }
   370 }