Index: Source/devtools/front_end/FilterBar.js |
diff --git a/Source/devtools/front_end/FilterBar.js b/Source/devtools/front_end/FilterBar.js |
index 7a661766642d382d6f72b47c210e8da923ebc9aa..b35aef87718e5b63e6ade2c184dfab0a5db23d0f 100644 |
--- a/Source/devtools/front_end/FilterBar.js |
+++ b/Source/devtools/front_end/FilterBar.js |
@@ -164,8 +164,9 @@ WebInspector.FilterUI.prototype = { |
/** |
* @constructor |
- * @implements {WebInspector.FilterUI} |
* @extends {WebInspector.Object} |
+ * @implements {WebInspector.FilterUI} |
+ * @implements {WebInspector.SuggestBoxDelegate} |
* @param {boolean=} supportRegex |
*/ |
WebInspector.TextFilterUI = function(supportRegex) |
@@ -182,6 +183,13 @@ WebInspector.TextFilterUI = function(supportRegex) |
this._filterInputElement.addEventListener("mousedown", this._onFilterFieldManualFocus.bind(this), false); // when the search field is manually selected |
this._filterInputElement.addEventListener("input", this._onInput.bind(this), false); |
this._filterInputElement.addEventListener("change", this._onInput.bind(this), false); |
+ this._filterInputElement.addEventListener("keydown", this._onInputKeyDown.bind(this), true); |
+ this._filterInputElement.addEventListener("blur", this._onBlur.bind(this), true); |
+ |
+ /** @type {?WebInspector.TextFilterUI.SuggestionBuilder} */ |
+ this._suggestionBuilder = null; |
+ |
+ this._suggestBox = new WebInspector.SuggestBox(this, this._filterElement); |
if (this._supportRegex) { |
this._filterElement.classList.add("supports-regex"); |
@@ -247,6 +255,14 @@ WebInspector.TextFilterUI.prototype = { |
}, |
/** |
+ * @param {?Event} event |
+ */ |
+ _onBlur: function(event) |
+ { |
+ this._suggestBox.hide(); |
+ }, |
+ |
+ /** |
* @param {!WebInspector.Event} event |
*/ |
_onInput: function(event) |
@@ -254,7 +270,32 @@ WebInspector.TextFilterUI.prototype = { |
this._valueChanged(); |
}, |
- _valueChanged: function() { |
+ /** |
+ * @param {?WebInspector.TextFilterUI.SuggestionBuilder} suggestionBuilder |
+ */ |
+ setSuggestionBuilder: function(suggestionBuilder) |
+ { |
+ this._suggestionBuilder = suggestionBuilder; |
+ if (document.activeElement === this._filterInputElement) |
+ this._updateSuggestions(); |
+ }, |
+ |
+ _updateSuggestions: function() |
+ { |
+ if (!this._suggestionBuilder) { |
+ this._suggestBox.hide(); |
+ return; |
+ } |
+ var suggestions = this._suggestionBuilder.buildSuggestions(this._filterInputElement); |
+ if (suggestions && suggestions.length) |
+ this._suggestBox.updateSuggestions(null, suggestions, 0, true, ""); |
+ else |
+ this._suggestBox.hide(); |
+ }, |
+ |
+ _valueChanged: function() |
+ { |
+ this._updateSuggestions(); |
var filterQuery = this.value(); |
this._regex = null; |
@@ -274,10 +315,68 @@ WebInspector.TextFilterUI.prototype = { |
this.dispatchEventToListeners(WebInspector.FilterUI.Events.FilterChanged, null); |
}, |
+ /** |
+ * @param {!KeyboardEvent} event |
+ * @return {boolean} |
+ */ |
+ _onInputKeyDown: function(event) |
+ { |
+ var handled = false; |
+ if (this._suggestBox.visible()) { |
+ if (event.keyIdentifier === "U+0009") // Tab |
+ handled = this._suggestBox.enterKeyPressed(); |
+ else |
+ handled = this._suggestBox.keyPressed(event); |
+ } |
+ if (handled) |
+ event.consume(true); |
+ return handled; |
+ }, |
+ |
+ /** |
+ * @override |
+ * @param {string} suggestion |
+ * @param {boolean=} isIntermediateSuggestion |
+ */ |
+ applySuggestion: function(suggestion, isIntermediateSuggestion) |
+ { |
+ if (!this._suggestionBuilder || isIntermediateSuggestion) |
+ return; |
+ this._suggestionBuilder.applySuggestion(this._filterInputElement, suggestion); |
+ }, |
+ |
+ /** @override */ |
+ acceptSuggestion: function() |
+ { |
+ this._filterInputElement.scrollLeft = this._filterInputElement.scrollWidth; |
+ this._valueChanged(); |
+ }, |
+ |
__proto__: WebInspector.Object.prototype |
} |
/** |
+ * @interface |
+ */ |
+WebInspector.TextFilterUI.SuggestionBuilder = function() |
+{ |
+} |
+ |
+WebInspector.TextFilterUI.SuggestionBuilder.prototype = { |
+ /** |
+ * @param {!HTMLInputElement} input |
+ * @return {?Array.<string>} |
+ */ |
+ buildSuggestions: function(input) { }, |
+ |
+ /** |
+ * @param {!HTMLInputElement} input |
+ * @param {string} suggestion |
+ */ |
+ applySuggestion: function(input, suggestion) { } |
+} |
+ |
+/** |
* @constructor |
* @implements {WebInspector.FilterUI} |
* @extends {WebInspector.Object} |