~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/console/console.js

  • Committer: mattgiuca
  • Date: 2008-02-05 01:41:15 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:409
Moved www/conf and www/common to a new directory lib. This separates the "web"
part of IVLE from what is becoming less web oriented (at least from Apache's
standpoint).
Modified setup.py to install this lib directory correctly and write conf in
the right place. Also adds the lib directory to ivle.pth.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 * Date: 30/1/2008
21
21
 */
22
22
 
23
 
var server_key;
 
23
digest_constant = "hello";
 
24
 
 
25
var server_host;
 
26
var server_port;
 
27
var server_magic;
24
28
 
25
29
/* Begin religious debate (tabs vs spaces) here: */
26
30
/* (This string will be inserted in the console when the user presses the Tab
34
38
windowpane_mode = false;
35
39
server_started = false;
36
40
 
37
 
interrupted = false;
38
 
 
39
41
/* Starts the console server, if it isn't already.
40
42
 * This can be called any number of times - it only starts the one server.
41
 
 * Note that this is asynchronous. It will return after signalling to start
42
 
 * the server, but there is no guarantee that it has been started yet.
43
43
 * This is a separate step from console_init, as the server is only to be
44
44
 * started once the first command is entered.
45
45
 * Does not return a value. Writes to global variables
46
 
 * server_host, and server_port.
47
 
 *
48
 
 * \param callback Function which will be called after the server has been
49
 
 * started. No parameters are passed. May be null.
 
46
 * server_host, server_port, server_magic.
50
47
 */
51
 
function start_server(callback)
 
48
function start_server()
52
49
{
53
 
    if (server_started)
54
 
    {
55
 
        callback();
56
 
        return;
57
 
    }
58
 
    var callback1 = function(xhr)
59
 
        {
60
 
            var json_text = xhr.responseText;
61
 
            server_key = JSON.parse(json_text).key;
62
 
            server_started = true;
63
 
            if (callback != null)
64
 
                callback();
65
 
        }
66
 
 
67
 
    //var current_path;
68
 
    if((typeof(current_path) != 'undefined') && current_file)
69
 
    {
70
 
        // We have a current_path - give a suggestion to the server
71
 
        var path;
72
 
        if (current_file.isdir)
73
 
        {
74
 
            // Browser
75
 
            path = path_join("/home", current_path);
76
 
        }
77
 
        else
78
 
        {
79
 
            // Editor - need to chop off filename
80
 
            var tmp_path = current_path.split('/');
81
 
            tmp_path.pop();
82
 
            path = path_join("/home", tmp_path.join('/'));
83
 
        }
84
 
        ajax_call(callback1, "console", "service", {"ivle.op": "start", "cwd": path}, "POST");
85
 
    }
86
 
    else
87
 
    {
88
 
        // No current_path - let the server decide
89
 
        ajax_call(callback1, "console", "service", {"ivle.op": "start"}, "POST");
90
 
    }
 
50
    if (server_started) return;
 
51
    var xhr = ajax_call("consoleservice", "start", {}, "POST");
 
52
    var json_text = xhr.responseText;
 
53
    var server_info = JSON.parse(json_text);
 
54
    server_host = server_info.host;
 
55
    server_port = server_info.port;
 
56
    server_magic = server_info.magic;
 
57
    server_started = true;
91
58
}
92
59
 
93
60
/** Initialises the console. All apps which import console are required to
110
77
        windowpane_mode = true;
111
78
        console_minimize();
112
79
    }
 
80
    /* TEMP: Start the server now.
 
81
     * Ultimately we want the server to start only when a line is typed, but
 
82
     * it currently does it asynchronously and doesn't start in time for the
 
83
     * first line. */
 
84
    start_server();
113
85
}
114
86
 
115
87
/** Hide the main console panel, so the console minimizes to just an input box
128
100
    if (!windowpane_mode) return;
129
101
    console_body.setAttribute("class", "windowpane maximal");
130
102
    console_filler.setAttribute("class", "windowpane maximal");
 
103
    /* Focus the input box by default */
 
