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

« back to all changes in this revision

Viewing changes to ivle/webapp/console/media/console.js

  • Committer: Matt Giuca
  • Date: 2009-05-12 15:08:45 UTC
  • mto: This revision was merged to the branch mainline in revision 1247.
  • Revision ID: matt.giuca@gmail.com-20090512150845-fg480l1qh7le0ypz
ivle-fetchsubmissions: In a stunningly awful hack, detects pre-Python2.6 and
    changes make_zip to behave correctly for the awful restriction in zipfile
    that you can't add directories.
    (Stops trying to add directories, and hacks in the footer writing if there
    is an empty file).

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 * Date: 30/1/2008
21
21
 */
22
22
 
23
 
digest_constant = "hello";
24
 
 
25
 
var server_host;
26
 
var server_port;
27
 
var server_magic;
 
23
var server_key;
28
24
 
29
25
/* Begin religious debate (tabs vs spaces) here: */
30
26
/* (This string will be inserted in the console when the user presses the Tab
38
34
windowpane_mode = false;
39
35
server_started = false;
40
36
 
 
37
interrupted = false;
 
38
 
41
39
/* Starts the console server, if it isn't already.
42
40
 * 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, server_port, server_magic.
 
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.
47
50
 */
48
 
function start_server()
 
51
function start_server(callback)
49
52
{
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;
 
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
    }
58
91
}
59
92
 
60
93
/** Initialises the console. All apps which import console are required to
77
110
        windowpane_mode = true;
78
111
        console_minimize();
79
112
    }
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();
85
113
}
86
114
 
87
115
/** Hide the main console panel, so the console minimizes to just an input box
100
128
    if (!windowpane_mode) return;
101
129
    console_body.setAttribute("class", "windowpane maximal");
102
130
    console_filler.setAttribute("class", "windowpane maximal");
103
 
    /* Focus the input box by default */
104
 
    document.getElementById("console_inputText").focus()
105
131
}
106
132
 
107
133
/* current_text is the string currently on the command line.
204
230
 
205
231
var hist = new History();
206
232
 
 
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
 
207
247
/** Send a line of text to the Python server, wait for its return, and react
208
248
 * to its response by writing to the output box.
209
249
 * Also maximize the console window if not already.
210
250
 */
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
 
    }
 
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");
228
302
    if (res.hasOwnProperty('okay'))
229
303
    {
230
304
        // Success!
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])
 
305
        if (res.okay)
238
306
        {
239
 
            var pre = document.createElement("pre");
240
 
            pre.setAttribute("class", "outputMsg");
241
 
            pre.appendChild(document.createTextNode(res.okay[1] + "\n"));
242
 
            output.appendChild(pre);
 
307
            output.appendChild(document.createTextNode(res.okay + "\n"));
 
308
            output.appendChild(span);
243
309
        }
244
310
        // set the prompt to >>>
245
 
        var prompt = document.getElementById("console_prompt");
246
 
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
 
311
        set_prompt(">>>");
247
312
    }
248
313
    else if (res.hasOwnProperty('exc'))
249
314
    {
250
315
        // 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
 
 
260
316
        // print out the error message (res.exc)
261
 
        var pre = document.createElement("pre");
262
 
        pre.setAttribute("class", "errorMsg");
263
 
        pre.appendChild(document.createTextNode(res.exc[1]));
264
 
        output.appendChild(pre);
 
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(">>>");
265
335
    }
266
336
    else if (res.hasOwnProperty('more'))
267
337
    {
268
338
        // Need more input, so set the prompt to ...
269
 
        var prompt = document.getElementById("console_prompt");
270
 
        prompt.replaceChild(document.createTextNode("... "), prompt.firstChild);
271
 
    }
272
 
    else {
 
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
    {
273
374
        // assert res.hasOwnProperty('input')
274
 
        var prompt = document.getElementById("console_prompt");
275
 
        prompt.replaceChild(document.createTextNode("+++ "), prompt.firstChild);
276
 
    }
 
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
 
277
385
    /* Open up the console so we can see the output */
278
386
    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();
279
393
}
280
394
 
281
395
function catch_input(key)
313
427
         */
314
428
        break;
315
429
    case 13:                /* Enter key */
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();
 
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);
320
439
        break;
321
440
    case 38:                /* Up arrow */
322
441
        hist.up(inp.value);
328
447
        break;
329
448
    }
330
449
}
 
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');