97 } |
97 } |
98 |
98 |
99 val empty_perspective: Document.Node.Perspective_Text = |
99 val empty_perspective: Document.Node.Perspective_Text = |
100 Document.Node.Perspective(false, Text.Perspective.empty, Document.Node.Overlays.empty) |
100 Document.Node.Perspective(false, Text.Perspective.empty, Document.Node.Overlays.empty) |
101 |
101 |
102 def node_perspective(): Document.Node.Perspective_Text = |
102 def node_perspective(changed_blobs: Set[Document.Node.Name]) |
|
103 : (Boolean, Document.Node.Perspective_Text) = |
103 { |
104 { |
104 Swing_Thread.require() |
105 Swing_Thread.require() |
105 |
106 |
106 if (Isabelle.continuous_checking && is_theory) { |
107 if (Isabelle.continuous_checking && is_theory) { |
107 val snapshot = this.snapshot() |
108 val snapshot = this.snapshot() |
123 if !JEdit_Lib.jedit_text_areas(blob_buffer).isEmpty |
124 if !JEdit_Lib.jedit_text_areas(blob_buffer).isEmpty |
124 start <- snapshot.node.command_start(cmd) |
125 start <- snapshot.node.command_start(cmd) |
125 range = snapshot.convert(cmd.proper_range + start) |
126 range = snapshot.convert(cmd.proper_range + start) |
126 } yield range |
127 } yield range |
127 |
128 |
128 Document.Node.Perspective(node_required, |
129 val reparse = |
129 Text.Perspective(document_view_ranges ::: thy_load_ranges), |
130 snapshot.node.thy_load_commands.exists(cmd => cmd.blobs_names.exists(changed_blobs(_))) |
130 PIDE.editor.node_overlays(node_name)) |
131 |
131 } |
132 (reparse, |
132 else empty_perspective |
133 Document.Node.Perspective(node_required, |
|
134 Text.Perspective(document_view_ranges ::: thy_load_ranges), |
|
135 PIDE.editor.node_overlays(node_name))) |
|
136 } |
|
137 else (false, empty_perspective) |
133 } |
138 } |
134 |
139 |
135 |
140 |
136 /* blob */ |
141 /* blob */ |
137 |
142 |
158 { |
163 { |
159 Swing_Thread.require() |
164 Swing_Thread.require() |
160 |
165 |
161 val header = node_header() |
166 val header = node_header() |
162 val text = JEdit_Lib.buffer_text(buffer) |
167 val text = JEdit_Lib.buffer_text(buffer) |
163 val perspective = node_perspective() |
168 val (_, perspective) = node_perspective(Set.empty) |
164 |
169 |
165 if (is_theory) |
170 if (is_theory) |
166 List(session.header_edit(node_name, header), |
171 List(session.header_edit(node_name, header), |
167 node_name -> Document.Node.Clear(), |
172 node_name -> Document.Node.Clear(), |
168 node_name -> Document.Node.Edits(List(Text.Edit.insert(0, text))), |
173 node_name -> Document.Node.Edits(List(Text.Edit.insert(0, text))), |
203 { |
208 { |
204 private var pending_clear = false |
209 private var pending_clear = false |
205 private val pending = new mutable.ListBuffer[Text.Edit] |
210 private val pending = new mutable.ListBuffer[Text.Edit] |
206 private var last_perspective = empty_perspective |
211 private var last_perspective = empty_perspective |
207 |
212 |
|
213 def is_pending(): Boolean = pending_clear || !pending.isEmpty |
208 def snapshot(): List[Text.Edit] = pending.toList |
214 def snapshot(): List[Text.Edit] = pending.toList |
209 |
215 |
210 def flushed_edits(): List[Document.Edit_Text] = |
216 def flushed_edits(changed_blobs: Set[Document.Node.Name]): List[Document.Edit_Text] = |
211 { |
217 { |
212 val clear = pending_clear |
218 val clear = pending_clear |
213 val edits = snapshot() |
219 val edits = snapshot() |
214 val perspective = node_perspective() |
220 val (reparse, perspective) = node_perspective(changed_blobs) |
215 if (clear || !edits.isEmpty || last_perspective != perspective) { |
221 if (clear || reparse || !edits.isEmpty || last_perspective != perspective) { |
216 pending_clear = false |
222 pending_clear = false |
217 pending.clear |
223 pending.clear |
218 last_perspective = perspective |
224 last_perspective = perspective |
219 node_edits(clear, edits, perspective) |
225 node_edits(clear, edits, perspective) |
220 } |
226 } |
232 pending += e |
238 pending += e |
233 PIDE.editor.invoke() |
239 PIDE.editor.invoke() |
234 } |
240 } |
235 } |
241 } |
236 |
242 |
|
243 def has_pending_edits(): Boolean = |
|
244 Swing_Thread.require { pending_edits.is_pending() } |
|
245 |
237 def snapshot(): Document.Snapshot = |
246 def snapshot(): Document.Snapshot = |
238 Swing_Thread.require { session.snapshot(node_name, pending_edits.snapshot()) } |
247 Swing_Thread.require { session.snapshot(node_name, pending_edits.snapshot()) } |
239 |
248 |
240 def flushed_edits(): List[Document.Edit_Text] = |
249 def flushed_edits(changed_blobs: Set[Document.Node.Name]): List[Document.Edit_Text] = |
241 Swing_Thread.require { pending_edits.flushed_edits() } |
250 Swing_Thread.require { pending_edits.flushed_edits(changed_blobs) } |
242 |
251 |
243 |
252 |
244 /* buffer listener */ |
253 /* buffer listener */ |
245 |
254 |
246 private val buffer_listener: BufferListener = new BufferAdapter |
255 private val buffer_listener: BufferListener = new BufferAdapter |