Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2007 Apple 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
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     14  *     its contributors may be used to endorse or promote products derived
     15  *     from this software without specific prior written permission.
     16  *
     17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 /**
     30  * @constructor
     31  * @extends {WebInspector.View}
     32  */
     33 WebInspector.SidebarPane = function(title)
     34 {
     35     WebInspector.View.call(this);
     36     this.setMinimumSize(25, 0);
     37     this.element.className = "sidebar-pane"; // Override
     38 
     39     this.titleElement = document.createElementWithClass("div", "sidebar-pane-toolbar");
     40     this.bodyElement = this.element.createChild("div", "body");
     41     this._title = title;
     42     this._expandCallback = null;
     43 }
     44 
     45 WebInspector.SidebarPane.EventTypes = {
     46     wasShown: "wasShown"
     47 }
     48 
     49 WebInspector.SidebarPane.prototype = {
     50     /**
     51      * @return {string}
     52      */
     53     title: function()
     54     {
     55         return this._title;
     56     },
     57 
     58     /**
     59      * @param {function()} callback
     60      */
     61     prepareContent: function(callback)
     62     {
     63         if (callback)
     64             callback();
     65     },
     66 
     67     expand: function()
     68     {
     69         this.prepareContent(this.onContentReady.bind(this));
     70     },
     71 
     72     onContentReady: function()
     73     {
     74         if (this._expandCallback)
     75             this._expandCallback();
     76         else
     77             this._expandPending = true;
     78     },
     79 
     80     /**
     81      * @param {function()} callback
     82      */
     83     setExpandCallback: function(callback)
     84     {
     85         this._expandCallback = callback;
     86         if (this._expandPending) {
     87             delete this._expandPending;
     88             this._expandCallback();
     89         }
     90     },
     91 
     92     wasShown: function()
     93     {
     94         WebInspector.View.prototype.wasShown.call(this);
     95         this.dispatchEventToListeners(WebInspector.SidebarPane.EventTypes.wasShown);
     96     },
     97 
     98     __proto__: WebInspector.View.prototype
     99 }
    100 
    101 /**
    102  * @constructor
    103  * @param {!Element} container
    104  * @param {!WebInspector.SidebarPane} pane
    105  */
    106 WebInspector.SidebarPaneTitle = function(container, pane)
    107 {
    108     this._pane = pane;
    109 
    110     this.element = container.createChild("div", "sidebar-pane-title");
    111     this.element.textContent = pane.title();
    112     this.element.tabIndex = 0;
    113     this.element.addEventListener("click", this._toggleExpanded.bind(this), false);
    114     this.element.addEventListener("keydown", this._onTitleKeyDown.bind(this), false);
    115     this.element.appendChild(this._pane.titleElement);
    116 
    117     this._pane.setExpandCallback(this._expand.bind(this));
    118 }
    119 
    120 WebInspector.SidebarPaneTitle.prototype = {
    121 
    122     _expand: function()
    123     {
    124         this.element.classList.add("expanded");
    125         this._pane.show(this.element.parentElement, /** @type {?Element} */ (this.element.nextSibling));
    126     },
    127 
    128     _collapse: function()
    129     {
    130         this.element.classList.remove("expanded");
    131         if (this._pane.element.parentNode == this.element.parentNode)
    132             this._pane.detach();
    133     },
    134 
    135     _toggleExpanded: function()
    136     {
    137         if (this.element.classList.contains("expanded"))
    138             this._collapse();
    139         else
    140             this._pane.expand();
    141     },
    142 
    143     /**
    144      * @param {!Event} event
    145      */
    146     _onTitleKeyDown: function(event)
    147     {
    148         if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code)
    149             this._toggleExpanded();
    150     }
    151 }
    152 
    153 /**
    154  * @constructor
    155  * @extends {WebInspector.View}
    156  */
    157 WebInspector.SidebarPaneStack = function()
    158 {
    159     WebInspector.View.call(this);
    160     this.setMinimumSize(25, 0);
    161     this.element.className = "sidebar-pane-stack"; // Override
    162     /** @type {!Map.<!WebInspector.SidebarPane, !WebInspector.SidebarPaneTitle>} */
    163     this._titleByPane = new Map();
    164 }
    165 
    166 WebInspector.SidebarPaneStack.prototype = {
    167     /**
    168      * @param {!WebInspector.SidebarPane} pane
    169      */
    170     addPane: function(pane)
    171     {
    172         this._titleByPane.set(pane, new WebInspector.SidebarPaneTitle(this.element, pane));
    173     },
    174 
    175     /**
    176      * @param {!WebInspector.SidebarPane} pane
    177      * @param {boolean} hide
    178      */
    179     togglePaneHidden: function(pane, hide)
    180     {
    181         var title = this._titleByPane.get(pane);
    182         if (!title)
    183             return;
    184 
    185         title.element.classList.toggle("hidden", hide);
    186         pane.element.classList.toggle("hidden", hide);
    187     },
    188 
    189     __proto__: WebInspector.View.prototype
    190 }
    191 
    192 /**
    193  * @constructor
    194  * @extends {WebInspector.TabbedPane}
    195  */
    196 WebInspector.SidebarTabbedPane = function()
    197 {
    198     WebInspector.TabbedPane.call(this);
    199     this.setRetainTabOrder(true);
    200     this.element.classList.add("sidebar-tabbed-pane");
    201 }
    202 
    203 WebInspector.SidebarTabbedPane.prototype = {
    204     /**
    205      * @param {!WebInspector.SidebarPane} pane
    206      */
    207     addPane: function(pane)
    208     {
    209         var title = pane.title();
    210         this.appendTab(title, title, pane);
    211         pane.element.appendChild(pane.titleElement);
    212         pane.setExpandCallback(this.selectTab.bind(this, title));
    213 
    214     },
    215 
    216     __proto__: WebInspector.TabbedPane.prototype
    217 }
    218