src/Tools/jEdit/src/scala_console.scala
author wenzelm
Sun, 05 Apr 2020 21:05:08 +0200
changeset 71700 6c39c3be85df
parent 71684 5036edb025b7
child 71782 a57035ae9029
permissions -rw-r--r--
clarified signature;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
43282
5d294220ca43 moved sources -- eliminated Netbeans artifact of jedit package directory;
wenzelm
parents: 37175
diff changeset
     1
/*  Title:      Tools/jEdit/src/scala_console.scala
36760
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     2
    Author:     Makarius
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     3
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     4
Scala instance of Console plugin.
b82a698ef6c9 tuned headers;
wenzelm
parents: 36015
diff changeset
     5
*/
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     6
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     7
package isabelle.jedit
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     8
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
     9
36015
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34857
diff changeset
    10
import isabelle._
6111de7c916a adapted to Scala 2.8.0 Beta 1;
wenzelm
parents: 34857
diff changeset
    11
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    12
import console.{Console, ConsolePane, Shell, Output}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    13
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
    14
import org.gjt.sp.jedit.{jEdit, JARClassLoader}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    15
import org.gjt.sp.jedit.MiscUtilities
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    16
48613
232652ac346e clarified directory content operations (similar to ML version);
wenzelm
parents: 48412
diff changeset
    17
import java.io.{File => JFile, FileFilter, OutputStream, Writer, PrintWriter}
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    18
47992
7700f0e9618c avoid scala.tools.nsc.Interpreter -- deprecated in scala-2.9.0;
wenzelm
parents: 45580
diff changeset
    19
import scala.tools.nsc.{GenericRunnerSettings, NewLinePrintWriter, ConsoleWriter}
7700f0e9618c avoid scala.tools.nsc.Interpreter -- deprecated in scala-2.9.0;
wenzelm
parents: 45580
diff changeset
    20
import scala.tools.nsc.interpreter.IMain
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
    21
