src/Pure/GUI/system_dialog.scala
author wenzelm
Tue, 29 Sep 2015 16:45:54 +0200
changeset 61279 8410015c3e82
parent 61278 4d2ea32e0f75
child 61280 12f9ab87a06d
permissions -rw-r--r--
proper event;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
53783
f5e9d182f645 clarified location of GUI modules (which depend on Swing of JFX);
wenzelm
parents: 53460
diff changeset
     1
/*  Title:      Pure/GUI/system_dialog.scala
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     3
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     4
Dialog for system processes, with optional output window.
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     5
*/
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     6
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     7
package isabelle
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     8
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
     9
60998
42cebb02b5ae more scalable GUI;
wenzelm
parents: 59387
diff changeset
    10
import java.awt.{GraphicsEnvironment, Point}
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    11
import java.awt.event.{WindowEvent, WindowAdapter}
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    12
import javax.swing.{WindowConstants, JFrame, JDialog}
53460
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
    13
import java.io.{File => JFile, BufferedReader, InputStreamReader}
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    14
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    15
import scala.swing.{ScrollPane, Button, CheckBox, FlowPanel,
53458
ddefd18d5ed0 tuned imports;
wenzelm
parents: 53457
diff changeset
    16
  BorderPanel, Frame, TextArea, Component, Label}
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    17
import scala.swing.event.ButtonClicked
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    18
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    19
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    20
class System_Dialog(owner: JFrame = null) extends Progress
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    21
{
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    22
  /* component state -- owned by GUI thread */
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    23
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    24
  private var _title = "Isabelle"
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    25
  private var _window: Option[Window] = None
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    26
  private var _return_code: Option[Int] = None
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    27
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    28
  private def check_window(): Window =
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    29
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    30
    GUI_Thread.require {}
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    31
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    32
    _window match {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    33
      case Some(window) => window
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    34
      case None =>
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    35
        val window = new Window
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    36
        _window = Some(window)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    37
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    38
        window.pack()
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    39
        val point = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint()
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    40
        window.setLocation(
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    41
          new Point(point.x - window.getWidth / 2, point.y - window.getHeight / 2))
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    42
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    43
        window.setVisible(true)
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    44
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    45
        window
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    46
      }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    47
  }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    48
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    49
  private val result = Future.promise[Int]
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    50
53454
1a0c39c728a1 clarified result;
wenzelm
parents: 53453
diff changeset
    51
  private def conclude()
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    52
  {
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
    53
    GUI_Thread.require {}
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    54
    require(_return_code.isDefined)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    55
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    56
    _window match {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    57
      case None =>
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    58
      case Some(window) =>
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    59
        window.setVisible(false)
53457
b7c15885fd1e more robust exit;
wenzelm
parents: 53456
diff changeset
    60
        window.dispose
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    61
        _window = None
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    62
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    63
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    64
    try { result.fulfill(_return_code.get) }
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    65
    catch { case ERROR(_) => }
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    66
  }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    67
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    68
  def join(): Int = result.join
53460
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
    69
  def join_exit(): Nothing = sys.exit(join)
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
    70
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    71
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    72
  /* window */
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    73
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    74
  private class Window extends JDialog(owner, _title)
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    75
  {
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    76
    setIconImages(GUI.isabelle_images())
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    77
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    78
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    79
    /* text */
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    80
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    81
    val text = new TextArea {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    82
      editable = false
59387
d15a96149703 tuned window size for the sake of Windows L&F;
wenzelm
parents: 59201
diff changeset
    83
      columns = 65
d15a96149703 tuned window size for the sake of Windows L&F;
wenzelm
parents: 59201
diff changeset
    84
      rows = 24
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    85
    }
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    86
    text.font = (new Label).font
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    87
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    88
    val scroll_text = new ScrollPane(text)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    89
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    90
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    91
    /* layout panel with dynamic actions */
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    92
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    93
    val action_panel = new FlowPanel(FlowPanel.Alignment.Center)()
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    94
    val layout_panel = new BorderPanel
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    95
    layout_panel.layout(scroll_text) = BorderPanel.Position.Center
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    96
    layout_panel.layout(action_panel) = BorderPanel.Position.South
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    97
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
    98
    setContentPane(layout_panel.peer)
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
    99
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   100
    def set_actions(cs: Component*)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   101
    {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   102
      action_panel.contents.clear
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   103
      action_panel.contents ++= cs
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   104
      layout_panel.revalidate
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   105
      layout_panel.repaint
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   106
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   107
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   108
53455
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   109
    /* close */
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   110
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   111
    setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE)
53455
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   112
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   113
    addWindowListener(new WindowAdapter {
61279
8410015c3e82 proper event;
wenzelm
parents: 61278
diff changeset
   114
      override def windowClosing(e: WindowEvent) {
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   115
        if (_return_code.isDefined) conclude()
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   116
        else stopping()
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   117
      }
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   118
    })
53455
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   119
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   120
    def stopping()
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   121
    {
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   122
      is_stopped = true
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   123
      set_actions(new Label("Stopping ..."))
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   124
    }
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   125
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   126
    val stop_button = new Button("Stop") {
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   127
      reactions += { case ButtonClicked(_) => stopping() }
e9a3390217b3 clarified close operations;
wenzelm
parents: 53454
diff changeset
   128
    }
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   129
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   130
    var do_auto_close = true
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   131
    def can_auto_close: Boolean = do_auto_close && _return_code == Some(0)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   132
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   133
    val auto_close = new CheckBox("Auto close") {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   134
      reactions += {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   135
        case ButtonClicked(_) => do_auto_close = this.selected
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   136
        if (can_auto_close) conclude()
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   137
      }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   138
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   139
    auto_close.selected = do_auto_close
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   140
    auto_close.tooltip = "Automatically close dialog when finished"
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   141
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   142
    set_actions(stop_button, auto_close)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   143
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   144
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   145
    /* exit */
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   146
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   147
    val delay_exit =
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
   148
      GUI_Thread.delay_first(Time.seconds(1.0))
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   149
      {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   150
        if (can_auto_close) conclude()
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   151
        else {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   152
          val button =
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   153
            new Button(if (_return_code == Some(0)) "OK" else "Exit") {
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   154
              reactions += { case ButtonClicked(_) => conclude() }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   155
            }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   156
          set_actions(button)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   157
          button.peer.getRootPane.setDefaultButton(button.peer)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   158
        }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   159
      }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   160
  }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   161
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   162
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   163
  /* progress operations */
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   164
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   165
  def title(txt: String): Unit =
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
   166
    GUI_Thread.later {
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   167
      _title = txt
61278
4d2ea32e0f75 tuned GUI;
wenzelm
parents: 61276
diff changeset
   168
      _window.foreach(window => window.setTitle(txt))
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   169
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   170
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   171
  def return_code(rc: Int): Unit =
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
   172
    GUI_Thread.later {
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   173
      _return_code = Some(rc)
53456
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
   174
      _window match {
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
   175
        case None => conclude()
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
   176
        case Some(window) => window.delay_exit.invoke
d12be8f62285 Build_Dialog based on System_Dialog;
wenzelm
parents: 53455
diff changeset
   177
      }
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   178
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   179
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   180
  override def echo(txt: String): Unit =
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 56662
diff changeset
   181
    GUI_Thread.later {
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   182
      val window = check_window()
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   183
      window.text.append(txt + "\n")
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   184
      val vertical = window.scroll_text.peer.getVerticalScrollBar
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   185
      vertical.setValue(vertical.getMaximum)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   186
    }
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   187
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   188
  override def theory(session: String, theory: String): Unit =
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   189
    echo(session + ": theory " + theory)
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   190
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   191
  @volatile private var is_stopped = false
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   192
  override def stopped: Boolean = is_stopped
53460
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   193
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   194
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   195
  /* system operations */
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   196
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   197
  def execute(cwd: JFile, env: Map[String, String], args: String*): Int =
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   198
  {
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   199
    val proc = Isabelle_System.raw_execute(cwd, env, true, args: _*)
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   200
    proc.getOutputStream.close
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   201
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   202
    val stdout = new BufferedReader(new InputStreamReader(proc.getInputStream, UTF8.charset))
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   203
    try {
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   204
      var line = stdout.readLine
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   205
      while (line != null) {
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   206
        echo(line)
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   207
        line = stdout.readLine
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   208
      }
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   209
    }
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   210
    finally { stdout.close }
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   211
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   212
    proc.waitFor
6015a663b889 tuned signature;
wenzelm
parents: 53458
diff changeset
   213
  }
53453
20ff79162ff3 dialog for system processes, with optional output window;
wenzelm
parents:
diff changeset
   214
}