1/*  Title:      Tools/VSCode/src/preview_panel.scala
2    Author:     Makarius
3
4HTML document preview.
5*/
6
7package isabelle.vscode
8
9
10import isabelle._
11
12import java.io.{File => JFile}
13
14
15class Preview_Panel(resources: VSCode_Resources)
16{
17  private val pending = Synchronized(Map.empty[JFile, Int])
18
19  def request(file: JFile, column: Int): Unit =
20    pending.change(map => map + (file -> column))
21
22  def flush(channel: Channel): Boolean =
23  {
24    pending.change_result(map =>
25    {
26      val map1 =
27        (map /: map.iterator)({ case (m, (file, column)) =>
28          resources.get_model(file) match {
29            case Some(model) =>
30              val snapshot = model.snapshot()
31              if (snapshot.is_outdated) m
32              else {
33                val preview = Present.preview(snapshot)
34                channel.write(
35                  Protocol.Preview_Response(file, column, preview.title, preview.content))
36                m - file
37              }
38            case None => m - file
39          }
40        })
41      (map1.nonEmpty, map1)
42    })
43  }
44}
45