332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
1 |
/* IVLE - Informatics Virtual Learning Environment
|
2 |
* Copyright (C) 2007-2008 The University of Melbourne
|
|
3 |
*
|
|
4 |
* This program is free software; you can redistribute it and/or modify
|
|
5 |
* it under the terms of the GNU General Public License as published by
|
|
6 |
* the Free Software Foundation; either version 2 of the License, or
|
|
7 |
* (at your option) any later version.
|
|
8 |
*
|
|
9 |
* This program is distributed in the hope that it will be useful,
|
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12 |
* GNU General Public License for more details.
|
|
13 |
*
|
|
14 |
* You should have received a copy of the GNU General Public License
|
|
15 |
* along with this program; if not, write to the Free Software
|
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
17 |
*
|
|
18 |
* Module: Console (Client-side JavaScript)
|
|
19 |
* Author: Tom Conway, Matt Giuca
|
|
20 |
* Date: 30/1/2008
|
|
21 |
*/
|
|
22 |
||
432
by drtomc
usrmgt: more work on this. Still some work to go. |
23 |
var server_key; |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
24 |
|
339
by mattgiuca
console: |
25 |
/* Begin religious debate (tabs vs spaces) here: */
|
26 |
/* (This string will be inserted in the console when the user presses the Tab
|
|
27 |
* key) */
|
|
28 |
TAB_STRING = " "; |
|
29 |
||
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
30 |
/* Console DOM objects */
|
31 |
console_body = null; |
|
32 |
console_filler = null; |
|
33 |
||
339
by mattgiuca
console: |
34 |
windowpane_mode = false; |
343
by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect |
35 |
server_started = false; |
339
by mattgiuca
console: |
36 |
|
628
by drtomc
console: Add output based interrupt. This allows users to interrupt long |
37 |
interrupted = false; |
38 |
||
1340
by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333). |
39 |
|
40 |
function get_console_start_directory() |
|
41 |
{
|
|
42 |
if((typeof(current_path) != 'undefined') && current_file) |
|
43 |
{
|
|
44 |
// We have a current_path - give a suggestion to the server
|
|
45 |
var path; |
|
46 |
if (current_file.isdir) |
|
47 |
{
|
|
48 |
// Browser
|
|
49 |
return path_join("/home", current_path); |
|
50 |
}
|
|
51 |
else
|
|
52 |
{
|
|
53 |
// Editor - need to chop off filename
|
|
54 |
var tmp_path = current_path.split('/'); |
|
55 |
tmp_path.pop(); |
|
56 |
return path_join("/home", tmp_path.join('/')); |
|
57 |
}
|
|
58 |
}
|
|
59 |
else
|
|
60 |
{
|
|
61 |
// No current_path - let the server decide
|
|
62 |
return ''; |
|
63 |
}
|
|
64 |
}
|
|
65 |
||
343
by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect |
66 |
/* Starts the console server, if it isn't already.
|
67 |
* This can be called any number of times - it only starts the one server.
|
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
68 |
* Note that this is asynchronous. It will return after signalling to start
|
69 |
* the server, but there is no guarantee that it has been started yet.
|
|
343
by mattgiuca
console: Small refactoring of how server starts up. Currently does not affect |
70 |
* This is a separate step from console_init, as the server is only to be
|
71 |
* started once the first command is entered.
|
|
72 |
* Does not return a value. Writes to global variables
|
|
432
by drtomc
usrmgt: more work on this. Still some work to go. |
73 |
* server_host, and server_port.
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
74 |
*
|
75 |
* \param callback Function which will be called after the server has been
|
|
76 |
* started. No parameters are passed. May be null.
|
|
217
by mattgiuca
Console: Python code generates a minimal document with a DIV and links to |
77 |
*/
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
78 |
function start_server(callback) |
217
by mattgiuca
Console: Python code generates a minimal document with a DIV and links to |
79 |
{
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
80 |
if (server_started) |
81 |
{
|
|
82 |
callback(); |
|
83 |
return; |
|
84 |
}
|
|
85 |
var callback1 = function(xhr) |
|
86 |
{
|
|
87 |
var json_text = xhr.responseText; |
|
1060
by wagrant
Make IVLE work fine in Firefox 3.1 (ie. Gecko/XULRunner 1.9.1). Gecko 1.9.1 has |
88 |
server_key = JSON.parse(json_text).key; |
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
89 |
server_started = true; |
90 |
if (callback != null) |
|
91 |
callback(); |
|
92 |
}
|
|
872
by dcoles
Console: Allow console to be started with a set working directory (defaults to |
93 |
|
1340
by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333). |
94 |
ajax_call( |
95 |
callback1, "console", "service", |
|
96 |
{"ivle.op": "start", "cwd": get_console_start_directory()}, |
|
97 |
"POST"); |
|
217
by mattgiuca
Console: Python code generates a minimal document with a DIV and links to |
98 |
}
|
99 |
||
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
100 |
/** Initialises the console. All apps which import console are required to
|
101 |
* call this function.
|
|
102 |
* Optional "windowpane" (bool), if true, will cause the console to go into
|
|
103 |
* "window pane" mode which will allow it to be opened and closed, and float
|
|
104 |
* over the page.
|
|
105 |
* (Defaults to closed).
|
|
106 |
*/
|
|
331
by mattgiuca
Console: Configured console to display properly as a "floating" window in the |
107 |
function console_init(windowpane) |
217
by mattgiuca
Console: Python code generates a minimal document with a DIV and links to |
108 |
{
|
331
by mattgiuca
Console: Configured console to display properly as a "floating" window in the |
109 |
/* Set up the console as a floating pane */
|
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
110 |
console_body = document.getElementById("console_body"); |
362
by mattgiuca
console: Automatically focus input box when starting console app, or when |
111 |
/* If there is no console body, don't worry.
|
112 |
* (This lets us import console.js even on pages without a console box */
|
|
113 |
if (console_body == null) return; |
|
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
114 |
console_filler = document.getElementById("console_filler"); |
331
by mattgiuca
Console: Configured console to display properly as a "floating" window in the |
115 |
if (windowpane) |
339
by mattgiuca
console: |
116 |
{
|
117 |
windowpane_mode = true; |
|
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
118 |
console_minimize(); |
339
by mattgiuca
console: |
119 |
}
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
120 |
}
|
121 |
||
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
122 |
/** Hide the main console panel, so the console minimizes to just an input box
|
123 |
* at the page bottom. */
|
|
124 |
function console_minimize() |
|
125 |
{
|
|
339
by mattgiuca
console: |
126 |
if (!windowpane_mode) return; |
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
127 |
console_body.setAttribute("class", "windowpane minimal"); |
128 |
console_filler.setAttribute("class", "windowpane minimal"); |
|
129 |
}
|
|
130 |
||
131 |
/** Show the main console panel, so it enlarges out to its full size.
|
|
132 |
*/
|
|
133 |
function console_maximize() |
|
134 |
{
|
|
339
by mattgiuca
console: |
135 |
if (!windowpane_mode) return; |
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
136 |
console_body.setAttribute("class", "windowpane maximal"); |
137 |
console_filler.setAttribute("class", "windowpane maximal"); |
|
138 |
}
|
|
139 |
||
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
140 |
/* current_text is the string currently on the command line.
|
141 |
* If non-empty, it will be stored at the bottom of the history.
|
|
142 |
*/
|
|
143 |
function historyUp(current_text) |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
144 |
{
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
145 |
/* Remember the changes made to this item */
|
146 |
this.edited[this.cursor] = current_text; |
|
147 |
if (this.cursor > 0) |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
148 |
{
|
149 |
this.cursor--; |
|
150 |
}
|
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
151 |
this.earliestCursor = this.cursor; |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
152 |
}
|
153 |
||
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
154 |
function historyDown(current_text) |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
155 |
{
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
156 |
/* Remember the changes made to this item */
|
157 |
this.edited[this.cursor] = current_text; |
|
158 |
if (this.cursor < this.items.length - 1) |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
159 |
{
|
160 |
this.cursor++; |
|
161 |
}
|
|
162 |
}
|
|
163 |
||
164 |
function historyCurr() |
|
165 |
{
|
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
166 |
return this.edited[this.cursor]; |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
167 |
}
|
168 |
||
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
169 |
function historySubmit(text) |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
170 |
{
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
171 |
/* Copy the selected item's "edited" version over the permanent version of
|
172 |
* the last item. */
|
|
173 |
this.items[this.items.length-1] = text; |
|
174 |
/* Add a new blank item */
|
|
175 |
this.items[this.items.length] = ""; |
|
176 |
this.cursor = this.items.length-1; |
|
177 |
/* Blow away all the edited versions, replacing them with the existing
|
|
178 |
* items set.
|
|
179 |
* Not the whole history - just start from the earliest edited one.
|
|
180 |
* (This avoids slowdown over extended usage time).
|
|
181 |
*/
|
|
182 |
for (var i=this.earliestCursor; i<=this.cursor; i++) |
|
183 |
this.edited[i] = this.items[i]; |
|
184 |
this.earliestCursor = this.cursor; |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
185 |
}
|
186 |
||
187 |
function historyShow() |
|
188 |
{
|
|
189 |
var res = ""; |
|
190 |
for (var i = 0; i < this.items.length; i++) |
|
191 |
{
|
|
192 |
if (i == this.cursor) |
|
193 |
{
|
|
194 |
res += "[" |
|
195 |
}
|
|
196 |
res += this.items[i].toString(); |
|
197 |
if (i == this.cursor) |
|
198 |
{
|
|
199 |
res += "]" |
|
200 |
}
|
|
201 |
res += " " |
|
202 |
}
|
|
203 |
if (this.cursor == this.items.length) |
|
204 |
{
|
|
205 |
res += "[]"; |
|
206 |
}
|
|
207 |
return res; |
|
208 |
}
|
|
209 |
||
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
210 |
/* How history works
|
211 |
* This is a fairly complex mechanism due to complications when editing
|
|
212 |
* history items. We store two arrays. "items" is the permanent history of
|
|
213 |
* each item. "edited" is a "volatile" version of items - the edits made to
|
|
214 |
* the history between now and last time you hit "enter".
|
|
215 |
* This is because the user can go back and edit any of the previous items,
|
|
216 |
* and the edits are remembered until they hit enter.
|
|
217 |
*
|
|
218 |
* When hitting enter, the "edited" version of the currently selected item
|
|
219 |
* replaces the "item" version of the last item in the list.
|
|
220 |
* Then a new blank item is created, for the new line of input.
|
|
221 |
* Lastly, all the "edited" versions are replaced with their stable versions.
|
|
222 |
*
|
|
223 |
* Cursor never points to an invalid location.
|
|
224 |
*/
|
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
225 |
function History() |
226 |
{
|
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
227 |
this.items = new Array(""); |
228 |
this.edited = new Array(""); |
|
229 |
this.cursor = 0; |
|
230 |
this.earliestCursor = 0; |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
231 |
this.up = historyUp; |
232 |
this.down = historyDown; |
|
233 |
this.curr = historyCurr; |
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
234 |
this.submit = historySubmit; |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
235 |
this.show = historyShow; |
236 |
}
|
|
237 |
||
238 |
var hist = new History(); |
|
239 |
||
628
by drtomc
console: Add output based interrupt. This allows users to interrupt long |
240 |
function set_interrupt() |
241 |
{
|
|
242 |
interrupted = true; |
|
243 |
}
|
|
244 |
||
245 |
function clear_output() |
|
246 |
{
|
|
247 |
var output = document.getElementById("console_output"); |
|
248 |
while (output.firstChild) |
|
249 |
{
|
|
250 |
output.removeChild(output.firstChild); |
|
251 |
}
|
|
252 |
}
|
|
253 |
||
333
by mattgiuca
console.js: enter_line now accepts the line as an argument instead of reading |
254 |
/** Send a line of text to the Python server, wait for its return, and react
|
255 |
* to its response by writing to the output box.
|
|
256 |
* Also maximize the console window if not already.
|
|
257 |
*/
|
|
590
by mattgiuca
console: Added disabling of the input box when waiting for a response from the |
258 |
function console_enter_line(inputbox, which) |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
259 |
{
|
628
by drtomc
console: Add output based interrupt. This allows users to interrupt long |
260 |
interrupted = false; |
261 |
||
593
by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line |
262 |
if (typeof(inputbox) == "string") |
263 |
{
|
|
1153
by William Grant
In the console, append a newline to the end of a submitted block of code. |
264 |
var inputline = inputbox + "\n"; |
593
by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line |
265 |
inputbox = null; |
266 |
}
|
|
267 |
else
|
|
268 |
{
|
|
1099.5.3
by William Grant
Disable the console input textbox at the start of the submission process, |
269 |
/* Disable the text box */
|
270 |
inputbox.setAttribute("disabled", "disabled"); |
|
271 |
||
1062
by wagrant
Console input from the text box now has a linefeed appended by the browser. We |
272 |
var inputline = inputbox.value + "\n"; |
593
by mattgiuca
console.js: Fixed not working when you pass a string to console_enter_line |
273 |
}
|
618
by drtomc
console: Get rid of all the extra pre elements. |
274 |
var output = document.getElementById("console_output"); |
275 |
{
|
|
654
by mattgiuca
console.js|css: |
276 |
// Print ">>>" span
|
277 |
var span = document.createElement("span"); |
|
278 |
span.setAttribute("class", "inputPrompt"); |
|
1064
by wagrant
The browser console now uses the correct prompt in the log pane - previously |
279 |
span.appendChild(document.createTextNode( |
1171
by William Grant
Replace all uses of .textContent with .nodeValue. |
280 |
document.getElementById("console_prompt").firstChild.nodeValue) |
1064
by wagrant
The browser console now uses the correct prompt in the log pane - previously |
281 |
);
|
654
by mattgiuca
console.js|css: |
282 |
output.appendChild(span); |
283 |
// Print input line itself in a span
|
|
618
by drtomc
console: Get rid of all the extra pre elements. |
284 |
var span = document.createElement("span"); |
285 |
span.setAttribute("class", "inputMsg"); |
|
1062
by wagrant
Console input from the text box now has a linefeed appended by the browser. We |
286 |
span.appendChild(document.createTextNode(inputline)); |
618
by drtomc
console: Get rid of all the extra pre elements. |
287 |
output.appendChild(span); |
288 |
}
|
|
1340
by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333). |
289 |
var args = { |
290 |
"ivle.op": "chat", "kind": which, "key": server_key, |
|
291 |
"text": inputline, "cwd": get_console_start_directory() |
|
292 |
};
|
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
293 |
var callback = function(xhr) |
294 |
{
|
|
1099.5.1
by William Grant
Disable the console input textbox properly, and don't set the colour |
295 |
console_response(inputbox, inputline, xhr.responseText); |
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
296 |
}
|
1099.1.29
by William Grant
ivle.webapp.console.service: Port www/apps/consoleservice to new framework. |
297 |
ajax_call(callback, "console", "service", args, "POST"); |
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
298 |
}
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
299 |
|
1099.5.1
by William Grant
Disable the console input textbox properly, and don't set the colour |
300 |
function console_response(inputbox, inputline, responseText) |
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
301 |
{
|
646
by drtomc
console: - work around the ff bug with the cursor. |
302 |
try
|
303 |
{
|
|
304 |
var res = JSON.parse(responseText); |
|
305 |
}
|
|
306 |
catch (e) |
|
307 |
{
|
|
308 |
alert("An internal error occurred in the python console."); |
|
309 |
return; |
|
310 |
}
|
|
328
by mattgiuca
console: Renamed HTML element IDs to prefix "console_". |
311 |
var output = document.getElementById("console_output"); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
312 |
if (res.hasOwnProperty('okay')) |
313 |
{
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
314 |
// Success!
|
315 |
if (res.okay) |
|
316 |
{
|
|
317 |
output.appendChild(document.createTextNode(res.okay + "\n")); |
|
318 |
output.appendChild(span); |
|
319 |
}
|
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
320 |
// set the prompt to >>>
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
321 |
set_prompt(">>>"); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
322 |
}
|
323 |
else if (res.hasOwnProperty('exc')) |
|
324 |
{
|
|
325 |
// Failure!
|
|
326 |
// print out the error message (res.exc)
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
327 |
print_error(res.exc); |
328 |
||
654
by mattgiuca
console.js|css: |
329 |
// set the prompt to >>>
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
330 |
set_prompt(">>>"); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
331 |
}
|
737
by dcoles
Console: The consoleservice is now able to work out when a console has timed |
332 |
else if (res.hasOwnProperty('restart') && res.hasOwnProperty('key')) |
333 |
{
|
|
334 |
// Server has indicated that the console should be restarted
|
|
335 |
||
336 |
// Get the new key (host, port, magic)
|
|
337 |
server_key = res.key; |
|
338 |
||
339 |
// Print a reason to explain why we'd do such a horrible thing
|
|
340 |
// (console timeout, server error etc.)
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
341 |
print_error("Console Restart: " + res.restart); |
342 |
||
737
by dcoles
Console: The consoleservice is now able to work out when a console has timed |
343 |
// set the prompt to >>>
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
344 |
set_prompt(">>>"); |
737
by dcoles
Console: The consoleservice is now able to work out when a console has timed |
345 |
}
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
346 |
else if (res.hasOwnProperty('more')) |
347 |
{
|
|
348 |
// Need more input, so set the prompt to ...
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
349 |
set_prompt("..."); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
350 |
}
|
598
by drtomc
console: send output back to the browser progressively. |
351 |
else if (res.hasOwnProperty('output')) |
352 |
{
|
|
599
by drtomc
console: improve end of line handling. |
353 |
if (res.output.length > 0) |
598
by drtomc
console: send output back to the browser progressively. |
354 |
{
|
618
by drtomc
console: Get rid of all the extra pre elements. |
355 |
output.appendChild(document.createTextNode(res.output)); |
598
by drtomc
console: send output back to the browser progressively. |
356 |
}
|
357 |
var callback = function(xhr) |
|
358 |
{
|
|
1099.5.1
by William Grant
Disable the console input textbox properly, and don't set the colour |
359 |
console_response(inputbox, null, xhr.responseText); |
598
by drtomc
console: send output back to the browser progressively. |
360 |
}
|
628
by drtomc
console: Add output based interrupt. This allows users to interrupt long |
361 |
if (interrupted) |
362 |
{
|
|
363 |
var kind = "interrupt"; |
|
364 |
}
|
|
365 |
else
|
|
366 |
{
|
|
367 |
var kind = "chat"; |
|
368 |
}
|
|
1340
by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333). |
369 |
var args = { |
370 |
"ivle.op": "chat", "kind": kind, "key": server_key, |
|
371 |
"text": '', "cwd": get_console_start_directory() |
|
372 |
};
|
|
1099.1.29
by William Grant
ivle.webapp.console.service: Port www/apps/consoleservice to new framework. |
373 |
ajax_call(callback, "console", "service", args, "POST"); |
623
by drtomc
console: fix a minor styling flaw. |
374 |
|
629
by drtomc
console: a couple of minor tweaks arising from conversation with Adrian. |
375 |
// Open up the console so we can see the output
|
376 |
// FIXME: do we need to maximize here?
|
|
623
by drtomc
console: fix a minor styling flaw. |
377 |
console_maximize(); |
629
by drtomc
console: a couple of minor tweaks arising from conversation with Adrian. |
378 |
|
623
by drtomc
console: fix a minor styling flaw. |
379 |
/* Auto-scrolling */
|
380 |
divScroll.activeScroll(); |
|
381 |
||
598
by drtomc
console: send output back to the browser progressively. |
382 |
// Return early, so we don't re-enable the input box.
|
383 |
return; |
|
384 |
}
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
385 |
else
|
386 |
{
|
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
387 |
// assert res.hasOwnProperty('input')
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
388 |
set_prompt("..."); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
389 |
}
|
598
by drtomc
console: send output back to the browser progressively. |
390 |
|
391 |
if (inputbox != null) |
|
392 |
{
|
|
393 |
/* Re-enable the text box */
|
|
394 |
inputbox.removeAttribute("disabled"); |
|
628
by drtomc
console: Add output based interrupt. This allows users to interrupt long |
395 |
interrupted = false; |
598
by drtomc
console: send output back to the browser progressively. |
396 |
}
|
397 |
||
332
by mattgiuca
console plugin: Now presents minimize/maximize buttons, allowing itself to be |
398 |
/* Open up the console so we can see the output */
|
399 |
console_maximize(); |
|
616
by agdimech
/console/console.js: Added dynamic scrolling for the console. |
400 |
/* Auto-scrolling */
|
401 |
divScroll.activeScroll(); |
|
629
by drtomc
console: a couple of minor tweaks arising from conversation with Adrian. |
402 |
|
403 |
// Focus the input box by default
|
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
404 |
document.getElementById("console_output").focus(); |
405 |
document.getElementById("console_inputText").focus(); |
|
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
406 |
}
|
407 |
||
408 |
function catch_input(key) |
|
409 |
{
|
|
328
by mattgiuca
console: Renamed HTML element IDs to prefix "console_". |
410 |
var inp = document.getElementById('console_inputText'); |
339
by mattgiuca
console: |
411 |
switch (key) |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
412 |
{
|
339
by mattgiuca
console: |
413 |
case 9: /* Tab key */ |
414 |
var selstart = inp.selectionStart; |
|
415 |
var selend = inp.selectionEnd; |
|
416 |
if (selstart == selend) |
|
417 |
{
|
|
418 |
/* No selection, just a carat. Insert a tab here. */
|
|
419 |
inp.value = inp.value.substr(0, selstart) |
|
420 |
+ TAB_STRING + inp.value.substr(selstart); |
|
421 |
}
|
|
422 |
else
|
|
423 |
{
|
|
424 |
/* Text is selected. Just indent the whole line
|
|
425 |
* by inserting a tab at the start */
|
|
426 |
inp.value = TAB_STRING + inp.value; |
|
427 |
}
|
|
428 |
/* Update the selection so the same characters as before are selected
|
|
429 |
*/
|
|
430 |
inp.selectionStart = selstart + TAB_STRING.length; |
|
431 |
inp.selectionEnd = inp.selectionStart + (selend - selstart); |
|
432 |
/* Cancel the event, so the TAB key doesn't move focus away from this
|
|
433 |
* box */
|
|
434 |
return false; |
|
435 |
/* Note: If it happens that some browsers don't support event
|
|
436 |
* cancelling properly, this hack might work instead:
|
|
437 |
setTimeout(
|
|
438 |
"document.getElementById('console_inputText').focus()",
|
|
439 |
0);
|
|
440 |
*/
|
|
441 |
break; |
|
442 |
case 13: /* Enter key */ |
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
443 |
var callback = function() |
444 |
{
|
|
445 |
/* Send the line of text to the server */
|
|
590
by mattgiuca
console: Added disabling of the input box when waiting for a response from the |
446 |
console_enter_line(inp, "chat"); |
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
447 |
hist.submit(inp.value); |
448 |
inp.value = hist.curr(); |
|
449 |
}
|
|
1341
by William Grant
Disable the console input textbox while starting the server. |
450 |
|
451 |
/* Disable the text box. This will be redone by
|
|
452 |
* console_enter_line, but we do it here too in case start_server
|
|
453 |
* takes a while.
|
|
454 |
*/
|
|
455 |
inp.setAttribute("disabled", "disabled"); |
|
559
by mattgiuca
Major JavaScript refactor: util.ajax_call is now asynchronous, not |
456 |
/* Start the server if it hasn't already been started */
|
457 |
start_server(callback); |
|
339
by mattgiuca
console: |
458 |
break; |
459 |
case 38: /* Up arrow */ |
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
460 |
hist.up(inp.value); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
461 |
inp.value = hist.curr(); |
1308
by William Grant
Unbreak console history retrieval in IE/WebKit. |
462 |
/* Inhibit further responses to this event, or WebKit moves the
|
463 |
* cursor to the start. */
|
|
464 |
return false; |
|
339
by mattgiuca
console: |
465 |
break; |
466 |
case 40: /* Down arrow */ |
|
350
by mattgiuca
media/console/console.js: Rewrote console history storage, browsing, and |
467 |
hist.down(inp.value); |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
468 |
inp.value = hist.curr(); |
1308
by William Grant
Unbreak console history retrieval in IE/WebKit. |
469 |
return false; |
339
by mattgiuca
console: |
470 |
break; |
276
by mattgiuca
Console now runs inside IVLE (without requiring an IFRAME). The separate |
471 |
}
|
217
by mattgiuca
Console: Python code generates a minimal document with a DIV and links to |
472 |
}
|
616
by agdimech
/console/console.js: Added dynamic scrolling for the console. |
473 |
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
474 |
/** Resets the console by signalling the old console to expire and starting a
|
475 |
* new one.
|
|
476 |
*/
|
|
477 |
function console_reset() |
|
478 |
{
|
|
479 |
// FIXME: We show some feedback here - either disable input or at very
|
|
480 |
// least the reset button.
|
|
481 |
||
482 |
// Restart the console
|
|
483 |
if(!server_started) |
|
484 |
{
|
|
485 |
start_server(null); |
|
486 |
}
|
|
487 |
else
|
|
488 |
{
|
|
1340
by William Grant
Ensure that the console always restarts with the right cwd (cleaner reimplementation of r1333). |
489 |
xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key, "cwd": get_console_start_directory()}, "POST"); |
1156
by William Grant
Remove an extra argument to console_response() in console_reset(). Fixes |
490 |
console_response(null, null, xhr.responseText); |
991
by dcoles
Console: Some improvements to the python console code - most notably the |
491 |
}
|
492 |
}
|
|
493 |
||
494 |
/** Prints an error line in the console **/
|
|
495 |
function print_error(error) |
|
496 |
{
|
|
497 |
var output = document.getElementById("console_output"); |
|
498 |
||
499 |
// Create text block
|
|
500 |
var span = document.createElement("span"); |
|
501 |
span.setAttribute("class", "errorMsg"); |
|
502 |
span.appendChild(document.createTextNode(error + "\n")); |
|
503 |
output.appendChild(span); |
|
504 |
||
505 |
// Autoscroll
|
|
506 |
divScroll.activeScroll(); |
|
507 |
}
|
|
508 |
||
509 |
/** Sets the prompt text **/
|
|
510 |
function set_prompt(prompt_text) |
|
511 |
{
|
|
512 |
var prompt = document.getElementById("console_prompt"); |
|
513 |
prompt.replaceChild(document.createTextNode(prompt_text + " "), prompt.firstChild); |
|
514 |
}
|
|
515 |
||
616
by agdimech
/console/console.js: Added dynamic scrolling for the console. |
516 |
/**** Following Code modified from ******************************************/
|
517 |
/**** http://radio.javaranch.com/pascarello/2006/08/17/1155837038219.html ***/
|
|
518 |
/****************************************************************************/
|
|
519 |
var chatscroll = new Object(); |
|
520 |
||
521 |
chatscroll.Pane = function(scrollContainerId) |
|
522 |
{
|
|
523 |
this.scrollContainerId = scrollContainerId; |
|
524 |
}
|
|
525 |
||
526 |
chatscroll.Pane.prototype.activeScroll = function() |
|
527 |
{
|
|
528 |
var scrollDiv = document.getElementById(this.scrollContainerId); |
|
529 |
var currentHeight = 0; |
|
530 |
||
531 |
if (scrollDiv.scrollHeight > 0) |
|
532 |
currentHeight = scrollDiv.scrollHeight; |
|
991
by dcoles
Console: Some improvements to the python console code - most notably the |
533 |
else if (scrollDiv.offsetHeight > 0) |
534 |
currentHeight = scrollDiv.offsetHeight; |
|
616
by agdimech
/console/console.js: Added dynamic scrolling for the console. |
535 |
|
536 |
scrollDiv.scrollTop = currentHeight; |
|
537 |
||
538 |
scrollDiv = null; |
|
539 |
}
|
|
540 |
||
541 |
var divScroll = new chatscroll.Pane('console_output'); |