1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2026-03-10 00:15:46 +01:00

Some housekeaping in ui.js

This commit is contained in:
Kris Maglione
2008-12-03 17:42:17 -05:00
parent b0df47b4bb
commit 46e5630adc

View File

@@ -38,7 +38,7 @@ function CommandLine() //{{{
////////////////////// PRIVATE SECTION ///////////////////////////////////////// ////////////////////// PRIVATE SECTION /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{ /////////////////////////////////////////////////////////////////////////////{{{
const UNINITIALIZED = -2; // notifies us, if we need to start history/tab-completion from the beginning const UNINITIALIZED = {}; // notifies us, if we need to start history/tab-completion from the beginning
storage.newArray("history-search", true); storage.newArray("history-search", true);
storage.newArray("history-command", true); storage.newArray("history-command", true);
@@ -104,6 +104,7 @@ function CommandLine() //{{{
self.reset(); self.reset();
}; };
this.context = context; this.context = context;
this.editor = context.editor;
this.selected = null; this.selected = null;
this.wildmode = options.get("wildmode"); this.wildmode = options.get("wildmode");
this.itemList = completionList; this.itemList = completionList;
@@ -124,17 +125,16 @@ function CommandLine() //{{{
}, },
set completion set_completion(completion) set completion set_completion(completion)
{ {
previewClear(); this.previewClear();
let editor = commandWidget.inputField.editor;
// Change the completion text. // Change the completion text.
// The second line is a hack to deal with some substring // The second line is a hack to deal with some substring
// preview corner cases. // preview corner cases.
commandWidget.value = this.prefix + completion + this.suffix; commandWidget.value = this.prefix + completion + this.suffix;
editor.selection.focusNode.textContent = commandWidget.value; this.editor.selection.focusNode.textContent = commandWidget.value;
// Reset the caret to one position after the completion. // Reset the caret to one position after the completion.
let range = editor.selection.getRangeAt(0); let range = this.editor.selection.getRangeAt(0);
range.setStart(range.startContainer, this.prefix.length + completion.length); range.setStart(range.startContainer, this.prefix.length + completion.length);
range.collapse(true); range.collapse(true);
}, },
@@ -154,6 +154,42 @@ function CommandLine() //{{{
full: this.wildmode.checkHas(this.wildtype, "full") full: this.wildmode.checkHas(this.wildtype, "full")
}), }),
preview: function preview()
{
// This will only work with autocomplete.
if (!options.get("wildoptions").has("auto") || !completions)
return;
if (this.type.longest && !this.suffix)
{
let start = commandWidget.selectionStart;
let substring = this.substring;
// Don't show 1-character substrings unless we've just hit backspace
if (substring.length < 2 && (!this.lastSubstring || this.lastSubstring.indexOf(substring) != 0))
return;
this.lastSubstring = substring;
// Chop off the bits we already have.
substring = substring.substr(completions.value.length);
// highlight="Preview" won't work in the editor.
let node = util.xmlToDom(<span style={highlight.get("Preview").value}>{substring}</span>,
document);
this.editor.insertNode(node, this.editor.rootElement, 1);
commandWidget.selectionStart = commandWidget.selectionEnd = start;
}
},
previewClear: function previewClear()
{
try
{
let node = this.editor.rootElement;
this.editor.deleteNode(node.firstChild.nextSibling);
}
catch (e) {}
},
reset: function reset(show) reset: function reset(show)
{ {
this.wildtypes = this.wildmode.values; this.wildtypes = this.wildmode.values;
@@ -171,7 +207,7 @@ function CommandLine() //{{{
this.wildIndex = 0; this.wildIndex = 0;
} }
previewSubstring(); this.preview();
}, },
select: function select(idx) select: function select(idx)
@@ -261,12 +297,9 @@ function CommandLine() //{{{
} }
} }
var completionList = new ItemList("liberator-completions"); /////////////////////////////////////////////////////////////////////////////}}}
var completions = null; ////////////////////// TIMERS //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var wildIndex = 0; // keep track how often we press <Tab> in a row
var startHints = false; // whether we're waiting to start hints mode
var lastSubstring = "";
var statusTimer = new util.Timer(5, 100, function statusTell() { var statusTimer = new util.Timer(5, 100, function statusTell() {
if (completions.selected == null) if (completions.selected == null)
@@ -274,6 +307,7 @@ function CommandLine() //{{{
else else
statusline.updateProgress("match " + (completions.selected + 1) + " of " + completions.items.length); statusline.updateProgress("match " + (completions.selected + 1) + " of " + completions.items.length);
}); });
var autocompleteTimer = new util.Timer(201, 300, function autocompleteTell(tabPressed) { var autocompleteTimer = new util.Timer(201, 300, function autocompleteTell(tabPressed) {
if (events.feedingKeys || !completions) if (events.feedingKeys || !completions)
return; return;
@@ -288,32 +322,9 @@ function CommandLine() //{{{
completions.tab(event.shiftKey); completions.tab(event.shiftKey);
}); });
// the containing box for the promptWidget and commandWidget /////////////////////////////////////////////////////////////////////////////}}}
var commandlineWidget = document.getElementById("liberator-commandline"); ////////////////////// CALLBACKS ///////////////////////////////////////////////
// the prompt for the current command, for example : or /. Can be blank /////////////////////////////////////////////////////////////////////////////{{{
var promptWidget = document.getElementById("liberator-commandline-prompt");
// the command bar which contains the current command
var commandWidget = document.getElementById("liberator-commandline-command");
commandWidget.inputField.QueryInterface(Components.interfaces.nsIDOMNSEditableElement);
// the widget used for multiline output
var multilineOutputWidget = document.getElementById("liberator-multiline-output");
multilineOutputWidget.contentDocument.body.id = "liberator-multiline-output-content";
var outputContainer = multilineOutputWidget.parentNode;
// the widget used for multiline intput
var multilineInputWidget = document.getElementById("liberator-multiline-input");
// we need to save the mode which were in before opening the command line
// this is then used if we focus the command line again without the "official"
// way of calling "open"
var currentExtendedMode = null; // the extended mode which we last openend the command line for
var currentPrompt = null;
var currentCommand = null;
// save the arguments for the inputMultiline method which are needed in the event handler
var multilineRegexp = null;
var multilineCallback = null;
// callback for prompt mode // callback for prompt mode
var promptSubmitCallback = null; var promptSubmitCallback = null;
@@ -328,7 +339,18 @@ function CommandLine() //{{{
if (options.get("wildoptions").has("auto")) if (options.get("wildoptions").has("auto"))
autocompleteTimer.tell(false); autocompleteTimer.tell(false);
else else
completions.selected = completions.RESET; completions.reset();
});
liberator.registerCallback("cancel", modes.PROMPT, closePrompt);
liberator.registerCallback("submit", modes.PROMPT, closePrompt);
liberator.registerCallback("change", modes.PROMPT, function (str) {
if (promptChangeCallback)
return promptChangeCallback(str);
});
liberator.registerCallback("complete", modes.PROMPT, function (context) {
if (promptCompleter)
promptCompleter(context);
}); });
function closePrompt(value) function closePrompt(value)
@@ -340,12 +362,46 @@ function CommandLine() //{{{
if (callback) if (callback)
callback(value); callback(value);
} }
liberator.registerCallback("cancel", modes.PROMPT, closePrompt);
liberator.registerCallback("submit", modes.PROMPT, closePrompt); /////////////////////////////////////////////////////////////////////////////}}}
liberator.registerCallback("change", modes.PROMPT, ////////////////////// VARIABLES ///////////////////////////////////////////////
function (str) { if (promptChangeCallback) return promptChangeCallback(str); }); /////////////////////////////////////////////////////////////////////////////{{{
liberator.registerCallback("complete", modes.PROMPT,
function (context) { if (promptCompleter) promptCompleter(context); }); const completionList = new ItemList("liberator-completions");
var completions = null;
var wildIndex = 0; // keep track how often we press <Tab> in a row
var startHints = false; // whether we're waiting to start hints mode
var lastSubstring = "";
// the containing box for the promptWidget and commandWidget
const commandlineWidget = document.getElementById("liberator-commandline");
// the prompt for the current command, for example : or /. Can be blank
const promptWidget = document.getElementById("liberator-commandline-prompt");
// the command bar which contains the current command
const commandWidget = document.getElementById("liberator-commandline-command");
commandWidget.inputField.QueryInterface(Components.interfaces.nsIDOMNSEditableElement);
// the widget used for multiline output
const multilineOutputWidget = document.getElementById("liberator-multiline-output");
const outputContainer = multilineOutputWidget.parentNode;
multilineOutputWidget.contentDocument.body.id = "liberator-multiline-output-content";
// the widget used for multiline intput
const multilineInputWidget = document.getElementById("liberator-multiline-input");
// we need to save the mode which were in before opening the command line
// this is then used if we focus the command line again without the "official"
// way of calling "open"
var currentExtendedMode = null; // the extended mode which we last openend the command line for
var currentPrompt = null;
var currentCommand = null;
// save the arguments for the inputMultiline method which are needed in the event handler
var multilineRegexp = null;
var multilineCallback = null;
function setHighlightGroup(group) function setHighlightGroup(group)
{ {
@@ -369,44 +425,6 @@ function CommandLine() //{{{
promptWidget.setAttributeNS(NS.uri, "highlight", highlightGroup || commandline.HL_NORMAL); promptWidget.setAttributeNS(NS.uri, "highlight", highlightGroup || commandline.HL_NORMAL);
} }
function previewClear()
{
try
{
let editor = commandWidget.inputField.editor;
let node = editor.rootElement;
editor.deleteNode(node.firstChild.nextSibling);
}
catch (e) {}
}
function previewSubstring()
{
// This will only work with autocomplete.
if (!options.get("wildoptions").has("auto") || !completions)
return;
let editor = commandWidget.inputField.editor;
if (completions.type.longest && !completions.suffix)
{
let start = commandWidget.selectionStart;
let substring = completions.substring;
// Don't show 1-character substrings unless we've just hit backspace
if (substring.length < 2 && lastSubstring.indexOf(substring) != 0)
return;
lastSubstring = substring;
// Chop off the bits we already have.
substring = substring.substr(completions.value.length);
// highlight="Preview" won't work in the editor.
let node = util.xmlToDom(<span style={highlight.get("Preview").value}>{substring}</span>,
document);
editor.insertNode(node, editor.rootElement, 1);
commandWidget.selectionStart = commandWidget.selectionEnd = start;
}
}
// sets the command - e.g. 'tabopen', 'open http://example.com/' // sets the command - e.g. 'tabopen', 'open http://example.com/'
function setCommand(cmd) function setCommand(cmd)
{ {
@@ -889,7 +907,7 @@ function CommandLine() //{{{
onEvent: function onEvent(event) onEvent: function onEvent(event)
{ {
previewClear(); completions.previewClear();
let command = this.getCommand(); let command = this.getCommand();
if (event.type == "blur") if (event.type == "blur")
@@ -916,7 +934,6 @@ function CommandLine() //{{{
else if (event.type == "input") else if (event.type == "input")
{ {
liberator.triggerCallback("change", currentExtendedMode, command); liberator.triggerCallback("change", currentExtendedMode, command);
previewSubstring();
} }
else if (event.type == "keypress") else if (event.type == "keypress")
{ {