Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(124)

Side by Side Diff: Source/devtools/front_end/SearchController.js

Issue 33143002: DevTools: Unify filtering UI (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Comments addressed Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/devtools/front_end/Panel.js ('k') | Source/devtools/front_end/Settings.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). 3 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com).
4 * Copyright (C) 2009 Joseph Pecoraro 4 * Copyright (C) 2009 Joseph Pecoraro
5 * Copyright (C) 2011 Google Inc. All rights reserved. 5 * Copyright (C) 2011 Google Inc. All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 10 *
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 this._searchControlElement = searchControlElementColumn.createChild("span", "toolbar-search-control"); 47 this._searchControlElement = searchControlElementColumn.createChild("span", "toolbar-search-control");
48 this._searchInputElement = this._searchControlElement.createChild("input", " search-replace"); 48 this._searchInputElement = this._searchControlElement.createChild("input", " search-replace");
49 this._searchInputElement.id = "search-input-field"; 49 this._searchInputElement.id = "search-input-field";
50 50
51 this._suggestBox = new WebInspector.SuggestBox(this, searchControlElementCol umn); 51 this._suggestBox = new WebInspector.SuggestBox(this, searchControlElementCol umn);
52 52
53 this._matchesElement = this._searchControlElement.createChild("label", "sear ch-results-matches"); 53 this._matchesElement = this._searchControlElement.createChild("label", "sear ch-results-matches");
54 this._matchesElement.setAttribute("for", "search-input-field"); 54 this._matchesElement.setAttribute("for", "search-input-field");
55 55
56 this._searchNavigationElement = this._searchControlElement.createChild("div" , "toolbar-search-navigation-controls"); 56 this._searchNavigationElement = this._searchControlElement.createChild("div" , "toolbar-search-navigation-controls");
57 this._toggleFilterUI(false);
58 57
59 this._searchNavigationPrevElement = this._searchNavigationElement.createChil d("div", "toolbar-search-navigation toolbar-search-navigation-prev"); 58 this._searchNavigationPrevElement = this._searchNavigationElement.createChil d("div", "toolbar-search-navigation toolbar-search-navigation-prev");
60 this._searchNavigationPrevElement.addEventListener("click", this._onPrevButt onSearch.bind(this), false); 59 this._searchNavigationPrevElement.addEventListener("click", this._onPrevButt onSearch.bind(this), false);
61 this._searchNavigationPrevElement.title = WebInspector.UIString("Search Prev ious"); 60 this._searchNavigationPrevElement.title = WebInspector.UIString("Search Prev ious");
62 61
63 this._searchNavigationNextElement = this._searchNavigationElement.createChil d("div", "toolbar-search-navigation toolbar-search-navigation-next"); 62 this._searchNavigationNextElement = this._searchNavigationElement.createChil d("div", "toolbar-search-navigation toolbar-search-navigation-next");
64 this._searchNavigationNextElement.addEventListener("click", this._onNextButt onSearch.bind(this), false); 63 this._searchNavigationNextElement.addEventListener("click", this._onNextButt onSearch.bind(this), false);
65 this._searchNavigationNextElement.title = WebInspector.UIString("Search Next "); 64 this._searchNavigationNextElement.title = WebInspector.UIString("Search Next ");
66 65
67 this._searchInputElement.addEventListener("mousedown", this._onSearchFieldMa nualFocus.bind(this), false); // when the search field is manually selected 66 this._searchInputElement.addEventListener("mousedown", this._onSearchFieldMa nualFocus.bind(this), false); // when the search field is manually selected
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 99
101 this._replaceCheckboxElement = this._replaceElement.createChild("input"); 100 this._replaceCheckboxElement = this._replaceElement.createChild("input");
102 this._replaceCheckboxElement.type = "checkbox"; 101 this._replaceCheckboxElement.type = "checkbox";
103 this._replaceCheckboxElement.id = "search-replace-trigger"; 102 this._replaceCheckboxElement.id = "search-replace-trigger";
104 this._replaceCheckboxElement.addEventListener("click", this._updateSecondRow Visibility.bind(this), false); 103 this._replaceCheckboxElement.addEventListener("click", this._updateSecondRow Visibility.bind(this), false);
105 104
106 this._replaceLabelElement = this._replaceElement.createChild("label"); 105 this._replaceLabelElement = this._replaceElement.createChild("label");
107 this._replaceLabelElement.textContent = WebInspector.UIString("Replace"); 106 this._replaceLabelElement.textContent = WebInspector.UIString("Replace");
108 this._replaceLabelElement.setAttribute("for", "search-replace-trigger"); 107 this._replaceLabelElement.setAttribute("for", "search-replace-trigger");
109 108
110 // Column 5
111 this._filterCheckboxContainer = this._firstRowElement.createChild("td").crea teChild("label");
112 this._filterCheckboxContainer.setAttribute("for", "filter-trigger");
113
114 this._filterCheckboxElement = this._filterCheckboxContainer.createChild("inp ut");
115 this._filterCheckboxElement.type = "checkbox";
116 this._filterCheckboxElement.id = "filter-trigger";
117 this._filterCheckboxElement.addEventListener("click", this._filterCheckboxCl ick.bind(this), false);
118
119 this._filterCheckboxContainer.createTextChild(WebInspector.UIString("Filter" ));
120
121 // Column 6 109 // Column 6
122 var cancelButtonElement = this._firstRowElement.createChild("td").createChil d("button"); 110 var cancelButtonElement = this._firstRowElement.createChild("td").createChil d("button");
123 cancelButtonElement.textContent = WebInspector.UIString("Cancel"); 111 cancelButtonElement.textContent = WebInspector.UIString("Cancel");
124 cancelButtonElement.tabIndex = -1; 112 cancelButtonElement.tabIndex = -1;
125 cancelButtonElement.addEventListener("click", this.closeSearch.bind(this), f alse); 113 cancelButtonElement.addEventListener("click", this.closeSearch.bind(this), f alse);
126 } 114 }
127 115
128 WebInspector.SearchController.prototype = { 116 WebInspector.SearchController.prototype = {
129 /** 117 /**
130 * @param {number} matches 118 * @param {number} matches
(...skipping 25 matching lines...) Expand all
156 closeSearch: function() 144 closeSearch: function()
157 { 145 {
158 this.cancelSearch(); 146 this.cancelSearch();
159 WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement()) ; 147 WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement()) ;
160 }, 148 },
161 149
162 cancelSearch: function() 150 cancelSearch: function()
163 { 151 {
164 if (!this._searchIsVisible) 152 if (!this._searchIsVisible)
165 return; 153 return;
166 if (this._filterCheckboxElement.checked) { 154 this.resetSearch();
167 this._filterCheckboxElement.checked = false;
168 this._toggleFilterUI(false);
169 this.resetFilter();
170 } else
171 this.resetSearch();
172 delete this._searchIsVisible; 155 delete this._searchIsVisible;
173 this._searchHost.setFooterElement(null); 156 this._searchHost.setFooterElement(null);
174 this.resetSearch(); 157 this.resetSearch();
175 delete this._searchHost; 158 delete this._searchHost;
176 delete this._searchProvider; 159 delete this._searchProvider;
177 }, 160 },
178 161
179 resetSearch: function() 162 resetSearch: function()
180 { 163 {
181 this._suggestBox.hide(); 164 this._suggestBox.hide();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 // FIXME: fix this mess. 252 // FIXME: fix this mess.
270 if (WebInspector.inspectorView.drawer().element.isAncestor(document.acti veElement) && WebInspector.inspectorView.drawer().getSearchProvider()) 253 if (WebInspector.inspectorView.drawer().element.isAncestor(document.acti veElement) && WebInspector.inspectorView.drawer().getSearchProvider())
271 this._searchHost = WebInspector.inspectorView.drawer(); 254 this._searchHost = WebInspector.inspectorView.drawer();
272 else 255 else
273 this._searchHost = WebInspector.inspectorView; 256 this._searchHost = WebInspector.inspectorView;
274 257
275 this._searchProvider = this._searchHost.getSearchProvider(); 258 this._searchProvider = this._searchHost.getSearchProvider();
276 this._searchHost.setFooterElement(this._element); 259 this._searchHost.setFooterElement(this._element);
277 260
278 this._updateReplaceVisibility(); 261 this._updateReplaceVisibility();
279 this._updateFilterVisibility();
280 if (WebInspector.currentFocusElement() !== this._searchInputElement) { 262 if (WebInspector.currentFocusElement() !== this._searchInputElement) {
281 var selection = window.getSelection(); 263 var selection = window.getSelection();
282 if (selection.rangeCount) { 264 if (selection.rangeCount) {
283 var queryCandidate = selection.toString().replace(/\r?\n.*/, "") ; 265 var queryCandidate = selection.toString().replace(/\r?\n.*/, "") ;
284 if (queryCandidate) 266 if (queryCandidate)
285 this._searchInputElement.value = queryCandidate; 267 this._searchInputElement.value = queryCandidate;
286 } 268 }
287 } 269 }
288 this._performSearch(false, false); 270 this._performSearch(false, false);
289 this._searchInputElement.focus(); 271 this._searchInputElement.focus();
290 this._searchInputElement.select(); 272 this._searchInputElement.select();
291 this._searchIsVisible = true; 273 this._searchIsVisible = true;
292 }, 274 },
293 275
294 /**
295 * @param {boolean} filter
296 */
297 _toggleFilterUI: function(filter)
298 {
299 this._matchesElement.enableStyleClass("hidden", filter);
300 this._searchNavigationElement.enableStyleClass("hidden", filter);
301 this._searchInputElement.placeholder = filter ? WebInspector.UIString("F ilter") : WebInspector.UIString("Find");
302 },
303
304 _updateFilterVisibility: function()
305 {
306 if (this._searchProvider.canFilter())
307 this._filterCheckboxContainer.removeStyleClass("hidden");
308 else
309 this._filterCheckboxContainer.addStyleClass("hidden");
310 },
311
312 _updateReplaceVisibility: function() 276 _updateReplaceVisibility: function()
313 { 277 {
314 if (!this._searchProvider) 278 if (!this._searchProvider)
315 return; 279 return;
316 280
317 if (this._searchProvider.canSearchAndReplace()) 281 if (this._searchProvider.canSearchAndReplace())
318 this._replaceElement.removeStyleClass("hidden"); 282 this._replaceElement.removeStyleClass("hidden");
319 else { 283 else {
320 this._replaceElement.addStyleClass("hidden"); 284 this._replaceElement.addStyleClass("hidden");
321 this._replaceCheckboxElement.checked = false; 285 this._replaceCheckboxElement.checked = false;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 this._searchProvider.replaceSelectionWith(this._replaceInputElement.valu e); 413 this._searchProvider.replaceSelectionWith(this._replaceInputElement.valu e);
450 delete this._currentQuery; 414 delete this._currentQuery;
451 this._performSearch(true, true); 415 this._performSearch(true, true);
452 }, 416 },
453 417
454 _replaceAll: function() 418 _replaceAll: function()
455 { 419 {
456 this._searchProvider.replaceAllWith(this._searchInputElement.value, this ._replaceInputElement.value); 420 this._searchProvider.replaceAllWith(this._searchInputElement.value, this ._replaceInputElement.value);
457 }, 421 },
458 422
459 _filterCheckboxClick: function()
460 {
461 this._searchInputElement.focus();
462 this._searchInputElement.select();
463
464 if (this._filterCheckboxElement.checked) {
465 this._toggleFilterUI(true);
466 this.resetSearch();
467 this._performFilter(this._searchInputElement.value);
468 } else {
469 this._toggleFilterUI(false);
470 this.resetFilter();
471 this._performSearch(false, false);
472 }
473 },
474
475 /**
476 * @param {string} query
477 */
478 _performFilter: function(query)
479 {
480 this._searchProvider.performFilter(query);
481 },
482 423
483 _onInput: function(event) 424 _onInput: function(event)
484 { 425 {
485 this._onValueChanged(); 426 this._onValueChanged();
486 }, 427 },
487 428
488 _onValueChanged: function() 429 _onValueChanged: function()
489 { 430 {
490 var suggestions = this._searchProvider.buildSuggestions(this._searchInpu tElement); 431 var suggestions = this._searchProvider.buildSuggestions(this._searchInpu tElement);
491 if (suggestions && suggestions.length) 432 if (suggestions && suggestions.length)
492 this._suggestBox.updateSuggestions(null, suggestions, 0, true, ""); 433 this._suggestBox.updateSuggestions(null, suggestions, 0, true, "");
493 else 434 else
494 this._suggestBox.hide(); 435 this._suggestBox.hide();
495 436 this._performSearch(false, true);
496 if (this._filterCheckboxElement.checked)
497 this._performFilter(this._searchInputElement.value);
498 else
499 this._performSearch(false, true);
500 }, 437 },
501 438
502 /** 439 /**
503 * @override 440 * @override
504 * @param {string} suggestion 441 * @param {string} suggestion
505 * @param {boolean=} isIntermediateSuggestion 442 * @param {boolean=} isIntermediateSuggestion
506 */ 443 */
507 applySuggestion: function(suggestion, isIntermediateSuggestion) 444 applySuggestion: function(suggestion, isIntermediateSuggestion)
508 { 445 {
509 if (isIntermediateSuggestion) 446 if (isIntermediateSuggestion)
510 return; 447 return;
511 448
512 var text = this._searchInputElement.value; 449 var text = this._searchInputElement.value;
513 text = text.substring(0, text.lastIndexOf(" ") + 1) + suggestion; 450 text = text.substring(0, text.lastIndexOf(" ") + 1) + suggestion;
514 this._searchInputElement.value = text; 451 this._searchInputElement.value = text;
515 }, 452 },
516 453
517 /** @override */ 454 /** @override */
518 acceptSuggestion: function() 455 acceptSuggestion: function()
519 { 456 {
520 this._searchInputElement.scrollLeft = this._searchInputElement.scrollWid th; 457 this._searchInputElement.scrollLeft = this._searchInputElement.scrollWid th;
521 this._onValueChanged(); 458 this._onValueChanged();
522 },
523
524 resetFilter: function()
525 {
526 this._performFilter("");
527 } 459 }
528 } 460 }
529 461
530 /** 462 /**
531 * @type {?WebInspector.SearchController} 463 * @type {?WebInspector.SearchController}
532 */ 464 */
533 WebInspector.searchController = null; 465 WebInspector.searchController = null;
534 466
535 /** 467 /**
536 * @interface 468 * @interface
537 */ 469 */
538 WebInspector.Searchable = function() 470 WebInspector.Searchable = function()
539 { 471 {
540 } 472 }
541 473
542 WebInspector.Searchable.prototype = { 474 WebInspector.Searchable.prototype = {
543 /** 475 /**
544 * @return {boolean} 476 * @return {boolean}
545 */ 477 */
546 canSearchAndReplace: function() { }, 478 canSearchAndReplace: function() { },
547 479
548 /**
549 * @return {boolean}
550 */
551 canFilter: function() { },
552
553 searchCanceled: function() { }, 480 searchCanceled: function() { },
554 481
555 /** 482 /**
556 * @param {string} query 483 * @param {string} query
557 * @param {boolean} shouldJump 484 * @param {boolean} shouldJump
558 * @param {WebInspector.Searchable=} self 485 * @param {WebInspector.Searchable=} self
559 */ 486 */
560 performSearch: function(query, shouldJump, self) { }, 487 performSearch: function(query, shouldJump, self) { },
561 488
562 /** 489 /**
(...skipping 10 matching lines...) Expand all
573 * @param {WebInspector.Searchable=} self 500 * @param {WebInspector.Searchable=} self
574 */ 501 */
575 jumpToPreviousSearchResult: function(self) { }, 502 jumpToPreviousSearchResult: function(self) { },
576 503
577 /** 504 /**
578 * @param {HTMLInputElement} input 505 * @param {HTMLInputElement} input
579 * @return {?Array.<string>} 506 * @return {?Array.<string>}
580 */ 507 */
581 buildSuggestions: function(input) { } 508 buildSuggestions: function(input) { }
582 } 509 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/Panel.js ('k') | Source/devtools/front_end/Settings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698