104
    document.getElementById("console_inputText").focus()
131
105
}
132
106
 
133
107
/* current_text is the string currently on the command line.
230
204
 
231
205
var hist = new History();
232
206
 
233
 
function set_interrupt()
234
 
{
235
 
    interrupted = true;
236
 
}
237
 
 
238
 
function clear_output()
239
 
{
240
 
    var output = document.getElementById("console_output");
241
 
    while (output.firstChild)
242
 
    {
243
 
        output.removeChild(output.firstChild);
244
 
    }
245
 
}
246
 
 
247
207
/** Send a line of text to the Python server, wait for its return, and react
248
208
 * to its response by writing to the output box.
249
209
 * Also maximize the console window if not already.
250
210
 */
251
 
function console_enter_line(inputbox, which)
252
 
{
253
 
    interrupted = false;
254
 
 
255
 
    if (typeof(inputbox) == "string")
256
 
    {
257
 
        var inputline = inputbox + "\n";
258
 
        inputbox = null;
259
 
    }
260
 
    else
261
 
    {
262
 
        /* Disable the text box */
263
 
        inputbox.setAttribute("disabled", "disabled");
264
 
 
265
 
        var inputline = inputbox.value + "\n";
266
 
    }
267
 
    var output = document.getElementById("console_output");
268
 
    {
269
 
        // Print ">>>" span
270
 
        var span = document.createElement("span");
271
 
        span.setAttribute("class", "inputPrompt");
272
 
        span.appendChild(document.createTextNode(
273
 
              document.getElementById("console_prompt").firstChild.nodeValue)
274
 
                        );
275
 
        output.appendChild(span);
276
 
        // Print input line itself in a span
277
 
        var span = document.createElement("span");
278
 
        span.setAttribute("class", "inputMsg");
279
 
        span.appendChild(document.createTextNode(inputline));
280
 
        output.appendChild(span);
281
 
    }
282
 
    var args = {"ivle.op": "chat", "kind": which, "key": server_key, "text":inputline};
283
 
    var callback = function(xhr)
284
 
        {
285
 
            console_response(inputbox, inputline, xhr.responseText);
286
 
        }
287
 
    ajax_call(callback, "console", "service", args, "POST");
288
 
}
289
 
 
290
 
function console_response(inputbox, inputline, responseText)
291
 
