Home | History | Annotate | Download | only in sources
      1 /*
      2  * Copyright (C) 2012 Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  * 1. Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *
     11  * 2. Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
     17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
     20  * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 /**
     30  * @constructor
     31  * @extends {WebInspector.SelectionDialogContentProvider}
     32  * @param {!WebInspector.UISourceCode} uiSourceCode
     33  * @param {function(number, number)} selectItemCallback
     34  */
     35 WebInspector.StyleSheetOutlineDialog = function(uiSourceCode, selectItemCallback)
     36 {
     37     WebInspector.SelectionDialogContentProvider.call(this);
     38     this._selectItemCallback = selectItemCallback;
     39     this._cssParser = new WebInspector.CSSParser();
     40     this._cssParser.addEventListener(WebInspector.CSSParser.Events.RulesParsed, this.refresh.bind(this));
     41     this._cssParser.parse(uiSourceCode.workingCopy());
     42 }
     43 
     44 /**
     45  * @param {!WebInspector.View} view
     46  * @param {!WebInspector.UISourceCode} uiSourceCode
     47  * @param {function(number, number)} selectItemCallback
     48  */
     49 WebInspector.StyleSheetOutlineDialog.show = function(view, uiSourceCode, selectItemCallback)
     50 {
     51     if (WebInspector.Dialog.currentInstance())
     52         return;
     53     var delegate = new WebInspector.StyleSheetOutlineDialog(uiSourceCode, selectItemCallback);
     54     var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(delegate);
     55     WebInspector.Dialog.show(view.element, filteredItemSelectionDialog);
     56 }
     57 
     58 WebInspector.StyleSheetOutlineDialog.prototype = {
     59     /**
     60      * @return {number}
     61      */
     62     itemCount: function()
     63     {
     64         return this._cssParser.rules().length;
     65     },
     66 
     67     /**
     68      * @param {number} itemIndex
     69      * @return {string}
     70      */
     71     itemKeyAt: function(itemIndex)
     72     {
     73         var rule = this._cssParser.rules()[itemIndex];
     74         return rule.selectorText || rule.atRule;
     75     },
     76 
     77     /**
     78      * @param {number} itemIndex
     79      * @param {string} query
     80      * @return {number}
     81      */
     82     itemScoreAt: function(itemIndex, query)
     83     {
     84         var rule = this._cssParser.rules()[itemIndex];
     85         return -rule.lineNumber;
     86     },
     87 
     88     /**
     89      * @param {number} itemIndex
     90      * @param {string} query
     91      * @param {!Element} titleElement
     92      * @param {!Element} subtitleElement
     93      */
     94     renderItem: function(itemIndex, query, titleElement, subtitleElement)
     95     {
     96         var rule = this._cssParser.rules()[itemIndex];
     97         titleElement.textContent = rule.selectorText || rule.atRule;
     98         this.highlightRanges(titleElement, query);
     99         subtitleElement.textContent = ":" + (rule.lineNumber + 1);
    100     },
    101 
    102     /**
    103      * @param {number} itemIndex
    104      * @param {string} promptValue
    105      */
    106     selectItem: function(itemIndex, promptValue)
    107     {
    108         var rule = this._cssParser.rules()[itemIndex];
    109         var lineNumber = rule.lineNumber;
    110         if (!isNaN(lineNumber) && lineNumber >= 0)
    111             this._selectItemCallback(lineNumber, rule.columnNumber);
    112     },
    113 
    114     dispose: function()
    115     {
    116         this._cssParser.dispose();
    117     },
    118 
    119     __proto__: WebInspector.SelectionDialogContentProvider.prototype
    120 }
    121