15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.DialogDelegate}
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @implements {WebInspector.ViewportControl.Provider}
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.SelectionDialogContentProvider} delegate
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FilteredItemSelectionDialog = function(delegate)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.DialogDelegate.call(this);
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var xhr = new XMLHttpRequest();
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xhr.open("GET", "filteredItemSelectionDialog.css", false);
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    xhr.send(null);
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element = document.createElement("div");
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.element.className = "filtered-item-list-dialog";
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    var styleElement = this.element.createChild("style");
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    styleElement.type = "text/css";
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    styleElement.textContent = xhr.responseText;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement = this.element.createChild("input", "monospace");
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._promptElement.addEventListener("input", this._onInput.bind(this), false);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement.type = "text";
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement.setAttribute("spellcheck", "false");
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._filteredItems = [];
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._viewportControl = new WebInspector.ViewportControl(this);
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._itemElementsContainer = this._viewportControl.element;
60a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._itemElementsContainer.classList.add("container");
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._itemElementsContainer.classList.add("monospace");
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._itemElementsContainer.addEventListener("click", this._onClick.bind(this), false);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.appendChild(this._itemElementsContainer);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._delegate = delegate;
66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._delegate.setRefreshCallback(this._itemsLoaded.bind(this));
67591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._itemsLoaded();
688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    this._shouldShowMatchingItems = true;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FilteredItemSelectionDialog.prototype = {
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
74a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} element
75a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} relativeToElement
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    position: function(element, relativeToElement)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const minWidth = 500;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const minHeight = 204;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var width = Math.max(relativeToElement.offsetWidth * 2 / 3, minWidth);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var height = Math.max(relativeToElement.offsetHeight * 2 / 3, minHeight);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.element.style.width = width + "px";
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const shadowPadding = 20; // shadow + padding
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.positionAt(
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            relativeToElement.totalOffsetLeft() + Math.max((relativeToElement.offsetWidth - width - 2 * shadowPadding) / 2, shadowPadding),
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            relativeToElement.totalOffsetTop() + Math.max((relativeToElement.offsetHeight - height - 2 * shadowPadding) / 2, shadowPadding));
908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._dialogHeight = height;
918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._updateShowMatchingItems();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    focus: function()
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.setCurrentFocusElement(this._promptElement);
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._filteredItems.length && this._viewportControl.lastVisibleIndex() === -1)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._viewportControl.refresh();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isHiding)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isHiding = true;
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._delegate.dispose();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._filterTimer)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            clearTimeout(this._filterTimer);
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderAsTwoRows: function()
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._renderAsTwoRows = true;
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onEnter: function()
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
119591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this._delegate.itemCount())
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._delegate.selectItem(this._filteredItems[this._selectedIndexInFiltered], this._promptElement.value.trim());
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _itemsLoaded: function()
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._loadTimeout)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
129591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._loadTimeout = setTimeout(this._updateAfterItemsLoaded.bind(this), 0);
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _updateAfterItemsLoaded: function()
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete this._loadTimeout;
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._filterItems();
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} index
140a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createItemElement: function(index)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var itemElement = document.createElement("div");
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement.className = "filtered-item-list-dialog-item " + (this._renderAsTwoRows ? "two-rows" : "one-row");
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemElement._titleElement = itemElement.createChild("span");
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        itemElement._titleSuffixElement = itemElement.createChild("span");
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement._subtitleElement = itemElement.createChild("div", "filtered-item-list-dialog-subtitle");
149591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        itemElement._subtitleElement.textContent = "\u200B";
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement._index = index;
151591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._delegate.renderItem(index, this._promptElement.value.trim(), itemElement._titleElement, itemElement._subtitleElement);
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return itemElement;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} query
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setQuery: function(query)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._promptElement.value = query;
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._scheduleFilter();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _filterItems: function()
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._filterTimer;
167591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._scoringTimer) {
168591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            clearTimeout(this._scoringTimer);
169591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._scoringTimer;
170591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var query = this._delegate.rewriteQuery(this._promptElement.value.trim());
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._query = query;
174591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var queryLength = query.length;
175591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var filterRegex = query ? WebInspector.FilePathScoreFunction.filterRegex(query) : null;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var oldSelectedAbsoluteIndex = this._selectedIndexInFiltered ? this._filteredItems[this._selectedIndexInFiltered] : null;
178591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var filteredItems = [];
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._selectedIndexInFiltered = 0;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
181591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestScores = [];
182591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestItems = [];
183591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestItemsToCollect = 100;
184591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var minBestScore = 0;
185591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var overflowItems = [];
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
187591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        scoreItems.call(this, 0);
1885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1897757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        /**
1907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @param {number} a
1917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @param {number} b
1927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @return {number}
1937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         */
194591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function compareIntegers(a, b)
195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
1967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            return b - a;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
199e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)        /**
200e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)         * @param {number} fromIndex
201e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)         * @this {WebInspector.FilteredItemSelectionDialog}
202e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)         */
203591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function scoreItems(fromIndex)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
205591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var maxWorkItems = 1000;
206591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var workDone = 0;
207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = fromIndex; i < this._delegate.itemCount() && workDone < maxWorkItems; ++i) {
208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Filter out non-matching items quickly.
209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (filterRegex && !filterRegex.test(this._delegate.itemKeyAt(i)))
210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    continue;
211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Score item.
213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                var score = this._delegate.itemScoreAt(i, query);
214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (query)
215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    workDone++;
216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Find its index in the scores array (earlier elements have bigger scores).
218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (score > minBestScore || bestScores.length < bestItemsToCollect) {
219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    var index = insertionIndexForObjectInListSortedByFunction(score, bestScores, compareIntegers, true);
220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    bestScores.splice(index, 0, score);
221591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    bestItems.splice(index, 0, i);
222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    if (bestScores.length > bestItemsToCollect) {
223591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        // Best list is too large -> drop last elements.
224591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        overflowItems.push(bestItems.peekLast());
225591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        bestScores.length = bestItemsToCollect;
226591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        bestItems.length = bestItemsToCollect;
227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    }
2287757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                    minBestScore = bestScores.peekLast();
229591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                } else
230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    filteredItems.push(i);
231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            // Process everything in chunks.
234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (i < this._delegate.itemCount()) {
235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._scoringTimer = setTimeout(scoreItems.bind(this, i), 0);
236591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                return;
237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            }
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._scoringTimer;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._filteredItems = bestItems.concat(overflowItems).concat(filteredItems);
241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < this._filteredItems.length; ++i) {
242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (this._filteredItems[i] === oldSelectedAbsoluteIndex) {
243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    this._selectedIndexInFiltered = i;
244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    break;
245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                }
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
247591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._viewportControl.refresh();
248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (!query)
249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._selectedIndexInFiltered = 0;
250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._updateSelection(this._selectedIndexInFiltered, false);
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _onInput: function(event)
25553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
2568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._shouldShowMatchingItems = this._delegate.shouldShowMatchingItems(this._promptElement.value);
2578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._updateShowMatchingItems();
25853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._scheduleFilter();
25953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
26053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    _updateShowMatchingItems: function()
2628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
2638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._itemElementsContainer.enableStyleClass("hidden", !this._shouldShowMatchingItems);
2648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this.element.style.height = this._shouldShowMatchingItems ? this._dialogHeight + "px" : "auto";
2658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
2668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _onKeyDown: function(event)
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var newSelectedIndex = this._selectedIndexInFiltered;
270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        switch (event.keyCode) {
272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.Down.code:
273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (++newSelectedIndex >= this._filteredItems.length)
274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                newSelectedIndex = this._filteredItems.length - 1;
275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, true);
276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.Up.code:
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (--newSelectedIndex < 0)
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                newSelectedIndex = 0;
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, false);
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.PageDown.code:
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            newSelectedIndex = Math.min(newSelectedIndex + this._viewportControl.rowsPerViewport(), this._filteredItems.length - 1);
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, true);
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.PageUp.code:
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            newSelectedIndex = Math.max(newSelectedIndex - this._viewportControl.rowsPerViewport(), 0);
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, false);
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        default:
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _scheduleFilter: function()
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._filterTimer)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._filterTimer = setTimeout(this._filterItems.bind(this), 0);
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} index
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} makeLast
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _updateSelection: function(index, makeLast)
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var element = this._viewportControl.renderedElementAt(this._selectedIndexInFiltered);
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (element)
313a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.remove("selected");
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._viewportControl.scrollItemIntoView(index, makeLast);
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._selectedIndexInFiltered = index;
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        element = this._viewportControl.renderedElementAt(index);
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (element)
318a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.add("selected");
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onClick: function(event)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var itemElement = event.target.enclosingNodeOrSelfWithClass("filtered-item-list-dialog-item");
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!itemElement)
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._delegate.selectItem(itemElement._index, this._promptElement.value.trim());
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.Dialog.hide();
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {number}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    itemCount: function()
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._filteredItems.length;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} index
340a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    itemElement: function(index)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var delegateIndex = this._filteredItems[index];
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var element = this._createItemElement(delegateIndex);
346591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (index === this._selectedIndexInFiltered)
347a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.add("selected");
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return element;
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.DialogDelegate.prototype
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
355591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @constructor
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SelectionDialogContentProvider = function()
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SelectionDialogContentProvider.prototype = {
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
363591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function():void} refreshCallback
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
365591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setRefreshCallback: function(refreshCallback)
366591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
367591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._refreshCallback = refreshCallback;
368591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
370591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
3718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {string} query
3728abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @return {boolean}
3738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     */
3748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    shouldShowMatchingItems: function(query)
3758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
3768abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return true;
3778abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
3788abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
3798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    /**
380591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
382591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
383591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
384591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return 0;
385591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
391591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemKeyAt: function(itemIndex)
392591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
393591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return "";
394591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
398591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
3995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
4005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
401591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
402591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
403591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return 1;
404591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
407591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
408591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
409a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
410a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
412591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
413591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
414591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
417a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} element
418591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
419591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {boolean}
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
421591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    highlightRanges: function(element, query)
422591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
423591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!query)
424591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return false;
425591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
426591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
427591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {string} text
428591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {string} query
429a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @return {?Array.<!WebInspector.SourceRange>}
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
431591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function rangesForMatch(text, query)
432591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var sm = new difflib.SequenceMatcher(query, text);
434591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var opcodes = sm.get_opcodes();
435591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var ranges = [];
436591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
437591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < opcodes.length; ++i) {
438591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                var opcode = opcodes[i];
439591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (opcode[0] === "equal")
440a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    ranges.push(new WebInspector.SourceRange(opcode[3], opcode[4] - opcode[3]));
441591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                else if (opcode[0] !== "insert")
442591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    return null;
443591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            }
444591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return ranges;
445591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
446591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
447591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var text = element.textContent;
448591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var ranges = rangesForMatch(text, query);
449591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!ranges)
450591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            ranges = rangesForMatch(text.toUpperCase(), query.toUpperCase());
451591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (ranges) {
452591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            WebInspector.highlightRangesWithStyleClass(element, ranges, "highlight");
453591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return true;
454591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
455591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
456591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
462591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    selectItem: function(itemIndex, promptValue)
463591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
464591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
465591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
466591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    refresh: function()
467591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
468591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._refreshCallback();
469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
475591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    rewriteQuery: function(query)
476591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
477591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return query;
478591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
480591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    dispose: function()
481591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
482591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
487591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @extends {WebInspector.SelectionDialogContentProvider}
488a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.View} view
489a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.ContentProvider} contentProvider
49051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @param {function(number, number)} selectItemCallback
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
49251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.JavaScriptOutlineDialog = function(view, contentProvider, selectItemCallback)
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.SelectionDialogContentProvider.call(this);
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._functionItems = [];
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._view = view;
49851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._selectItemCallback = selectItemCallback;
499591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    contentProvider.requestContent(this._contentAvailable.bind(this));
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
503a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.View} view
504a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.ContentProvider} contentProvider
50551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @param {function(number, number)} selectItemCallback
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
50751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)WebInspector.JavaScriptOutlineDialog.show = function(view, contentProvider, selectItemCallback)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return null;
51151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.JavaScriptOutlineDialog(view, contentProvider, selectItemCallback));
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.Dialog.show(view.element, filteredItemSelectionDialog);
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.JavaScriptOutlineDialog.prototype = {
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
517591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {?string} content
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    _contentAvailable: function(content)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
521591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._outlineWorker = new Worker("ScriptFormatterWorker.js");
522591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._outlineWorker.onmessage = this._didBuildOutlineChunk.bind(this);
523591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        const method = "outline";
524591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._outlineWorker.postMessage({ method: method, params: { content: content } });
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
527591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _didBuildOutlineChunk: function(event)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
529591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var data = event.data;
530591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var chunk = data["chunk"];
531591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for (var i = 0; i < chunk.length; ++i)
532591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._functionItems.push(chunk[i]);
533591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
534591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (data.total === data.index)
535591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this.dispose();
536591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
537591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.refresh();
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
540591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
541591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
543591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
545591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._functionItems.length;
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    itemKeyAt: function(itemIndex)
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._functionItems[itemIndex].name;
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
559591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
5605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
5615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
562591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
5635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
564591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var item = this._functionItems[itemIndex];
565591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return -item.line;
5665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
5675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
5685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
569591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
570591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
571a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
572a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
574591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
576591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var item = this._functionItems[itemIndex];
577591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        titleElement.textContent = item.name + (item.arguments ? item.arguments : "");
578591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.highlightRanges(titleElement, query);
579591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        subtitleElement.textContent = ":" + (item.line + 1);
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectItem: function(itemIndex, promptValue)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lineNumber = this._functionItems[itemIndex].line;
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isNaN(lineNumber) && lineNumber >= 0)
59051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            this._selectItemCallback(lineNumber, this._functionItems[itemIndex].column);
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
593591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    dispose: function()
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
595591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._outlineWorker) {
596591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._outlineWorker.terminate();
597591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._outlineWorker;
598591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
601591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    __proto__: WebInspector.SelectionDialogContentProvider.prototype
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
606591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @extends {WebInspector.SelectionDialogContentProvider}
607a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
6095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebInspector.SelectUISourceCodeDialog = function(defaultScores)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
611591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebInspector.SelectionDialogContentProvider.call(this);
612591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
6137757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    /** @type {!Array.<!WebInspector.UISourceCode>} */
614926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._uiSourceCodes = [];
615591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    var projects = WebInspector.workspace.projects().filter(this.filterProject.bind(this));
616926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    for (var i = 0; i < projects.length; ++i)
617e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        this._uiSourceCodes = this._uiSourceCodes.concat(projects[i].uiSourceCodes());
6185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    this._defaultScores = defaultScores;
619591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._scorer = new WebInspector.FilePathScoreFunction("");
620591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
623926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SelectUISourceCodeDialog.prototype = {
624926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
625a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.UISourceCode} uiSourceCode
62653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
627926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
628926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber)
629926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
630926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Overridden by subclasses
631926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
633926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
634a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
635926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
636926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
638926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
639926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Overridden by subclasses
640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
643591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
645591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
647591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._uiSourceCodes.length;
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    itemKeyAt: function(itemIndex)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
656e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return this._uiSourceCodes[itemIndex].fullDisplayName();
6575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
6585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
6595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
6605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
661591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
6625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
6635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
664591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
6655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
666591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var uiSourceCode = this._uiSourceCodes[itemIndex];
667591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var score = this._defaultScores ? (this._defaultScores.get(uiSourceCode) || 0) : 0;
668591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!query || query.length < 2)
669591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return score;
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
671591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._query !== query) {
672591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._query = query;
673591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._scorer = new WebInspector.FilePathScoreFunction(query);
674591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
675591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
676e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var path = uiSourceCode.fullDisplayName();
677591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return score + 10 * this._scorer.score(path, null);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
681591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
682591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
683a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
684a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
685591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
686591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
687591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
688591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        query = this.rewriteQuery(query);
689591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var uiSourceCode = this._uiSourceCodes[itemIndex];
690e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        titleElement.textContent = uiSourceCode.displayName() + (this._queryLineNumber ? this._queryLineNumber : "");
691e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        subtitleElement.textContent = uiSourceCode.fullDisplayName().trimEnd(100);
692591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
693591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var indexes = [];
694e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var score = new WebInspector.FilePathScoreFunction(query).score(subtitleElement.textContent, indexes);
695591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var fileNameIndex = subtitleElement.textContent.lastIndexOf("/");
696591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var ranges = [];
697591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for (var i = 0; i < indexes.length; ++i)
698591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            ranges.push({offset: indexes[i], length: 1});
699591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (indexes[0] > fileNameIndex) {
700591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < ranges.length; ++i)
701591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                ranges[i].offset -= fileNameIndex + 1;
702591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return WebInspector.highlightRangesWithStyleClass(titleElement, ranges, "highlight");
703591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        } else {
704591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return WebInspector.highlightRangesWithStyleClass(subtitleElement, ranges, "highlight");
705591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectItem: function(itemIndex, promptValue)
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (/^:\d+$/.test(promptValue.trimRight())) {
7158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            var lineNumber = parseInt(promptValue.trimRight().substring(1), 10) - 1;
7168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            if (!isNaN(lineNumber) && lineNumber >= 0)
7178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)                this.uiSourceCodeSelected(null, lineNumber);
7188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return;
7198abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        }
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lineNumberMatch = promptValue.match(/[^:]+\:([\d]*)$/);
72153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        var lineNumber = lineNumberMatch ? Math.max(parseInt(lineNumberMatch[1], 10) - 1, 0) : undefined;
722926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.uiSourceCodeSelected(this._uiSourceCodes[itemIndex], lineNumber);
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rewriteQuery: function(query)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!query)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return query;
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        query = query.trim();
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lineNumberMatch = query.match(/([^:]+)(\:[\d]*)$/);
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._queryLineNumber = lineNumberMatch ? lineNumberMatch[2] : "";
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineNumberMatch ? lineNumberMatch[1] : query;
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
740a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
741926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _uiSourceCodeAdded: function(event)
743926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
744a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
745e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!this.filterProject(uiSourceCode.project()))
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
747926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._uiSourceCodes.push(uiSourceCode)
748591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.refresh();
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
751926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dispose: function()
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
753591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
754591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
755591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
756591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    __proto__: WebInspector.SelectionDialogContentProvider.prototype
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
760926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
761926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.SelectUISourceCodeDialog}
762a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.SourcesPanel} panel
763a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
764926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
7655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebInspector.OpenResourceDialog = function(panel, defaultScores)
766926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
7675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebInspector.SelectUISourceCodeDialog.call(this, defaultScores);
768926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._panel = panel;
769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
770926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
771926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.OpenResourceDialog.prototype = {
772926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
773926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
7748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {?WebInspector.UISourceCode} uiSourceCode
77553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
776926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
777926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber)
778926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
7798abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!uiSourceCode)
7808abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            uiSourceCode = this._panel.currentUISourceCode();
7818abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!uiSourceCode)
7828abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return;
783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._panel.showUISourceCode(uiSourceCode, lineNumber);
784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
785926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
786926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
7878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {string} query
7888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @return {boolean}
7898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     */
7908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    shouldShowMatchingItems: function(query)
7918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
7928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return !query.startsWith(":");
7938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
7948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
7958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    /**
796a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return !project.isServiceProject();
801926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
802926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
803926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.SelectUISourceCodeDialog.prototype
804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
807a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.SourcesPanel} panel
808a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Element} relativeToElement
80953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * @param {string=} name
810a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
811926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
8125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebInspector.OpenResourceDialog.show = function(panel, relativeToElement, name, defaultScores)
813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
816926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
8175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.OpenResourceDialog(panel, defaultScores));
818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.renderAsTwoRows();
81953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (name)
82053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        filteredItemSelectionDialog.setQuery(name);
821926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.Dialog.show(relativeToElement, filteredItemSelectionDialog);
822926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
824926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
826926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.SelectUISourceCodeDialog}
827926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} type
828a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UISourceCode)} callback
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SelectUISourceCodeForProjectTypeDialog = function(type, callback)
831926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._type = type;
833926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.SelectUISourceCodeDialog.call(this);
834926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._callback = callback;
835926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
837926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SelectUISourceCodeForProjectTypeDialog.prototype = {
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
839a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.UISourceCode} uiSourceCode
84053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
841926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
842926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber)
843926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._callback(uiSourceCode);
845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
847926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
848a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
849926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
850926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
851926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
852926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return project.type() === this._type;
853926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
854926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
855926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.SelectUISourceCodeDialog.prototype
856926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
857926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} type
860a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UISourceCode)} callback
861a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Element} relativeToElement
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SelectUISourceCodeForProjectTypeDialog.show = function(name, type, callback, relativeToElement)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.SelectUISourceCodeForProjectTypeDialog(type, callback));
869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.setQuery(name);
870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.renderAsTwoRows();
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.Dialog.show(relativeToElement, filteredItemSelectionDialog);
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
873