equal
deleted
inserted
replaced
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 } |