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

« back to all changes in this revision

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

  • Committer: dcoles
  • Date: 2008-07-03 04:20:54 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:803
Setup: Modularised setup.py so it is now no longer over 1000 lines. This should 
allow us to get in there and tidy up each module much easier. Also removed 
updatejails since this functionality seems to be duplicated with remakeuser.py 
and remakealluser.py scripts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
37
37
interrupted = false;
38
38
 
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
 
 
66
39
/* Starts the console server, if it isn't already.
67
40
 * This can be called any number of times - it only starts the one server.
68
41
 * Note that this is asynchronous. It will return after signalling to start
85
58
    var callback1 = function(xhr)
86
59
        {
87
60
            var json_text = xhr.responseText;
88
 
            try
89
 
            {
90
 
                server_key = JSON.parse(json_text).key;
91
 
                server_started = true;
92
 
                var args = {
93
 
                    "ivle.op": "chat", "kind": "splash", "key": server_key
94
 
                };
95
 
                var callback2 = function(xhr)
96
 
                {
97
 
                    console_response(null, null, xhr.responseText);
98
 
                    if (callback != null)
99
 
                        callback();
100
 
                };
101
 
                ajax_call(callback2, "console", "service", args, "POST");
102
 
            }
103
 
            catch (e)
104
 
            {
105
 
                alert("An error occured when starting the IVLE console. " +
106
 
                    "Please refresh the page and try again.\n" +
107
 
                    "Details have been logged for further examination.")
108
 
            }
 
61
            server_key = JSON.parse(json_text);
 
62
            server_started = true;
 
63
            if (callback != null)
 
64
                callback();
109
65
        }
110
 
 
111
 
    $("#console_output").append(
112
 
        '<span class="console_message">IVLE console starting up...</span>\n');
113
 
    console_maximize(true);
114
 
    ajax_call(
115
 
        callback1, "console", "service",
116
 
        {"ivle.op": "start", "cwd": get_console_start_directory()}, 
117
 
        "POST");
118
 
}
119
 
 
120
 
/** Start up the console backend before the user has entered text.
121
 
 * This will disable the text input, start a backend, and enable the input
122
 
 * again.
123
 
 */
124
 
function start_server_early()
125
 
{
126
 
    var inputbox = document.getElementById("console_inputText");
127
 
    inputbox.setAttribute("disabled", "disabled");
128
 
    var callback = function(xhr)
129
 
    {
130
 
        inputbox.removeAttribute("disabled")
131
 
    }
132
 
    start_server(callback);
 
66
    ajax_call(callback1, "consoleservice", "start", {}, "POST");
133
67
}
134
68
 
135
69
/** Initialises the console. All apps which import console are required to
159
93
function console_minimize()
160
94
{
161
95
    if (!windowpane_mode) return;
162
 
    console_body.setAttribute("class", "console_body windowpane minimal");
 
96
    console_body.setAttribute("class", "windowpane minimal");
163
97
    console_filler.setAttribute("class", "windowpane minimal");
164
98
}
165
99
 
166
100
/** Show the main console panel, so it enlarges out to its full size.
167
101
 */
168
 
function console_maximize(do_not_start)
 
102
function console_maximize()
169
103
{
170
104
    if (!windowpane_mode) return;
171
 
    if (!do_not_start && !server_started) start_server_early();
172
 
    console_body.setAttribute("class", "console_body windowpane maximal");
 
105
    console_body.setAttribute("class", "windowpane maximal");
173
106
    console_filler.setAttribute("class", "windowpane maximal");
174
107
}
175
108
 
