Bug 343707: Add Restore Default Search Engines button to search manager, patch by Michael Wu <michael.wu@mozilla.com>, r=me

This commit is contained in:
gavin%gavinsharp.com 2006-08-07 23:26:27 +00:00
parent cefc0731a0
commit 599cc60aa0
5 changed files with 121 additions and 3 deletions

View File

@ -106,6 +106,16 @@ var gEngineManagerDialog = {
os.removeObserver(this, "browser-search-engine-modified");
},
onRestoreDefaults: function engineManager_onRestoreDefaults() {
var num = gEngineView._engineStore.restoreDefaultEngines();
gEngineView.rowCountChanged(0, num);
gEngineView.invalidate();
},
showRestoreDefaults: function engineManager_showRestoreDefaults(val) {
document.documentElement.getButton("extra2").disabled = !val;
},
loadAddEngines: function engineManager_loadAddEngines() {
this.onOK();
window.opener.BrowserSearch.loadAddEngines();
@ -205,15 +215,38 @@ EngineRemoveOp.prototype = {
}
}
function EngineUnhideOp(aEngineClone, aNewIndex) {
if (!aEngineClone)
throw new Error("bad args to new EngineUnhideOp!");
this._engine = aEngineClone.originalEngine;
this._newIndex = aNewIndex;
}
EngineUnhideOp.prototype = {
_engine: null,
_newIndex: null,
commit: function EUO_commit() {
this._engine.hidden = false;
var searchService = Cc["@mozilla.org/browser/search-service;1"].
getService(Ci.nsIBrowserSearchService);
searchService.moveEngine(this._engine, this._newIndex);
}
}
function EngineStore() {
var searchService = Cc["@mozilla.org/browser/search-service;1"].
getService(Ci.nsIBrowserSearchService);
this._engines = searchService.getVisibleEngines({}).map(this._cloneEngine);
this._defaultEngines = searchService.getDefaultEngines({}).map(this._cloneEngine);
this._ops = [];
// check if we need to disable the restore defaults button
var someHidden = this._defaultEngines.some(function (e) {return e.hidden;});
gEngineManagerDialog.showRestoreDefaults(someHidden);
}
EngineStore.prototype = {
_engines: null,
_defaultEngines: null,
_ops: null,
get engines() {
@ -221,6 +254,7 @@ EngineStore.prototype = {
},
set engines(val) {
this._engines = val;
return val;
},
_getIndexForEngine: function ES_getIndexForEngine(aEngine) {
@ -235,9 +269,23 @@ EngineStore.prototype = {
return newO;
},
// Callback for Array's some(). A thisObj must be passed to some()
_isSameEngine: function ES_isSameEngine(aEngineClone) {
return aEngineClone.originalEngine == this.originalEngine;
},
commit: function ES_commit() {
var searchService = Cc["@mozilla.org/browser/search-service;1"].
getService(Ci.nsIBrowserSearchService);
var currentEngine = this._cloneEngine(searchService.currentEngine);
for (var i = 0; i < this._ops.length; i++)
this._ops[i].commit();
// Restore currentEngine if it is a default engine that is still visible.
// Needed if the user deletes currentEngine and then restores it.
if (this._defaultEngines.some(this._isSameEngine, currentEngine) &&
!currentEngine.originalEngine.hidden)
searchService.currentEngine = currentEngine.originalEngine;
},
addEngine: function ES_addEngine(aEngine) {
@ -265,6 +313,23 @@ EngineStore.prototype = {
this._engines.splice(index, 1);
this._ops.push(new EngineRemoveOp(aEngine));
if (this._defaultEngines.some(this._isSameEngine, aEngine))
gEngineManagerDialog.showRestoreDefaults(true);
},
restoreDefaultEngines: function ES_restoreDefaultEngines() {
var i = 0;
for each (var e in this._defaultEngines) {
// skip adding engine if the engine is already in the list
if (this._engines.some(this._isSameEngine, e))
continue;
this._engines.splice(i, 0, e);
this._ops.push(new EngineUnhideOp(e, i));
i++;
}
gEngineManagerDialog.showRestoreDefaults(false);
return i;
},
reloadIcons: function ES_reloadIcons() {

View File

@ -44,10 +44,13 @@
<dialog id="engineManager"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
buttons="accept,cancel"
buttons="accept,cancel,extra2"
buttonlabelextra2="&restoreDefaults.label;"
buttonaccesskeyextra2="&restoreDefaults.accesskey;"
onload="gEngineManagerDialog.init();"
ondialogaccept="gEngineManagerDialog.onOK();"
ondialogcancel="gEngineManagerDialog.onCancel();"
ondialogextra2="gEngineManagerDialog.onRestoreDefaults();"
title="&engineManager.title;"
style="&engineManager.style;"
persist="screenX screenY"

View File

@ -162,7 +162,7 @@ interface nsISearchEngine : nsISupports
};
[scriptable, uuid(0c6164fe-580d-497f-87d3-1bf36006cb7c)]
[scriptable, uuid(8307b8f2-08ea-45b8-96bf-b1dc7688fe3b)]
interface nsIBrowserSearchService : nsISupports
{
/**
@ -228,7 +228,8 @@ interface nsIBrowserSearchService : nsISupports
/**
* Un-hides all engines installed in the directory corresponding to
* the directory service's NS_APP_SEARCH_DIR key.
* the directory service's NS_APP_SEARCH_DIR key. (i.e. the set of
* engines returned by getDefaultEngines)
*/
void restoreDefaultEngines();
@ -271,6 +272,15 @@ interface nsIBrowserSearchService : nsISupports
out unsigned long engineCount,
[retval, array, size_is(engineCount)] out nsISearchEngine engines);
/**
* Returns an array of all default search engines.
*
* @returns an array of nsISearchEngine objects.
*/
void getDefaultEngines(
out unsigned long engineCount,
[retval, array, size_is(engineCount)] out nsISearchEngine engines);
/**
* Moves a search engine.
*

View File

@ -2537,6 +2537,43 @@ SearchService.prototype = {
return engines;
},
getDefaultEngines: function SRCH_SVC_getDefault(aCount) {
function isDefault (engine) {
return engine._isInAppDir;
};
var engines = this._sortedEngines.filter(isDefault);
var prefB = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefService).
getBranch(BROWSER_SEARCH_PREF + "order.");
var engineOrder = {};
var i = 1;
while (true) {
try {
engineOrder[prefB.getCharPref(i)] = i++;
} catch (ex) {
break;
}
}
function compareEngines (a, b) {
var aIdx = engineOrder[a.name];
var bIdx = engineOrder[b.name];
if (aIdx && bIdx)
return aIdx - bIdx;
if (aIdx)
return -1;
if (bIdx)
return 1;
return a.name < b.name ? -1 : 1;
}
engines.sort(compareEngines);
aCount.value = engines.length;
return engines;
},
getEngineByName: function SRCH_SVC_getEngineByName(aEngineName) {
return this._engines[aEngineName] || null;
},

View File

@ -15,3 +15,6 @@
<!ENTITY enableSuggest.label "Show search suggestions">
<!ENTITY enableSuggest.accesskey "S">
<!ENTITY restoreDefaults.label "Restore Defaults">
<!ENTITY restoreDefaults.accesskey "e">