src/Tools/jEdit/src/session_build.scala
author paulson <lp15@cam.ac.uk>
Wed, 24 Apr 2024 20:56:26 +0100
changeset 80149 40a3fc07a587
parent 79052 d5cf21ad8b47
permissions -rw-r--r--
More tidying of proofs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     1
/*  Title:      Tools/jEdit/src/session_build.scala
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     3
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     4
Session build management.
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     5
*/
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     6
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     8
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
     9
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    10
import isabelle._
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    11
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    12
import java.awt.event.{WindowEvent, WindowAdapter}
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    13
import javax.swing.{WindowConstants, JDialog}
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    14
75853
f981111768ec clarified signature;
wenzelm
parents: 75852
diff changeset
    15
import scala.swing.{ScrollPane, FlowPanel, BorderPanel, TextArea, Component, Label}
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    16
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    17
import org.gjt.sp.jedit.View
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    18
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    19
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
    20
object Session_Build {
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
    21
  def check_dialog(view: View): Unit = {
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    22
    val options = PIDE.options.value
71725
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    23
    Isabelle_Thread.fork() {
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    24
      try {
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    25
        if (JEdit_Sessions.session_no_build ||
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    26
          JEdit_Sessions.session_build(options, no_build = true) == 0)
71725
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    27
          JEdit_Sessions.session_start(options)
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    28
        else GUI_Thread.later { new Dialog(view) }
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    29
      }
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    30
      catch {
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    31
        case exn: Throwable =>
76344
adb3f8d33838 more informative errors, with optional exception trace as in Command_Line.tool;
wenzelm
parents: 75854
diff changeset
    32
          GUI.dialog(view, "Isabelle build", GUI.scrollable_text(Exn.print(exn)))
71725
c255ed582095 proper asynchronous GUI interaction for somewhat heavy JEdit_Sessions.session_build check;
wenzelm
parents: 71704
diff changeset
    33
      }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    34
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    35
  }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    36
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
    37
  private class Dialog(view: View) extends JDialog(view) {
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 69854
diff changeset
    38
    val options: Options = PIDE.options.value
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    39
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    40
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    41
    /* text */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    42
79051
wenzelm
parents: 77719
diff changeset
    43
    private val text = new TextArea
wenzelm
parents: 77719
diff changeset
    44
    text.editable = false
wenzelm
parents: 77719
diff changeset
    45
    text.columns = 60
wenzelm
parents: 77719
diff changeset
    46
    text.rows = 24
61742
fd3b214b0979 clarified font: GUI defaults might change dynamically;
wenzelm
parents: 61680
diff changeset
    47
    text.font = GUI.copy_font((new Label).font)
79052
d5cf21ad8b47 workaround for "fix" JDK-4512626 in Java 20/21: avoid spurious caret in read-only text;
wenzelm
parents: 79051
diff changeset
    48
    text.caret.color = text.background
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    49
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    50
    private val scroll_text = new ScrollPane(text)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    51
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    52
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    53
    /* progress */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    54
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    55
    private val progress = new Progress {
77509
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    56
      override def output(message: Progress.Message): Unit =
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    57
        if (do_output(message)) {
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    58
          GUI_Thread.later {
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    59
            text.append(message.output_text + "\n")
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    60
            val vertical = scroll_text.peer.getVerticalScrollBar
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    61
            vertical.setValue(vertical.getMaximum)
3bc49507bae5 clarified treatment of "verbose" messages, e.g. Progress.theory();
wenzelm
parents: 77502
diff changeset
    62
          }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    63
        }
77532
69af424b1f9d less verbosity, amending 3bc49507bae5;
wenzelm
parents: 77509
diff changeset
    64
69af424b1f9d less verbosity, amending 3bc49507bae5;
wenzelm
parents: 77509
diff changeset
    65
      override def theory(theory: Progress.Theory): Unit =
69af424b1f9d less verbosity, amending 3bc49507bae5;
wenzelm
parents: 77509
diff changeset
    66
        output(theory.message.copy(verbose = false))
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    67
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    68
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    69
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    70
    /* layout panel with dynamic actions */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    71
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    72
    private val action_panel = new FlowPanel(FlowPanel.Alignment.Center)()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    73
    private val layout_panel = new BorderPanel
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    74
    layout_panel.layout(scroll_text) = BorderPanel.Position.Center
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    75
    layout_panel.layout(action_panel) = BorderPanel.Position.South
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    76
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    77
    setContentPane(layout_panel.peer)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    78
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
    79
    private def set_actions(cs: Component*): Unit = {
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    80
      action_panel.contents.clear()
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    81
      action_panel.contents ++= cs
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    82
      layout_panel.revalidate()
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    83
      layout_panel.repaint()
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    84
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    85
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    86
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    87
    /* return code and exit */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    88
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    89
    private var _return_code: Option[Int] = None
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    90
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    91
    private def return_code(rc: Int): Unit =
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    92
      GUI_Thread.later {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    93
        _return_code = Some(rc)
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
    94
        delay_exit.invoke()
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    95
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    96
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    97
    private val delay_exit =
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
    98
      Delay.first(Time.seconds(1.0), gui = true) {
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    99
        if (can_auto_close) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   100
        else {
75853
f981111768ec clarified signature;
wenzelm
parents: 75852
diff changeset
   101
          val button = new GUI.Button("Close") { override def clicked(): Unit = conclude() }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   102
          set_actions(button)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   103
          button.peer.getRootPane.setDefaultButton(button.peer)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   104
        }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   105
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   106
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
   107
    private def conclude(): Unit = {
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   108
      setVisible(false)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   109
      dispose()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   110
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   111
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   112
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   113
    /* close */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   114
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   115
    setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   116
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   117
    addWindowListener(new WindowAdapter {
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
   118
      override def windowClosing(e: WindowEvent): Unit = {
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   119
        if (_return_code.isDefined) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   120
        else stopping()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   121
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   122
    })
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   123
75393
87ebf5a50283 clarified formatting, for the sake of scala3;
wenzelm
parents: 74306
diff changeset
   124
    private def stopping(): Unit = {
73367
77ef8bef0593 clarified signature --- fewer warnings;
wenzelm
parents: 73340
diff changeset
   125
      progress.stop()
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   126
      set_actions(new Label("Stopping ..."))
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   127
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   128
75853
f981111768ec clarified signature;
wenzelm
parents: 75852
diff changeset
   129
    private val stop_button = new GUI.Button("Stop") {
f981111768ec clarified signature;
wenzelm
parents: 75852
diff changeset
   130
      override def clicked(): Unit = stopping()
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   131
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   132
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   133
    private var do_auto_close = true
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   134
    private def can_auto_close: Boolean = do_auto_close && _return_code == Some(0)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   135
75854
2163772eeaf2 tuned signature;
wenzelm
parents: 75853
diff changeset
   136
    private val auto_close = new GUI.Check("Auto close", init = do_auto_close) {
75852
fcc25bb49def clarified signature;
wenzelm
parents: 75752
diff changeset
   137
      tooltip = "Automatically close dialog when finished"
fcc25bb49def clarified signature;
wenzelm
parents: 75752
diff changeset
   138
      override def clicked(state: Boolean): Unit = {
fcc25bb49def clarified signature;
wenzelm
parents: 75752
diff changeset
   139
        do_auto_close = state
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   140
        if (can_auto_close) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   141
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   142
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   143
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   144
    set_actions(stop_button, auto_close)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   145
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   146
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   147
    /* main */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   148
77719
cbfbf48b0281 tuned signature;
wenzelm
parents: 77532
diff changeset
   149
    setTitle("Isabelle build (" + Isabelle_System.ml_identifier() + " / " +
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   150
      "jdk-" + Platform.jvm_version + "_" + Platform.jvm_platform + ")")
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   151
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   152
    pack()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   153
    setLocationRelativeTo(view)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   154
    setVisible(true)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   155
71692
f8e52c0152fe clarified names;
wenzelm
parents: 71685
diff changeset
   156
    Isabelle_Thread.fork(name = "session_build") {
75752
a0253e471aa4 clarified signature;
wenzelm
parents: 75393
diff changeset
   157
      progress.echo("Build started for Isabelle/" +
a0253e471aa4 clarified signature;
wenzelm
parents: 75393
diff changeset
   158
        PIDE.resources.session_base.session_name + " ...")
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   159
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   160
      val (out, rc) =
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
   161
        try { ("", JEdit_Sessions.session_build(options, progress = progress)) }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   162
        catch {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   163
          case exn: Throwable =>
74068
62e4ec8cff38 clarified signature;
wenzelm
parents: 73367
diff changeset
   164
            (Output.error_message_text(Exn.message(exn)) + "\n", Exn.failure_rc(exn))
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   165
        }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   166
74306
a117c076aa22 clarified signature;
wenzelm
parents: 74068
diff changeset
   167
      val ok = rc == Process_Result.RC.ok
a117c076aa22 clarified signature;
wenzelm
parents: 74068
diff changeset
   168
      progress.echo(out + (if (ok) "OK" else Process_Result.RC.print_long(rc)) + "\n")
61289
14cd4eabce10 tuned message;
wenzelm
parents: 61288
diff changeset
   169
74306
a117c076aa22 clarified signature;
wenzelm
parents: 74068
diff changeset
   170
      if (ok) JEdit_Sessions.session_start(options)
61680
f7c00119e6e7 tuned message;
wenzelm
parents: 61556
diff changeset
   171
      else progress.echo("Session build failed -- prover process remains inactive!")
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   172
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   173
      return_code(rc)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   174
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   175
  }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   176
}