src/Tools/jEdit/src/document_dockable.scala
author wenzelm
Tue, 24 Jun 2025 21:05:48 +0200
changeset 82747 00828818a607
parent 82142 508a673c87ac
child 82748 0ffcfc137624
permissions -rw-r--r--
tuned signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/document_dockable.scala
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     3
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     4
Dockable window for document build support.
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     5
*/
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     6
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     8
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
     9
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    10
import isabelle._
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    11
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    12
import java.awt.BorderLayout
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    13
82142
508a673c87ac removed unused imports;
wenzelm
parents: 81657
diff changeset
    14
import scala.swing.{ScrollPane, TabbedPane, BorderPanel, Component}
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
    15
import scala.swing.event.SelectionChanged
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    16
82142
508a673c87ac removed unused imports;
wenzelm
parents: 81657
diff changeset
    17
import org.gjt.sp.jedit.View
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    18
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    19
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    20
object Document_Dockable {
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
    21
  /* state */
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
    22
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    23
  object State {
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    24
    def init(): State = State()
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    25
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    26
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    27
  sealed case class State(
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    28
    pending: Boolean = false,
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    29
    process: Future[Unit] = Future.value(()),
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    30
    progress: Progress = new Progress,
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    31
    output_results: Command.Results = Command.Results.empty,
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    32
    output_main: List[XML.Elem] = Nil,
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    33
    output_more: List[XML.Elem] = Nil
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    34
  ) {
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    35
    def running: Boolean = !process.is_finished
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    36
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
    37
    def run(process: Future[Unit], progress: Progress, reset_pending: Boolean): State =
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
    38
      copy(process = process, progress = progress, pending = if (reset_pending) false else pending)
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    39
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    40
    def output(results: Command.Results, main: List[XML.Elem]): State =
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    41
      copy(output_results = results, output_main = main, output_more = Nil)
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    42
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    43
    def finish(more: List[XML.Elem]): State =
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    44
      copy(process = Future.value(()), output_more = more)
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
    45
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
    46
    def output_all: List[XML.Elem] = output_main ::: output_more
77157
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    47
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    48
    def reset(): State = {
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    49
      process.cancel()
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    50
      progress.stop()
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    51
      State.init()
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
    52
    }
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    53
  }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    54
}
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    55
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    56
class Document_Dockable(view: View, position: String) extends Dockable(view, position) {
76609
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    57
  dockable =>
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    58
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    59
  GUI_Thread.require {}
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    60
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    61
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    62
  /* component state -- owned by GUI thread */
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    63
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    64
  private val current_state = Synchronized(Document_Dockable.State.init())
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    65
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    66
  private val process_indicator = new Process_Indicator
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
    67
  private val output: Output_Area = new Output_Area(view)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    68
  private val message_pane = new TabbedPane
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    69
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
    70
  override def detach_operation: Option[() => Unit] = output.pretty_text_area.detach_operation
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
    71
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
    72
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    73
  private def show_state(): Unit = GUI_Thread.later {
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    74
    val st = current_state.value
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    75
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
    76
    output.pretty_text_area.update(Document.Snapshot.init, st.output_results, st.output_all)
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    77
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    78
    if (st.running) process_indicator.update("Running document build process ...", 15)
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    79
    else if (st.pending) process_indicator.update("Waiting for pending document content ...", 5)
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
    80
    else process_indicator.update(null, 0)
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    81
  }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    82
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    83
  private def show_page(page: TabbedPane.Page): Unit = GUI_Thread.later {
77156
e3a7d3668629 clarified GUI events: ensure fresh output when switching pages;
wenzelm
parents: 77155
diff changeset
    84
    show_state()
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    85
    message_pane.selection.page = page
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    86
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    87
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    88
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    89
  /* progress */
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    90
77174
1eb55d6809b3 more general program start message;
wenzelm
parents: 77173
diff changeset
    91
  class Log_Progress extends Program_Progress(default_title = "build") {
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    92
    progress =>
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    93
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    94
    override def detect_program(s: String): Option[String] =
77173
f1063cdb0093 clarified terminology of inlined "PROGRAM START" messages;
wenzelm
parents: 77170
diff changeset
    95
      Document_Build.detect_program_start(s)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    96
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    97
    private val delay: Delay =
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    98
      Delay.first(PIDE.session.output_delay) {
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
    99
        if (!stopped) {
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
   100
          output_process(progress)
77156
e3a7d3668629 clarified GUI events: ensure fresh output when switching pages;
wenzelm
parents: 77155
diff changeset
   101
          show_state()
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   102
        }
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   103
      }
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   104
77509
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
   105
    override def output(message: Progress.Message): Unit = { super.output(message); delay.invoke() }
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   106
    override def stop_program(): Unit = { super.stop_program(); delay.invoke() }
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   107
  }
76021
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
   108
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   109
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   110
  /* document build process */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   111
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   112
  private def init_state(): Unit =
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   113
    current_state.change { st =>
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   114
      st.progress.stop()
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   115
      Document_Dockable.State(progress = new Log_Progress)
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   116
    }
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   117
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   118
  private def cancel_process(): Unit =
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   119
    current_state.change { st => st.process.cancel(); st }
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   120
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   121
  private def await_process(): Unit =
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   122
    current_state.guarded_access(st => if (st.process.is_finished) None else Some((), st))
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   123
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
   124
  private def output_process(progress: Log_Progress): Unit = {
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
   125
    val (results, main) = progress.output()
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
   126
    current_state.change(_.output(results, main))
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   127
  }
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   128
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   129
  private def pending_process(): Unit =
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   130
    current_state.change { st =>
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   131
      if (st.pending) st
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   132
      else {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   133
        delay_auto_build.revoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   134
        delay_build.invoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   135
        st.copy(pending = true)
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   136
      }
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   137
    }
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   138
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
   139
  private def finish_process(output: List[XML.Elem]): Unit =
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   140
    current_state.change { st =>
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   141
      if (st.pending) {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   142
        delay_auto_build.revoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   143
        delay_build.invoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   144
      }
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   145
      st.finish(output)
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   146
    }
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   147
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   148
  private def run_process(reset_pending: Boolean = false)(body: Log_Progress => Unit): Boolean = {
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   149
    val started =
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   150
      current_state.change_result { st =>
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   151
        if (st.process.is_finished) {
76994
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   152
          st.progress.stop()
7c23db6b857b more detailed Program_Progress / Log_Progress: each program gets its own log output, which is attached to the document via markup;
wenzelm
parents: 76769
diff changeset
   153
          val progress = new Log_Progress
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   154
          val process =
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   155
            Future.thread[Unit](name = "Document_Dockable.process") {
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   156
              await_process()
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   157
              body(progress)
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   158
            }
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   159
          (true, st.run(process, progress, reset_pending))
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   160
        }
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   161
        else (false, st)
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   162
      }
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   163
    show_state()
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   164
    started
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   165
  }
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76711
diff changeset
   166
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   167
  private def load_document(session: String): Boolean = {
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   168
    val options = PIDE.options.value
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   169
    run_process() { _ =>
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   170
      try {
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   171
        val session_background =
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   172
          Document_Build.session_background(
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   173
            options, session, dirs = JEdit_Sessions.session_dirs)
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   174
        PIDE.editor.document_setup(Some(session_background))
76716
a7602257a825 clarified state document nodes for Theories_Status / Document_Dockable;
wenzelm
parents: 76711
diff changeset
   175
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   176
        finish_process(Nil)
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   177
        GUI_Thread.later {
76725
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   178
          refresh_theories()
76996
6d847e27cafc tuned GUI;
wenzelm
parents: 76994
diff changeset
   179
          show_page(input_page)
76718
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   180
        }
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   181
      }
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   182
      catch {
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   183
        case exn: Throwable if !Exn.is_interrupt(exn) =>
3f50b24909df clarified process management;
wenzelm
parents: 76716
diff changeset
   184
          finish_process(List(Protocol.error_message(Exn.print(exn))))
77156
e3a7d3668629 clarified GUI events: ensure fresh output when switching pages;
wenzelm
parents: 77155
diff changeset
   185
          show_page(output_page)
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   186
      }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   187
    }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   188
  }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   189
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   190
  private def document_build_attempt(): Boolean = {
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   191
    val document_session = PIDE.editor.document_session()
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   192
    if (document_session.is_vacuous) true
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   193
    else if (document_session.is_pending) false
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   194
    else {
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   195
      run_process(reset_pending = true) { progress =>
77153
0bb95bcf804e more accurate output: avoid output_body from last run;
wenzelm
parents: 77152
diff changeset
   196
        output_process(progress)
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   197
        show_page(output_page)
77153
0bb95bcf804e more accurate output: avoid output_body from last run;
wenzelm
parents: 77152
diff changeset
   198
77194
7438d516ab4f tuned signature;
wenzelm
parents: 77189
diff changeset
   199
        val result = Exn.capture {
7438d516ab4f tuned signature;
wenzelm
parents: 77189
diff changeset
   200
          val snapshot = document_session.get_snapshot
77196
wenzelm
parents: 77195
diff changeset
   201
          using(JEdit_Sessions.open_session_context(document_snapshot = Some(snapshot)))(
wenzelm
parents: 77195
diff changeset
   202
            Document_Editor.build(_, document_session, progress))
77194
7438d516ab4f tuned signature;
wenzelm
parents: 77189
diff changeset
   203
        }
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   204
        val msgs =
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   205
          result match {
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   206
            case Exn.Res(_) =>
77188
608668d39689 tuned message;
wenzelm
parents: 77187
diff changeset
   207
              List(Protocol.writeln_message("DONE"))
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   208
            case Exn.Exn(exn: Document_Build.Build_Error) =>
80480
972f7a4cdc0e clarified YXML.Source: more direct support for String and Bytes, instead of CharSequence;
wenzelm
parents: 78614
diff changeset
   209
              exn.log_errors.map(s => Protocol.error_message(YXML.parse_body(YXML.Source(s))))
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   210
            case Exn.Exn(exn) =>
80480
972f7a4cdc0e clarified YXML.Source: more direct support for String and Bytes, instead of CharSequence;
wenzelm
parents: 78614
diff changeset
   211
              List(Protocol.error_message(YXML.parse_body(YXML.Source(Exn.print(exn)))))
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   212
          }
76732
0ba6f360d38a actually build document;
wenzelm
parents: 76727
diff changeset
   213
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   214
        progress.stop_program()
77146
eb114301c4df clarified signature: prefer semantic status;
wenzelm
parents: 77145
diff changeset
   215
        output_process(progress)
77152
4c9296390f20 more accurate output: avoid output_main from last run;
wenzelm
parents: 77151
diff changeset
   216
        progress.stop()
81392
92aa6f7b470c clarified output representation: postpone Pretty.separate;
wenzelm
parents: 81387
diff changeset
   217
        finish_process(msgs)
76732
0ba6f360d38a actually build document;
wenzelm
parents: 76727
diff changeset
   218
77155
6840013a791a clarified GUI: avoid odd jumping pages on "Cancel";
wenzelm
parents: 77154
diff changeset
   219
        show_page(output_page)
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   220
      }
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   221
      true
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   222
    }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   223
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   224
77144
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   225
  private lazy val delay_build: Delay =
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   226
    Delay.first(PIDE.session.output_delay, gui = true) {
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   227
      if (!document_build_attempt()) delay_build.invoke()
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   228
    }
42c3970e1ac1 clarified Document_Editor.Session: more explicit types, more robust operations;
wenzelm
parents: 77142
diff changeset
   229
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   230
  private lazy val delay_auto_build: Delay =
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   231
    Delay.last(PIDE.session.document_delay, gui = true) {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   232
      pending_process()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   233
    }
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   234
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   235
  private def document_pending() = current_state.value.pending
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   236
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   237
  private val document_auto = new JEdit_Options.Bool_Access("editor_document_auto")
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   238
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   239
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   240
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   241
  /* controls */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   242
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   243
  private val document_session =
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   244
    JEdit_Sessions.document_selector(PIDE.options, standalone = true)
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   245
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   246
  private lazy val delay_load: Delay =
76610
6e2383488a55 clarified signature: proper scopes and types;
wenzelm
parents: 76609
diff changeset
   247
    Delay.last(PIDE.session.load_delay, gui = true) {
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   248
      for (session <- document_session.selection_value) {
77157
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
   249
        current_state.change(_.reset())
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   250
        if (!load_document(session)) delay_load.invoke()
77154
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   251
        else if (document_auto()) delay_auto_build.invoke()
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   252
      }
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   253
    }
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   254
77154
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   255
  document_session.reactions += {
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   256
    case SelectionChanged(_) =>
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   257
      delay_load.invoke()
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   258
      delay_build.revoke()
77157
c0633a0da53e clarified GUI events: reset everything on session context switch;
wenzelm
parents: 77156
diff changeset
   259
      delay_auto_build.revoke()
77154
dd9bde3d839e clarified GUI events;
wenzelm
parents: 77153
diff changeset
   260
  }
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   261
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   262
  private val auto_build_button =
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   263
    new JEdit_Options.Bool_GUI(document_auto, "Auto") {
78614
4da5cdaa4dcd clarified signature;
wenzelm
parents: 77509
diff changeset
   264
      tooltip = Word.capitalized(document_auto.description)
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   265
      override def clicked(state: Boolean): Unit = {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   266
        super.clicked(state)
77160
158dfe7f68ed clarified GUI events;
wenzelm
parents: 77159
diff changeset
   267
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   268
        if (state) delay_auto_build.invoke()
77160
158dfe7f68ed clarified GUI events;
wenzelm
parents: 77159
diff changeset
   269
        else delay_auto_build.revoke()
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   270
      }
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   271
    }
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   272
75853
f981111768ec clarified signature;
wenzelm
parents: 75839
diff changeset
   273
  private val build_button =
81657
4210fd10e776 clarified signature;
wenzelm
parents: 81493
diff changeset
   274
    new GUI.Button(GUI.Style_HTML.enclose_bold("Build")) {
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   275
      tooltip = "Build document"
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   276
      override def clicked(): Unit = pending_process()
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   277
    }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   278
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   279
  private val view_button =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   280
    new GUI.Button("View") {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   281
      tooltip = "View document"
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   282
      override def clicked(): Unit = Document_Editor.view_document()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   283
    }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   284
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   285
  private val controls =
77159
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   286
    Wrap_Panel(List(document_session, process_indicator.component,
77170
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   287
      auto_build_button, build_button, view_button))
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   288
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   289
  add(controls.peer, BorderLayout.NORTH)
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   290
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   291
  override def focusOnDefaultComponent(): Unit = build_button.requestFocus()
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   292
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   293
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   294
  /* message pane with pages */
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   295
77159
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   296
  private val all_button =
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   297
    new GUI.Button("All") {
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   298
      tooltip = "Select all document theories"
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   299
      override def clicked(): Unit = PIDE.editor.document_select_all(set = true)
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   300
    }
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   301
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   302
  private val none_button =
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   303
    new GUI.Button("None") {
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   304
      tooltip = "Deselect all document theories"
76720
37f7b2965e02 more GUI operations;
wenzelm
parents: 76719
diff changeset
   305
      override def clicked(): Unit = PIDE.editor.document_select_all(set = false)
37f7b2965e02 more GUI operations;
wenzelm
parents: 76719
diff changeset
   306
    }
37f7b2965e02 more GUI operations;
wenzelm
parents: 76719
diff changeset
   307
76726
c83dfd565283 clarified GUI;
wenzelm
parents: 76725
diff changeset
   308
  private val purge_button = new GUI.Button("Purge") {
c83dfd565283 clarified GUI;
wenzelm
parents: 76725
diff changeset
   309
    tooltip = "Remove theories that are no longer required"
c83dfd565283 clarified GUI;
wenzelm
parents: 76725
diff changeset
   310
    override def clicked(): Unit = PIDE.editor.purge()
c83dfd565283 clarified GUI;
wenzelm
parents: 76725
diff changeset
   311
  }
c83dfd565283 clarified GUI;
wenzelm
parents: 76725
diff changeset
   312
77159
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   313
  private val input_controls =
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   314
    Wrap_Panel(List(all_button, none_button, purge_button))
76720
37f7b2965e02 more GUI operations;
wenzelm
parents: 76719
diff changeset
   315
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   316
  private val theories = new Theories_Status(view, document = true)
77008
60b465c4463c tuned GUI;
wenzelm
parents: 76996
diff changeset
   317
  private val theories_pane = new ScrollPane(theories.gui)
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   318
76725
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   319
  private def refresh_theories(): Unit = {
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   320
    val domain = PIDE.editor.document_theories().toSet
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   321
    theories.update(domain = Some(domain), trim = true, force = true)
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   322
    theories.refresh()
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   323
  }
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   324
76996
6d847e27cafc tuned GUI;
wenzelm
parents: 76994
diff changeset
   325
  private val input_page =
6d847e27cafc tuned GUI;
wenzelm
parents: 76994
diff changeset
   326
    new TabbedPane.Page("Input", new BorderPanel {
77159
b899d7840b49 clarified GUIs: keep related buttons together;
wenzelm
parents: 77158
diff changeset
   327
      layout(input_controls) = BorderPanel.Position.North
77008
60b465c4463c tuned GUI;
wenzelm
parents: 76996
diff changeset
   328
      layout(theories_pane) = BorderPanel.Position.Center
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   329
    }, "Selection and status of document theories")
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   330
77170
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   331
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   332
  private val cancel_button =
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   333
    new GUI.Button("Cancel") {
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   334
      tooltip = "Cancel build process"
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   335
      override def clicked(): Unit = cancel_process()
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   336
    }
2ddb82044ff0 clarified GUI;
wenzelm
parents: 77169
diff changeset
   337
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   338
  private val output_controls =
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   339
    Wrap_Panel(List(cancel_button, output.pretty_text_area.zoom_component))
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   340
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   341
  private val output_page =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   342
    new TabbedPane.Page("Output", new BorderPanel {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   343
      layout(output_controls) = BorderPanel.Position.North
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   344
      layout(output.text_pane) = BorderPanel.Position.Center
76996
6d847e27cafc tuned GUI;
wenzelm
parents: 76994
diff changeset
   345
    }, "Results from document build process")
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   346
76996
6d847e27cafc tuned GUI;
wenzelm
parents: 76994
diff changeset
   347
  message_pane.pages ++= List(input_page, output_page)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   348
81493
07e79b80e96d clarified signature: avoid implicit functionality;
wenzelm
parents: 81490
diff changeset
   349
  output.setup(dockable)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   350
  set_content(message_pane)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   351
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   352
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   353
  /* main */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   354
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   355
  private val main =
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   356
    Session.Consumer[Any](getClass.getName) {
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   357
      case _: Session.Global_Options =>
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   358
        GUI_Thread.later {
76578
06b001094ddb more uniform session selectors, with persistent options;
wenzelm
parents: 76577
diff changeset
   359
          document_session.load()
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   360
          output.handle_resize()
76725
c8d5cc19270a more thorough GUI updates, notably for multiple Document dockables;
wenzelm
parents: 76720
diff changeset
   361
          refresh_theories()
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   362
        }
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   363
      case changed: Session.Commands_Changed =>
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   364
        GUI_Thread.later {
76719
2c8632c746fe proper handling of state updates;
wenzelm
parents: 76718
diff changeset
   365
          val domain = PIDE.editor.document_theories().filter(changed.nodes).toSet
77150
286fdf0fcc44 clarified guard: avoid spurious auto builds;
wenzelm
parents: 77149
diff changeset
   366
          if (domain.nonEmpty) {
286fdf0fcc44 clarified guard: avoid spurious auto builds;
wenzelm
parents: 77149
diff changeset
   367
            theories.update(domain = Some(domain))
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   368
77150
286fdf0fcc44 clarified guard: avoid spurious auto builds;
wenzelm
parents: 77149
diff changeset
   369
            val pending = document_pending()
286fdf0fcc44 clarified guard: avoid spurious auto builds;
wenzelm
parents: 77149
diff changeset
   370
            val auto = document_auto()
286fdf0fcc44 clarified guard: avoid spurious auto builds;
wenzelm
parents: 77149
diff changeset
   371
            if ((pending || auto) && PIDE.editor.document_session().is_ready) {
77149
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   372
              if (pending) {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   373
                delay_auto_build.revoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   374
                delay_build.invoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   375
              }
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   376
              else if (auto) {
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   377
                delay_auto_build.invoke()
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   378
              }
3991a35cd740 automatically build document when selected theories are finished;
wenzelm
parents: 77147
diff changeset
   379
            }
77147
38077c938d01 defer build until document nodes are ready;
wenzelm
parents: 77146
diff changeset
   380
          }
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   381
        }
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   382
    }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   383
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   384
  override def init(): Unit = {
76701
3543ecb4c97d tuned signature;
wenzelm
parents: 76681
diff changeset
   385
    PIDE.editor.document_init(dockable)
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   386
    init_state()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   387
    PIDE.session.global_options += main
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   388
    PIDE.session.commands_changed += main
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   389
    output.init()
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   390
    delay_load.invoke()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   391
  }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   392
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   393
  override def exit(): Unit = {
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   394
    PIDE.session.global_options -= main
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   395
    PIDE.session.commands_changed -= main
81490
9b55af09cb1f re-use Output_Area;
wenzelm
parents: 81398
diff changeset
   396
    output.exit()
76701
3543ecb4c97d tuned signature;
wenzelm
parents: 76681
diff changeset
   397
    PIDE.editor.document_exit(dockable)
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   398
  }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   399
}