15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com).
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Joseph Pecoraro
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     its contributors may be used to endorse or promote products derived
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     from this software without specific prior written permission.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
34d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) * @extends {WebInspector.VBox}
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.Searchable} searchable
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView = function(searchable)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    WebInspector.VBox.call(this);
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._searchProvider = searchable;
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
4351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    this._footerElementContainer = this.element.createChild("div", "search-bar status-bar hidden");
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._footerElementContainer.style.order = 100;
4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._footerElement = this._footerElementContainer.createChild("table", "toolbar-search");
4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._footerElement.cellSpacing = 0;
4951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._firstRowElement = this._footerElement.createChild("tr");
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._secondRowElement = this._footerElement.createChild("tr", "hidden");
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Column 1
54591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    var searchControlElementColumn = this._firstRowElement.createChild("td");
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchControlElement = searchControlElementColumn.createChild("span", "toolbar-search-control");
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchInputElement = this._searchControlElement.createChild("input", "search-replace");
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchInputElement.id = "search-input-field";
58f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    this._searchInputElement.placeholder = WebInspector.UIString("Find");
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._matchesElement = this._searchControlElement.createChild("label", "search-results-matches");
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._matchesElement.setAttribute("for", "search-input-field");
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._searchNavigationElement = this._searchControlElement.createChild("div", "toolbar-search-navigation-controls");
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._searchNavigationPrevElement = this._searchNavigationElement.createChild("div", "toolbar-search-navigation toolbar-search-navigation-prev");
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchNavigationPrevElement.addEventListener("click", this._onPrevButtonSearch.bind(this), false);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchNavigationPrevElement.title = WebInspector.UIString("Search Previous");
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._searchNavigationNextElement = this._searchNavigationElement.createChild("div", "toolbar-search-navigation toolbar-search-navigation-next");
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchNavigationNextElement.addEventListener("click", this._onNextButtonSearch.bind(this), false);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchNavigationNextElement.title = WebInspector.UIString("Search Next");
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._searchInputElement.addEventListener("mousedown", this._onSearchFieldManualFocus.bind(this), false); // when the search field is manually selected
7406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    this._searchInputElement.addEventListener("keydown", this._onSearchKeyDown.bind(this), true);
75591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._searchInputElement.addEventListener("input", this._onInput.bind(this), false);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceInputElement = this._secondRowElement.createChild("td").createChild("input", "search-replace toolbar-replace-control");
7806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    this._replaceInputElement.addEventListener("keydown", this._onReplaceKeyDown.bind(this), true);
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceInputElement.placeholder = WebInspector.UIString("Replace");
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Column 2
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._findButtonElement = this._firstRowElement.createChild("td").createChild("button", "hidden");
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._findButtonElement.textContent = WebInspector.UIString("Find");
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._findButtonElement.tabIndex = -1;
85a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._findButtonElement.addEventListener("click", this._onFindClick.bind(this), false);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceButtonElement = this._secondRowElement.createChild("td").createChild("button");
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceButtonElement.textContent = WebInspector.UIString("Replace");
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceButtonElement.disabled = true;
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceButtonElement.tabIndex = -1;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceButtonElement.addEventListener("click", this._replace.bind(this), false);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Column 3
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._prevButtonElement = this._firstRowElement.createChild("td").createChild("button", "hidden");
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._prevButtonElement.textContent = WebInspector.UIString("Previous");
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._prevButtonElement.tabIndex = -1;
97a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    this._prevButtonElement.addEventListener("click", this._onPreviousClick.bind(this), false);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceAllButtonElement = this._secondRowElement.createChild("td").createChild("button");
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceAllButtonElement.textContent = WebInspector.UIString("Replace All");
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceAllButtonElement.addEventListener("click", this._replaceAll.bind(this), false);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Column 4
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceElement = this._firstRowElement.createChild("td").createChild("span");
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceCheckboxElement = this._replaceElement.createChild("input");
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceCheckboxElement.type = "checkbox";
1086f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    this._uniqueId = ++WebInspector.SearchableView._lastUniqueId;
1096f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    var replaceCheckboxId = "search-replace-trigger" + this._uniqueId;
1106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    this._replaceCheckboxElement.id = replaceCheckboxId;
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._replaceCheckboxElement.addEventListener("change", this._updateSecondRowVisibility.bind(this), false);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceLabelElement = this._replaceElement.createChild("label");
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._replaceLabelElement.textContent = WebInspector.UIString("Replace");
1156f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    this._replaceLabelElement.setAttribute("for", replaceCheckboxId);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // Column 5
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var cancelButtonElement = this._firstRowElement.createChild("td").createChild("button");
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelButtonElement.textContent = WebInspector.UIString("Cancel");
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelButtonElement.tabIndex = -1;
121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    cancelButtonElement.addEventListener("click", this.closeSearch.bind(this), false);
12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._minimalSearchQuerySize = 3;
12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
12451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._registerShortcuts();
12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
12651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1276f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochWebInspector.SearchableView._lastUniqueId = 0;
1286f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
1295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
1305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @return {!Array.<!WebInspector.KeyboardShortcut.Descriptor>}
1315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView.findShortcuts = function()
13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (WebInspector.SearchableView._findShortcuts)
13551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return WebInspector.SearchableView._findShortcuts;
13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebInspector.SearchableView._findShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta)];
13751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!WebInspector.isMac())
13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        WebInspector.SearchableView._findShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.F3));
13951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return WebInspector.SearchableView._findShortcuts;
14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
14151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
1435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @return {!Array.<!WebInspector.KeyboardShortcut.Descriptor>}
1445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
14551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView.cancelSearchShortcuts = function()
14651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (WebInspector.SearchableView._cancelSearchShortcuts)
14851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return WebInspector.SearchableView._cancelSearchShortcuts;
14951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebInspector.SearchableView._cancelSearchShortcuts = [WebInspector.KeyboardShortcut.makeDescriptor(WebInspector.KeyboardShortcut.Keys.Esc)];
15051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return WebInspector.SearchableView._cancelSearchShortcuts;
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @return {!Array.<!WebInspector.KeyboardShortcut.Descriptor>}
1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView.findNextShortcut = function()
15751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
15851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (WebInspector.SearchableView._findNextShortcut)
15951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return WebInspector.SearchableView._findNextShortcut;
16051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebInspector.SearchableView._findNextShortcut = [];
16143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (WebInspector.isMac())
16243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        WebInspector.SearchableView._findNextShortcut.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta));
16351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return WebInspector.SearchableView._findNextShortcut;
16451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
16551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
1675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @return {!Array.<!WebInspector.KeyboardShortcut.Descriptor>}
1685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
16951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView.findPreviousShortcuts = function()
17051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
17151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (WebInspector.SearchableView._findPreviousShortcuts)
17251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return WebInspector.SearchableView._findPreviousShortcuts;
17351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    WebInspector.SearchableView._findPreviousShortcuts = [];
17443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (WebInspector.isMac())
17543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        WebInspector.SearchableView._findPreviousShortcuts.push(WebInspector.KeyboardShortcut.makeDescriptor("g", WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Shift));
17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return WebInspector.SearchableView._findPreviousShortcuts;
17751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
17851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
17951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.SearchableView.prototype = {
180591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
181a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @return {!Element}
182a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    defaultFocusedElement: function()
184a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
185a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var children = this.children();
186a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        for (var i = 0; i < children.length; ++i) {
187a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var element = children[i].defaultFocusedElement();
188a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (element)
189a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                return element;
190a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
191a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        return WebInspector.View.prototype.defaultFocusedElement.call(this);
192a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
193a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
194a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
195d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @param {?Event} event
196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
19751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    _onKeyDown: function(event)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
199d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(/**@type {!KeyboardEvent}*/(event));
20051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        var handler = this._shortcuts[shortcutKey];
20151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (handler && handler(event))
20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            event.consume(true);
20351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
20551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    _registerShortcuts: function()
20651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
20751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._shortcuts = {};
20851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {!Array.<!WebInspector.KeyboardShortcut.Descriptor>} shortcuts
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {function()} handler
21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.SearchableView}
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
21451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        function register(shortcuts, handler)
21551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        {
21651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            for (var i = 0; i < shortcuts.length; ++i)
21751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)                this._shortcuts[shortcuts[i].key] = handler;
21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
21951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
22051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        register.call(this, WebInspector.SearchableView.findShortcuts(), this.handleFindShortcut.bind(this));
22151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        register.call(this, WebInspector.SearchableView.cancelSearchShortcuts(), this.handleCancelSearchShortcut.bind(this));
22251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        register.call(this, WebInspector.SearchableView.findNextShortcut(), this.handleFindNextShortcut.bind(this));
22351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        register.call(this, WebInspector.SearchableView.findPreviousShortcuts(), this.handleFindPreviousShortcut.bind(this));
22451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
22551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
22651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
22751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {number} minimalSearchQuerySize
22851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
22951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setMinimalSearchQuerySize: function(minimalSearchQuerySize)
23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._minimalSearchQuerySize = minimalSearchQuerySize;
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
23351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {boolean} replaceable
23651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setReplaceable: function(replaceable)
23851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._replaceable = replaceable;
24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
24151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
24251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
24351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @param {number} matches
24451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
24551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateSearchMatchesCount: function(matches)
24651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
24751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._searchProvider.currentSearchMatches = matches;
24851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentQuery ? matches : 0, -1);
249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} currentMatchIndex
253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
25451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    updateCurrentMatchIndex: function(currentMatchIndex)
255591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
25651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._updateSearchMatchesCountAndCurrentMatchIndex(this._searchProvider.currentSearchMatches, currentMatchIndex);
257591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
26009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
26109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
262591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    isSearchVisible: function()
263591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
264591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._searchIsVisible;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
267591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    closeSearch: function()
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
269591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.cancelSearch();
27009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (WebInspector.currentFocusElement().isDescendant(this._footerElementContainer))
271a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this.focus();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    _toggleSearchBar: function(toggled)
27551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
276d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._footerElementContainer.classList.toggle("hidden", !toggled);
27751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this.doResize();
27851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
27951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cancelSearch: function()
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!this._searchIsVisible)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
284f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        this.resetSearch();
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._searchIsVisible;
28651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this._toggleSearchBar(false);
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resetSearch: function()
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
291591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._clearSearch();
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._updateReplaceVisibility();
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._matchesElement.textContent = "";
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {boolean}
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
29951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    handleFindNextShortcut: function()
30051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
30151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!this._searchIsVisible)
30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._searchProvider.jumpToNextSearchResult();
30451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return true;
30551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
30651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
30751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
30851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @return {boolean}
30951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
31051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    handleFindPreviousShortcut: function()
31151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
31251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!this._searchIsVisible)
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return false;
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._searchProvider.jumpToPreviousSearchResult();
31551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return true;
31651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
31751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
31851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
31951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @return {boolean}
32051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
32151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    handleFindShortcut: function()
32251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
32351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this.showSearchField();
32451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return true;
32551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
32651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
32751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    /**
32851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     * @return {boolean}
32951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)     */
33051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    handleCancelSearchShortcut: function()
33151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    {
33251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!this._searchIsVisible)
33351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return false;
33451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        this.closeSearch();
33551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return true;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
338591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
339591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} enabled
340591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateSearchNavigationButtonState: function(enabled)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._replaceButtonElement.disabled = !enabled;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (enabled) {
345a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._searchNavigationPrevElement.classList.add("enabled");
346a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._searchNavigationNextElement.classList.add("enabled");
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
348a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._searchNavigationPrevElement.classList.remove("enabled");
349a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._searchNavigationNextElement.classList.remove("enabled");
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} matches
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} currentMatchIndex
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateSearchMatchesCountAndCurrentMatchIndex: function(matches, currentMatchIndex)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
359591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this._currentQuery)
360591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._matchesElement.textContent = "";
361591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        else if (matches === 0 || currentMatchIndex >= 0)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._matchesElement.textContent = WebInspector.UIString("%d of %d", currentMatchIndex + 1, matches);
363591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        else if (matches === 1)
364591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._matchesElement.textContent = WebInspector.UIString("1 match");
365591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        else
366591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._matchesElement.textContent = WebInspector.UIString("%d matches", matches);
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._updateSearchNavigationButtonState(matches > 0);
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    showSearchField: function()
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
372591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._searchIsVisible)
373591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this.cancelSearch();
374591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
375f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        var queryCandidate;
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (WebInspector.currentFocusElement() !== this._searchInputElement) {
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var selection = window.getSelection();
378f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            if (selection.rangeCount)
379f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu                queryCandidate = selection.toString().replace(/\r?\n.*/, "");
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
381f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
382f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        this._toggleSearchBar(true);
383f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        this._updateReplaceVisibility();
384f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (queryCandidate)
385f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            this._searchInputElement.value = queryCandidate;
386591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._performSearch(false, false);
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchInputElement.focus();
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchInputElement.select();
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchIsVisible = true;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateReplaceVisibility: function()
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._replaceElement.classList.toggle("hidden", !this._replaceable);
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!this._replaceable) {
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._replaceCheckboxElement.checked = false;
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._updateSecondRowVisibility();
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
401591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
4025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event} event
403591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onSearchFieldManualFocus: function(event)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.setCurrentFocusElement(event.target);
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
409591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
4105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event} event
411591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
41206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    _onSearchKeyDown: function(event)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
414a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!isEnterKey(event))
415a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            return;
416a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
417a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!this._currentQuery)
418a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._performSearch(true, true, event.shiftKey);
419a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        else
420a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._jumpToNextSearchResult(event.shiftKey);
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
423591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
4245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Event} event
42506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)     */
42606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    _onReplaceKeyDown: function(event)
42706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
42806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (isEnterKey(event))
42906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            this._replace();
43006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    },
43106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
43206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    /**
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean=} isBackwardSearch
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
435591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _jumpToNextSearchResult: function(isBackwardSearch)
436591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
437a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!this._currentQuery || !this._searchNavigationPrevElement.classList.contains("enabled"))
438591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
439591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
440591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (isBackwardSearch)
441591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._searchProvider.jumpToPreviousSearchResult();
442591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        else
443591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._searchProvider.jumpToNextSearchResult();
444591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
445591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onNextButtonSearch: function(event)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
448a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!this._searchNavigationNextElement.classList.contains("enabled"))
449591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return;
450591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._jumpToNextSearchResult();
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchInputElement.focus();
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onPrevButtonSearch: function(event)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (!this._searchNavigationPrevElement.classList.contains("enabled"))
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
458591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._jumpToNextSearchResult(true);
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._searchInputElement.focus();
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
462a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _onFindClick: function(event)
463a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
464a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!this._currentQuery)
465a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._performSearch(true, true);
466a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        else
467a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._jumpToNextSearchResult();
468a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._searchInputElement.focus();
469a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
470a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
471a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _onPreviousClick: function(event)
472a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
473a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (!this._currentQuery)
474a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._performSearch(true, true, true);
475a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        else
476a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._jumpToNextSearchResult(true);
477a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._searchInputElement.focus();
478a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
479a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
480591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _clearSearch: function()
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
482591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        delete this._currentQuery;
48351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!!this._searchProvider.currentQuery) {
48451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            delete this._searchProvider.currentQuery;
48551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            this._searchProvider.searchCanceled();
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
487591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._updateSearchMatchesCountAndCurrentMatchIndex(0, -1);
488591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
490591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
491591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} forceSearch
492591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} shouldJump
493a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {boolean=} jumpBackwards
494591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
495a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _performSearch: function(forceSearch, shouldJump, jumpBackwards)
496591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
497591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var query = this._searchInputElement.value;
49851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (!query || (!forceSearch && query.length < this._minimalSearchQuerySize && !this._currentQuery)) {
499591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._clearSearch();
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._currentQuery = query;
504591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._searchProvider.currentQuery = query;
505a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        this._searchProvider.performSearch(query, shouldJump, jumpBackwards);
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _updateSecondRowVisibility: function()
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
510d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        var secondRowVisible = this._replaceCheckboxElement.checked;
511d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._footerElementContainer.classList.toggle("replaceable", secondRowVisible);
512d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._footerElement.classList.toggle("toolbar-search-replace", secondRowVisible);
513d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._secondRowElement.classList.toggle("hidden", !secondRowVisible);
514d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._prevButtonElement.classList.toggle("hidden", !secondRowVisible);
515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._findButtonElement.classList.toggle("hidden", !secondRowVisible);
516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        this._replaceCheckboxElement.tabIndex = secondRowVisible ? -1 : 0;
517d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
518d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (secondRowVisible)
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._replaceInputElement.focus();
520d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        else
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._searchInputElement.focus();
522a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        this.doResize();
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _replace: function()
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /** @type {!WebInspector.Replaceable} */ (this._searchProvider).replaceSelectionWith(this._replaceInputElement.value);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._currentQuery;
529591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._performSearch(true, true);
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _replaceAll: function()
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /** @type {!WebInspector.Replaceable} */ (this._searchProvider).replaceAllWith(this._searchInputElement.value, this._replaceInputElement.value);
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
536591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
537591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _onInput: function(event)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
53906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        this._onValueChanged();
54006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    },
54106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
54206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    _onValueChanged: function()
54306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    {
544f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        this._performSearch(false, true);
54551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    },
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    __proto__: WebInspector.VBox.prototype
54851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
549591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
550591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch/**
551591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @interface
552591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch */
553591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebInspector.Searchable = function()
554591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
555591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
556591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
557591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebInspector.Searchable.prototype = {
558591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    searchCanceled: function() { },
559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
560591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
561591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
562591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {boolean} shouldJump
563a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {boolean=} jumpBackwards
564591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
565a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    performSearch: function(query, shouldJump, jumpBackwards) { },
566591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
56751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    jumpToNextSearchResult: function() { },
568591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
56909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    jumpToPreviousSearchResult: function() { }
57009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
57109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
57209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/**
57309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @interface
57409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */
57509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.Replaceable = function()
57609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
57709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
57809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
57909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.Replaceable.prototype = {
58009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
58109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {string} text
58209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
58309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    replaceSelectionWith: function(text) { },
58409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
58509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    /**
58609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {string} query
58709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {string} replacement
58809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     */
58909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    replaceAllWith: function(query, replacement) { }
590591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
591