Added API to manipulate external launchers for MIME types.
[conkeror.git] / modules / interactive.js
blob0a8337e40c294683c5168cb90a3085cb692bd27e
1 /**
2  * (C) Copyright 2007-2008 John J. Foerch
3  * (C) Copyright 2007-2008 Jeremy Maitin-Shepard
4  *
5  * Use, modification, and distribution are subject to the terms specified in the
6  * COPYING file.
7 **/
9 require("utils.js");
11 var interactive_commands = new string_hashmap();
13 /**
14  * name: string name of the command.
15  *
16  * doc: Documentation string, may be null.
17  *
18  * handler: A function to handle the command.
19  *
20  * options: An object that may contain any of the following keys.
21  *          Options may be null.
22  *
23  *   prefix: boolean where `true' means that this command is a
24  *           prefix command.
25  */
26 function interactive(name, doc, handler, options)
28     options = merge_defaults(options);
29     var cmd = {
30         name: name,
31         handler: handler,
32         prefix: options.prefix,
33         doc: doc,
34         shortdoc: get_shortdoc_string(doc),
35         source_code_reference: get_caller_source_code_reference() };
37     interactive_commands.put(name, cmd);
40 function interactive_error(str) {
41     var e = new Error(str);
42     e.__proto__ = interactive_error.prototype;
43     return e;
45 interactive_error.prototype.__proto__ = Error.prototype;
47 function interactive_context() {}
48 interactive_context.prototype = {
50     get P () this.prefix_argument,
52     get p () univ_arg_to_number(this.prefix_argument),
54     set p (default_value) univ_arg_to_number(this.prefix_argument, default_value),
56     get minibuffer () this.window.minibuffer,
58     get : function (x) this.buffer.get(x)
61 function handle_interactive_error(window, e) {
62     if (e instanceof interactive_error)
63         window.minibuffer.message(e.message);
64     else if (e instanceof abort)
65         window.minibuffer.message("Quit");
66     else {
67         dump_error(e);
68         window.minibuffer.message("call interactively: " + e);
69     }
72 // Any additional arguments specify "given" arguments to the function.
73 function call_interactively(I, command)
75     var handler;
76     var top_args;
78     I.__proto__ = interactive_context.prototype;
80     if (I.buffer == null)
81         I.buffer = I.window.buffers.current;
82     else if (I.window == null)
83         I.window = I.buffer.window;
85     var window = I.window;
87     if (typeof(command) == "function") {
88         // Special interactive command
89         command(I);
90         return;
91     }
93     var cmd = interactive_commands.get(command);
94     if (!cmd)
95     {
96         window.minibuffer.message("Invalid command: " + command);
97         return;
98     }
100     I.command = command;
102     var handler = cmd.handler;
104     try {
105         var result = handler(I);
106         if (is_coroutine(result)) {
107             co_call(function() {
108                 try {
109                     yield result;
110                 } catch (e) {
111                     handle_interactive_error(window, e);
112                 }
113             }());
114         }
115     } catch (e)
116     {
117         handle_interactive_error(window, e);
118     }
122 I.f = interactive_method(
123     $doc = "Existing file",
124     $async = function (ctx, cont) {
125         keywords(arguments, $prompt = "File:", $initial_value = default_directory.path,
126                  $history = "file");
127         ctx.window.minibuffer.read(
128             $prompt = arguments.$prompt,
129             $initial_value = arguments.$initial_value,
130             $history = arguments.$history,
131             $callback = function(s) {
132                 var f = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
133                 f.initWithPath(s);
134                 cont(f);
135             });
136     });
138 // FIXME: eventually they will differ, when completion for files is added
139 I.F = I.f;