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.createElement("div"); 40 this.titleElement.className = "sidebar-pane-toolbar"; 41 42 this.bodyElement = this.element.createChild("div", "body"); 43 44 this._title = title; 45 46 this._expandCallback = null; 47 } 48 49 WebInspector.SidebarPane.EventTypes = { 50 wasShown: "wasShown" 51 } 52 53 WebInspector.SidebarPane.prototype = { 54 /** 55 * @return {string} 56 */ 57 title: function() 58 { 59 return this._title; 60 }, 61 62 /** 63 * @param {function()} callback 64 */ 65 prepareContent: function(callback) 66 { 67 if (callback) 68 callback(); 69 }, 70 71 expand: function() 72 { 73 this.prepareContent(this.onContentReady.bind(this)); 74 }, 75 76 onContentReady: function() 77 { 78 if (this._expandCallback) 79 this._expandCallback(); 80 else 81 this._expandPending = true; 82 }, 83 84 /** 85 * @param {function()} callback 86 */ 87 setExpandCallback: function(callback) 88 { 89 this._expandCallback = callback; 90 if (this._expandPending) { 91 delete this._expandPending; 92 this._expandCallback(); 93 } 94 }, 95 96 wasShown: function() 97 { 98 WebInspector.View.prototype.wasShown.call(this); 99 this.dispatchEventToListeners(WebInspector.SidebarPane.EventTypes.wasShown); 100 }, 101 102 __proto__: WebInspector.View.prototype 103 } 104 105 /** 106 * @constructor 107 * @param {!Element} container 108 * @param {!WebInspector.SidebarPane} pane 109 */ 110 WebInspector.SidebarPaneTitle = function(container, pane) 111 { 112 this._pane = pane; 113 114 this.element = container.createChild("div", "sidebar-pane-title"); 115 this.element.textContent = pane.title(); 116 this.element.tabIndex = 0; 117 this.element.addEventListener("click", this._toggleExpanded.bind(this), false); 118 this.element.addEventListener("keydown", this._onTitleKeyDown.bind(this), false); 119 this.element.appendChild(this._pane.titleElement); 120 121 this._pane.setExpandCallback(this._expand.bind(this)); 122 } 123 124 WebInspector.SidebarPaneTitle.prototype = { 125 126 _expand: function() 127 { 128 this.element.classList.add("expanded"); 129 this._pane.show(this.element.parentElement, /** @type {?Element} */ (this.element.nextSibling)); 130 }, 131 132 _collapse: function() 133 { 134 this.element.classList.remove("expanded"); 135 if (this._pane.element.parentNode == this.element.parentNode) 136 this._pane.detach(); 137 }, 138 139 _toggleExpanded: function() 140 { 141 if (this.element.classList.contains("expanded")) 142 this._collapse(); 143 else 144 this._pane.expand(); 145 }, 146 147 /** 148 * @param {?Event} event 149 */ 150 _onTitleKeyDown: function(event) 151 { 152 if (isEnterKey(event) || event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code) 153 this._toggleExpanded(); 154 } 155 } 156 157 /** 158 * @constructor 159 * @extends {WebInspector.View} 160 */ 161 WebInspector.SidebarPaneStack = function() 162 { 163 WebInspector.View.call(this); 164 this.setMinimumSize(25, 0); 165 this.element.className = "sidebar-pane-stack"; // Override 166 this.registerRequiredCSS("sidebarPane.css"); 167 } 168 169 WebInspector.SidebarPaneStack.prototype = { 170 /** 171 * @param {!WebInspector.SidebarPane} pane 172 */ 173 addPane: function(pane) 174 { 175 new WebInspector.SidebarPaneTitle(this.element, pane); 176 }, 177 178 __proto__: WebInspector.View.prototype 179 } 180 181 /** 182 * @constructor 183 * @extends {WebInspector.TabbedPane} 184 */ 185 WebInspector.SidebarTabbedPane = function() 186 { 187 WebInspector.TabbedPane.call(this); 188 this.setRetainTabOrder(true); 189 this.element.classList.add("sidebar-tabbed-pane"); 190 this.registerRequiredCSS("sidebarPane.css"); 191 } 192 193 WebInspector.SidebarTabbedPane.prototype = { 194 /** 195 * @param {!WebInspector.SidebarPane} pane 196 */ 197 addPane: function(pane) 198 { 199 var title = pane.title(); 200 this.appendTab(title, title, pane); 201 pane.element.appendChild(pane.titleElement); 202 pane.setExpandCallback(this.selectTab.bind(this, title)); 203 204 }, 205 206 __proto__: WebInspector.TabbedPane.prototype 207 } 208