src/Tools/jEdit/src/scala_console.scala
changeset 56834 a752f065f3d3
parent 56833 d0a57abc71f8
child 56836 69531d86d77e
equal deleted inserted replaced
56833:d0a57abc71f8 56834:a752f065f3d3
    57   }
    57   }
    58 
    58 
    59 
    59 
    60   /* global state -- owned by Swing thread */
    60   /* global state -- owned by Swing thread */
    61 
    61 
    62   private var interpreters = Map[Console, IMain]()
    62   private abstract class Request
       
    63   private var interpreters = Map[Console, Consumer_Thread[Request]]()
    63 
    64 
    64   private var global_console: Console = null
    65   private var global_console: Console = null
    65   private var global_out: Output = null
    66   private var global_out: Output = null
    66   private var global_err: Output = null
    67   private var global_err: Output = null
    67 
    68 
    70     val buf = new StringBuffer
    71     val buf = new StringBuffer
    71     override def flush()
    72     override def flush()
    72     {
    73     {
    73       val s = buf.synchronized { val s = buf.toString; buf.setLength(0); s }
    74       val s = buf.synchronized { val s = buf.toString; buf.setLength(0); s }
    74       val str = UTF8.decode_permissive(s)
    75       val str = UTF8.decode_permissive(s)
    75       if (global_out == null) System.out.print(str)
    76       Swing_Thread.later {
    76       else Swing_Thread.now { global_out.writeAttrs(null, str) }
    77         if (global_out == null) System.out.print(str)
       
    78         else global_out.writeAttrs(null, str)
       
    79       }
    77     }
    80     }
    78     override def close() { flush () }
    81     override def close() { flush () }
    79     def write(byte: Int) {
    82     def write(byte: Int) {
    80       val c = byte.toChar
    83       val c = byte.toChar
    81       buf.append(c)
    84       buf.append(c)
   119   }
   122   }
   120 
   123 
   121   private def report_error(str: String)
   124   private def report_error(str: String)
   122   {
   125   {
   123     if (global_console == null || global_err == null) System.err.println(str)
   126     if (global_console == null || global_err == null) System.err.println(str)
   124     else Swing_Thread.now { global_err.print(global_console.getErrorColor, str) }
   127     else Swing_Thread.later { global_err.print(global_console.getErrorColor, str) }
   125   }
   128   }
   126 
   129 
   127 
   130 
   128   /* jEdit console methods */
   131   /* interpreter thread */
   129 
   132 
   130   override def openConsole(console: Console)
   133   private case class Start(console: Console) extends Request
       
   134   private case class Execute(console: Console, out: Output, err: Output, command: String)
       
   135     extends Request
       
   136 
       
   137   private def fork_interpreter(): Consumer_Thread[Request] =
   131   {
   138   {
   132     val settings = new GenericRunnerSettings(report_error)
   139     val settings = new GenericRunnerSettings(report_error)
   133     settings.classpath.value = reconstruct_classpath()
   140     settings.classpath.value = reconstruct_classpath()
   134 
   141 
   135     val interp = new IMain(settings, new PrintWriter(console_writer, true))
   142     val interp = new IMain(settings, new PrintWriter(console_writer, true))
   136     {
   143     {
   137       override def parentClassLoader = new JARClassLoader
   144       override def parentClassLoader = new JARClassLoader
   138     }
   145     }
   139     interp.setContextClassLoader
   146     interp.setContextClassLoader
   140     interp.bind("view", "org.gjt.sp.jedit.View", console.getView)
   147 
   141     interp.bind("console", "console.Console", console)
   148     Consumer_Thread.fork[Request]("Scala_Console") {
   142     interp.interpret("import isabelle.jedit.PIDE")
   149       case Start(console) =>
   143 
   150         interp.bind("view", "org.gjt.sp.jedit.View", console.getView)
       
   151         interp.bind("console", "console.Console", console)
       
   152         interp.interpret("import isabelle.jedit.PIDE")
       
   153         true
       
   154 
       
   155       case Execute(console, out, err, command) =>
       
   156         with_console(console, out, err) {
       
   157           interp.interpret(command)
       
   158           Swing_Thread.later {
       
   159             if (err != null) err.commandDone()
       
   160             out.commandDone()
       
   161           }
       
   162           true
       
   163         }
       
   164     }
       
   165   }
       
   166 
       
   167 
       
   168   /* jEdit console methods */
       
   169 
       
   170   override def openConsole(console: Console)
       
   171   {
       
   172     val interp = fork_interpreter()
       
   173     interp.send(Start(console))
   144     interpreters += (console -> interp)
   174     interpreters += (console -> interp)
   145   }
   175   }
   146 
   176 
   147   override def closeConsole(console: Console)
   177   override def closeConsole(console: Console)
   148   {
   178   {
   149     interpreters -= console
   179     interpreters.get(console) match {
       
   180       case Some(interp) =>
       
   181         interp.shutdown
       
   182         interpreters -= console
       
   183       case None =>
       
   184     }
   150   }
   185   }
   151 
   186 
   152   override def printInfoMessage(out: Output)
   187   override def printInfoMessage(out: Output)
   153   {
   188   {
   154     out.print(null,
   189     out.print(null,
   165     out.writeAttrs(ConsolePane.colorAttributes(console.getPlainColor), " ")
   200     out.writeAttrs(ConsolePane.colorAttributes(console.getPlainColor), " ")
   166   }
   201   }
   167 
   202 
   168   override def execute(console: Console, input: String, out: Output, err: Output, command: String)
   203   override def execute(console: Console, input: String, out: Output, err: Output, command: String)
   169   {
   204   {
   170     val interp = interpreters(console)
   205     interpreters(console).send(Execute(console, out, err, command))
   171     with_console(console, out, err) { interp.interpret(command) }
       
   172     if (err != null) err.commandDone()
       
   173     out.commandDone()
       
   174   }
   206   }
   175 
   207 
   176   override def stop(console: Console)
   208   override def stop(console: Console)
   177   {
   209   {
   178     closeConsole(console)
   210     closeConsole(console)