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 } |