diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/search/FileBasedSearchResultsPane.js')
-rw-r--r-- | chromium/third_party/WebKit/Source/devtools/front_end/search/FileBasedSearchResultsPane.js | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/search/FileBasedSearchResultsPane.js b/chromium/third_party/WebKit/Source/devtools/front_end/search/FileBasedSearchResultsPane.js new file mode 100644 index 00000000000..6c6cd9035e9 --- /dev/null +++ b/chromium/third_party/WebKit/Source/devtools/front_end/search/FileBasedSearchResultsPane.js @@ -0,0 +1,231 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @constructor + * @extends {WebInspector.SearchResultsPane} + * @param {!WebInspector.ProjectSearchConfig} searchConfig + */ +WebInspector.FileBasedSearchResultsPane = function(searchConfig) +{ + WebInspector.SearchResultsPane.call(this, searchConfig); + + this._searchResults = []; + + this.element.id = "search-results-pane-file-based"; + + this._treeOutlineElement = document.createElement("ol"); + this._treeOutlineElement.className = "search-results-outline-disclosure"; + this.element.appendChild(this._treeOutlineElement); + this._treeOutline = new TreeOutline(this._treeOutlineElement); + + this._matchesExpandedCount = 0; +} + +WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount = 20; +WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce = 20; + +WebInspector.FileBasedSearchResultsPane.prototype = { + /** + * @param {!WebInspector.FileBasedSearchResult} searchResult + */ + addSearchResult: function(searchResult) + { + this._searchResults.push(searchResult); + var uiSourceCode = searchResult.uiSourceCode; + if (!uiSourceCode) + return; + this._addFileTreeElement(searchResult); + }, + + /** + * @param {!WebInspector.FileBasedSearchResult} searchResult + */ + _addFileTreeElement: function(searchResult) + { + var fileTreeElement = new WebInspector.FileBasedSearchResultsPane.FileTreeElement(this._searchConfig, searchResult); + this._treeOutline.appendChild(fileTreeElement); + // Expand until at least a certain number of matches is expanded. + if (this._matchesExpandedCount < WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount) + fileTreeElement.expand(); + this._matchesExpandedCount += searchResult.searchMatches.length; + }, + + __proto__: WebInspector.SearchResultsPane.prototype +} + +/** + * @constructor + * @extends {TreeElement} + * @param {!WebInspector.ProjectSearchConfig} searchConfig + * @param {!WebInspector.FileBasedSearchResult} searchResult + */ +WebInspector.FileBasedSearchResultsPane.FileTreeElement = function(searchConfig, searchResult) +{ + TreeElement.call(this, "", null, true); + this._searchConfig = searchConfig; + this._searchResult = searchResult; + + this.toggleOnClick = true; + this.selectable = false; +} + +WebInspector.FileBasedSearchResultsPane.FileTreeElement.prototype = { + onexpand: function() + { + if (this._initialized) + return; + + this._updateMatchesUI(); + this._initialized = true; + }, + + _updateMatchesUI: function() + { + this.removeChildren(); + var toIndex = Math.min(this._searchResult.searchMatches.length, WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce); + if (toIndex < this._searchResult.searchMatches.length) { + this._appendSearchMatches(0, toIndex - 1); + this._appendShowMoreMatchesElement(toIndex - 1); + } else { + this._appendSearchMatches(0, toIndex); + } + }, + + onattach: function() + { + this._updateSearchMatches(); + }, + + _updateSearchMatches: function() + { + this.listItemElement.classList.add("search-result"); + + var fileNameSpan = document.createElement("span"); + fileNameSpan.className = "search-result-file-name"; + fileNameSpan.textContent = this._searchResult.uiSourceCode.fullDisplayName(); + this.listItemElement.appendChild(fileNameSpan); + + var matchesCountSpan = document.createElement("span"); + matchesCountSpan.className = "search-result-matches-count"; + + var searchMatchesCount = this._searchResult.searchMatches.length; + if (searchMatchesCount === 1) + matchesCountSpan.textContent = WebInspector.UIString("(%d match)", searchMatchesCount); + else + matchesCountSpan.textContent = WebInspector.UIString("(%d matches)", searchMatchesCount); + + this.listItemElement.appendChild(matchesCountSpan); + if (this.expanded) + this._updateMatchesUI(); + }, + + /** + * @param {number} fromIndex + * @param {number} toIndex + */ + _appendSearchMatches: function(fromIndex, toIndex) + { + var searchResult = this._searchResult; + var uiSourceCode = searchResult.uiSourceCode; + var searchMatches = searchResult.searchMatches; + + var queries = this._searchConfig.queries(); + var regexes = []; + for (var i = 0; i < queries.length; ++i) + regexes.push(createSearchRegex(queries[i], !this._searchConfig.ignoreCase(), this._searchConfig.isRegex())); + + for (var i = fromIndex; i < toIndex; ++i) { + var lineNumber = searchMatches[i].lineNumber; + var lineContent = searchMatches[i].lineContent; + var matchRanges = []; + for (var j = 0; j < regexes.length; ++j) + matchRanges = matchRanges.concat(this._regexMatchRanges(lineContent, regexes[j])); + + var anchor = this._createAnchor(uiSourceCode, lineNumber, matchRanges[0].offset); + + var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4); + var lineNumberSpan = document.createElement("span"); + lineNumberSpan.classList.add("search-match-line-number"); + lineNumberSpan.textContent = numberString; + anchor.appendChild(lineNumberSpan); + + var contentSpan = this._createContentSpan(lineContent, matchRanges); + anchor.appendChild(contentSpan); + + var searchMatchElement = new TreeElement(""); + searchMatchElement.selectable = false; + this.appendChild(searchMatchElement); + searchMatchElement.listItemElement.className = "search-match source-code"; + searchMatchElement.listItemElement.appendChild(anchor); + } + }, + + /** + * @param {number} startMatchIndex + */ + _appendShowMoreMatchesElement: function(startMatchIndex) + { + var matchesLeftCount = this._searchResult.searchMatches.length - startMatchIndex; + var showMoreMatchesText = WebInspector.UIString("Show all matches (%d more).", matchesLeftCount); + this._showMoreMatchesTreeElement = new TreeElement(showMoreMatchesText); + this.appendChild(this._showMoreMatchesTreeElement); + this._showMoreMatchesTreeElement.listItemElement.classList.add("show-more-matches"); + this._showMoreMatchesTreeElement.onselect = this._showMoreMatchesElementSelected.bind(this, startMatchIndex); + }, + + /** + * @param {!WebInspector.UISourceCode} uiSourceCode + * @param {number} lineNumber + * @param {number} columnNumber + * @return {!Element} + */ + _createAnchor: function(uiSourceCode, lineNumber, columnNumber) + { + return WebInspector.Linkifier.linkifyUsingRevealer(uiSourceCode.uiLocation(lineNumber, columnNumber), "", uiSourceCode.url, lineNumber); + }, + + /** + * @param {string} lineContent + * @param {!Array.<!WebInspector.SourceRange>} matchRanges + */ + _createContentSpan: function(lineContent, matchRanges) + { + var contentSpan = document.createElement("span"); + contentSpan.className = "search-match-content"; + contentSpan.textContent = lineContent; + WebInspector.highlightRangesWithStyleClass(contentSpan, matchRanges, "highlighted-match"); + return contentSpan; + }, + + /** + * @param {string} lineContent + * @param {!RegExp} regex + * @return {!Array.<!WebInspector.SourceRange>} + */ + _regexMatchRanges: function(lineContent, regex) + { + regex.lastIndex = 0; + var match; + var offset = 0; + var matchRanges = []; + while ((regex.lastIndex < lineContent.length) && (match = regex.exec(lineContent))) + matchRanges.push(new WebInspector.SourceRange(match.index, match[0].length)); + + return matchRanges; + }, + + /** + * @param {number} startMatchIndex + * @return {boolean} + */ + _showMoreMatchesElementSelected: function(startMatchIndex) + { + this.removeChild(this._showMoreMatchesTreeElement); + this._appendSearchMatches(startMatchIndex, this._searchResult.searchMatches.length); + return false; + }, + + __proto__: TreeElement.prototype +} |