{
292
 
    try
293
 
    {
294
 
        var res = JSON.parse(responseText);
295
 
    }
296
 
    catch (e)
297
 
    {
298
 
        alert("An internal error occurred in the python console.");
299
 
        return;
300
 
    }
301
 
    var output = document.getElementById("console_output");
 
211
function console_enter_line(inputline, which)
 
212
{
 
213
    /* Start the server if it hasn't already been started */
 
214
    start_server();
 
215
    var digest = hex_md5(inputline + server_magic);
 
216
    var args = {"host": server_host, "port": server_port,
 
217
                    "digest":digest, "text":inputline};
 
218
    var xmlhttp = ajax_call("consoleservice", which, args, "POST");
 
219
 
 
220
    var res = JSON.parse(xmlhttp.responseText);
 
221
    var output = document.getElementById("console_output");
 
222
    {
 
223
        var pre = document.createElement("pre");
 
224
        pre.setAttribute("class", "inputMsg");
 
225
        pre.appendChild(document.createTextNode(inputline + "\n"));
 
226
        output.appendChild(pre);
 
227
    }
302
228
    if (res.hasOwnProperty('okay'))
303
229
    {
304
230
        // Success!
305
 
        if (res.okay)
 
231
        // print out the output (res.okay[0])
 
232
        var pre = document.createElement("pre");
 
233
        pre.setAttribute("class", "outputMsg");
 
234
        pre.appendChild(document.createTextNode(res.okay[0]));
 
235
        output.appendChild(pre);
 
236
        // print out the return value (res.okay[1])
 
237
        if (res.okay[1])
306
238
        {
307
 
            output.appendChild(document.createTextNode(res.okay + "\n"));
308
 
            output.appendChild(span);
 
239
            var pre = document.createElement("pre");
 
240
            pre.setAttribute("class", "outputMsg");
 
241
            pre.appendChild(document.createTextNode(res.okay[1] + "\n"));
 
242
            output.appendChild(pre);
309
243
        }
310
244
        // set the prompt to >>>
311
 
        set_prompt(">>>");
 
245
        var prompt = document.getElementById("console_prompt");
 
246
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
312
247
    }
313
248
    else if (res.hasOwnProperty('exc'))
314
249
    {
315
250
        // Failure!
 
251
        // print out any output that came before the error
 
252
        if (res.exc[0].length > 0)
 
253
        {
 
254
            var pre = document.createElement("pre");
 
255
            pre.setAttribute("class", "outputMsg");
 
256
            pre.appendChild(document.createTextNode(res.exc[0]));
 
257
            output.appendChild(pre);
 
258
        }
 
259
 
316
260
        // print out the error message (res.exc)
317
 
        print_error(res.exc);
318
 
        
319
 
        // set the prompt to >>>
320
 
        set_prompt(">>>");
321
 
    }
322
 
    else if (res.hasOwnProperty('restart') && res.hasOwnProperty('key'))
323
 
    {
324
 
        // Server has indicated that the console should be restarted
325
 
        
326
 
        // Get the new key (host, port, magic)
327
 
        server_key = res.key;
328
 
 
329
 
        // Print a reason to explain why we'd do such a horrible thing
330
 
        // (console timeout, server error etc.)
331
 
        print_error("Console Restart: " + res.restart);
332
 
        
333
 
        // set the prompt to >>>
334
 
        set_prompt(">>>");
 
261
        var pre = document.createElement("pre");
 
262
        pre.setAttribute("class", "errorMsg");
 
263
        pre.appendChild(document.createTextNode(res.exc[1]));
 
264
        output.appendChild(pre);
335
265
    }
336
266
    else if (res.hasOwnProperty('more'))
337
267
    {
338
268
        // Need more input, so set the prompt to ...
339
 
        set_prompt("...");
340
 
    }
341
 
    else if (res.hasOwnProperty('output'))
342
 
    {
343
 
        if (res.output.length > 0)
344
 
        {
345
 
            output.appendChild(document.createTextNode(res.output));
346
 
        }
347
 
        var callback = function(xhr)
348
 
            {
349
 
                console_response(inputbox, null, xhr.responseText);
350
 
            }
351
 
        if (interrupted)
352
 
        {
353
 
            var kind = "interrupt";
354
 
        }
355
 
        else
356
 
        {
357
 
            var kind = "chat";
358
 
        }
359
 
        var args = {"ivle.op": "chat", "kind": kind, "key": server_key, "text":''};
360
 
        ajax_call(callback, "console", "service", args, "POST");
361
 
 
362
 
        // Open up the console so we can see the output
363
 
        // FIXME: do we need to maximize here?
364
 
        console_maximize();
365
 
 
366
 
        /* Auto-scrolling */
367
 
        divScroll.activeScroll();
368
 
 
369
 
        // Return early, so we don't re-enable the input box.
370
 
        return;
371
 
    }
372
 
    else
373
 
    {
 
269
        var prompt = document.getElementById("console_prompt");
 
270
        prompt.replaceChild(document.createTextNode("... "), prompt.firstChild);
 
271
    }
 
272
    else {
374
273
        // assert res.hasOwnProperty('input')
375
 
        set_prompt("...");
376
 
    }
377
 
 
378
 
    if (inputbox != null)
379
 
    {
380
 
        /* Re-enable the text box */
381
 
        inputbox.removeAttribute("disabled");
382
 
        interrupted = false;
383
 
    }
384
 
 
 
274
        var prompt = document.getElementById("console_prompt");
 
275
        prompt.replaceChild(document.createTextNode("+++ "), prompt.firstChild);
 
276
    }
385
277
    /* Open up the console so we can see the output */
386
278
    console_maximize();
387
 
    /* Auto-scrolling */
388
 
    divScroll.activeScroll();
389
 
 
390
 
    // Focus the input box by default
391
 
    document.getElementById("console_output").focus();
392
 
    document.getElementById("console_inputText").focus();
393
279
}
394
280
 
