OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * | 10 * |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 | 76 |
77 /** | 77 /** |
78 * @param {number} searchId | 78 * @param {number} searchId |
79 * @param {Object} searchResult | 79 * @param {Object} searchResult |
80 */ | 80 */ |
81 _onSearchResult: function(searchId, searchResult) | 81 _onSearchResult: function(searchId, searchResult) |
82 { | 82 { |
83 if (searchId !== this._searchId) | 83 if (searchId !== this._searchId) |
84 return; | 84 return; |
85 | 85 |
| 86 this._searchView.addSearchResult(searchResult); |
| 87 if (!searchResult.searchMatches.length) |
| 88 return; |
| 89 |
86 if (!this._searchResultsPane) | 90 if (!this._searchResultsPane) |
87 this._searchResultsPane = this._currentSearchScope.createSearchResul
tsPane(this._searchConfig); | 91 this._searchResultsPane = this._currentSearchScope.createSearchResul
tsPane(this._searchConfig); |
88 this._searchView.resultsPane = this._searchResultsPane; | 92 this._searchView.resultsPane = this._searchResultsPane; |
89 this._searchResultsPane.addSearchResult(searchResult); | 93 this._searchResultsPane.addSearchResult(searchResult); |
90 }, | 94 }, |
91 | 95 |
92 /** | 96 /** |
93 * @param {number} searchId | 97 * @param {number} searchId |
| 98 * @param {boolean} finished |
94 */ | 99 */ |
95 _onSearchFinished: function(searchId) | 100 _onSearchFinished: function(searchId, finished) |
96 { | 101 { |
97 if (searchId !== this._searchId) | 102 if (searchId !== this._searchId) |
98 return; | 103 return; |
99 | 104 |
100 if (!this._searchResultsPane) | 105 if (!this._searchResultsPane) |
101 this._searchView.nothingFound(); | 106 this._searchView.nothingFound(); |
102 | 107 |
103 this._searchView.searchFinished(); | 108 this._searchView.searchFinished(finished); |
104 }, | 109 }, |
105 | 110 |
106 /** | 111 /** |
107 * @param {WebInspector.SearchConfig} searchConfig | 112 * @param {WebInspector.SearchConfig} searchConfig |
108 */ | 113 */ |
109 startSearch: function(searchConfig) | 114 startSearch: function(searchConfig) |
110 { | 115 { |
111 this.stopSearch(); | 116 this.resetSearch(); |
| 117 ++this._searchId; |
112 | 118 |
113 this._searchConfig = searchConfig; | 119 this._searchConfig = searchConfig; |
114 // FIXME: this._currentSearchScope should be initialized based on search
Config | 120 // FIXME: this._currentSearchScope should be initialized based on search
Config |
115 this._currentSearchScope = this._searchScope; | 121 this._currentSearchScope = this._searchScope; |
116 | 122 |
117 this._searchView.searchStarted(); | 123 var totalSearchResultsCount = this._currentSearchScope.performSearch(sea
rchConfig, this._onSearchResult.bind(this, this._searchId), this._onSearchFinish
ed.bind(this, this._searchId)); |
118 this._currentSearchScope.performSearch(searchConfig, this._onSearchResul
t.bind(this, this._searchId), this._onSearchFinished.bind(this, this._searchId))
; | 124 this._searchView.searchStarted(totalSearchResultsCount); |
| 125 }, |
| 126 |
| 127 resetSearch: function() |
| 128 { |
| 129 this.stopSearch(); |
| 130 |
| 131 if (this._searchResultsPane) { |
| 132 this._searchView.resetResults(); |
| 133 delete this._searchResultsPane; |
| 134 } |
119 }, | 135 }, |
120 | 136 |
121 stopSearch: function() | 137 stopSearch: function() |
122 { | 138 { |
123 ++this._searchId; | |
124 delete this._searchResultsPane; | |
125 if (this._currentSearchScope) | 139 if (this._currentSearchScope) |
126 this._currentSearchScope.stopSearch(); | 140 this._currentSearchScope.stopSearch(); |
127 } | 141 } |
128 } | 142 } |
129 | 143 |
130 /** | 144 /** |
131 * @constructor | 145 * @constructor |
132 * @extends {WebInspector.View} | 146 * @extends {WebInspector.View} |
133 * @param {WebInspector.AdvancedSearchController} controller | 147 * @param {WebInspector.AdvancedSearchController} controller |
134 */ | 148 */ |
(...skipping 20 matching lines...) Expand all Loading... |
155 this._search.setAttribute("results", "0"); | 169 this._search.setAttribute("results", "0"); |
156 this._search.setAttribute("size", 20); | 170 this._search.setAttribute("size", 20); |
157 | 171 |
158 this._ignoreCaseLabel = this._searchPanelElement.createChild("label"); | 172 this._ignoreCaseLabel = this._searchPanelElement.createChild("label"); |
159 this._ignoreCaseLabel.addStyleClass("search-config-label"); | 173 this._ignoreCaseLabel.addStyleClass("search-config-label"); |
160 this._ignoreCaseCheckbox = this._ignoreCaseLabel.createChild("input"); | 174 this._ignoreCaseCheckbox = this._ignoreCaseLabel.createChild("input"); |
161 this._ignoreCaseCheckbox.setAttribute("type", "checkbox"); | 175 this._ignoreCaseCheckbox.setAttribute("type", "checkbox"); |
162 this._ignoreCaseCheckbox.addStyleClass("search-config-checkbox"); | 176 this._ignoreCaseCheckbox.addStyleClass("search-config-checkbox"); |
163 this._ignoreCaseLabel.appendChild(document.createTextNode(WebInspector.UIStr
ing("Ignore case"))); | 177 this._ignoreCaseLabel.appendChild(document.createTextNode(WebInspector.UIStr
ing("Ignore case"))); |
164 | 178 |
165 | |
166 this._regexLabel = this._searchPanelElement.createChild("label"); | 179 this._regexLabel = this._searchPanelElement.createChild("label"); |
167 this._regexLabel.addStyleClass("search-config-label"); | 180 this._regexLabel.addStyleClass("search-config-label"); |
168 this._regexCheckbox = this._regexLabel.createChild("input"); | 181 this._regexCheckbox = this._regexLabel.createChild("input"); |
169 this._regexCheckbox.setAttribute("type", "checkbox"); | 182 this._regexCheckbox.setAttribute("type", "checkbox"); |
170 this._regexCheckbox.addStyleClass("search-config-checkbox"); | 183 this._regexCheckbox.addStyleClass("search-config-checkbox"); |
171 this._regexLabel.appendChild(document.createTextNode(WebInspector.UIString("
Regular expression"))); | 184 this._regexLabel.appendChild(document.createTextNode(WebInspector.UIString("
Regular expression"))); |
172 | 185 |
| 186 this._searchStatusBarElement = document.createElement("div"); |
| 187 this._searchStatusBarElement.className = "search-status-bar-item"; |
| 188 this._searchMessageElement = this._searchStatusBarElement.createChild("div")
; |
| 189 this._searchMessageElement.className = "search-status-bar-message"; |
| 190 this._searchProgressElement = document.createElement("progress"); |
| 191 this._searchProgressElement.className = "search-status-bar-progress"; |
| 192 |
| 193 this._searchStopButtonItem = document.createElement("div"); |
| 194 this._searchStopButtonItem.className = "search-status-bar-stop-button-item"; |
| 195 this._searchStopStatusBarButton = new WebInspector.StatusBarButton(WebInspec
tor.UIString("Stop search"), "search-status-bar-stop-button"); |
| 196 this._searchStopButtonItem.appendChild(this._searchStopStatusBarButton.eleme
nt); |
| 197 this._searchStopStatusBarButton.addEventListener("click", this._searchStopBu
ttonPressed, this); |
| 198 |
| 199 this._searchResultsMessageElement = document.createElement("span"); |
| 200 this._searchResultsMessageElement.className = "search-results-status-bar-mes
sage"; |
| 201 |
173 this._load(); | 202 this._load(); |
174 } | 203 } |
175 | 204 |
176 // Number of recent search queries to store. | 205 // Number of recent search queries to store. |
177 WebInspector.SearchView.maxQueriesCount = 20; | 206 WebInspector.SearchView.maxQueriesCount = 20; |
178 | 207 |
179 WebInspector.SearchView.prototype = { | 208 WebInspector.SearchView.prototype = { |
180 /** | 209 /** |
| 210 * @type {Array.<Element>} |
| 211 */ |
| 212 get statusBarItems() |
| 213 { |
| 214 return [this._searchStatusBarElement]; |
| 215 }, |
| 216 |
| 217 /** |
| 218 * @type {Element} |
| 219 */ |
| 220 get counterElement() |
| 221 { |
| 222 return this._searchResultsMessageElement; |
| 223 }, |
| 224 |
| 225 /** |
181 * @type {WebInspector.SearchConfig} | 226 * @type {WebInspector.SearchConfig} |
182 */ | 227 */ |
183 get searchConfig() | 228 get searchConfig() |
184 { | 229 { |
185 var searchConfig = {}; | 230 var searchConfig = {}; |
186 searchConfig.query = this._search.value; | 231 searchConfig.query = this._search.value; |
187 searchConfig.ignoreCase = this._ignoreCaseCheckbox.checked; | 232 searchConfig.ignoreCase = this._ignoreCaseCheckbox.checked; |
188 searchConfig.isRegex = this._regexCheckbox.checked; | 233 searchConfig.isRegex = this._regexCheckbox.checked; |
189 return searchConfig; | 234 return searchConfig; |
190 }, | 235 }, |
191 | 236 |
192 /** | 237 /** |
193 * @type {WebInspector.SearchResultsPane} | 238 * @type {WebInspector.SearchResultsPane} |
194 */ | 239 */ |
195 set resultsPane(resultsPane) | 240 set resultsPane(resultsPane) |
196 { | 241 { |
197 this._searchResultsElement.removeChildren(); | 242 this.resetResults(); |
198 this._searchResultsElement.appendChild(resultsPane.element); | 243 this._searchResultsElement.appendChild(resultsPane.element); |
199 }, | 244 }, |
200 | 245 |
201 searchStarted: function() | 246 /** |
| 247 * @param {number} totalSearchResultsCount |
| 248 */ |
| 249 searchStarted: function(totalSearchResultsCount) |
202 { | 250 { |
203 // FIXME: This needs better UI. | 251 this.resetResults(); |
204 var searchingView = new WebInspector.EmptyView(WebInspector.UIString("Se
arching...")) | 252 this._resetCounters(); |
| 253 |
| 254 this._totalSearchResultsCount = totalSearchResultsCount; |
| 255 |
| 256 this._searchMessageElement.textContent = WebInspector.UIString("Searchin
g..."); |
| 257 this._searchStatusBarElement.appendChild(this._searchProgressElement); |
| 258 this._searchStatusBarElement.appendChild(this._searchStopButtonItem); |
| 259 this._updateSearchProgress(); |
| 260 |
| 261 this._updateSearchResultsMessage(); |
| 262 |
| 263 var searchingView = new WebInspector.EmptyView(WebInspector.UIString("Se
arching...")); |
| 264 searchingView.show(this._searchResultsElement); |
| 265 }, |
| 266 |
| 267 _updateSearchResultsMessage: function() |
| 268 { |
| 269 if (this._searchMatchesCount && this._searchResultsCount) |
| 270 this._searchResultsMessageElement.textContent = WebInspector.UIStrin
g("Found %d matches in %d files.", this._searchMatchesCount, this._nonEmptySearc
hResultsCount); |
| 271 else |
| 272 this._searchResultsMessageElement.textContent = ""; |
| 273 }, |
| 274 |
| 275 _updateSearchProgress: function() |
| 276 { |
| 277 this._searchProgressElement.setAttribute("max", this._totalSearchResults
Count); |
| 278 this._searchProgressElement.setAttribute("value", this._searchResultsCou
nt); |
| 279 }, |
| 280 |
| 281 resetResults: function() |
| 282 { |
205 this._searchResultsElement.removeChildren(); | 283 this._searchResultsElement.removeChildren(); |
206 searchingView.show(this._searchResultsElement); | 284 }, |
| 285 |
| 286 _resetCounters: function() |
| 287 { |
| 288 this._searchMatchesCount = 0; |
| 289 this._searchResultsCount = 0; |
| 290 this._nonEmptySearchResultsCount = 0; |
207 }, | 291 }, |
208 | 292 |
209 nothingFound: function() | 293 nothingFound: function() |
210 { | 294 { |
211 // FIXME: This needs better UI. | 295 this.resetResults(); |
212 var notFoundView = new WebInspector.EmptyView(WebInspector.UIString("Not
hing found")) | 296 |
213 this._searchResultsElement.removeChildren(); | 297 var notFoundView = new WebInspector.EmptyView(WebInspector.UIString("No
matches found.")); |
214 notFoundView.show(this._searchResultsElement); | 298 notFoundView.show(this._searchResultsElement); |
| 299 this._searchResultsMessageElement.textContent = WebInspector.UIString("N
o matches found."); |
215 }, | 300 }, |
216 | 301 |
217 searchFinished: function() | 302 /** |
| 303 * @param {Object} searchResult |
| 304 */ |
| 305 addSearchResult: function(searchResult) |
218 { | 306 { |
219 // FIXME: add message to drawer status bar | 307 this._searchMatchesCount += searchResult.searchMatches.length; |
| 308 this._searchResultsCount++; |
| 309 if (searchResult.searchMatches.length) |
| 310 this._nonEmptySearchResultsCount++; |
| 311 this._updateSearchResultsMessage(); |
| 312 this._updateSearchProgress(); |
| 313 }, |
| 314 |
| 315 /** |
| 316 * @param {boolean} finished |
| 317 */ |
| 318 searchFinished: function(finished) |
| 319 { |
| 320 this._searchMessageElement.textContent = finished ? WebInspector.UIStrin
g("Search finished.") : WebInspector.UIString("Search interrupted."); |
| 321 this._searchStatusBarElement.removeChild(this._searchProgressElement); |
| 322 this._searchStatusBarElement.removeChild(this._searchStopButtonItem); |
220 }, | 323 }, |
221 | 324 |
222 focus: function() | 325 focus: function() |
223 { | 326 { |
224 WebInspector.currentFocusElement = this._search; | 327 WebInspector.currentFocusElement = this._search; |
225 this._search.select(); | 328 this._search.select(); |
226 }, | 329 }, |
227 | 330 |
228 wasShown: function() | 331 wasShown: function() |
229 { | 332 { |
(...skipping 21 matching lines...) Expand all Loading... |
251 }, | 354 }, |
252 | 355 |
253 _load: function() | 356 _load: function() |
254 { | 357 { |
255 var searchConfig = WebInspector.settings.advancedSearchConfig.get(); | 358 var searchConfig = WebInspector.settings.advancedSearchConfig.get(); |
256 this._search.value = searchConfig.query; | 359 this._search.value = searchConfig.query; |
257 this._ignoreCaseCheckbox.checked = searchConfig.ignoreCase; | 360 this._ignoreCaseCheckbox.checked = searchConfig.ignoreCase; |
258 this._regexCheckbox.checked = searchConfig.isRegex; | 361 this._regexCheckbox.checked = searchConfig.isRegex; |
259 }, | 362 }, |
260 | 363 |
| 364 _searchStopButtonPressed: function() |
| 365 { |
| 366 this._controller.stopSearch(); |
| 367 this.focus(); |
| 368 }, |
| 369 |
261 _onAction: function() | 370 _onAction: function() |
262 { | 371 { |
263 this._save(); | 372 this._save(); |
264 this._controller.startSearch(this.searchConfig); | 373 this._controller.startSearch(this.searchConfig); |
265 } | 374 } |
266 } | 375 } |
267 | 376 |
268 WebInspector.SearchView.prototype.__proto__ = WebInspector.View.prototype; | 377 WebInspector.SearchView.prototype.__proto__ = WebInspector.View.prototype; |
269 | 378 |
270 /** | 379 /** |
(...skipping 12 matching lines...) Expand all Loading... |
283 /** | 392 /** |
284 * @interface | 393 * @interface |
285 */ | 394 */ |
286 WebInspector.SearchScope = function() | 395 WebInspector.SearchScope = function() |
287 { | 396 { |
288 } | 397 } |
289 | 398 |
290 WebInspector.SearchScope.prototype = { | 399 WebInspector.SearchScope.prototype = { |
291 /** | 400 /** |
292 * @param {WebInspector.SearchConfig} searchConfig | 401 * @param {WebInspector.SearchConfig} searchConfig |
| 402 * @param {function(Object)} searchResultCallback |
| 403 * @param {function(boolean)} searchFinishedCallback |
293 */ | 404 */ |
294 performSearch: function(searchConfig, searchResultCallback, searchFinishedCa
llback) { }, | 405 performSearch: function(searchConfig, searchResultCallback, searchFinishedCa
llback) { }, |
295 | 406 |
296 stopSearch: function() { }, | 407 stopSearch: function() { }, |
297 | 408 |
298 /** | 409 /** |
299 * @param {WebInspector.SearchConfig} searchConfig | 410 * @param {WebInspector.SearchConfig} searchConfig |
300 * @return WebInspector.SearchResultsPane} | 411 * @return WebInspector.SearchResultsPane} |
301 */ | 412 */ |
302 createSearchResultsPane: function(searchConfig) { } | 413 createSearchResultsPane: function(searchConfig) { } |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 WebInspector.FileBasedSearchResultsPane = function(searchConfig) | 446 WebInspector.FileBasedSearchResultsPane = function(searchConfig) |
336 { | 447 { |
337 WebInspector.SearchResultsPane.call(this, searchConfig); | 448 WebInspector.SearchResultsPane.call(this, searchConfig); |
338 | 449 |
339 this._searchResults = []; | 450 this._searchResults = []; |
340 | 451 |
341 this.element.id ="search-results-pane-file-based"; | 452 this.element.id ="search-results-pane-file-based"; |
342 | 453 |
343 this._treeOutlineElement = document.createElement("ol"); | 454 this._treeOutlineElement = document.createElement("ol"); |
344 this._treeOutlineElement.className = "outline-disclosure"; | 455 this._treeOutlineElement.className = "outline-disclosure"; |
| 456 this._treeOutlineElement.addStyleClass("search-results-outline-disclosure"); |
345 this.element.appendChild(this._treeOutlineElement); | 457 this.element.appendChild(this._treeOutlineElement); |
346 this._treeOutline = new TreeOutline(this._treeOutlineElement); | 458 this._treeOutline = new TreeOutline(this._treeOutlineElement); |
| 459 |
| 460 this._matchesExpandedCount = 0; |
347 } | 461 } |
348 | 462 |
| 463 WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount = 20; |
| 464 WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce = 20; |
| 465 |
349 WebInspector.FileBasedSearchResultsPane.prototype = { | 466 WebInspector.FileBasedSearchResultsPane.prototype = { |
350 /** | 467 /** |
351 * @param {Object} file | 468 * @param {Object} file |
352 * @param {number} lineNumber | 469 * @param {number} lineNumber |
353 * @param {number} columnNumber | 470 * @param {number} columnNumber |
354 * @return {Element} | 471 * @return {Element} |
355 */ | 472 */ |
356 createAnchor: function(file, lineNumber, columnNumber) { }, | 473 createAnchor: function(file, lineNumber, columnNumber) { }, |
357 | 474 |
358 /** | 475 /** |
359 * @param {Object} file | 476 * @param {Object} file |
360 * @return {string} | 477 * @return {string} |
361 */ | 478 */ |
362 fileName: function(file) { }, | 479 fileName: function(file) { }, |
363 | 480 |
364 /** | 481 /** |
365 * @param {Object} searchResult | 482 * @param {Object} searchResult |
366 */ | 483 */ |
367 addSearchResult: function(searchResult) | 484 addSearchResult: function(searchResult) |
368 { | 485 { |
369 this._searchResults.push(searchResult); | 486 this._searchResults.push(searchResult); |
370 var file = searchResult.file; | 487 var file = searchResult.file; |
371 var fileName = this.fileName(file); | 488 var fileName = this.fileName(file); |
372 var searchMatches = searchResult.searchMatches; | 489 var searchMatches = searchResult.searchMatches; |
373 | 490 |
374 // Expand first file with matches only. | 491 var fileTreeElement = this._addFileTreeElement(fileName, searchMatches.l
ength, this._searchResults.length - 1); |
375 var fileTreeElement = this._addFileTreeElement(fileName, searchMatches.l
ength, this._searchResults.length === 1); | 492 }, |
| 493 |
| 494 /** |
| 495 * @param {Object} searchResult |
| 496 * @param {TreeElement} fileTreeElement |
| 497 */ |
| 498 _fileTreeElementExpanded: function(searchResult, fileTreeElement) |
| 499 { |
| 500 if (fileTreeElement._initialized) |
| 501 return; |
| 502 |
| 503 var toIndex = Math.min(searchResult.searchMatches.length, WebInspector.F
ileBasedSearchResultsPane.fileMatchesShownAtOnce); |
| 504 if (toIndex < searchResult.searchMatches.length) { |
| 505 this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex
- 1); |
| 506 this._appendShowMoreMatchesElement(fileTreeElement, searchResult, to
Index - 1); |
| 507 } else |
| 508 this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex)
; |
| 509 |
| 510 fileTreeElement._initialized = true; |
| 511 }, |
| 512 |
| 513 /** |
| 514 * @param {TreeElement} fileTreeElement |
| 515 * @param {Object} searchResult |
| 516 * @param {number} fromIndex |
| 517 * @param {number} toIndex |
| 518 */ |
| 519 _appendSearchMatches: function(fileTreeElement, searchResult, fromIndex, toI
ndex) |
| 520 { |
| 521 var file = searchResult.file; |
| 522 var fileName = this.fileName(file); |
| 523 var searchMatches = searchResult.searchMatches; |
376 | 524 |
377 var regex = createSearchRegex(this._searchConfig.query, !this._searchCon
fig.ignoreCase, this._searchConfig.isRegex); | 525 var regex = createSearchRegex(this._searchConfig.query, !this._searchCon
fig.ignoreCase, this._searchConfig.isRegex); |
378 for (var i = 0; i < searchMatches.length; i++) { | 526 for (var i = fromIndex; i < toIndex; ++i) { |
379 var lineNumber = searchMatches[i].lineNumber; | 527 var lineNumber = searchMatches[i].lineNumber; |
380 var lineContent = searchMatches[i].lineContent; | 528 var lineContent = searchMatches[i].lineContent; |
381 var matchRanges = this._regexMatchRanges(lineContent, regex); | 529 var matchRanges = this._regexMatchRanges(lineContent, regex); |
382 | 530 |
383 var anchor = this.createAnchor(file, lineNumber, matchRanges[0].offs
et); | 531 var anchor = this.createAnchor(file, lineNumber, matchRanges[0].offs
et); |
384 | 532 |
385 var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4
); | 533 var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4
); |
386 var lineNumberSpan = document.createElement("span"); | 534 var lineNumberSpan = document.createElement("span"); |
387 lineNumberSpan.addStyleClass("webkit-line-number"); | 535 lineNumberSpan.addStyleClass("webkit-line-number"); |
388 lineNumberSpan.addStyleClass("search-match-line-number"); | 536 lineNumberSpan.addStyleClass("search-match-line-number"); |
389 lineNumberSpan.textContent = numberString; | 537 lineNumberSpan.textContent = numberString; |
390 anchor.appendChild(lineNumberSpan); | 538 anchor.appendChild(lineNumberSpan); |
391 | 539 |
392 var contentSpan = this._createContentSpan(lineContent, matchRanges); | 540 var contentSpan = this._createContentSpan(lineContent, matchRanges); |
393 anchor.appendChild(contentSpan); | 541 anchor.appendChild(contentSpan); |
394 | 542 |
395 var searchMatchElement = new TreeElement("", null, false); | 543 var searchMatchElement = new TreeElement("", null, false); |
396 fileTreeElement.appendChild(searchMatchElement); | 544 fileTreeElement.appendChild(searchMatchElement); |
397 searchMatchElement.listItemElement.className = "search-match"; | 545 searchMatchElement.listItemElement.className = "search-match"; |
398 searchMatchElement.listItemElement.appendChild(anchor); | 546 searchMatchElement.listItemElement.appendChild(anchor); |
399 } | 547 } |
400 }, | 548 }, |
401 | 549 |
| 550 /** |
| 551 * @param {TreeElement} fileTreeElement |
| 552 * @param {Object} searchResult |
| 553 * @param {number} startMatchIndex |
| 554 */ |
| 555 _appendShowMoreMatchesElement: function(fileTreeElement, searchResult, start
MatchIndex) |
| 556 { |
| 557 var matchesLeftCount = searchResult.searchMatches.length - startMatchInd
ex; |
| 558 var showMoreMatchesText = WebInspector.UIString("Show all matches (%d mo
re).", matchesLeftCount); |
| 559 var showMoreMatchesElement = new TreeElement(showMoreMatchesText, null,
false); |
| 560 fileTreeElement.appendChild(showMoreMatchesElement); |
| 561 showMoreMatchesElement.listItemElement.addStyleClass("show-more-matches"
); |
| 562 showMoreMatchesElement.onselect = this._showMoreMatchesElementSelected.b
ind(this, searchResult, startMatchIndex); |
| 563 }, |
| 564 |
| 565 /** |
| 566 * @param {Object} searchResult |
| 567 * @param {number} startMatchIndex |
| 568 * @param {TreeElement} showMoreMatchesElement |
| 569 */ |
| 570 _showMoreMatchesElementSelected: function(searchResult, startMatchIndex, sho
wMoreMatchesElement) |
| 571 { |
| 572 var fileTreeElement = showMoreMatchesElement.parent; |
| 573 fileTreeElement.removeChild(showMoreMatchesElement); |
| 574 this._appendSearchMatches(fileTreeElement, searchResult, startMatchIndex
, searchResult.searchMatches.length); |
| 575 }, |
| 576 |
402 /** | 577 /** |
403 * @param {string} fileName | 578 * @param {string} fileName |
404 * @param {number} searchMatchesCount | 579 * @param {number} searchMatchesCount |
405 * @param {boolean} expanded | 580 * @param {number} searchResultIndex |
406 */ | 581 */ |
407 _addFileTreeElement: function(fileName, searchMatchesCount, expanded) | 582 _addFileTreeElement: function(fileName, searchMatchesCount, searchResultInde
x) |
408 { | 583 { |
409 var fileTreeElement = new TreeElement("", null, true); | 584 var fileTreeElement = new TreeElement("", null, true); |
410 fileTreeElement.expanded = expanded; | |
411 fileTreeElement.toggleOnClick = true; | 585 fileTreeElement.toggleOnClick = true; |
412 fileTreeElement.selectable = false; | 586 fileTreeElement.selectable = false; |
413 | 587 |
414 this._treeOutline.appendChild(fileTreeElement); | 588 this._treeOutline.appendChild(fileTreeElement); |
415 fileTreeElement.listItemElement.addStyleClass("search-result"); | 589 fileTreeElement.listItemElement.addStyleClass("search-result"); |
416 | 590 |
417 var fileNameSpan = document.createElement("span"); | 591 var fileNameSpan = document.createElement("span"); |
418 fileNameSpan.className = "search-result-file-name"; | 592 fileNameSpan.className = "search-result-file-name"; |
419 fileNameSpan.textContent = fileName; | 593 fileNameSpan.textContent = fileName; |
420 fileTreeElement.listItemElement.appendChild(fileNameSpan); | 594 fileTreeElement.listItemElement.appendChild(fileNameSpan); |
421 | 595 |
422 var matchesCountSpan = document.createElement("span"); | 596 var matchesCountSpan = document.createElement("span"); |
423 matchesCountSpan.className = "search-result-matches-count"; | 597 matchesCountSpan.className = "search-result-matches-count"; |
424 if (searchMatchesCount === 1) | 598 if (searchMatchesCount === 1) |
425 matchesCountSpan.textContent = WebInspector.UIString("(%d match)", s
earchMatchesCount); | 599 matchesCountSpan.textContent = WebInspector.UIString("(%d match)", s
earchMatchesCount); |
426 else | 600 else |
427 matchesCountSpan.textContent = WebInspector.UIString("(%d matches)",
searchMatchesCount); | 601 matchesCountSpan.textContent = WebInspector.UIString("(%d matches)",
searchMatchesCount); |
428 | 602 |
429 fileTreeElement.listItemElement.appendChild(matchesCountSpan); | 603 fileTreeElement.listItemElement.appendChild(matchesCountSpan); |
430 | 604 |
| 605 var searchResult = this._searchResults[searchResultIndex]; |
| 606 fileTreeElement.onexpand = this._fileTreeElementExpanded.bind(this, sear
chResult); |
| 607 |
| 608 // Expand until at least certain amount of matches is expanded. |
| 609 if (this._matchesExpandedCount < WebInspector.FileBasedSearchResultsPane
.matchesExpandedByDefaultCount) |
| 610 fileTreeElement.expand(); |
| 611 this._matchesExpandedCount += searchResult.searchMatches.length; |
| 612 |
431 return fileTreeElement; | 613 return fileTreeElement; |
432 }, | 614 }, |
433 | 615 |
434 /** | 616 /** |
435 * @param {string} lineContent | 617 * @param {string} lineContent |
436 * @param {RegExp} regex | 618 * @param {RegExp} regex |
437 * @return {Array.<Object>} | 619 * @return {Array.<Object>} |
438 */ | 620 */ |
439 _regexMatchRanges: function(lineContent, regex) | 621 _regexMatchRanges: function(lineContent, regex) |
440 { | 622 { |
441 regex.lastIndex = 0; | 623 regex.lastIndex = 0; |
442 var match; | 624 var match; |
443 var offset = 0; | 625 var offset = 0; |
444 var matchRanges = []; | 626 var matchRanges = []; |
445 while (match = regex.exec(lineContent)) | 627 while ((regex.lastIndex < lineContent.length) && (match = regex.exec(lin
eContent))) |
446 matchRanges.push({ offset: match.index, length: match[0].length }); | 628 matchRanges.push({ offset: match.index, length: match[0].length }); |
447 | 629 |
448 return matchRanges; | 630 return matchRanges; |
449 }, | 631 }, |
450 | 632 |
451 /** | 633 /** |
452 * @param {string} lineContent | 634 * @param {string} lineContent |
453 * @param {Array.<Object>} matchRanges | 635 * @param {Array.<Object>} matchRanges |
454 */ | 636 */ |
455 _createContentSpan: function(lineContent, matchRanges) | 637 _createContentSpan: function(lineContent, matchRanges) |
(...skipping 10 matching lines...) Expand all Loading... |
466 | 648 |
467 /** | 649 /** |
468 * @constructor | 650 * @constructor |
469 * @param {Object} file | 651 * @param {Object} file |
470 * @param {Array.<Object>} searchMatches | 652 * @param {Array.<Object>} searchMatches |
471 */ | 653 */ |
472 WebInspector.FileBasedSearchResultsPane.SearchResult = function(file, searchMatc
hes) { | 654 WebInspector.FileBasedSearchResultsPane.SearchResult = function(file, searchMatc
hes) { |
473 this.file = file; | 655 this.file = file; |
474 this.searchMatches = searchMatches; | 656 this.searchMatches = searchMatches; |
475 } | 657 } |
OLD | NEW |