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)
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!WebInspector.FilteredItemSelectionDialog._stylesLoaded) {
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebInspector.View.createStyleElement("filteredItemSelectionDialog.css");
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        WebInspector.FilteredItemSelectionDialog._stylesLoaded = true;
44d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element = document.createElement("div");
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.element.className = "filtered-item-list-dialog";
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement = this.element.createChild("input", "monospace");
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this._promptElement.addEventListener("input", this._onInput.bind(this), false);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement.type = "text";
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._promptElement.setAttribute("spellcheck", "false");
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._filteredItems = [];
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._viewportControl = new WebInspector.ViewportControl(this);
57d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    this._viewportControl.element.classList.add("fill");
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._itemElementsContainer = this._viewportControl.element;
59a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._itemElementsContainer.classList.add("container");
60a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    this._itemElementsContainer.classList.add("monospace");
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._itemElementsContainer.addEventListener("click", this._onClick.bind(this), false);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this.element.appendChild(this._itemElementsContainer);
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._delegate = delegate;
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._delegate.setRefreshCallback(this._itemsLoaded.bind(this));
66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._itemsLoaded();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.FilteredItemSelectionDialog.prototype = {
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} element
72a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} relativeToElement
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    position: function(element, relativeToElement)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
76aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        const shadow = 10;
77aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        const shadowPadding = 20; // shadow + padding
78aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var container = WebInspector.Dialog.modalHostView().element;
79aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var preferredWidth = Math.max(relativeToElement.offsetWidth * 2 / 3, 500);
80aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var width = Math.min(preferredWidth, container.offsetWidth - 2 * shadowPadding);
81aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var preferredHeight = Math.max(relativeToElement.offsetHeight * 2 / 3, 204);
82aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var height = Math.min(preferredHeight, container.offsetHeight - 2 * shadowPadding);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this.element.style.width = width + "px";
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var box = relativeToElement.boxInWindow(window).relativeToElement(container);
86aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var positionX = box.x + Math.max((box.width - width - 2 * shadowPadding) / 2, shadow);
87aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        positionX = Math.max(shadow, Math.min(container.offsetWidth - width - 2 * shadowPadding, positionX));
88aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        var positionY = box.y + Math.max((box.height - height - 2 * shadowPadding) / 2, shadow);
89aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch        positionY = Math.max(shadow, Math.min(container.offsetHeight - height - 2 * shadowPadding, positionY));
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        element.positionAt(positionX, positionY, container);
918abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._dialogHeight = height;
928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._updateShowMatchingItems();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    focus: function()
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.setCurrentFocusElement(this._promptElement);
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._filteredItems.length && this._viewportControl.lastVisibleIndex() === -1)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._viewportControl.refresh();
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    willHide: function()
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._isHiding)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._isHiding = true;
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._delegate.dispose();
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._filterTimer)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            clearTimeout(this._filterTimer);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    renderAsTwoRows: function()
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._renderAsTwoRows = true;
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    onEnter: function()
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
120591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!this._delegate.itemCount())
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
12210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        var selectedIndex = this._shouldShowMatchingItems() && this._selectedIndexInFiltered < this._filteredItems.length ? this._filteredItems[this._selectedIndexInFiltered] : null;
12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._delegate.selectItem(selectedIndex, this._promptElement.value.trim());
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
126591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _itemsLoaded: function()
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this._loadTimeout)
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
131591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._loadTimeout = setTimeout(this._updateAfterItemsLoaded.bind(this), 0);
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _updateAfterItemsLoaded: function()
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        delete this._loadTimeout;
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._filterItems();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} index
142a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @return {!Element}
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createItemElement: function(index)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var itemElement = document.createElement("div");
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement.className = "filtered-item-list-dialog-item " + (this._renderAsTwoRows ? "two-rows" : "one-row");
148d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        itemElement._titleElement = itemElement.createChild("div", "filtered-item-list-dialog-title");
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement._subtitleElement = itemElement.createChild("div", "filtered-item-list-dialog-subtitle");
150591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        itemElement._subtitleElement.textContent = "\u200B";
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        itemElement._index = index;
152591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._delegate.renderItem(index, this._promptElement.value.trim(), itemElement._titleElement, itemElement._subtitleElement);
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return itemElement;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} query
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setQuery: function(query)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._promptElement.value = query;
162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._scheduleFilter();
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _filterItems: function()
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._filterTimer;
168591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._scoringTimer) {
169591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            clearTimeout(this._scoringTimer);
170591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._scoringTimer;
171591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var query = this._delegate.rewriteQuery(this._promptElement.value.trim());
174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._query = query;
175591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var queryLength = query.length;
176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var filterRegex = query ? WebInspector.FilePathScoreFunction.filterRegex(query) : null;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var oldSelectedAbsoluteIndex = this._selectedIndexInFiltered ? this._filteredItems[this._selectedIndexInFiltered] : null;
179591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var filteredItems = [];
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._selectedIndexInFiltered = 0;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
182591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestScores = [];
183591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestItems = [];
184591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var bestItemsToCollect = 100;
185591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var minBestScore = 0;
186591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var overflowItems = [];
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
188591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        scoreItems.call(this, 0);
1895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1907757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        /**
1917757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @param {number} a
1927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @param {number} b
1937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         * @return {number}
1947757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch         */
195591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function compareIntegers(a, b)
196591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
1977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            return b - a;
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {number} fromIndex
20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.FilteredItemSelectionDialog}
20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
204591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function scoreItems(fromIndex)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
206591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var maxWorkItems = 1000;
207591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var workDone = 0;
208591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = fromIndex; i < this._delegate.itemCount() && workDone < maxWorkItems; ++i) {
209591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Filter out non-matching items quickly.
210591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (filterRegex && !filterRegex.test(this._delegate.itemKeyAt(i)))
211591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    continue;
212591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
213591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Score item.
214591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                var score = this._delegate.itemScoreAt(i, query);
215591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (query)
216591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    workDone++;
217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                // Find its index in the scores array (earlier elements have bigger scores).
219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (score > minBestScore || bestScores.length < bestItemsToCollect) {
220591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    var index = insertionIndexForObjectInListSortedByFunction(score, bestScores, compareIntegers, true);
221591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    bestScores.splice(index, 0, score);
222591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    bestItems.splice(index, 0, i);
223591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    if (bestScores.length > bestItemsToCollect) {
224591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        // Best list is too large -> drop last elements.
225591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        overflowItems.push(bestItems.peekLast());
226591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        bestScores.length = bestItemsToCollect;
227591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                        bestItems.length = bestItemsToCollect;
228591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    }
2297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch                    minBestScore = bestScores.peekLast();
230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                } else
231591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    filteredItems.push(i);
232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            // Process everything in chunks.
235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (i < this._delegate.itemCount()) {
236591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._scoringTimer = setTimeout(scoreItems.bind(this, i), 0);
237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                return;
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            }
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._scoringTimer;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._filteredItems = bestItems.concat(overflowItems).concat(filteredItems);
242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < this._filteredItems.length; ++i) {
243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (this._filteredItems[i] === oldSelectedAbsoluteIndex) {
244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    this._selectedIndexInFiltered = i;
245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    break;
246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                }
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
248d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            this._viewportControl.invalidate();
249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            if (!query)
250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                this._selectedIndexInFiltered = 0;
251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._updateSelection(this._selectedIndexInFiltered, false);
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    /**
25643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     * @return {boolean}
25743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)     */
25843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    _shouldShowMatchingItems: function()
25943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
26043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return this._delegate.shouldShowMatchingItems(this._promptElement.value);
26143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    },
26243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
26353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    _onInput: function(event)
26453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    {
2658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        this._updateShowMatchingItems();
26653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        this._scheduleFilter();
26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    },
26853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    _updateShowMatchingItems: function()
2708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
27143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        var shouldShowMatchingItems = this._shouldShowMatchingItems();
27243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this._itemElementsContainer.classList.toggle("hidden", !shouldShowMatchingItems);
27343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        this.element.style.height = shouldShowMatchingItems ? this._dialogHeight + "px" : "auto";
2748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
2758abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
276d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    /**
277d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @return {number}
278d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     */
279d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    _rowsPerViewport: function()
280d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    {
281d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return Math.floor(this._viewportControl.element.clientHeight / this._rowHeight);
282d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    },
283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _onKeyDown: function(event)
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var newSelectedIndex = this._selectedIndexInFiltered;
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        switch (event.keyCode) {
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.Down.code:
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (++newSelectedIndex >= this._filteredItems.length)
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                newSelectedIndex = this._filteredItems.length - 1;
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, true);
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.Up.code:
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (--newSelectedIndex < 0)
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                newSelectedIndex = 0;
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, false);
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.PageDown.code:
302d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            newSelectedIndex = Math.min(newSelectedIndex + this._rowsPerViewport(), this._filteredItems.length - 1);
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, true);
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        case WebInspector.KeyboardShortcut.Keys.PageUp.code:
307d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)            newSelectedIndex = Math.max(newSelectedIndex - this._rowsPerViewport(), 0);
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._updateSelection(newSelectedIndex, false);
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            event.consume(true);
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            break;
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        default:
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _scheduleFilter: function()
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._filterTimer)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._filterTimer = setTimeout(this._filterItems.bind(this), 0);
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
323f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     * @param {number} index
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} makeLast
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _updateSelection: function(index, makeLast)
327f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var element = this._viewportControl.renderedElementAt(this._selectedIndexInFiltered);
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (element)
330a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.remove("selected");
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._viewportControl.scrollItemIntoView(index, makeLast);
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._selectedIndexInFiltered = index;
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        element = this._viewportControl.renderedElementAt(index);
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (element)
335a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.add("selected");
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _onClick: function(event)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var itemElement = event.target.enclosingNodeOrSelfWithClass("filtered-item-list-dialog-item");
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!itemElement)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._delegate.selectItem(itemElement._index, this._promptElement.value.trim());
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.Dialog.hide();
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {number}
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    itemCount: function()
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._filteredItems.length;
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {number} index
357f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @return {number}
358f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
359f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    fastHeight: function(index)
360f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
361f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (!this._rowHeight) {
362f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var delegateIndex = this._filteredItems[index];
363f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var element = this._createItemElement(delegateIndex);
364f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._rowHeight = element.measurePreferredSize(this._viewportControl.contentElement()).height;
365f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
366f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return this._rowHeight;
367f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
368f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
369f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
370f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {number} index
371d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)     * @return {!WebInspector.ViewportElement}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    itemElement: function(index)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var delegateIndex = this._filteredItems[index];
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var element = this._createItemElement(delegateIndex);
377591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (index === this._selectedIndexInFiltered)
378a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            element.classList.add("selected");
379f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return new WebInspector.StaticViewportElement(element);
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
382112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu    /**
383112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu     * @return {number}
384112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu     */
385112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu    minimumRowHeight: function()
386112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu    {
387112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu        return this.fastHeight(0);
388112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu    },
389112db3b40c6242b0b82bd13eac6dbf33d29d95e2Bo Liu
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.DialogDelegate.prototype
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
394591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @constructor
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SelectionDialogContentProvider = function()
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SelectionDialogContentProvider.prototype = {
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
402591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function():void} refreshCallback
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
404591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    setRefreshCallback: function(refreshCallback)
405591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
406591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._refreshCallback = refreshCallback;
407591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
409591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
4108abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {string} query
4118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @return {boolean}
4128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     */
4138abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    shouldShowMatchingItems: function(query)
4148abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
4158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return true;
4168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
4178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
4188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    /**
419591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
421591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
422591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
423591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return 0;
424591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemKeyAt: function(itemIndex)
431591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
432591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return "";
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
4365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
437591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
4385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
4395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
440591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
441591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
442591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return 1;
443591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
446591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
447591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
448a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
449a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
451591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
452591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
453591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} element
457591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
458591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {boolean}
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
460591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    highlightRanges: function(element, query)
461591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
462591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!query)
463591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return false;
464591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
465591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
466591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {string} text
467591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {string} query
468a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         * @return {?Array.<!WebInspector.SourceRange>}
469591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
470591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function rangesForMatch(text, query)
471591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
472591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var sm = new difflib.SequenceMatcher(query, text);
473591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var opcodes = sm.get_opcodes();
474591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var ranges = [];
475591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
476591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < opcodes.length; ++i) {
477591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                var opcode = opcodes[i];
478591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                if (opcode[0] === "equal")
479a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                    ranges.push(new WebInspector.SourceRange(opcode[3], opcode[4] - opcode[3]));
480591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                else if (opcode[0] !== "insert")
481591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    return null;
482591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            }
483591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return ranges;
484591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
485591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
486591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var text = element.textContent;
487591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var ranges = rangesForMatch(text, query);
488591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!ranges)
489591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            ranges = rangesForMatch(text.toUpperCase(), query.toUpperCase());
490591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (ranges) {
491591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            WebInspector.highlightRangesWithStyleClass(element, ranges, "highlight");
492591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return true;
493591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
494591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
495591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
49809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?number} itemIndex
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
501591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    selectItem: function(itemIndex, promptValue)
502591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
503591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
504591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
505591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    refresh: function()
506591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
507591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._refreshCallback();
508591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
514591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    rewriteQuery: function(query)
515591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
516591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return query;
517591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
518926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
519591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    dispose: function()
520591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
521591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
526591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @extends {WebInspector.SelectionDialogContentProvider}
52709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.UISourceCode} uiSourceCode
52851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @param {function(number, number)} selectItemCallback
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
53007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.JavaScriptOutlineDialog = function(uiSourceCode, selectItemCallback)
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.SelectionDialogContentProvider.call(this);
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._functionItems = [];
53551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    this._selectItemCallback = selectItemCallback;
536f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    this._outlineWorker = new Worker("script_formatter_worker/ScriptFormatterWorker.js");
53709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._outlineWorker.onmessage = this._didBuildOutlineChunk.bind(this);
53809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    this._outlineWorker.postMessage({ method: "javaScriptOutline", params: { content: uiSourceCode.workingCopy() } });
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
542a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.View} view
54309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @param {!WebInspector.UISourceCode} uiSourceCode
54451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) * @param {function(number, number)} selectItemCallback
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
54609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.JavaScriptOutlineDialog.show = function(view, uiSourceCode, selectItemCallback)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
5495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return;
55007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.JavaScriptOutlineDialog(uiSourceCode, selectItemCallback));
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.Dialog.show(view.element, filteredItemSelectionDialog);
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.JavaScriptOutlineDialog.prototype = {
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
55609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {!MessageEvent} event
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
558591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _didBuildOutlineChunk: function(event)
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
56009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var data = /** @type {!WebInspector.JavaScriptOutlineDialog.MessageEventData} */ (event.data);
56109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var chunk = data.chunk;
562591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for (var i = 0; i < chunk.length; ++i)
563591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._functionItems.push(chunk[i]);
564591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
565d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (data.total === data.index + 1)
566591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this.dispose();
567591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
568591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.refresh();
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
571591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
572591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
574591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
576591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._functionItems.length;
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    itemKeyAt: function(itemIndex)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return this._functionItems[itemIndex].name;
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
5895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
590591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
5915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
5925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
593591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
5945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
595591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var item = this._functionItems[itemIndex];
596591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return -item.line;
5975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
5985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
5995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
600591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
601591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
602a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
603a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
605591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
607591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var item = this._functionItems[itemIndex];
608591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        titleElement.textContent = item.name + (item.arguments ? item.arguments : "");
609591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.highlightRanges(titleElement, query);
610591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        subtitleElement.textContent = ":" + (item.line + 1);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
61409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?number} itemIndex
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectItem: function(itemIndex, promptValue)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
61909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (itemIndex === null)
62009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            return;
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var lineNumber = this._functionItems[itemIndex].line;
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isNaN(lineNumber) && lineNumber >= 0)
62351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            this._selectItemCallback(lineNumber, this._functionItems[itemIndex].column);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
626591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    dispose: function()
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
628591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._outlineWorker) {
629591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._outlineWorker.terminate();
630591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            delete this._outlineWorker;
631591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
634591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    __proto__: WebInspector.SelectionDialogContentProvider.prototype
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
639591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch * @extends {WebInspector.SelectionDialogContentProvider}
640a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
6425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)WebInspector.SelectUISourceCodeDialog = function(defaultScores)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
644591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebInspector.SelectionDialogContentProvider.call(this);
645591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
646f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    this._populate();
6475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    this._defaultScores = defaultScores;
648591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this._scorer = new WebInspector.FilePathScoreFunction("");
649591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
650f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebInspector.workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);
651926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.SelectUISourceCodeDialog.prototype = {
654f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _projectRemoved: function(event)
655f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
656f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        var project = /** @type {!WebInspector.Project} */ (event.data);
657f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        this._populate(project);
658f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        this.refresh();
659f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    },
660f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
661f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    /**
662f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     * @param {!WebInspector.Project=} skipProject
663f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu     */
664f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    _populate: function(skipProject)
665f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
666f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        /** @type {!Array.<!WebInspector.UISourceCode>} */
667f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        this._uiSourceCodes = [];
668f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        var projects = WebInspector.workspace.projects().filter(this.filterProject.bind(this));
669f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        for (var i = 0; i < projects.length; ++i) {
670f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            if (skipProject && projects[i] === skipProject)
671f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu                continue;
672f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            this._uiSourceCodes = this._uiSourceCodes.concat(projects[i].uiSourceCodes());
673f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        }
674f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    },
675f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
677a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {?WebInspector.UISourceCode} uiSourceCode
67853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
67909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number=} columnNumber
680926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
68109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber, columnNumber)
682926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Overridden by subclasses
684926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
686926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
687a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
68809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
689926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
690926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Overridden by subclasses
694926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
696926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
697591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {number}
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
699591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemCount: function()
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
701591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return this._uiSourceCodes.length;
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {number} itemIndex
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    itemKeyAt: function(itemIndex)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
710e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        return this._uiSourceCodes[itemIndex].fullDisplayName();
7115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
7125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
7135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
7145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {number} itemIndex
715591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
7165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @return {number}
7175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
718591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    itemScoreAt: function(itemIndex, query)
7195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
720591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var uiSourceCode = this._uiSourceCodes[itemIndex];
721591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var score = this._defaultScores ? (this._defaultScores.get(uiSourceCode) || 0) : 0;
722591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!query || query.length < 2)
723591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return score;
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (this._query !== query) {
726591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._query = query;
727591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            this._scorer = new WebInspector.FilePathScoreFunction(query);
728591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
729591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
730e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var path = uiSourceCode.fullDisplayName();
731591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return score + 10 * this._scorer.score(path, null);
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
735591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {number} itemIndex
736591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} query
737a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} titleElement
738a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!Element} subtitleElement
73909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!Array.<!Element>}
740591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
741591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    renderItem: function(itemIndex, query, titleElement, subtitleElement)
742591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
743591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        query = this.rewriteQuery(query);
744591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var uiSourceCode = this._uiSourceCodes[itemIndex];
74509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        titleElement.textContent = uiSourceCode.displayName() + (this._queryLineNumberAndColumnNumber || "");
746e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        subtitleElement.textContent = uiSourceCode.fullDisplayName().trimEnd(100);
747591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
748591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var indexes = [];
749e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        var score = new WebInspector.FilePathScoreFunction(query).score(subtitleElement.textContent, indexes);
750591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var fileNameIndex = subtitleElement.textContent.lastIndexOf("/");
751591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var ranges = [];
752591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        for (var i = 0; i < indexes.length; ++i)
753591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            ranges.push({offset: indexes[i], length: 1});
754591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (indexes[0] > fileNameIndex) {
755591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            for (var i = 0; i < ranges.length; ++i)
756591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                ranges[i].offset -= fileNameIndex + 1;
757591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return WebInspector.highlightRangesWithStyleClass(titleElement, ranges, "highlight");
758591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        } else {
759591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return WebInspector.highlightRangesWithStyleClass(subtitleElement, ranges, "highlight");
760591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
76409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {?number} itemIndex
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} promptValue
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    selectItem: function(itemIndex, promptValue)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
76909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var parsedExpression = promptValue.trim().match(/^([^:]*)(:\d+)?(:\d+)?$/);
77009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!parsedExpression)
7718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return;
77209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
77309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var lineNumber;
77409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var columnNumber;
77509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (parsedExpression[2])
77609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            lineNumber = parseInt(parsedExpression[2].substr(1), 10) - 1;
77709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (parsedExpression[3])
77809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            columnNumber = parseInt(parsedExpression[3].substr(1), 10) - 1;
77909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var uiSourceCode = itemIndex !== null ? this._uiSourceCodes[itemIndex] : null;
78009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this.uiSourceCodeSelected(uiSourceCode, lineNumber, columnNumber);
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    /**
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @param {string} query
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     * @return {string}
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)     */
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    rewriteQuery: function(query)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!query)
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return query;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        query = query.trim();
79209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        var lineNumberMatch = query.match(/^([^:]+)((?::[^:]*){0,2})$/);
79309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        this._queryLineNumberAndColumnNumber = lineNumberMatch ? lineNumberMatch[2] : "";
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return lineNumberMatch ? lineNumberMatch[1] : query;
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
797926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
798a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Event} event
799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _uiSourceCodeAdded: function(event)
801926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
802a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var uiSourceCode = /** @type {!WebInspector.UISourceCode} */ (event.data);
803e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (!this.filterProject(uiSourceCode.project()))
804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return;
805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._uiSourceCodes.push(uiSourceCode)
806591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this.refresh();
807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
808926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
809926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dispose: function()
810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
811591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
812f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        WebInspector.workspace.removeEventListener(WebInspector.Workspace.Events.ProjectRemoved, this._projectRemoved, this);
813591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
814591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
815591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    __proto__: WebInspector.SelectionDialogContentProvider.prototype
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
820926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.SelectUISourceCodeDialog}
82107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @param {!WebInspector.SourcesView} sourcesView
822a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
823926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
82407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.OpenResourceDialog = function(sourcesView, defaultScores)
825926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
8265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebInspector.SelectUISourceCodeDialog.call(this, defaultScores);
82707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    this._sourcesView = sourcesView;
828926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
829926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.OpenResourceDialog.prototype = {
831926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
832926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
8338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {?WebInspector.UISourceCode} uiSourceCode
83453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
83509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number=} columnNumber
836926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
83709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber, columnNumber)
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
8398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!uiSourceCode)
84007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            uiSourceCode = this._sourcesView.currentUISourceCode();
8418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        if (!uiSourceCode)
8428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)            return;
84307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        this._sourcesView.showSourceLocation(uiSourceCode, lineNumber, columnNumber);
844926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
845926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
846926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
8478abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @param {string} query
8488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     * @return {boolean}
8498abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)     */
8508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    shouldShowMatchingItems: function(query)
8518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    {
8528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return !query.startsWith(":");
8538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    },
8548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
8558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    /**
856a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
85709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
858926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
859926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
861926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return !project.isServiceProject();
862926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.SelectUISourceCodeDialog.prototype
865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
86807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * @param {!WebInspector.SourcesView} sourcesView
869a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Element} relativeToElement
87043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) * @param {string=} query
871a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Map.<!WebInspector.UISourceCode, number>=} defaultScores
872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
87307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochWebInspector.OpenResourceDialog.show = function(sourcesView, relativeToElement, query, defaultScores)
874926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
875926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
876926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
87807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.OpenResourceDialog(sourcesView, defaultScores));
879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.renderAsTwoRows();
88043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (query)
88143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        filteredItemSelectionDialog.setQuery(query);
882926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.Dialog.show(relativeToElement, filteredItemSelectionDialog);
883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
884926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
885926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.SelectUISourceCodeDialog}
88810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch * @param {!Array.<string>} types
889a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UISourceCode)} callback
890926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
89110f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebInspector.SelectUISourceCodeForProjectTypesDialog = function(types, callback)
892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
89310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    this._types = types;
894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.SelectUISourceCodeDialog.call(this);
895926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._callback = callback;
896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
89810f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebInspector.SelectUISourceCodeForProjectTypesDialog.prototype = {
899926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
900a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.UISourceCode} uiSourceCode
90153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)     * @param {number=} lineNumber
90209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @param {number=} columnNumber
903926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
90409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    uiSourceCodeSelected: function(uiSourceCode, lineNumber, columnNumber)
905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._callback(uiSourceCode);
907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
910a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Project} project
91109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {boolean}
912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filterProject: function(project)
914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
91510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return this._types.indexOf(project.type()) !== -1;
916926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
917926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.SelectUISourceCodeDialog.prototype
919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
921926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
922f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @param {string} name
92310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch * @param {!Array.<string>} types
924a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {function(!WebInspector.UISourceCode)} callback
925a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!Element} relativeToElement
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
92710f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochWebInspector.SelectUISourceCodeForProjectTypesDialog.show = function(name, types, callback, relativeToElement)
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (WebInspector.Dialog.currentInstance())
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(new WebInspector.SelectUISourceCodeForProjectTypesDialog(types, callback));
933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.setQuery(name);
934926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    filteredItemSelectionDialog.renderAsTwoRows();
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.Dialog.show(relativeToElement, filteredItemSelectionDialog);
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
93709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
93809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)/**
93909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @typedef {{index: number, total: number, chunk: !Array.<!{selectorText: string, lineNumber: number, columnNumber: number}>}}
94009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) */
94109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.JavaScriptOutlineDialog.MessageEventData;
942