import scala.collection.mutable
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    22
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    23
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    24
class Scala_Console extends Shell("Scala")
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    25
{
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    26
  /* reconstructed jEdit/plugin classpath */
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    27
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    28
  private def reconstruct_classpath(): String =
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    29
  {
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    30
    def find_jars(start: String): List[String] =
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    31
      if (start != null)
62443
133f65ac17e5 just one File.find_files, based on Java 7 Files operations;
wenzelm
parents: 61590
diff changeset
    32
        File.find_files(new JFile(start), file => file.getName.endsWith(".jar")).
71601
97ccf48c2f0c misc tuning based on hints by IntelliJ IDEA;
wenzelm
parents: 67178
diff changeset
    33
          map(File.absolute_name)
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    34
      else Nil
53575
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    35
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    36
    val initial_class_path =
66923
wenzelm
parents: 66234
diff changeset
    37
      space_explode(JFile.pathSeparatorChar, System.getProperty("java.class.path", ""))
53575
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    38
53574
cb7d8e70f4f4 provide main classpath again, notably for cold-start;
wenzelm
parents: 50205
diff changeset
    39
    val path =
53575
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    40
      initial_class_path :::
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    41
      find_jars(jEdit.getSettingsDirectory) :::
df79aa33bb74 more official initial class path according to sun.misc.Launcher;
wenzelm
parents: 53574
diff changeset
    42
      find_jars(jEdit.getJEditHome)
48409
0d2114eb412a more explicit java.io.{File => JFile};
wenzelm
parents: 47992
diff changeset
    43
    path.mkString(JFile.pathSeparator)
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    44
  }
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    45
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    46
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 57609
diff changeset
    47
  /* global state -- owned by GUI thread */
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
    48
57609
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    49
  @volatile private var interpreters = Map.empty[Console, Interpreter]
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    50
57609
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    51
  @volatile private var global_console: Console = null
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    52
  @volatile private var global_out: Output = null
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    53
  @volatile private var global_err: Output = null
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
    54
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    55
  private val console_stream = new OutputStream
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    56
  {
65876
wenzelm
parents: 62443
diff changeset
    57
    val buf = new StringBuilder(100)
wenzelm
parents: 62443
diff changeset
    58
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    59
    override def flush()
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    60
    {
57609
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    61
      val s = buf.synchronized { val s = buf.toString; buf.clear; s }
56833
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
    62
      val str = UTF8.decode_permissive(s)
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 57609
diff changeset
    63
      GUI_Thread.later {
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
    64
        if (global_out == null) System.out.print(str)
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
    65
        else global_out.writeAttrs(null, str)
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
    66
      }
71684
5036edb025b7 clarified signature;
wenzelm
parents: 71601
diff changeset
    67
      Time.seconds(0.01).sleep  // FIXME adhoc delay to avoid loosing output
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    68
    }
65876
wenzelm
parents: 62443
diff changeset
    69
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    70
    override def close() { flush () }
65876
wenzelm
parents: 62443
diff changeset
    71
wenzelm
parents: 62443
diff changeset
    72
    def write(byte: Int)
wenzelm
parents: 62443
diff changeset
    73
    {
56833
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
    74
      val c = byte.toChar
57609
943dbbbf7ad5 some robustification of console output;
wenzelm
parents: 57603
diff changeset
    75
      buf.synchronized { buf.append(c) }
56833
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
    76
      if (c == '\n') flush()
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
    77
    }
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    78
  }
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    79
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    80
  private val console_writer = new Writer
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    81
  {
65877
6eb1a3f7012f more uniform line-oriented output, notably for scala-2.12.2 REPL which emits "\n" separately;
wenzelm
parents: 65876
diff changeset
    82
    def flush() { console_stream.flush() }
6eb1a3f7012f more uniform line-oriented output, notably for scala-2.12.2 REPL which emits "\n" separately;
wenzelm
parents: 65876
diff changeset
    83
    def close() { console_stream.flush() }
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    84
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    85
    def write(cbuf: Array[Char], off: Int, len: Int)
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    86
    {
65877
6eb1a3f7012f more uniform line-oriented output, notably for scala-2.12.2 REPL which emits "\n" separately;
wenzelm
parents: 65876
diff changeset
    87
      if (len > 0) {
6eb1a3f7012f more uniform line-oriented output, notably for scala-2.12.2 REPL which emits "\n" separately;
wenzelm
parents: 65876
diff changeset
    88
        UTF8.bytes(new String(cbuf.slice(off, off + len))).foreach(console_stream.write(_))
6eb1a3f7012f more uniform line-oriented output, notably for scala-2.12.2 REPL which emits "\n" separately;
wenzelm
parents: 65876
diff changeset
    89
      }
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    90
    }
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    91
  }
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
    92
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    93
  private def with_console[A](console: Console, out: Output, err: Output)(e: => A): A =
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    94
  {
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    95
    global_console = console
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    96
    global_out = out
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
    97
    global_err = if (err == null) out else err
56833
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
    98
    try {
56832
93f05fa757dd more redirection;
wenzelm
parents: 55621
diff changeset
    99
      scala.Console.withErr(console_stream) {
93f05fa757dd more redirection;
wenzelm
parents: 55621
diff changeset
   100
        scala.Console.withOut(console_stream) { e }
93f05fa757dd more redirection;
wenzelm
parents: 55621
diff changeset
   101
      }
93f05fa757dd more redirection;
wenzelm
parents: 55621
diff changeset
   102
    }
56833
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   103
    finally {
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   104
      console_stream.flush
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   105
      global_console = null
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   106
      global_out = null
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   107
      global_err = null
d0a57abc71f8 clarified synchronization and exception handling;
wenzelm
parents: 56832
diff changeset
   108
    }
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   109
  }
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   110
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   111
  private def report_error(str: String)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   112
  {
67178
70576478bda9 avoid println with its extra CR on Windows;
wenzelm
parents: 66923
diff changeset
   113
    if (global_console == null || global_err == null) isabelle.Output.writeln(str)
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 57609
diff changeset
   114
    else GUI_Thread.later { global_err.print(global_console.getErrorColor, str) }
34846
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
   115
  }
ca76b3978540 pass all jEdit jars to compiler as classpath -- to enable proper referencing of application name space;
wenzelm
parents: 34845
diff changeset
   116
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   117
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   118
  /* interpreter thread */
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   119
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   120
  private abstract class Request
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   121
  private case class Start(console: Console) extends Request
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   122
  private case class Execute(console: Console, out: Output, err: Output, command: String)
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   123
    extends Request
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   124
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   125
  private class Interpreter
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   126
  {
61590
wenzelm
parents: 61558
diff changeset
   127
    private val running = Synchronized[Option[Thread]](None)
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   128
    def interrupt { running.change(opt => { opt.foreach(_.interrupt); opt }) }
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   129
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   130
    private val settings = new GenericRunnerSettings(report_error)
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
   131
    settings.classpath.value = reconstruct_classpath()
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   132
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   133
    private val interp = new IMain(settings, new PrintWriter(console_writer, true))
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   134
    {
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   135
      override def parentClassLoader = new JARClassLoader
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   136
    }
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   137
    interp.setContextClassLoader
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   138
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   139
    val thread: Consumer_Thread[Request] = Consumer_Thread.fork("Scala_Console")
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   140
    {
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   141
      case Start(console) =>
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   142
        interp.bind("view", "org.gjt.sp.jedit.View", console.getView)
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   143
        interp.bind("console", "console.Console", console)
57603
0f58af858813 more default imports;
wenzelm
parents: 56836
diff changeset
   144
        interp.interpret("import isabelle._; import isabelle.jedit._")
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   145
        true
34850
fdd560e80264 redirect scala.Console output during interpretation;
wenzelm
parents: 34849
diff changeset
   146
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   147
      case Execute(console, out, err, command) =>
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   148
        with_console(console, out, err) {
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   149
          try {
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   150
            running.change(_ => Some(Thread.currentThread()))
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   151
            interp.interpret(command)
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   152
          }
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   153
          finally {
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   154
            running.change(_ => None)
71700
6c39c3be85df clarified signature;
wenzelm
parents: 71684
diff changeset
   155
            Exn.Interrupt.dispose()
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   156
          }
57612
990ffb84489b clarified module name: facilitate alternative GUI frameworks;
wenzelm
parents: 57609
diff changeset
   157
          GUI_Thread.later {
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   158
            if (err != null) err.commandDone()
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   159
            out.commandDone()
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   160
          }
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   161
          true
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   162
        }
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   163
    }
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   164
  }
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   165
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   166
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   167
  /* jEdit console methods */
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   168
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   169
  override def openConsole(console: Console)
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   170
  {
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   171
    val interp = new Interpreter
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   172
    interp.thread.send(Start(console))
34845
6d64de27efa5 provide some bindings of jEdit values;
wenzelm
parents: 34844
diff changeset
   173
    interpreters += (console -> interp)
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   174
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   175
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   176
  override def closeConsole(console: Console)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   177
  {
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   178
    interpreters.get(console) match {
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   179
      case Some(interp) =>
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   180
        interp.interrupt
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   181
        interp.thread.shutdown
56834
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   182
        interpreters -= console
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   183
      case None =>
a752f065f3d3 fork Scala interpreter thread, independently of Swing_Thread;
wenzelm
parents: 56833
diff changeset
   184
    }
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   185
  }
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   186
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   187
  override def printInfoMessage(out: Output)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   188
  {
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   189
    out.print(null,
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   190
     "This shell evaluates Isabelle/Scala expressions.\n\n" +
57848
f68cda7c85d4 tuned message;
wenzelm
parents: 57612
diff changeset
   191
     "The contents of package isabelle and isabelle.jedit are imported.\n" +
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   192
     "The following special toplevel bindings are provided:\n" +
50205
788c8263e634 renamed main plugin object to PIDE;
wenzelm
parents: 50203
diff changeset
   193
     "  view    -- current jEdit/Swing view (e.g. view.getBuffer, view.getTextArea)\n" +
788c8263e634 renamed main plugin object to PIDE;
wenzelm
parents: 50203
diff changeset
   194
     "  console -- jEdit Console plugin\n" +
55621
8d69c15b6fb9 added PIDE.snapshot, PIDE.rendering for convenience;
wenzelm
parents: 55618
diff changeset
   195
     "  PIDE    -- Isabelle/PIDE plugin (e.g. PIDE.session, PIDE.snapshot, PIDE.rendering)\n")
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   196
  }
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   197
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   198
  override def printPrompt(console: Console, out: Output)
37175
be764a7adb10 eliminated hard tabs;
wenzelm
parents: 36760
diff changeset
   199
  {
34844
92ea2174ea78 more precise prompt etc.;
wenzelm
parents: 34841
diff changeset
   200
    out.writeAttrs(ConsolePane.colorAttributes(console.getInfoColor), "scala>")
37175
be764a7adb10 eliminated hard tabs;
wenzelm
parents: 36760
diff changeset
   201
    out.writeAttrs(ConsolePane.colorAttributes(console.getPlainColor), " ")
be764a7adb10 eliminated hard tabs;
wenzelm
parents: 36760
diff changeset
   202
  }
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   203
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   204
  override def execute(console: Console, input: String, out: Output, err: Output, command: String)
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   205
  {
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   206
    interpreters(console).thread.send(Execute(console, out, err, command))
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   207
  }
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   208
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   209
  override def stop(console: Console)
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   210
  {
56836
69531d86d77e more sensible interrupt of interpreter, when the user pushes Cancel button;
wenzelm
parents: 56834
diff changeset
   211
    interpreters.get(console).foreach(_.interrupt)
34849
96bcb91b45ce bind "session";
wenzelm
parents: 34846
diff changeset
   212
  }
34841
2ada58650469 some attempts at Scala console plugin;
wenzelm
parents:
diff changeset
   213
}