complete rewrite of search.xml: more functionalities with less code :-)

add shortkeys to toggle the search engine (bug 200884), by using ctrl-arrow up and down in the search bar.
remove the pref browser.search.defaultengine. Now we rely on the local store so we can have several windows with different search engines.
This commit is contained in:
chanial%noos.fr 2006-02-18 00:13:12 +00:00
Родитель c006e3a89d
Коммит 759d5381ff
1 изменённых файлов: 112 добавлений и 126 удалений

Просмотреть файл

@ -20,6 +20,7 @@
# Rights Reserved.
#
# Contributor(s):
# Pierre Chanial V 2.0 (p_ch@verizon.net)
#
# Alternatively, the contents of this file may be used under the
# terms of the GNU General Public License Version 2 or later (the
@ -46,152 +47,137 @@
setTimeout(function(a) { a.initialize(); }, 0, this);
]]></constructor>
<destructor><![CDATA[
var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.removeObserver("browser.search", this.mPrefObserver);
]]></destructor>
<field name="mPrefs">
var svc = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
svc.getBranch(null);
</field>
<field name="mPrefObserver"><![CDATA[
({
searchBar: this,
observe: function(aObserver, aBlah, aPref) {
if (aPref.indexOf("browser.search") == 0)
this.searchBar.updateEngines();
}
});
]]></field>
<field name="enginesReady">false</field>
<field name="currentSearchId">""</field>
<field name="currentSearchURL">""</field>
<field name="currentSearchName">""</field>
<field name="currentSearchIcon">""</field>
<property name="searchMode"
onget="return this.getAttribute('searchmode');"
onset="this.setAttribute('searchmode', val); return val;"/>
<property name="searchValue" readonly="true">
<getter>
<![CDATA[
if (!this.enginesReady)
this.updateEngines();
const ISEARCH_CONTRACTID = "@mozilla.org/rdf/datasource;1?name=internetsearch";
const nsIInternetSearchService = Components.interfaces.nsIInternetSearchService;
var searchService = Components.classes[ISEARCH_CONTRACTID].getService(nsIInternetSearchService);
if (this.currentSearchURL)
return this.currentSearchURL;
return searchService.GetInternetSearchURL(this.currentSearchId, escape(this.value), 0, 0, {value:0});
]]>
</getter>
</property>
<method name="initialize">
<body><![CDATA[
var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.addObserver("browser.search", this.mPrefObserver, false);
this.updateEngines();
]]></body>
</method>
<method name="updateEngines">
<body><![CDATA[
if (this.getAttribute("searchmode") == "__PhoenixFindInPage")
return;
var rdf = Components.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
try {
var ds = rdf.GetDataSource("rdf:internetsearch");
} catch (ex) {
// sometimes bad profiles cause this error, which horks the searchBar
return;
}
const kNC_Name = rdf.GetResource("http://home.netscape.com/NC-rdf#Name");
const kNC_Icon = rdf.GetResource("http://home.netscape.com/NC-rdf#Icon");
const kNC_searchBarUrl = rdf.GetResource("http://home.netscape.com/NC-rdf#actionBar");
var defaultEngine = null;
try {
defaultEngine = this.mPrefs.getComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsString).data;
} catch(ex) {
this.ensureDefaultEnginePrefs(rdf, ds);
defaultEngine = this.mPrefs.getComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsString).data;
}
if (defaultEngine) {
if (ds) {
var res = rdf.GetResource(defaultEngine);
try {
this.currentSearchURL = this.readRDFString(ds, res, kNC_searchBarUrl);
} catch(ex) { }
this.currentSearchId = res.Value;
this.currentSearchName = this.readRDFString(ds, res, kNC_Name);
this.currentSearchIcon = this.readRDFString(ds, res, kNC_Icon);
this.RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
this.ISEARCHDS = this.RDF.GetDataSource("rdf:internetsearch");
if (this.firstChild && this.firstChild.localName == "image");
this.firstChild.setAttribute("src", this.currentSearchIcon);
}
}
this.enginesReady = true;
var engine = this.currentEngine;
if (!engine)
this.currentEngine = this.getDefaultEngine();
]]></body>
</method>
<method name="ensureDefaultEnginePrefs">
<parameter name="aRDF"/>
<parameter name="aDS"/>
<body><![CDATA[
var defaultName = this.mPrefs.getComplexValue("browser.search.defaultenginename",
Components.interfaces.nsIPrefLocalizedString).data;
const kNC_Root = aRDF.GetResource("NC:SearchEngineRoot");
const kNC_child = aRDF.GetResource("http://home.netscape.com/NC-rdf#child");
const kNC_Name = aRDF.GetResource("http://home.netscape.com/NC-rdf#Name");
<field name="RDF"/>
<field name="ISEARCHDS"/>
<property name="currentEngine"
onget="return this.getAttribute('searchengine')">
<setter><![CDATA[
if (!val)
return;
this.setAttribute("searchengine", val);
if (val == "__PhoenixFindInPage") {
this.setAttribute("autocompletesearchparam", "__PhoenixFindInPage");
this.firstChild.removeAttribute("src");
return;
}
this.setAttribute("autocompletesearchparam", "q");
const kNC_Icon = this.RDF.GetResource("http://home.netscape.com/NC-rdf#Icon");
var rEngine = this.RDF.GetResource(val);
this.firstChild.setAttribute("src", this.readRDFString(rEngine, kNC_Icon));
var arcs = aDS.GetTargets(kNC_Root, kNC_child, true);
]]></setter>
</property>
<method name="getDefaultEngine">
<body><![CDATA[
var PREF = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch(null);
var defaultName = PREF.getComplexValue("browser.search.defaultenginename",
Components.interfaces.nsIPrefLocalizedString).data;
const kNC_Root = this.RDF.GetResource("NC:SearchEngineRoot");
const kNC_child = this.RDF.GetResource("http://home.netscape.com/NC-rdf#child");
const kNC_Name = this.RDF.GetResource("http://home.netscape.com/NC-rdf#Name");
var arcs = this.ISEARCHDS.GetTargets(kNC_Root, kNC_child, true);
while (arcs.hasMoreElements()) {
var engineRes = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var name = this.readRDFString(aDS, engineRes, kNC_Name);
if (name == defaultName) {
var str = Components.classes["@mozilla.org/supports-string;1"]
.createInstance(Components.interfaces.nsISupportsString);
str.data = engineRes.Value;
this.mPrefs.setComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsString,
str);
}
var rEngine = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var name = this.readRDFString(rEngine, kNC_Name);
if (name == defaultName)
return rEngine.Value;
}
return null;
]]></body>
</method>
<method name="readRDFString">
<parameter name="aDS"/>
<parameter name="aRes"/>
<parameter name="aProp"/>
<body><![CDATA[
var n = aDS.GetTarget(aRes, aProp, true);
var n = this.ISEARCHDS.GetTarget(aRes, aProp, true);
return n ? n.QueryInterface(Components.interfaces.nsIRDFLiteral).Value : null;
]]></body>
</method>
<method name="onTextEntered">
<parameter name="aEvent"/>
<body><![CDATA[
// Save the current value in the form history
if (gFormFillEnabled) {
if (!gFormHistory)
gFormHistory = Components.classes["@mozilla.org/satchel/form-history;1"]
.getService(Components.interfaces.nsIFormHistory);
gFormHistory.addEntry(this.getAttribute("autocompletesearchparam"), this.value);
}
if (this.currentEngine != "__PhoenixFindInPage") {
const ISEARCH_CONTRACTID = "@mozilla.org/rdf/datasource;1?name=internetsearch";
const nsIInternetSearchService = Components.interfaces.nsIInternetSearchService;
var ISEARCHSVC = Components.classes[ISEARCH_CONTRACTID]
.getService(nsIInternetSearchService);
var searchURL = ISEARCHSVC.GetInternetSearchURL(this.currentEngine, escape(this.value),
0, 0, {value:0});
gURLBar.value = searchURL;
BrowserLoadURL(aEvent);
} else {
quickFindInPage(this.value);
}
]]></body>
</method>
</implementation>
<handlers>
<handler event="keypress" keycode="vk_up" modifiers="control">
<![CDATA[
var currentEngine = this.currentEngine;
if (!currentEngine || currentEngine == "__PhoenixFindInPage")
return;
var searchEngineMenuitem = document.getElementById(currentEngine);
var newEngine = searchEngineMenuitem.previousSibling;
if (!newEngine.id)
newEngine = {id: "__PhoenixFindInPage"}
this.currentEngine = newEngine.id;
]]>
</handler>
<handler event="keypress" keycode="vk_down" modifiers="control">
<![CDATA[
var currentEngine = this.currentEngine;
if (!currentEngine)
return;
var searchEngineMenuitem = document.getElementById(currentEngine);
var newEngine;
if (currentEngine == "__PhoenixFindInPage") {
newEngine = searchEngineMenuitem.nextSibling.nextSibling.nextSibling;
} else {
newEngine = searchEngineMenuitem.nextSibling;
}
if (newEngine)
this.currentEngine = newEngine.id;
]]>
</handler>
</handlers>
</binding>
</bindings>