295
228
{
296
229
    interrupted = false;
297
230
 
298
 
    // Open up the console so we can see the output
299
 
    console_maximize();
300
 
 
301
231
    if (typeof(inputbox) == "string")
302
232
    {
303
 
        var inputline = inputbox + "\n";
 
233
        var inputline = inputbox;
304
234
        inputbox = null;
 
235
        var graytimer = null;
305
236
    }
306
237
    else
307
238
    {
308
 
        /* Disable the text box */
309
 
        inputbox.setAttribute("disabled", "disabled");
310
 
 
311
 
        var inputline = inputbox.value + "\n";
 
239
        GLOBAL_inputbox = inputbox;     /* For timer */
 
240
        var inputline = inputbox.value;
 
241
        var graytimer = setTimeout("GLOBAL_inputbox.setAttribute(\"class\", "
 
242
            + "\"disabled\");", 100);
312
243
    }
313
244
    var output = document.getElementById("console_output");
314
245
    {
315
246
        // Print ">>>" span
316
247
        var span = document.createElement("span");
317
248
        span.setAttribute("class", "inputPrompt");
318
 
        span.appendChild(document.createTextNode(
319
 
              document.getElementById("console_prompt").firstChild.nodeValue)
320
 
                        );
 
249
        span.appendChild(document.createTextNode(">>> "));
321
250
        output.appendChild(span);
322
251
        // Print input line itself in a span
323
252
        var span = document.createElement("span");
324
253
        span.setAttribute("class", "inputMsg");
325
 
        span.appendChild(document.createTextNode(inputline));
 
254
        span.appendChild(document.createTextNode(inputline + "\n"));
326
255
        output.appendChild(span);
327
 
        divScroll.activeScroll();
328
256
    }
329
 
    var args = {
330
 
        "ivle.op": "chat", "kind": which, "key": server_key,
331
 
        "text": inputline, "cwd": get_console_start_directory()
332
 
        };
 
257
    var args = {"key": server_key, "text":inputline};
333
258
    var callback = function(xhr)
334
259
        {
335
 
            console_response(inputbox, inputline, xhr.responseText);
 
260
            console_response(inputbox, graytimer, inputline, xhr.responseText);
336
261
        }
337
 
    ajax_call(callback, "console", "service", args, "POST");
 
262
    /* Disable the text box */
 
263
    if (inputbox != null)
 
264
        inputbox.setAttribute("disabled", "disabled");
 
265
    ajax_call(callback, "consoleservice", which, args, "POST");
338
266
}
339
267
 
340
 
function console_response(inputbox, inputline, responseText)
 
268
function console_response(inputbox, graytimer, inputline, responseText)
341
269
{
342
270
    try
343
271
    {
356
284
        {
357
285
            output.appendChild(document.createTextNode(res.okay + "\n"));
358
286
            output.appendChild(span);
359
 
            divScroll.activeScroll();
360
287
        }
361
288
        // set the prompt to >>>
362
 
        set_prompt(">>>");
 
289
        var prompt = document.getElementById("console_prompt");
 
290
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
363
291
    }
364
292
    else if (res.hasOwnProperty('exc'))
365
293
    {
366
294
        // Failure!
367
295
        // print out the error message (res.exc)
368
 
        print_error(res.exc);
369
 
        
 
296
        var span = document.createElement("span");
 
297
        span.setAttribute("class", "errorMsg");
 
298
        span.appendChild(document.createTextNode(res.exc + "\n"));
 
299
        output.appendChild(span);
370
300
        // set the prompt to >>>
371
 
        set_prompt(">>>");
 
301
        var prompt = document.getElementById("console_prompt");
 
302
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
372
303
    }
373
304
    else if (res.hasOwnProperty('restart') && res.hasOwnProperty('key'))
374
305
    {
379
310
 
380
311
        // Print a reason to explain why we'd do such a horrible thing
381
312
        // (console timeout, server error etc.)
382
 
        print_error(
383
 
            "IVLE console restarted: " + res.restart, "console_message");
384
 
        
 
313
        var span = document.createElement("span");
 
314
        span.setAttribute("class", "errorMsg");
 
315
        span.appendChild(document.createTextNode("Console Restart: " + res.restart + "\n"));
 
316
        output.appendChild(span);
385
317
        // set the prompt to >>>
386
 
        set_prompt(">>>");
 
318
        var prompt = document.getElementById("console_prompt");
 
319
        prompt.replaceChild(document.createTextNode(">>> "), prompt.firstChild);
 
320
 
387
321
    }
388
322
    else if (res.hasOwnProperty('more'))
389
323
    {
390
324
        // Need more input, so set the prompt to ...
391
 
        set_prompt("...");
 
325
        var prompt = document.getElementById("console_prompt");
 
326
        prompt.replaceChild(document.createTextNode("... "), prompt.firstChild);
392
327
    }
393
328
    else if (res.hasOwnProperty('output'))
394
329
    {
395
330
        if (res.output.length > 0)
396
331
        {
397
332
            output.appendChild(document.createTextNode(res.output));
398
 
            divScroll.activeScroll();
399
333
        }
400
334
        var callback = function(xhr)
401
335
            {
402
 
                console_response(inputbox, null, xhr.responseText);
 
336
                console_response(inputbox, graytimer,
 
337
                                 null, xhr.responseText);
403
338
            }
404
339
        if (interrupted)
405
340
        {
409
344
        {
410
345
            var kind = "chat";
411
346
        }
412
 
        var args = {
413
 
            "ivle.op": "chat", "kind": kind, "key": server_key,
414
 
            "text": '', "cwd": get_console_start_directory()
415
 
            };
416
 
        ajax_call(callback, "console", "service", args, "POST");
 
347
        var args = {"key": server_key, "text":''};
 
348
        ajax_call(callback, "consoleservice", kind, args, "POST");
417
349
 
418
350
        // Open up the console so we can see the output
 
351
        // FIXME: do we need to maximize here?
419
352
        console_maximize();
420
353
 
 
354
        /* Auto-scrolling */
 
355
        divScroll.activeScroll();
 
356
 
421
357
        // Return early, so we don't re-enable the input box.
422
358
        return;
423
359
    }
424
 
    else if (res.hasOwnProperty('input'))
425
 
    {
426
 
        set_prompt("+++");
427
 
    }
428
 
    else
429
 
    {
430
 
        alert("An internal error occurred in the python console.");
431
 
        return;
 
360
    else {
 
361
        // assert res.hasOwnProperty('input')
 
362
        var prompt = document.getElementById("console_prompt");
 
363
        prompt.replaceChild(document.createTextNode("+++ "), prompt.firstChild);
432
364
    }
433
365
 
434
366
    if (inputbox != null)
435
367
    {
436
368
        /* Re-enable the text box */
 
369
        clearTimeout(graytimer);
437
370
        inputbox.removeAttribute("disabled");
 
371
        inputbox.removeAttribute("class");
438
372
        interrupted = false;
439
373
    }
440
374
 
 
375
    /* Open up the console so we can see the output */
 
376
    console_maximize();
441
377
    /* Auto-scrolling */
442
378
    divScroll.activeScroll();
443
379
 
444
380
    // Focus the input box by default
445
 
    document.getElementById("console_output").focus();
446
 
    document.getElementById("console_inputText").focus();
 
381
    document.getElementById("console_output").focus()
 
382
    document.getElementById("console_inputText").focus()
447
383
}
448
384
 
449
385
function catch_input(key)
488
424
            hist.submit(inp.value);
489
425
            inp.value = hist.curr();
490
426
        }
491
 
 
492
 
        /* Disable the text box. This will be redone by
493
 
         * console_enter_line, but we do it here too in case start_server
494
 
         * takes a while.
495
 
         */
496
 
        inp.setAttribute("disabled", "disabled");
497
427
        /* Start the server if it hasn't already been started */
498
428
        start_server(callback);
499
429
        break;
500
430
    case 38:                /* Up arrow */
501
431
        hist.up(inp.value);
502
432
        inp.value = hist.curr();
503
 
        /* Inhibit further responses to this event, or WebKit moves the
504
 
         * cursor to the start. */
505
 
        return false;
506
433
        break;
507
434
    case 40:                /* Down arrow */
508
435
        hist.down(inp.value);
509
436
        inp.value = hist.curr();
510
 
        return false;
511
437
        break;
512
438
    }
