1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-22 23:58:00 +01:00

massive options.js cleanup. It is now only responsible for the options framework, but does not host

any option. They are now saved in the modules where the corresponding features are defined or in vim.js
if they are general options. Expect the same code rework for commands and mappings.
This commit is contained in:
Martin Stubenschrott
2008-02-07 03:03:27 +00:00
parent b3eb0000ab
commit 1556268fea
12 changed files with 428 additions and 465 deletions

View File

@@ -26,7 +26,9 @@ the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
vimperator.Option = function (names, type, extraInfo) //{{{
// do NOT create instances of this class yourself, use the helper method
// vimperator.options.add() instead
vimperator.Option = function (names, description, type, defaultValue, getter, setter, validator, completer)
{
if (!names || !type)
return null;
@@ -36,30 +38,22 @@ vimperator.Option = function (names, type, extraInfo) //{{{
this.name = names[0];
this.names = names;
this.type = type;
this.shortHelp = description || "";
if (extraInfo)
{
this.shortHelp = extraInfo.shortHelp || null;
// "", 0 are valid default values
this.defaultValue = (defaultValue === undefined) ? null : defaultValue;
value = this.defaultValue;
// "", 0 are valid default values
if (extraInfo.defaultValue !== undefined)
this.defaultValue = extraInfo.defaultValue;
else
this.defaultValue = null;
this.setter = setter || null;
this.getter = getter || null;
this.completer = completer || null;
this.validator = validator || null;
value = this.defaultValue;
if (extraInfo.setter)
this.setter = extraInfo.setter;
if (extraInfo.getter)
this.getter = extraInfo.getter;
this.completer = extraInfo.completer || null;
this.validator = extraInfo.validator || null;
}
// this property is set to true whenever the option is first set
// useful to see whether it was changed by some rc file
this.hasChanged = false;
// add noOPTION variant of boolean OPTION to this.names
// FIXME: are these variants really considered names?
if (this.type == "boolean")
{
this.names = []; // reset since order is important
@@ -70,7 +64,6 @@ vimperator.Option = function (names, type, extraInfo) //{{{
}
}
// NOTE: forced defaults need to use vimperator.options.getPref
this.__defineGetter__("value",
function ()
{
@@ -83,14 +76,12 @@ vimperator.Option = function (names, type, extraInfo) //{{{
function (newValue)
{
value = newValue;
this.hasChanged = true;
if (this.setter)
this.setter.call(this, value);
}
);
// TODO: add is[Type]() queries for use in set()?
// : add isValid() or just throw an exception?
this.hasName = function (name)
{
return this.names.some(function (e) { return e == name; });
@@ -108,8 +99,12 @@ vimperator.Option = function (names, type, extraInfo) //{{{
{
this.value = this.defaultValue;
};
}; //}}}
vimperator.Options = function () //{{{
{
////////////////////////////////////////////////////////////////////////////////
@@ -118,21 +113,8 @@ vimperator.Options = function () //{{{
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
var preferences = prefService.getDefaultBranch("");
var options = [];
// save if we already changed a GUI related option, used for setInitialGUI
var guioptionsDone = false, showtablineDone = false, laststatusDone = false;
function optionsIterator()
{
for (var i = 0; i < options.length; i++)
yield options[i];
throw StopIteration;
}
function storePreference(name, value)
{
var type = prefService.getPrefType(name);
@@ -197,76 +179,6 @@ vimperator.Options = function () //{{{
}
}
// show/hide the menubar, toolbar and bookmarks toolbar
function setGuiOptions(value)
{
var guioptions = vimperator.config.guioptions || {};
try
{
for (let option in guioptions)
guioptions[option].forEach( function(elem) {
document.getElementById(elem).collapsed = (value.indexOf(option.toString()) < 0); });
}
catch (e) { }
guioptionsDone = true;
}
function setLastStatus(value)
{
if (value == 0)
document.getElementById("status-bar").collapsed = true;
else if (value == 1)
vimperator.echo("show status line only with > 1 window not implemented yet");
else
document.getElementById("status-bar").collapsed = false;
laststatusDone = true;
}
function setShowTabline(value)
{
var tabs = getBrowser().mStrip.getElementsByClassName("tabbrowser-tabs")[0];
if (!tabs)
return;
if (value == 0)
{
tabs.collapsed = true;
}
else if (value == 1)
{
storePreference("browser.tabs.autoHide", true);
tabs.collapsed = false;
}
else
{
storePreference("browser.tabs.autoHide", false);
tabs.collapsed = false;
}
showtablineDone = true;
}
function setTitleString(value)
{
document.getElementById("main-window").setAttribute("titlemodifier", value);
if (window.content.document.title.length > 0)
document.title = window.content.document.title + " - " + value;
else
document.title = value;
}
function setPopups(value)
{
var values = [ [0, 1], // always in current tab
[0, 3], // in a new tab
[2, 3], // in a new window if it has specified sizes
[1, 2]];// always in new window
storePreference("browser.link.open_newwindow.restriction", values[value][0]);
storePreference("browser.link.open_newwindow", values[value][1]);
}
//
// firefox preferences which need to be changed to work well with vimperator
//
@@ -276,7 +188,8 @@ vimperator.Options = function () //{{{
if (!/keypress/.test(popupAllowedEvents))
storePreference("dom.popup_allowed_events", popupAllowedEvents + " keypress");
// TODO: shouldn't we be resetting these in destroy() as well?
// TODO: maybe reset in .destroy()?
// TODO: move to vim.js or buffer.js
// we have our own typeahead find implementation
storePreference("accessibility.typeaheadfind.autostart", false);
storePreference("accessibility.typeaheadfind", false); // actually the above setting should do it, but has no effect in firefox
@@ -288,11 +201,38 @@ vimperator.Options = function () //{{{
////////////////////// PUBLIC SECTION //////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
var optionManager = {
return {
__iterator__: function ()
{
return optionsIterator();
for (var i = 0; i < options.length; i++)
yield options[i];
throw StopIteration;
},
add: function (names, description, type, defaultValue, extraInfo)
{
if (!extraInfo)
extraInfo = {};
var option = new vimperator.Option(names, description, type, defaultValue,
extraInfo.getter, extraInfo.setter, extraInfo.validator);
// quickly access options with vimperator.options["wildmode"]:
this.__defineGetter__(option.name, function () { return option.value; });
this.__defineSetter__(option.name, function (value) { option.value = value; });
// TODO: sort option
options.push(option);
},
destroy: function ()
{
// reset some modified firefox prefs
if (loadPreference("dom.popup_allowed_events", "change click dblclick mouseup reset submit")
== popupAllowedEvents + " keypress")
storePreference("dom.popup_allowed_events", popupAllowedEvents);
},
get: function (name)
@@ -305,21 +245,6 @@ vimperator.Options = function () //{{{
return null;
},
add: function (option)
{
this.__defineGetter__(option.name, function () { return option.value; });
this.__defineSetter__(option.name, function (value) { option.value = value; });
options.push(option);
},
destroy: function ()
{
// reset some modified firefox prefs
if (loadPreference("dom.popup_allowed_events", "change click dblclick mouseup reset submit")
== popupAllowedEvents + " keypress")
storePreference("dom.popup_allowed_events", popupAllowedEvents);
},
list: function (onlyNonDefault)
{
var list = ":" + vimperator.util.escapeHTML(vimperator.commandline.getCommand()) + "<br/>" +
@@ -361,6 +286,21 @@ vimperator.Options = function () //{{{
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
},
// TODO: move to vim.js?
// this hack is only needed, because we need to do asynchronous loading of the .vimperatorrc
setInitialGUI: function ()
{
if (vimperator.config.name != "Vimperator")
return;
if (!guioptionsDone)
this.get("guioptions").reset();
if (!laststatusDone)
this.get("laststatus").reset();
if (!showtablineDone)
this.get("showtabline").reset();
},
listPrefs: function (onlyNonDefault, filter)
{
if (!filter)
@@ -381,7 +321,7 @@ vimperator.Options = function () //{{{
name = prefArray[i];
value = this.getPref(name);
if (typeof value == "string")
value = value.substr(0,100).replace(/\n/g, " ");
value = value.substr(0, 100).replace(/\n/g, " ");
value = vimperator.util.colorize(value, false);
defaultValue = loadPreference(name, null);
@@ -403,34 +343,19 @@ vimperator.Options = function () //{{{
vimperator.commandline.echo(list, vimperator.commandline.HL_NORMAL, vimperator.commandline.FORCE_MULTILINE);
},
// this hack is only needed, because we need to do asynchronous loading of the .vimperatorrc
setInitialGUI: function ()
{
if (vimperator.config.name != "Vimperator")
return;
if (!guioptionsDone)
this.get("guioptions").reset();
if (!laststatusDone)
this.get("laststatus").reset();
if (!showtablineDone)
this.get("showtabline").reset();
},
// be better placed in the 'core' vimperator namespace somewhere?
setPref: function (name, value)
{
return storePreference(name, value);
},
getPref: function (name, forcedDefault)
{
return loadPreference(name, forcedDefault);
},
setPref: function (name, value)
{
return storePreference(name, value);
},
resetPref: function (name)
{
return preferences.clearUserPref(name);
return prefService.clearUserPref(name);
},
// this works only for booleans
@@ -441,296 +366,7 @@ vimperator.Options = function () //{{{
else
vimperator.echoerr("E488: Trailing characters: " + name + "!");
}
};
/////////////////////////////////////////////////////////////////////////////}}}
////////////////////// DEFAULT OPTIONS /////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////{{{
const DEFAULT_HINTTAGS = "//*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @class='lk' or @class='s'] | " +
"//input[not(@type='hidden')] | //a | //area | //iframe | //textarea | //button | //select | " +
"//xhtml:*[@onclick or @onmouseover or @onmousedown or @onmouseup or @oncommand or @class='lk' or @class='s'] | " +
"//xhtml:input[not(@type='hidden')] | //xhtml:a | //xhtml:area | //xhtml:iframe | //xhtml:textarea | //xhtml:button | //xhtml:select";
optionManager.add(new vimperator.Option(["activate", "act"], "stringlist",
{
shortHelp: "Define when tabs are automatically activated",
defaultValue: "homepage,quickmark,tabopen,paste",
validator: function (value)
{
return value.split(",").every(function (item) { return /^(homepage|quickmark|tabopen|paste|)$/.test(item); });
}
}
));
optionManager.add(new vimperator.Option(["complete", "cpt"], "charlist",
{
shortHelp: "Items which are completed at the :[tab]open prompt",
defaultValue: "sfbh",
validator: function (value) { return !/[^sfbh]/.test(value); }
}
));
optionManager.add(new vimperator.Option(["defsearch", "ds"], "string",
{
shortHelp: "Set the default search engine",
defaultValue: "google"
}
));
optionManager.add(new vimperator.Option(["editor"], "string",
{
shortHelp: "Set the external text editor",
defaultValue: "gvim -f"
}
));
optionManager.add(new vimperator.Option(["extendedhinttags", "eht"], "string",
{
shortHelp: "XPath string of hintable elements activated by ';'",
defaultValue: DEFAULT_HINTTAGS
}
));
optionManager.add(new vimperator.Option(["focusedhintstyle", "fhs"], "string",
{
shortHelp: "CSS specification of focused hints",
defaultValue: "z-index:5000; font-family:monospace; font-size:12px; color:ButtonText; background-color:ButtonShadow; " +
"border-color:ButtonShadow; border-width:1px; border-style:solid; padding:0px 1px 0px 1px; position:absolute;"
}
));
optionManager.add(new vimperator.Option(["fullscreen", "fs"], "boolean",
{
shortHelp: "Show the current window fullscreen",
setter: function (value) { window.fullScreen = value; },
getter: function () { return window.fullScreen; },
defaultValue: false
}
));
optionManager.add(new vimperator.Option(["guioptions", "go"], "charlist",
{
shortHelp: "Show or hide the menu, toolbar and scrollbars",
setter: function (value) { setGuiOptions(value); },
defaultValue: "",
validator: function (value)
{
var regex = "[^";
for (let option in vimperator.config.guioptions)
regex += option.toString();
return !(new RegExp(regex + "]").test(value));
}
}
));
optionManager.add(new vimperator.Option(["hinttimeout", "hto"], "number",
{
shortHelp: "Automatically follow non unique numerical hint after {arg} ms",
defaultValue: 0,
validator: function (value) { return value >= 0; }
}
));
optionManager.add(new vimperator.Option(["hintstyle", "hs"], "string",
{
shortHelp: "CSS specification of unfocused hints",
defaultValue: "z-index:5000; font-family:monospace; font-size:12px; color:white; background-color:red; " +
"border-color:ButtonShadow; border-width:0px; border-style:solid; padding:0px 1px 0px 1px; position:absolute;"
}
));
optionManager.add(new vimperator.Option(["hinttags", "ht"], "string",
{
shortHelp: "XPath string of hintable elements activated by <code class=\"mapping\">'f'</code> and <code class=\"mapping\">'F'</code>",
defaultValue: DEFAULT_HINTTAGS
}
));
optionManager.add(new vimperator.Option(["history", "hi"], "number",
{
shortHelp: "Number of Ex commands and search patterns to store in the commandline history",
defaultValue: 500
}
));
optionManager.add(new vimperator.Option(["hlsearch", "hls"], "boolean",
{
shortHelp: "Highlight previous search pattern matches",
setter: function (value) { if (value) vimperator.search.highlight(); else vimperator.search.clear(); },
defaultValue: false
}
));
optionManager.add(new vimperator.Option(["hlsearchstyle", "hlss"], "string",
{
shortHelp: "CSS specification of highlighted search items",
defaultValue: "color: black; background-color: yellow; padding: 0; display: inline;"
}
));
optionManager.add(new vimperator.Option(["ignorecase", "ic"], "boolean",
{
shortHelp: "Ignore case in search patterns",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["incsearch", "is"], "boolean",
{
shortHelp: "Show where the search pattern matches as it is typed",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["insertmode", "im"], "boolean",
{
shortHelp: "Use Insert mode as the default for text areas",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["laststatus", "ls"], "number",
{
shortHelp: "Show the status line",
defaultValue: 2,
setter: function (value) { setLastStatus(value); },
validator: function (value) { return (value >= 0 && value <= 2); }
}
));
optionManager.add(new vimperator.Option(["linksearch", "lks"], "boolean",
{
shortHelp: "Limit the search to hyperlink text",
defaultValue: false
}
));
optionManager.add(new vimperator.Option(["more"], "boolean",
{
shortHelp: "Pause the message list window when more than one screen of listings is displayed",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["nextpattern"], "stringlist",
{
shortHelp: "Patterns to use when guessing the 'next' page in a document sequence",
defaultValue: "\\bnext,^>$,^(>>|»)$,^(>|»),(>|»)$"
}
));
optionManager.add(new vimperator.Option(["pageinfo", "pa"], "charlist",
{
shortHelp: "Desired info on :pa[geinfo]",
defaultValue: "gfm",
validator: function (value) { return !(/[^gfm]/.test(value) || value.length > 3 || value.length < 1); }
}
));
optionManager.add(new vimperator.Option(["popups", "pps"], "number",
{
shortHelp: "Where to show requested popup windows",
defaultValue: 1,
setter: function (value) { setPopups(value); },
validator: function (value) { return (value >= 0 && value <= 3); }
}
));
optionManager.add(new vimperator.Option(["preload"], "boolean",
{
shortHelp: "Speed up first time history/bookmark completion",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["previewheight", "pvh"], "number",
{
shortHelp: "Default height for preview window",
defaultValue: 10,
validator: function (value) { return (value >= 1 && value <= 50); }
}
));
optionManager.add(new vimperator.Option(["previouspattern"], "stringlist",
{
shortHelp: "Patterns to use when guessing the 'previous' page in a document sequence",
defaultValue: "\\bprev|previous\\b,^<$,^(<<|«)$,^(<|«),(<|«)$"
}
));
optionManager.add(new vimperator.Option(["scroll", "scr"], "number",
{
shortHelp: "Number of lines to scroll with <code class=\"mapping\">C-u</code> and <code class=\"mapping\">C-d</code> commands",
defaultValue: 0,
validator: function (value) { return value >= 0; }
}
));
optionManager.add(new vimperator.Option(["showmode", "smd"], "boolean",
{
shortHelp: "Show the current mode in the command line",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["showstatuslinks", "ssli"], "number",
{
shortHelp: "Show the destination of the link under the cursor in the status bar",
defaultValue: 1,
validator: function (value) { return (value >= 0 && value <= 2); }
}
));
optionManager.add(new vimperator.Option(["showtabline", "stal"], "number",
{
shortHelp: "Control when to show the tab bar of opened web pages",
setter: function (value) { setShowTabline(value); },
defaultValue: 2,
validator: function (value) { return (value >= 0 && value <= 2); }
}
));
optionManager.add(new vimperator.Option(["smartcase", "scs"], "boolean",
{
shortHelp: "Override the 'ignorecase' option if the pattern contains uppercase characters",
defaultValue: true
}
));
optionManager.add(new vimperator.Option(["titlestring"], "string",
{
shortHelp: "Change the title of the browser window",
setter: function (value) { setTitleString(value); },
defaultValue: "Vimperator"
}
));
optionManager.add(new vimperator.Option(["usermode", "um"], "boolean",
{
shortHelp: "Show current website with a minimal style sheet to make it easily accessible",
setter: function (value) { getMarkupDocumentViewer().authorStyleDisabled = value; },
getter: function () { return getMarkupDocumentViewer().authorStyleDisabled; },
defaultValue: false
}
));
optionManager.add(new vimperator.Option(["verbose", "vbs"], "number",
{
shortHelp: "Define which type of messages are logged",
defaultValue: 0,
validator: function (value) { return (value >= 0 && value <= 9); }
}
));
optionManager.add(new vimperator.Option(["visualbell", "vb"], "boolean",
{
shortHelp: "Use visual bell instead of beeping on errors",
setter: function (value) { vimperator.options.setPref("accessibility.typeaheadfind.enablesound", !value); },
defaultValue: false
}
));
optionManager.add(new vimperator.Option(["wildmode", "wim"], "stringlist",
{
shortHelp: "Define how command line completion works",
defaultValue: "list:full",
validator: function (value)
{
return value.split(",").every(function (item) { return /^(full|longest|list|list:full|list:longest|)$/.test(item); });
}
}
));
optionManager.add(new vimperator.Option(["wildoptions", "wop"], "stringlist",
{
shortHelp: "Change how command line completion is done",
defaultValue: "",
validator: function (value) { return /^(sort|)$/.test(value); }
}
));
//}}}
// we start with an "empty" GUI so that no toolbars or tabbar is shown if the user
// sets them to empty in the .vimperatorrc, which is sourced asynchronously
if (vimperator.config.name != "Vimperator")
return optionManager;
setShowTabline(0);
setGuiOptions("");
setLastStatus(0);
guioptionsDone = showtablineDone = laststatusDone = false;
setTitleString(optionManager.titlestring);
setPopups(optionManager.popups);
return optionManager;
}; //}}}
// vim: set fdm=marker sw=4 ts=4 et: