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) |