513
439
}
514
440
 
515
 
/** Resets the console by signalling the old console to expire and starting a 
516
 
 * new one.
517
 
 */
518
 
function console_reset()
519
 
{
520
 
    // FIXME: We show some feedback here - either disable input or at very 
521
 
    // least the reset button.
522
 
 
523
 
    // Restart the console
524
 
    if(!server_started)
525
 
    {
526
 
        start_server(null);
527
 
    }
528
 
    else
529
 
    {
530
 
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key, "cwd": get_console_start_directory()}, "POST");
531
 
        console_response(null, null, xhr.responseText);
532
 
    }
533
 
}
534
 
 
535
 
/** Prints an error line in the console **/
536
 
function print_error(error, cls)
537
 
{
538
 
    if (!cls)
539
 
        cls = "errorMsg";
540
 
 
541
 
    var output = document.getElementById("console_output");
542
 
  
543
 
    // Create text block
544
 
    var span = document.createElement("span");
545
 
    span.setAttribute("class", cls);
546
 
    span.appendChild(document.createTextNode(error + "\n"));
547
 
    output.appendChild(span);
548
 
 
549
 
    // Autoscroll
550
 
    divScroll.activeScroll();
551
 
}
552
 
 
553
 
/** Sets the prompt text **/
554
 
function set_prompt(prompt_text)
555
 
{
556
 
    var prompt = document.getElementById("console_prompt");
557
 
    prompt.replaceChild(document.createTextNode(prompt_text + " "), prompt.firstChild);
558
 
}
559
 
 
560
441
/**** Following Code modified from ******************************************/
561
442
/**** http://radio.javaranch.com/pascarello/2006/08/17/1155837038219.html ***/
562
443
/****************************************************************************/
574
455
        
575
456
    if (scrollDiv.scrollHeight > 0)
576
457
        currentHeight = scrollDiv.scrollHeight;
577
 
    else if (scrollDiv.offsetHeight > 0)
578
 
        currentHeight = scrollDiv.offsetHeight;
 
458
    else 
 
459
        if (objDiv.offsetHeight > 0)
 
460
            currentHeight = scrollDiv.offsetHeight;
579
461
 
580
462
    scrollDiv.scrollTop = currentHeight;
581
463