395
281
function catch_input(key)
427
313
         */
428
314
        break;
429
315
    case 13:                /* Enter key */
430
 
        var callback = function()
431
 
        {
432
 
            /* Send the line of text to the server */
433
 
            console_enter_line(inp, "chat");
434
 
            hist.submit(inp.value);
435
 
            inp.value = hist.curr();
436
 
        }
437
 
        /* Start the server if it hasn't already been started */
438
 
        start_server(callback);
 
316
        /* Send the line of text to the server */
 
317
        console_enter_line(inp.value, "chat");
 
318
        hist.submit(inp.value);
 
319
        inp.value = hist.curr();
439
320
        break;
440
321
    case 38:                /* Up arrow */
441
322
        hist.up(inp.value);
447
328
        break;
448
329
    }
449
330
}
450
 
 
451
 
/** Resets the console by signalling the old console to expire and starting a 
452
 
 * new one.
453
 
 */
454
 
function console_reset()
455
 
{
456
 
    // FIXME: We show some feedback here - either disable input or at very 
457
 
    // least the reset button.
458
 
 
459
 
    // Restart the console
460
 
    if(!server_started)
461
 
    {
462
 
        start_server(null);
463
 
    }
464
 
    else
465
 
    {
466
 
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key}, "POST");
467
 
        console_response(null, null, xhr.responseText);
468
 
    }
469
 
}
470
 
 
471
 
/** Prints an error line in the console **/
472
 
function print_error(error)
473
 
474
 
    var output = document.getElementById("console_output");
475
 
  
476
 
    // Create text block
477
 
    var span = document.createElement("span");
478
 
    span.setAttribute("class", "errorMsg");
479
 
    span.appendChild(document.createTextNode(error + "\n"));
480
 
    output.appendChild(span);
481
 
 
482
 
    // Autoscroll
483
 
    divScroll.activeScroll();
484
 
}
485
 
 
486
 
/** Sets the prompt text **/
487
 
function set_prompt(prompt_text)
488
 
{
489
 
    var prompt = document.getElementById("console_prompt");
490
 
    prompt.replaceChild(document.createTextNode(prompt_text + " "), prompt.firstChild);
491
 
}
492
 
 
493
 
/**** Following Code modified from ******************************************/
494
 
/**** http://radio.javaranch.com/pascarello/2006/08/17/1155837038219.html ***/
495
 
/****************************************************************************/
496
 
var chatscroll = new Object();
497
 
 
498
 
chatscroll.Pane = function(scrollContainerId)
499
 
{
500
 
    this.scrollContainerId = scrollContainerId;
501
 
}
502
 
 
503
 
chatscroll.Pane.prototype.activeScroll = function()
504
 
{
505
 
    var scrollDiv = document.getElementById(this.scrollContainerId);
506
 
    var currentHeight = 0;
507
 
        
508
 
    if (scrollDiv.scrollHeight > 0)
509
 
        currentHeight = scrollDiv.scrollHeight;
510
 
    else if (scrollDiv.offsetHeight > 0)
511
 
        currentHeight = scrollDiv.offsetHeight;
512
 
 
513
 
    scrollDiv.scrollTop = currentHeight;
514
 
 
515
 
    scrollDiv = null;
516
 
}
517
 
 
518
 
var divScroll = new chatscroll.Pane('console_output');