src/Tools/jEdit/src/jedit/document_model.scala
changeset 34825 7f72547f9b12
parent 34824 ac35eee85f5c
child 34827 69852bd3c4c4
equal deleted inserted replaced
34824:ac35eee85f5c 34825:7f72547f9b12
     8 package isabelle.jedit
     8 package isabelle.jedit
     9 
     9 
    10 
    10 
    11 import isabelle.proofdocument.{Change, Command, Edit, Insert, Remove, Document, Session}
    11 import isabelle.proofdocument.{Change, Command, Edit, Insert, Remove, Document, Session}
    12 
    12 
    13 import scala.actors.Future
       
    14 import scala.actors.Futures._
       
    15 import scala.actors.Actor, Actor._
    13 import scala.actors.Actor, Actor._
    16 import scala.collection.mutable
    14 import scala.collection.mutable
    17 
    15 
    18 import org.gjt.sp.jedit.Buffer
    16 import org.gjt.sp.jedit.Buffer
    19 import org.gjt.sp.jedit.buffer.{BufferAdapter, BufferListener, JEditBuffer}
    17 import org.gjt.sp.jedit.buffer.{BufferAdapter, BufferListener, JEditBuffer}
    60 {
    58 {
    61   /* changes vs. edits */
    59   /* changes vs. edits */
    62 
    60 
    63   private val document_0 = session.begin_document(buffer.getName)
    61   private val document_0 = session.begin_document(buffer.getName)
    64 
    62 
    65   private val change_0 =
    63   private val change_0 = new Change(document_0.id, None, Nil, Future.value(document_0, Nil))
    66     new Change(document_0.id, None, Nil, future { (document_0, Nil) })  // FIXME more robust history start
       
    67   private var _changes = List(change_0)   // owned by Swing thread
    64   private var _changes = List(change_0)   // owned by Swing thread
    68   def changes = _changes
    65   def changes = _changes
    69   private var current_change = change_0
    66   private var current_change = change_0
    70 
    67 
    71   private val edits = new mutable.ListBuffer[Edit]   // owned by Swing thread
    68   private val edits = new mutable.ListBuffer[Edit]   // owned by Swing thread
    73   private val edits_delay = Swing_Thread.delay_last(300) {
    70   private val edits_delay = Swing_Thread.delay_last(300) {
    74     if (!edits.isEmpty) {
    71     if (!edits.isEmpty) {
    75       val new_id = session.create_id()
    72       val new_id = session.create_id()
    76       val eds = edits.toList
    73       val eds = edits.toList
    77       val change1 = current_change
    74       val change1 = current_change
    78       val result: Future[Document.Result] = future {
    75       val result: Future[Document.Result] = Future.fork {
    79         val old_doc = change1.document
    76         val old_doc = change1.document
    80         Document.text_edits(session, old_doc, new_id, eds)
    77         Document.text_edits(session, old_doc, new_id, eds)
    81       }
    78       }
    82       result()  // FIXME !?!?!?
       
    83       val change2 = new Change(new_id, Some(change1), eds, result)
    79       val change2 = new Change(new_id, Some(change1), eds, result)
    84       _changes ::= change2
    80       _changes ::= change2
    85       session.input(change2)
    81       session.input(change2)
    86       current_change = change2
    82       current_change = change2
    87       edits.clear
    83       edits.clear
   112   /* history of changes */
   108   /* history of changes */
   113 
   109 
   114   def recent_document(): Document =
   110   def recent_document(): Document =
   115   {
   111   {
   116     def find(change: Change): Document =
   112     def find(change: Change): Document =
   117       if (change.result.isSet || !change.parent.isDefined) change.document
   113       if (change.result.is_finished || !change.parent.isDefined) change.document
   118       else find(change.parent.get)
   114       else find(change.parent.get)
   119     find(current_change)
   115     find(current_change)
   120   }
   116   }
   121 
   117 
   122 
   118