src/Tools/jEdit/src/jedit/document_model.scala
changeset 34833 683ddf358698
parent 34830 621753b73219
child 34834 df9af932e418
equal deleted inserted replaced
34832:d785f72ef388 34833:683ddf358698
    56 
    56 
    57 class Document_Model(val session: Session, val buffer: Buffer)
    57 class Document_Model(val session: Session, val buffer: Buffer)
    58 {
    58 {
    59   /* history */
    59   /* history */
    60 
    60 
       
    61   private val document_0 = session.begin_document(buffer.getName)
       
    62 
    61   @volatile private var history =  // owned by Swing thread
    63   @volatile private var history =  // owned by Swing thread
    62     new Change(None, Nil, Future.value(session.begin_document(buffer.getName), Nil))
    64     new Change(None, Nil, document_0.id, Future.value(document_0, Nil))
    63 
    65 
    64   def current_change(): Change = history
    66   def current_change(): Change = history
    65 
    67 
    66   def recent_document(): Document =
    68   def recent_document(): Document =
    67   {
    69   {
    75   /* transforming offsets */
    77   /* transforming offsets */
    76 
    78 
    77   private def changes_from(doc: Document): List[Edit] =
    79   private def changes_from(doc: Document): List[Edit] =
    78   {
    80   {
    79     Swing_Thread.assert()
    81     Swing_Thread.assert()
    80     List.flatten(current_change.ancestors(_.document.id == doc.id).reverse.map(_.edits)) :::
    82     (edits_buffer.toList /:
    81       edits_buffer.toList
    83       current_change.ancestors.takeWhile(_.id != doc.id))((edits, change) => change.edits ::: edits)
    82   }
    84   }
    83 
    85 
    84   def from_current(doc: Document, offset: Int): Int =
    86   def from_current(doc: Document, offset: Int): Int =
    85     (offset /: changes_from(doc).reverse) ((i, change) => change before i)
    87     (offset /: changes_from(doc).reverse) ((i, change) => change before i)
    86 
    88 
   101 
   103 
   102   private val edits_delay = Swing_Thread.delay_last(300) {
   104   private val edits_delay = Swing_Thread.delay_last(300) {
   103     if (!edits_buffer.isEmpty) {
   105     if (!edits_buffer.isEmpty) {
   104       val edits = edits_buffer.toList
   106       val edits = edits_buffer.toList
   105       val change1 = current_change()
   107       val change1 = current_change()
       
   108       val result_id = session.create_id()
   106       val result: Future[Document.Result] = Future.fork {
   109       val result: Future[Document.Result] = Future.fork {
   107         Document.text_edits(session, change1.document, session.create_id(), edits)
   110         Document.text_edits(session, change1.document, result_id, edits)
   108       }
   111       }
   109       val change2 = new Change(Some(change1), edits, result)
   112       val change2 = new Change(Some(change1), edits, result_id, result)
   110       history = change2
   113       history = change2
   111       result.map(_ => session.input(change2))
   114       result.map(_ => session.input(change2))
   112       edits_buffer.clear
   115       edits_buffer.clear
   113     }
   116     }
   114   }
   117   }