src/Tools/VSCode/src/preview_panel.scala
author wenzelm
Mon, 06 Apr 2020 13:40:44 +0200
changeset 71705 7b75d52a1bf1
parent 70302 9ea7081c3f03
child 71774 491f185fd705
permissions -rw-r--r--
clarified interrupt handling;

/*  Title:      Tools/VSCode/src/preview_panel.scala
    Author:     Makarius

HTML document preview.
*/

package isabelle.vscode


import isabelle._
import isabelle.vscode.Protocol

import java.io.{File => JFile}


class Preview_Panel(resources: VSCode_Resources)
{
  private val pending = Synchronized(Map.empty[JFile, Int])

  def request(file: JFile, column: Int): Unit =
    pending.change(map => map + (file -> column))

  def flush(channel: Channel): Boolean =
  {
    pending.change_result(map =>
    {
      val map1 =
        (map /: map.iterator)({ case (m, (file, column)) =>
          resources.get_model(file) match {
            case Some(model) =>
              val snapshot = model.snapshot()
              if (snapshot.is_outdated) m
              else {
                val preview = Present.preview(resources, snapshot)
                channel.write(
                  Protocol.Preview_Response(file, column, preview.title, preview.content))
                m - file
              }
            case None => m - file
          }
        })
      (map1.nonEmpty, map1)
    })
  }
}