src/Tools/jEdit/src/document_dockable.scala
author wenzelm
Mon, 19 Dec 2022 11:16:46 +0100
changeset 76701 3543ecb4c97d
parent 76681 8ad17c4669da
child 76707 2e231c07b428
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
import java.awt.event.{ComponentEvent, ComponentAdapter}
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    14
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    15
import scala.swing.{ScrollPane, TextArea, Label, TabbedPane, BorderPanel, Component}
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
    16
import scala.swing.event.SelectionChanged
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    17
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    18
import org.gjt.sp.jedit.{jEdit, View}
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    19
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    20
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    21
object Document_Dockable {
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
    22
  /* state */
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
    23
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    24
  object Status extends Enumeration {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    25
    val WAITING = Value("waiting")
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    26
    val RUNNING = Value("running")
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    27
    val FINISHED = Value("finished")
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    28
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    29
76026
614a8feea80c clarified GUI update;
wenzelm
parents: 76025
diff changeset
    30
  sealed case class Result(output: List[XML.Tree] = Nil) {
614a8feea80c clarified GUI update;
wenzelm
parents: 76025
diff changeset
    31
    def failed: Boolean = output.exists(Protocol.is_error)
614a8feea80c clarified GUI update;
wenzelm
parents: 76025
diff changeset
    32
  }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    33
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    34
  object State {
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    35
    def init(): State = State()
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    36
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    37
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    38
  sealed case class State(
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
    39
    progress: Progress = new Progress,
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    40
    process: Future[Unit] = Future.value(()),
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    41
    status: Status.Value = Status.FINISHED,
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    42
    output: List[XML.Tree] = Nil
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    43
  ) {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    44
    def run(progress: Progress, process: Future[Unit]): State =
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    45
      copy(progress = progress, process = process, status = Status.RUNNING)
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    46
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    47
    def finish(result: Result): State = State(output = result.output)
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    48
    def finish(msg: XML.Tree): State = finish(Result(output = List(msg)))
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    49
  }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    50
}
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    51
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    52
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
    53
  dockable =>
cc9ddf373bd2 maintain global state of document editor views, notably for is_active operation;
wenzelm
parents: 76606
diff changeset
    54
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    55
  GUI_Thread.require {}
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    56
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    57
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    58
  /* component state -- owned by GUI thread */
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    59
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
    60
  private val current_state = Synchronized(Document_Dockable.State.init())
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    61
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    62
  private val process_indicator = new Process_Indicator
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    63
  private val pretty_text_area = new Pretty_Text_Area(view)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    64
  private val message_pane = new TabbedPane
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    65
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    66
  private def show_state(): Unit = GUI_Thread.later {
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    67
    val st = current_state.value
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    68
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    69
    pretty_text_area.update(Document.Snapshot.init, Command.Results.empty, st.output)
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    70
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    71
    st.status match {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    72
      case Document_Dockable.Status.WAITING =>
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    73
        process_indicator.update("Waiting for PIDE document content ...", 5)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    74
      case Document_Dockable.Status.RUNNING =>
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    75
        process_indicator.update("Running document build process ...", 15)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    76
      case Document_Dockable.Status.FINISHED =>
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    77
        process_indicator.update(null, 0)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    78
    }
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    79
  }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    80
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    81
  private def show_page(page: TabbedPane.Page): Unit = GUI_Thread.later {
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
    82
    message_pane.selection.page = page
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    83
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    84
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    85
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
    86
  /* text area with zoom/resize */
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    87
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    88
  override def detach_operation: Option[() => Unit] = pretty_text_area.detach_operation
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
    89
76021
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    90
  private val zoom = new Font_Info.Zoom { override def changed(): Unit = handle_resize() }
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    91
  private def handle_resize(): Unit = GUI_Thread.require { pretty_text_area.zoom(zoom) }
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    92
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    93
  private val delay_resize: Delay =
76610
6e2383488a55 clarified signature: proper scopes and types;
wenzelm
parents: 76609
diff changeset
    94
    Delay.first(PIDE.session.update_delay, gui = true) { handle_resize() }
76021
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    95
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    96
  addComponentListener(new ComponentAdapter {
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    97
    override def componentResized(e: ComponentEvent): Unit = delay_resize.invoke()
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    98
    override def componentShown(e: ComponentEvent): Unit = delay_resize.invoke()
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
    99
  })
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
   100
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   101
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   102
  /* progress log */
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   103
76489
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   104
  private val log_area =
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   105
    new TextArea {
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   106
      editable = false
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   107
      font = GUI.copy_font((new Label).font)
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   108
    }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   109
  private val scroll_log_area = new ScrollPane(log_area)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   110
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   111
  def log_progress(): Document_Editor.Log_Progress =
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   112
    new Document_Editor.Log_Progress(PIDE.session) {
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   113
      override def show(text: String): Unit =
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   114
        if (text != log_area.text) {
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   115
          log_area.text = text
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   116
          val vertical = scroll_log_area.peer.getVerticalScrollBar
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   117
          vertical.setValue(vertical.getMaximum)
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   118
        }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   119
    }
76021
752425c69577 clarified component structure, concerning initialization order;
wenzelm
parents: 75853
diff changeset
   120
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   121
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   122
  /* document build process */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   123
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   124
  private def cancel(): Unit =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   125
    current_state.change { st => st.process.cancel(); st }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   126
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   127
  private def init_state(): Unit =
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   128
    current_state.change { _ => Document_Dockable.State(progress = log_progress()) }
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   129
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   130
  private def load_document(session: String): Boolean = {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   131
    current_state.change_result { st =>
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   132
      if (st.process.is_finished) {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   133
        val options = PIDE.options.value
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   134
        val progress = log_progress()
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   135
        val process =
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   136
          Future.thread[Unit](name = "Document_Dockable.load_document") {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   137
            try {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   138
              val session_background =
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   139
                Document_Build.session_background(
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   140
                  options, session, dirs = JEdit_Sessions.session_dirs)
76701
3543ecb4c97d tuned signature;
wenzelm
parents: 76681
diff changeset
   141
              PIDE.editor.document_setup(Some(session_background))
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   142
              GUI_Thread.later { show_state(); show_page(theories_page) }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   143
            }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   144
            catch {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   145
              case exn: Throwable if !Exn.is_interrupt(exn) =>
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   146
                current_state.change(_.finish(Protocol.error_message(Exn.message(exn))))
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   147
                GUI_Thread.later { show_state(); show_page(output_page) }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   148
            }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   149
          }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   150
        (true, st.run(progress, process))
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   151
      }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   152
      else (false, st)
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   153
    }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   154
  }
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   155
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   156
  private def build_document(): Unit = {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   157
    current_state.change { st =>
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   158
      if (st.process.is_finished) {
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   159
        val progress = log_progress()
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   160
        val process =
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   161
          Future.thread[Unit](name = "Document_Dockable.build_document") {
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   162
            show_page(theories_page)
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   163
            Time.seconds(2.0).sleep()
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   164
76034
dda3c117f13c clarified GUI behaviour;
wenzelm
parents: 76026
diff changeset
   165
            show_page(log_page)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   166
            val res =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   167
              Exn.capture {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   168
                progress.echo("Start " + Date.now())
76489
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   169
                for (i <- 1 to 200) {
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   170
                  progress.echo("message " + i)
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   171
                  Time.seconds(0.1).sleep()
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   172
                }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   173
                progress.echo("Stop " + Date.now())
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   174
              }
76026
614a8feea80c clarified GUI update;
wenzelm
parents: 76025
diff changeset
   175
            val msg =
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   176
              res match {
76680
e95b9c9e17ff clarified signature;
wenzelm
parents: 76610
diff changeset
   177
                case Exn.Res(_) => Protocol.writeln_message("OK")
e95b9c9e17ff clarified signature;
wenzelm
parents: 76610
diff changeset
   178
                case Exn.Exn(exn) => Protocol.error_message(Exn.message(exn))
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   179
              }
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   180
            current_state.change(_.finish(msg))
76035
wenzelm
parents: 76034
diff changeset
   181
            show_state()
76568
1c1d7b3478b1 tuned GUI behaviour;
wenzelm
parents: 76567
diff changeset
   182
1c1d7b3478b1 tuned GUI behaviour;
wenzelm
parents: 76567
diff changeset
   183
            show_page(if (Exn.is_interrupt_exn(res)) theories_page else output_page)
76565
6827dd0c3723 clarified process: implicit load() when finished;
wenzelm
parents: 76564
diff changeset
   184
            GUI_Thread.later { progress.load() }
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   185
          }
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   186
        st.run(progress, process)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   187
      }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   188
      else st
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   189
    }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   190
    show_state()
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   191
  }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   192
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   193
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   194
  /* controls */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   195
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   196
  private val document_session =
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   197
    JEdit_Sessions.document_selector(PIDE.options, standalone = true)
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   198
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   199
  private lazy val delay_load: Delay =
76610
6e2383488a55 clarified signature: proper scopes and types;
wenzelm
parents: 76609
diff changeset
   200
    Delay.last(PIDE.session.load_delay, gui = true) {
76681
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   201
      for (session <- document_session.selection_value) {
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   202
        if (!load_document(session)) delay_load.invoke()
8ad17c4669da clarified state and process;
wenzelm
parents: 76680
diff changeset
   203
      }
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   204
    }
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   205
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   206
  document_session.reactions += { case SelectionChanged(_) => delay_load.invoke() }
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   207
75853
f981111768ec clarified signature;
wenzelm
parents: 75839
diff changeset
   208
  private val build_button =
f981111768ec clarified signature;
wenzelm
parents: 75839
diff changeset
   209
    new GUI.Button("<html><b>Build</b></html>") {
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   210
      tooltip = "Build document"
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   211
      override def clicked(): Unit = build_document()
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   212
    }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   213
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   214
  private val cancel_button =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   215
    new GUI.Button("Cancel") {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   216
      tooltip = "Cancel build process"
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   217
      override def clicked(): Unit = cancel()
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   218
    }
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   219
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   220
  private val view_button =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   221
    new GUI.Button("View") {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   222
      tooltip = "View document"
76606
3558388330f8 clarified modules;
wenzelm
parents: 76602
diff changeset
   223
      override def clicked(): Unit = Document_Editor.view_document()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   224
    }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   225
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   226
  private val controls =
75830
b054f22efd0d more GUI elements;
wenzelm
parents: 75816
diff changeset
   227
    Wrap_Panel(List(document_session, process_indicator.component, build_button,
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   228
      view_button, cancel_button))
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   229
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   230
  add(controls.peer, BorderLayout.NORTH)
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   231
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   232
  override def focusOnDefaultComponent(): Unit = build_button.requestFocus()
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   233
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   234
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   235
  /* message pane with pages */
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   236
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   237
  private val theories = new Theories_Status(view, document = true)
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   238
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   239
  private val theories_page =
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   240
    new TabbedPane.Page("Theories", new BorderPanel {
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   241
      layout(theories.gui) = BorderPanel.Position.Center
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   242
    }, "Selection and status of document theories")
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   243
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   244
  private val output_controls =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   245
    Wrap_Panel(List(pretty_text_area.search_label, pretty_text_area.search_field, zoom))
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   246
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   247
  private val output_page =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   248
    new TabbedPane.Page("Output", new BorderPanel {
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   249
      layout(output_controls) = BorderPanel.Position.North
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   250
      layout(Component.wrap(pretty_text_area)) = BorderPanel.Position.Center
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   251
    }, "Output from build process")
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   252
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   253
  private val log_page =
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   254
    new TabbedPane.Page("Log", new BorderPanel {
76489
8c9830109ab2 clarified Log_Progress vs. GUI: more like Syslog_Dockable;
wenzelm
parents: 76036
diff changeset
   255
      layout(scroll_log_area) = BorderPanel.Position.Center
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   256
    }, "Raw log of build process")
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   257
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   258
  message_pane.pages ++= List(theories_page, log_page, output_page)
76023
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   259
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   260
  set_content(message_pane)
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   261
c7fed2fd52f5 more GUI functionality;
wenzelm
parents: 76021
diff changeset
   262
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   263
  /* main */
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   264
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   265
  private val main =
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   266
    Session.Consumer[Any](getClass.getName) {
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   267
      case _: Session.Global_Options =>
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   268
        GUI_Thread.later {
76578
06b001094ddb more uniform session selectors, with persistent options;
wenzelm
parents: 76577
diff changeset
   269
          document_session.load()
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   270
          handle_resize()
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   271
          theories.reinit()
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   272
        }
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   273
      case changed: Session.Commands_Changed =>
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   274
        GUI_Thread.later {
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   275
          theories.update(domain = Some(changed.nodes), trim = changed.assignment)
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   276
        }
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   277
    }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   278
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   279
  override def init(): Unit = {
76701
3543ecb4c97d tuned signature;
wenzelm
parents: 76681
diff changeset
   280
    PIDE.editor.document_init(dockable)
76491
2c37c10d6884 clarified GUI state;
wenzelm
parents: 76490
diff changeset
   281
    init_state()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   282
    PIDE.session.global_options += main
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   283
    PIDE.session.commands_changed += main
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   284
    theories.update()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   285
    handle_resize()
76602
b5dfe1551637 more specific GUI for document nodes;
wenzelm
parents: 76580
diff changeset
   286
    delay_load.invoke()
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   287
  }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   288
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   289
  override def exit(): Unit = {
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   290
    PIDE.session.global_options -= main
76567
aef247025f07 more GUI elements;
wenzelm
parents: 76565
diff changeset
   291
    PIDE.session.commands_changed -= main
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   292
    delay_resize.revoke()
76701
3543ecb4c97d tuned signature;
wenzelm
parents: 76681
diff changeset
   293
    PIDE.editor.document_exit(dockable)
75816
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   294
  }
91f02f224b80 basic setup for document build panel;
wenzelm
parents:
diff changeset
   295
}