michael@0: michael@0: const nsISupports = Components.interfaces.nsISupports; michael@0: const nsIAutoCompleteResult = Components.interfaces.nsIAutoCompleteResult; michael@0: const nsIAutoCompleteSearch = Components.interfaces.nsIAutoCompleteSearch; michael@0: const nsIFactory = Components.interfaces.nsIFactory; michael@0: const nsIUUIDGenerator = Components.interfaces.nsIUUIDGenerator; michael@0: const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar; michael@0: michael@0: var gDefaultAutoCompleteSearch = null; michael@0: michael@0: /** michael@0: * Register 'test-a11y-search' AutoCompleteSearch. michael@0: * michael@0: * @param aValues [in] set of possible results values michael@0: * @param aComments [in] set of possible results descriptions michael@0: */ michael@0: function initAutoComplete(aValues, aComments) michael@0: { michael@0: var allResults = new ResultsHeap(aValues, aComments); michael@0: gDefaultAutoCompleteSearch = michael@0: new AutoCompleteSearch("test-a11y-search", allResults); michael@0: registerAutoCompleteSearch(gDefaultAutoCompleteSearch, michael@0: "Accessibility Test AutoCompleteSearch"); michael@0: } michael@0: michael@0: /** michael@0: * Unregister 'test-a11y-search' AutoCompleteSearch. michael@0: */ michael@0: function shutdownAutoComplete() michael@0: { michael@0: unregisterAutoCompleteSearch(gDefaultAutoCompleteSearch); michael@0: gDefaultAutoCompleteSearch.cid = null; michael@0: gDefaultAutoCompleteSearch = null; michael@0: } michael@0: michael@0: michael@0: /** michael@0: * Register the given AutoCompleteSearch. michael@0: * michael@0: * @param aSearch [in] AutoCompleteSearch object michael@0: * @param aDescription [in] description of the search object michael@0: */ michael@0: function registerAutoCompleteSearch(aSearch, aDescription) michael@0: { michael@0: var name = "@mozilla.org/autocomplete/search;1?name=" + aSearch.name; michael@0: michael@0: var uuidGenerator = Components.classes["@mozilla.org/uuid-generator;1"]. michael@0: getService(nsIUUIDGenerator); michael@0: var cid = uuidGenerator.generateUUID(); michael@0: michael@0: var componentManager = Components.manager.QueryInterface(nsIComponentRegistrar); michael@0: componentManager.registerFactory(cid, aDescription, name, aSearch); michael@0: michael@0: // Keep the id on the object so we can unregister later. michael@0: aSearch.cid = cid; michael@0: } michael@0: michael@0: /** michael@0: * Unregister the given AutoCompleteSearch. michael@0: */ michael@0: function unregisterAutoCompleteSearch(aSearch) michael@0: { michael@0: var componentManager = Components.manager.QueryInterface(nsIComponentRegistrar); michael@0: componentManager.unregisterFactory(aSearch.cid, aSearch); michael@0: } michael@0: michael@0: michael@0: /** michael@0: * A container to keep all possible results of autocomplete search. michael@0: */ michael@0: function ResultsHeap(aValues, aComments) michael@0: { michael@0: this.values = aValues; michael@0: this.comments = aComments; michael@0: } michael@0: michael@0: ResultsHeap.prototype = michael@0: { michael@0: constructor: ResultsHeap, michael@0: michael@0: /** michael@0: * Return AutoCompleteResult for the given search string. michael@0: */ michael@0: getAutoCompleteResultFor: function(aSearchString) michael@0: { michael@0: var values = [], comments = []; michael@0: for (var idx = 0; idx < this.values.length; idx++) { michael@0: if (this.values[idx].indexOf(aSearchString) != -1) { michael@0: values.push(this.values[idx]); michael@0: comments.push(this.comments[idx]); michael@0: } michael@0: } michael@0: return new AutoCompleteResult(values, comments); michael@0: } michael@0: } michael@0: michael@0: michael@0: /** michael@0: * nsIAutoCompleteSearch implementation. michael@0: * michael@0: * @param aName [in] the name of autocomplete search michael@0: * @param aAllResults [in] ResultsHeap object michael@0: */ michael@0: function AutoCompleteSearch(aName, aAllResults) michael@0: { michael@0: this.name = aName; michael@0: this.allResults = aAllResults; michael@0: } michael@0: michael@0: AutoCompleteSearch.prototype = michael@0: { michael@0: constructor: AutoCompleteSearch, michael@0: michael@0: // nsIAutoCompleteSearch implementation michael@0: startSearch: function(aSearchString, aSearchParam, aPreviousResult, michael@0: aListener) michael@0: { michael@0: var result = this.allResults.getAutoCompleteResultFor(aSearchString); michael@0: aListener.onSearchResult(this, result); michael@0: }, michael@0: michael@0: stopSearch: function() {}, michael@0: michael@0: // nsISupports implementation michael@0: QueryInterface: function(iid) michael@0: { michael@0: if (iid.equals(nsISupports) || michael@0: iid.equals(nsIFactory) || michael@0: iid.equals(nsIAutoCompleteSearch)) michael@0: return this; michael@0: michael@0: throw Components.results.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: michael@0: // nsIFactory implementation michael@0: createInstance: function(outer, iid) michael@0: { michael@0: return this.QueryInterface(iid); michael@0: }, michael@0: michael@0: // Search name. Used by AutoCompleteController. michael@0: name: null, michael@0: michael@0: // Results heap. michael@0: allResults: null michael@0: } michael@0: michael@0: michael@0: /** michael@0: * nsIAutoCompleteResult implementation. michael@0: */ michael@0: function AutoCompleteResult(aValues, aComments) michael@0: { michael@0: this.values = aValues; michael@0: this.comments = aComments; michael@0: michael@0: if (this.values.length > 0) michael@0: this.searchResult = nsIAutoCompleteResult.RESULT_SUCCESS; michael@0: else michael@0: this.searchResult = nsIAutoCompleteResult.NOMATCH; michael@0: } michael@0: michael@0: AutoCompleteResult.prototype = michael@0: { michael@0: constructor: AutoCompleteResult, michael@0: michael@0: searchString: "", michael@0: searchResult: null, michael@0: michael@0: defaultIndex: 0, michael@0: michael@0: get matchCount() michael@0: { michael@0: return this.values.length; michael@0: }, michael@0: michael@0: getValueAt: function(aIndex) michael@0: { michael@0: return this.values[aIndex]; michael@0: }, michael@0: michael@0: getLabelAt: function(aIndex) michael@0: { michael@0: return this.getValueAt(aIndex); michael@0: }, michael@0: michael@0: getCommentAt: function(aIndex) michael@0: { michael@0: return this.comments[aIndex]; michael@0: }, michael@0: michael@0: getStyleAt: function(aIndex) michael@0: { michael@0: return null; michael@0: }, michael@0: michael@0: getImageAt: function(aIndex) michael@0: { michael@0: return ""; michael@0: }, michael@0: michael@0: getFinalCompleteValueAt: function(aIndex) michael@0: { michael@0: return this.getValueAt(aIndex); michael@0: }, michael@0: michael@0: removeValueAt: function (aRowIndex, aRemoveFromDb) {}, michael@0: michael@0: // nsISupports implementation michael@0: QueryInterface: function(iid) { michael@0: if (iid.equals(nsISupports) || michael@0: iid.equals(nsIAutoCompleteResult)) michael@0: return this; michael@0: michael@0: throw Components.results.NS_ERROR_NO_INTERFACE; michael@0: }, michael@0: michael@0: // Data michael@0: values: null, michael@0: comments: null michael@0: }