mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-23 05:57:58 +01:00
use the singleton construction idiom to create vimperator.hints
This commit is contained in:
367
content/hints.js
367
content/hints.js
@@ -28,6 +28,10 @@ the terms of any one of the MPL, the GPL or the LGPL.
|
|||||||
|
|
||||||
vimperator.Hints = function () //{{{
|
vimperator.Hints = function () //{{{
|
||||||
{
|
{
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
////////////////////// PRIVATE SECTION /////////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////{{{
|
||||||
|
|
||||||
var submode = ""; // used for extended mode, can be "o", "t", "y", etc.
|
var submode = ""; // used for extended mode, can be "o", "t", "y", etc.
|
||||||
var hintString = ""; // the typed string part of the hint is in this string
|
var hintString = ""; // the typed string part of the hint is in this string
|
||||||
var hintNumber = 0; // only the numerical part of the hint
|
var hintNumber = 0; // only the numerical part of the hint
|
||||||
@@ -467,211 +471,215 @@ vimperator.Hints = function () //{{{
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////}}}
|
||||||
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
////////////////////// PUBLIC SECTION //////////////////////////////////////////
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////{{{
|
||||||
|
|
||||||
// TODO: implement framesets
|
return {
|
||||||
this.show = function (mode, minor, filter)
|
|
||||||
{
|
// TODO: implement framesets
|
||||||
if (mode == vimperator.modes.EXTENDED_HINT && !/^[;asoOtTwWyY]$/.test(minor))
|
show: function (mode, minor, filter)
|
||||||
{
|
{
|
||||||
vimperator.beep();
|
if (mode == vimperator.modes.EXTENDED_HINT && !/^[;asoOtTwWyY]$/.test(minor))
|
||||||
return;
|
{
|
||||||
}
|
vimperator.beep();
|
||||||
|
|
||||||
vimperator.modes.set(vimperator.modes.HINTS, mode);
|
|
||||||
submode = minor || "o"; // open is the default mode
|
|
||||||
hintString = filter || "";
|
|
||||||
hintNumber = 0;
|
|
||||||
canUpdate = false;
|
|
||||||
|
|
||||||
generate();
|
|
||||||
|
|
||||||
// get all keys from the input queue
|
|
||||||
var mt = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread;
|
|
||||||
while (mt.hasPendingEvents())
|
|
||||||
mt.processNextEvent(true);
|
|
||||||
|
|
||||||
canUpdate = true;
|
|
||||||
showHints();
|
|
||||||
|
|
||||||
if (valid_hints.length == 0)
|
|
||||||
{
|
|
||||||
vimperator.beep();
|
|
||||||
vimperator.modes.reset();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (valid_hints.length == 1)
|
|
||||||
{
|
|
||||||
processHints(true);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else // still hints visible
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.hide = function ()
|
|
||||||
{
|
|
||||||
removeHints(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
this.onEvent = function (event)
|
|
||||||
{
|
|
||||||
var key = vimperator.events.toString(event);
|
|
||||||
var followFirst = false;
|
|
||||||
|
|
||||||
// clear any timeout which might be active after pressing a number
|
|
||||||
if (activeTimeout)
|
|
||||||
{
|
|
||||||
clearTimeout(activeTimeout);
|
|
||||||
activeTimeout = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (key)
|
|
||||||
{
|
|
||||||
case "<Return>":
|
|
||||||
followFirst = true;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "<Space>":
|
|
||||||
hintString += " ";
|
|
||||||
escapeNumbers = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "<Tab>":
|
|
||||||
case "<S-Tab>":
|
|
||||||
usedTabKey = true;
|
|
||||||
if (hintNumber == 0)
|
|
||||||
hintNumber = 1;
|
|
||||||
|
|
||||||
var oldID = hintNumber;
|
|
||||||
if (key == "<Tab>")
|
|
||||||
{
|
|
||||||
if (++hintNumber > valid_hints.length)
|
|
||||||
hintNumber = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (--hintNumber < 1)
|
|
||||||
hintNumber = valid_hints.length;
|
|
||||||
}
|
|
||||||
showActiveHint(hintNumber, oldID);
|
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
case "<BS>":
|
vimperator.modes.set(vimperator.modes.HINTS, mode);
|
||||||
if (hintNumber > 0 && !usedTabKey)
|
submode = minor || "o"; // open is the default mode
|
||||||
{
|
hintString = filter || "";
|
||||||
hintNumber = Math.floor(hintNumber / 10);
|
hintNumber = 0;
|
||||||
}
|
canUpdate = false;
|
||||||
else if (hintString != "")
|
|
||||||
{
|
|
||||||
usedTabKey = false;
|
|
||||||
hintNumber = 0;
|
|
||||||
hintString = hintString.substr(0, hintString.length - 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
usedTabKey = false;
|
|
||||||
hintNumber = 0;
|
|
||||||
vimperator.beep();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "<C-w>":
|
generate();
|
||||||
case "<C-u>":
|
|
||||||
hintString = "";
|
|
||||||
hintNumber = 0;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "\\":
|
// get all keys from the input queue
|
||||||
escapeNumbers = !escapeNumbers;
|
var mt = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread;
|
||||||
if (escapeNumbers && usedTabKey) // hintNumber not used normally, but someone may wants to toggle
|
while (mt.hasPendingEvents())
|
||||||
hintNumber = 0; // <tab>s ? reset. Prevent to show numbers not entered.
|
mt.processNextEvent(true);
|
||||||
|
|
||||||
updateStatusline();
|
canUpdate = true;
|
||||||
return;
|
showHints();
|
||||||
|
|
||||||
default:
|
if (valid_hints.length == 0)
|
||||||
// pass any special or ctrl- etc. prefixed key back to the main vimperator loop
|
{
|
||||||
if (/^<./.test(key) || key == ":")
|
vimperator.beep();
|
||||||
{
|
vimperator.modes.reset();
|
||||||
var map = null;
|
return false;
|
||||||
if ((map = vimperator.mappings.get(vimperator.modes.NORMAL, key)) ||
|
}
|
||||||
(map = vimperator.mappings.get(vimperator.modes.HINTS, key)))
|
else if (valid_hints.length == 1)
|
||||||
|
{
|
||||||
|
processHints(true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else // still hints visible
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function ()
|
||||||
|
{
|
||||||
|
removeHints(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
onEvent: function (event)
|
||||||
|
{
|
||||||
|
var key = vimperator.events.toString(event);
|
||||||
|
var followFirst = false;
|
||||||
|
|
||||||
|
// clear any timeout which might be active after pressing a number
|
||||||
|
if (activeTimeout)
|
||||||
|
{
|
||||||
|
clearTimeout(activeTimeout);
|
||||||
|
activeTimeout = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case "<Return>":
|
||||||
|
followFirst = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "<Space>":
|
||||||
|
hintString += " ";
|
||||||
|
escapeNumbers = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "<Tab>":
|
||||||
|
case "<S-Tab>":
|
||||||
|
usedTabKey = true;
|
||||||
|
if (hintNumber == 0)
|
||||||
|
hintNumber = 1;
|
||||||
|
|
||||||
|
var oldID = hintNumber;
|
||||||
|
if (key == "<Tab>")
|
||||||
{
|
{
|
||||||
map.execute(null, -1);
|
if (++hintNumber > valid_hints.length)
|
||||||
return;
|
hintNumber = 1;
|
||||||
}
|
|
||||||
|
|
||||||
vimperator.beep();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (/^[0-9]$/.test(key) && !escapeNumbers)
|
|
||||||
{
|
|
||||||
var oldHintNumber = hintNumber;
|
|
||||||
if (hintNumber == 0 || usedTabKey)
|
|
||||||
{
|
|
||||||
usedTabKey = false;
|
|
||||||
hintNumber = parseInt(key, 10);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hintNumber = (hintNumber * 10) + parseInt(key, 10);
|
|
||||||
|
|
||||||
updateStatusline();
|
|
||||||
|
|
||||||
if (!canUpdate)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (docs.length == 0)
|
|
||||||
{
|
{
|
||||||
generate();
|
if (--hintNumber < 1)
|
||||||
showHints();
|
hintNumber = valid_hints.length;
|
||||||
}
|
}
|
||||||
showActiveHint(hintNumber, oldHintNumber || 1);
|
showActiveHint(hintNumber, oldID);
|
||||||
|
return;
|
||||||
|
|
||||||
if (hintNumber == 0 || hintNumber > valid_hints.length)
|
case "<BS>":
|
||||||
|
if (hintNumber > 0 && !usedTabKey)
|
||||||
{
|
{
|
||||||
|
hintNumber = Math.floor(hintNumber / 10);
|
||||||
|
}
|
||||||
|
else if (hintString != "")
|
||||||
|
{
|
||||||
|
usedTabKey = false;
|
||||||
|
hintNumber = 0;
|
||||||
|
hintString = hintString.substr(0, hintString.length - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
usedTabKey = false;
|
||||||
|
hintNumber = 0;
|
||||||
|
vimperator.beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "<C-w>":
|
||||||
|
case "<C-u>":
|
||||||
|
hintString = "";
|
||||||
|
hintNumber = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "\\":
|
||||||
|
escapeNumbers = !escapeNumbers;
|
||||||
|
if (escapeNumbers && usedTabKey) // hintNumber not used normally, but someone may wants to toggle
|
||||||
|
hintNumber = 0; // <tab>s ? reset. Prevent to show numbers not entered.
|
||||||
|
|
||||||
|
updateStatusline();
|
||||||
|
return;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// pass any special or ctrl- etc. prefixed key back to the main vimperator loop
|
||||||
|
if (/^<./.test(key) || key == ":")
|
||||||
|
{
|
||||||
|
var map = null;
|
||||||
|
if ((map = vimperator.mappings.get(vimperator.modes.NORMAL, key)) ||
|
||||||
|
(map = vimperator.mappings.get(vimperator.modes.HINTS, key)))
|
||||||
|
{
|
||||||
|
map.execute(null, -1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
vimperator.beep();
|
vimperator.beep();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we write a numeric part like 3, but we have 45 hints, only follow
|
if (/^[0-9]$/.test(key) && !escapeNumbers)
|
||||||
// the hint after a timeout, as the user might have wanted to follow link 34
|
|
||||||
if (hintNumber > 0 && hintNumber * 10 <= valid_hints.length)
|
|
||||||
{
|
{
|
||||||
var timeout = vimperator.options["hinttimeout"];
|
var oldHintNumber = hintNumber;
|
||||||
if (timeout > 0)
|
if (hintNumber == 0 || usedTabKey)
|
||||||
activeTimeout = setTimeout(function () { processHints(true); }, timeout);
|
{
|
||||||
|
usedTabKey = false;
|
||||||
|
hintNumber = parseInt(key, 10);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hintNumber = (hintNumber * 10) + parseInt(key, 10);
|
||||||
|
|
||||||
return false;
|
updateStatusline();
|
||||||
|
|
||||||
|
if (!canUpdate)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (docs.length == 0)
|
||||||
|
{
|
||||||
|
generate();
|
||||||
|
showHints();
|
||||||
|
}
|
||||||
|
showActiveHint(hintNumber, oldHintNumber || 1);
|
||||||
|
|
||||||
|
if (hintNumber == 0 || hintNumber > valid_hints.length)
|
||||||
|
{
|
||||||
|
vimperator.beep();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we write a numeric part like 3, but we have 45 hints, only follow
|
||||||
|
// the hint after a timeout, as the user might have wanted to follow link 34
|
||||||
|
if (hintNumber > 0 && hintNumber * 10 <= valid_hints.length)
|
||||||
|
{
|
||||||
|
var timeout = vimperator.options["hinttimeout"];
|
||||||
|
if (timeout > 0)
|
||||||
|
activeTimeout = setTimeout(function () { processHints(true); }, timeout);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// we have a unique hint
|
||||||
|
processHints(true);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
// we have a unique hint
|
|
||||||
processHints(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hintString += key;
|
hintString += key;
|
||||||
hintNumber = 0; // after some text input
|
hintNumber = 0; // after some text input
|
||||||
if (usedTabKey)
|
if (usedTabKey)
|
||||||
{
|
{
|
||||||
usedTabKey = false;
|
usedTabKey = false;
|
||||||
showActiveHint(1, hintNumber);
|
showActiveHint(1, hintNumber);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateStatusline();
|
||||||
|
|
||||||
|
if (canUpdate)
|
||||||
|
{
|
||||||
|
if (docs.length == 0 && hintString.length > 0)
|
||||||
|
generate();
|
||||||
|
|
||||||
|
showHints();
|
||||||
|
processHints(followFirst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStatusline();
|
|
||||||
|
|
||||||
if (canUpdate)
|
|
||||||
{
|
|
||||||
if (docs.length == 0 && hintString.length > 0)
|
|
||||||
generate();
|
|
||||||
|
|
||||||
showHints();
|
|
||||||
processHints(followFirst);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: add resize support
|
// FIXME: add resize support
|
||||||
@@ -685,6 +693,7 @@ vimperator.Hints = function () //{{{
|
|||||||
// doc = window.content.document;
|
// doc = window.content.document;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
//}}}
|
||||||
}; //}}}
|
}; //}}}
|
||||||
|
|
||||||
// vim: set fdm=marker sw=4 ts=4 et:
|
// vim: set fdm=marker sw=4 ts=4 et:
|
||||||
|
|||||||
@@ -613,7 +613,7 @@ const vimperator = (function () //{{{
|
|||||||
vimperator.log("Loading module quickmarks...", 3);
|
vimperator.log("Loading module quickmarks...", 3);
|
||||||
vimperator.quickmarks = vimperator.QuickMarks();
|
vimperator.quickmarks = vimperator.QuickMarks();
|
||||||
vimperator.log("Loading module hints...", 3);
|
vimperator.log("Loading module hints...", 3);
|
||||||
vimperator.hints = new vimperator.Hints();
|
vimperator.hints = vimperator.Hints();
|
||||||
vimperator.log("Loading module io...", 3);
|
vimperator.log("Loading module io...", 3);
|
||||||
vimperator.io = vimperator.IO();
|
vimperator.io = vimperator.IO();
|
||||||
vimperator.log("Loading module completion...", 3);
|
vimperator.log("Loading module completion...", 3);
|
||||||
|
|||||||
Reference in New Issue
Block a user