src/Pure/PIDE/document_editor.scala
author wenzelm
Thu, 08 Dec 2022 22:11:36 +0100
changeset 76609 cc9ddf373bd2
parent 76606 3558388330f8
child 76610 6e2383488a55
permissions -rw-r--r--
maintain global state of document editor views, notably for is_active operation;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76606
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/PIDE/document_editor.scala
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     3
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     4
Central resources for interactive document preparation.
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     6
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     8
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
     9
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    10
object Document_Editor {
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    11
  /* document output */
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    12
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    13
  def document_name: String = "document"
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    14
  def document_output_dir(): Path = Path.explode("$ISABELLE_HOME_USER/document_output")
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    15
  def document_output(): Path = document_output_dir() + Path.basic(document_name)
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    16
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    17
  def view_document(): Unit = {
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    18
    val path = document_output().pdf
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    19
    if (path.is_file) Isabelle_System.pdf_viewer(path)
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    20
  }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    21
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    22
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    23
  /* progress */
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    24
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    25
  class Log_Progress(session: Session) extends Progress {
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    26
    def show(text: String): Unit = {}
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    27
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    28
    private val syslog = session.make_syslog()
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    29
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    30
    private def update(text: String = syslog.content()): Unit = show(text)
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    31
    private val delay =
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    32
      Delay.first(session.session_options.seconds("editor_update_delay"), gui = true) { update() }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    33
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    34
    override def echo(msg: String): Unit = { syslog += msg; delay.invoke() }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    35
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    36
    def load(): Unit = GUI_Thread.require {
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    37
      val path = document_output().log
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    38
      val text = if (path.is_file) File.read(path) else ""
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    39
      GUI_Thread.later { delay.revoke(); update(text) }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    40
    }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    41
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    42
    GUI_Thread.later { update() }
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    43
  }
76609
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    44
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    45
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    46
  /* global state */
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    47
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    48
  sealed case class State(
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    49
    session_info: Option[Sessions.Info] = None,
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    50
    views: Set[AnyRef] = Set.empty,
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    51
  ) {
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    52
    def is_active: Boolean = session_info.isDefined && views.nonEmpty
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    53
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    54
    def register_view(id: AnyRef): State = copy(views = views + id)
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    55
    def unregister_view(id: AnyRef): State = copy(views = views - id)
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    56
  }
76606
3558388330f8 clarified modules;
wenzelm
parents:
diff changeset
    57
}