/
CDC-1.2b/
CDC-1.2b/src/
parent $generic_editor
object $code_editor

var $root child_index 0
var $root owners [$code_editor]
var $root owned [$code_editor]
var $root fertile 0
var $has_commands commands [["compile", 'compile_cmd], ["refresh", 'refresh_cmd]]
var $has_commands shortcuts []
var $root inited 1
var $command_aliases command_aliases []
var $root manager $code_editor
var $root writable [$code_editor]
var $root readable ['parameters, 'methods, 'code]
var $root dbref 'code_editor
var $old_command_environment verb_cache #[]
var $old_command_environment command_cache [["compile", 'compile_cmd], ["refresh", 'refresh_cmd], ["@abort|abort", 'abort_cmd], ["quit|@quit", 'quit_cmd], ["list|nlist *", 'list_cmd], ["ins?ert *", 'insert_cmd], ["del?ete *", 'del_line_cmd], ["join *", 'join_cmd], ["enter", 'enter_cmd], ["help", 'help_screen]]
var $old_command_environment shortcuts_cache [["\"*", 'add_line_cmd, [1]], ["s/*/*", 'sub_cmd, ["", 1, 2]], ["fill * @*", 'fill_cmd, ["", 1, 2]], ["fill *", 'fill_cmd, ["", 1, ""]]]

method start_editing
    arg what;
    var ref, obj, method, code;
    
    // called by $user_input.edit_cmd
    ref = $parse.reference(what);
    obj = (| sender().match_environment(ref[1]) |);
    if (!obj) {
        sender().tell(what + " does not describe an editable method.");
        return 0;
    }
    method = tosym(ref[2]);
    catch any {
        code = sender().run_with_users_perms(obj, 'list_method, method, 2);
    } with handler {
        if (error() == ~methodnf) {
            code = [];
        } else {
            sender().tell(("You cannot edit " + what) + ".");
            sender().tell("Error: " + ((traceback()[1])[2]));
            return 0;
        }
    }
    sender().tell(("Now editing " + what) + ".");
    code = $generic_editor.adjust(code, 'spaces);
    
    // user doing editing, obj to be programmed, method to be programmed, code, current line
    // number, changes made
    return #[['user, sender()], ['obj, obj], ['method, method], ['text, code], ['cur_line, 1], ['changed, 0]];
.

method compile_cmd
    arg editing, cmd;
    var errors, last_edit;
    
    .perms(sender(), 'parser);
    catch any {
        last_edit = (" // Edited: " + ($time.ldate('mdy, 'dash))) + "/";
        last_edit = (last_edit + ($time.ltime('12hr, '_ampm))) + " ";
        last_edit = (last_edit + "by: ") + ((editing['user]).namef('ref));
        errors = (editing['user]).run_with_users_perms(editing['obj], 'compile, (editing['text]) + [last_edit], editing['method]);
        if (errors) {
            (editing['user]).tell(errors);
        } else {
            (editing['user]).tell("Method compiled.");
    
            // clear modified flag
            editing = editing.replace('changed, 0);
        }
    } with handler {
        (editing['user]).tell("An error occurred attempting to compile.");
        (editing['user]).tell("The error was " + ((traceback()[1])[2]));
    }
    return editing;
.

method refresh_cmd
    arg editing, com;
    var code;
    
    // re-loads method if not changed
    .perms(sender(), 'parser);
    if (editing['changed]) {
        (editing['user]).tell("Changes have been made. Compile first to refresh.");
    } else {
        catch any {
            code = (editing['user]).run_with_users_perms(editing['obj], 'list_method, editing['method], 2);
        } with handler {
            (editing['user]).tell("Unable to list method into buffer, error was " + ((traceback()[1])[2]));
            return editing;
        }
        editing = editing.replace('text, code);
        (editing['user]).tell("Done.");
    }
    return editing;
.

method help_msg
    var msg;
    
    msg = [];
    msg = msg + ["The code editor allows you to modify and re-compile methods."];
    msg = msg + ["It includes these commands it inherits from the generic editor:"];
    msg = msg + pass();
    msg = msg + [""];
    msg = msg + ["And adds the following:"];
    msg = msg + ["  compile      compile and store current text"];
    msg = msg + ["  refresh      re-load compiled method"];
    msg = msg + [""];
    return msg;
.