src/Tools/jEdit/src/document_model.scala
changeset 55781 b3a4207fb9a6
parent 55778 e1fd8780f997
child 55783 da0513d95155
equal deleted inserted replaced
55780:9fdd01fa48d1 55781:b3a4207fb9a6
    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