src/Tools/jEdit/src/session_build.scala
author wenzelm
Sat, 04 Apr 2020 19:18:19 +0200
changeset 71685 d5773922358d
parent 71601 97ccf48c2f0c
child 71692 f8e52c0152fe
permissions -rw-r--r--
clarified signature;
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
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    15
import scala.swing.{ScrollPane, Button, CheckBox, FlowPanel,
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    16
  BorderPanel, TextArea, Component, Label}
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    17
import scala.swing.event.ButtonClicked
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    18
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    19
import org.gjt.sp.jedit.View
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    20
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    21
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    22
object Session_Build
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    23
{
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    24
  def check_dialog(view: View)
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    25
  {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    26
    GUI_Thread.require {}
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    27
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    28
    val options = PIDE.options.value
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    29
    try {
69854
cc0b3e177b49 system option "system_heaps" supersedes various command-line options for "system build mode";
wenzelm
parents: 68957
diff changeset
    30
      if (JEdit_Sessions.session_no_build ||
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    31
          JEdit_Sessions.session_build(options, no_build = true) == 0)
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    32
            JEdit_Sessions.session_start(options)
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    33
      else new Dialog(view)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    34
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    35
    catch {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    36
      case exn: Throwable =>
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    37
        GUI.dialog(view, "Isabelle", GUI.scrollable_text(Exn.message(exn)))
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    38
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    39
  }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    40
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    41
  private class Dialog(view: View) extends JDialog(view)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    42
  {
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 69854
diff changeset
    43
    val options: Options = PIDE.options.value
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    44
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
    45
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    46
    /* text */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    47
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    48
    private val text = new TextArea {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    49
      editable = false
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    50
      columns = 65
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    51
      rows = 24
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    52
    }
61742
fd3b214b0979 clarified font: GUI defaults might change dynamically;
wenzelm
parents: 61680
diff changeset
    53
    text.font = GUI.copy_font((new Label).font)
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    54
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    55
    private val scroll_text = new ScrollPane(text)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    56
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    57
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    58
    /* progress */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    59
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    60
    @volatile private var is_stopped = false
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    61
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    62
    private val progress = new Progress {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    63
      override def echo(txt: String): Unit =
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    64
        GUI_Thread.later {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    65
          text.append(txt + "\n")
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    66
          val vertical = scroll_text.peer.getVerticalScrollBar
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    67
          vertical.setValue(vertical.getMaximum)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    68
        }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    69
68957
eef4e983fd9d clarified theory progress;
wenzelm
parents: 68410
diff changeset
    70
      override def theory(theory: Progress.Theory): Unit = echo(theory.message)
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    71
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    72
      override def stopped: Boolean = is_stopped
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    73
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    74
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    75
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    76
    /* layout panel with dynamic actions */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    77
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    78
    private val action_panel = new FlowPanel(FlowPanel.Alignment.Center)()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    79
    private val layout_panel = new BorderPanel
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    80
    layout_panel.layout(scroll_text) = BorderPanel.Position.Center
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    81
    layout_panel.layout(action_panel) = BorderPanel.Position.South
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    82
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    83
    setContentPane(layout_panel.peer)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    84
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    85
    private def set_actions(cs: Component*)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    86
    {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    87
      action_panel.contents.clear
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    88
      action_panel.contents ++= cs
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    89
      layout_panel.revalidate
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    90
      layout_panel.repaint
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    91
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    92
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    93
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    94
    /* return code and exit */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    95
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    96
    private var _return_code: Option[Int] = None
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    97
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    98
    private def return_code(rc: Int): Unit =
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
    99
      GUI_Thread.later {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   100
        _return_code = Some(rc)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   101
        delay_exit.invoke
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   102
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   103
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   104
    private val delay_exit =
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   105
      GUI_Thread.delay_first(Time.seconds(1.0))
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   106
      {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   107
        if (can_auto_close) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   108
        else {
61299
0f8187611ba9 tuned GUI;
wenzelm
parents: 61292
diff changeset
   109
          val button = new Button("Close") { reactions += { case ButtonClicked(_) => conclude() } }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   110
          set_actions(button)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   111
          button.peer.getRootPane.setDefaultButton(button.peer)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   112
        }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   113
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   114
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   115
    private def conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   116
    {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   117
      setVisible(false)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   118
      dispose()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   119
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   120
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   121
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   122
    /* close */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   123
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   124
    setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   125
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   126
    addWindowListener(new WindowAdapter {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   127
      override def windowClosing(e: WindowEvent) {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   128
        if (_return_code.isDefined) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   129
        else stopping()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   130
      }
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 def stopping()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   134
    {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   135
      is_stopped = true
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   136
      set_actions(new Label("Stopping ..."))
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   137
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   138
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   139
    private val stop_button = new Button("Stop") {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   140
      reactions += { case ButtonClicked(_) => stopping() }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   141
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   142
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   143
    private var do_auto_close = true
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   144
    private def can_auto_close: Boolean = do_auto_close && _return_code == Some(0)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   145
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   146
    private val auto_close = new CheckBox("Auto close") {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   147
      reactions += {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   148
        case ButtonClicked(_) => do_auto_close = this.selected
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   149
        if (can_auto_close) conclude()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   150
      }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   151
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   152
    auto_close.selected = do_auto_close
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   153
    auto_close.tooltip = "Automatically close dialog when finished"
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   154
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   155
    set_actions(stop_button, auto_close)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   156
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   157
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   158
    /* main */
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   159
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   160
    setTitle("Isabelle build (" +
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   161
      Isabelle_System.getenv("ML_IDENTIFIER") + " / " +
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   162
      "jdk-" + Platform.jvm_version + "_" + Platform.jvm_platform + ")")
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   163
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   164
    pack()
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   165
    setLocationRelativeTo(view)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   166
    setVisible(true)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   167
71685
d5773922358d clarified signature;
wenzelm
parents: 71601
diff changeset
   168
    Standard_Thread.fork(name = "session_build") {
66973
829c3133c4ca added isabelle jedit options -B, -P, clarified -R;
wenzelm
parents: 65828
diff changeset
   169
      progress.echo("Build started for Isabelle/" + PIDE.resources.session_name + " ...")
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   170
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   171
      val (out, rc) =
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
   172
        try { ("", JEdit_Sessions.session_build(options, progress = progress)) }
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   173
        catch {
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   174
          case exn: Throwable =>
65828
02dd430d80c5 tuned signature;
wenzelm
parents: 65256
diff changeset
   175
            (Output.error_message_text(Exn.message(exn)) + "\n", Exn.return_code(exn, 2))
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   176
        }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   177
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   178
      progress.echo(out + (if (rc == 0) "OK\n" else "Return code: " + rc + "\n"))
61289
14cd4eabce10 tuned message;
wenzelm
parents: 61288
diff changeset
   179
65256
c3d6dd17d626 more explicit options;
wenzelm
parents: 62973
diff changeset
   180
      if (rc == 0) JEdit_Sessions.session_start(options)
61680
f7c00119e6e7 tuned message;
wenzelm
parents: 61556
diff changeset
   181
      else progress.echo("Session build failed -- prover process remains inactive!")
61288
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   182
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   183
      return_code(rc)
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   184
    }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   185
  }
9399860edb46 clarified modules;
wenzelm
parents:
diff changeset
   186
}