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.element.className = "sidebar-pane"; 37 38 this.titleElement = document.createElement("div"); 39 this.titleElement.className = "sidebar-pane-toolbar"; 40 41 this.bodyElement = this.element.createChild("div", "body"); 42 43 this._title = title; 44 45 this._expandCallback = null; 46 } 47 48 WebInspector.SidebarPane.EventTypes = { 49 wasShown: "wasShown" 50 } 51 52 WebInspector.SidebarPane.prototype = { 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.addStyleClass("expanded"); 125 this._pane.show(this.element.parentNode, this.element.nextSibling); 126 }, 127 128 _collapse: function() 129 { 130 this.element.removeStyleClass("expanded"); 131 if (this._pane.element.parentNode == this.element.parentNode) 132 this._pane.detach(); 133 }, 134 135 _toggleExpanded: function() 136 { 137 if (this.element.hasStyleClass("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.element.className = "sidebar-pane-stack fill"; 161 this.registerRequiredCSS("sidebarPane.css"); 162 } 163 164 WebInspector.SidebarPaneStack.prototype = { 165 /** 166 * @param {WebInspector.SidebarPane} pane 167 */ 168 addPane: function(pane) 169 { 170 new WebInspector.SidebarPaneTitle(this.element, pane); 171 }, 172 173 __proto__: WebInspector.View.prototype 174 } 175 176 /** 177 * @constructor 178 * @extends {WebInspector.TabbedPane} 179 */ 180 WebInspector.SidebarTabbedPane = function() 181 { 182 WebInspector.TabbedPane.call(this); 183 this.setRetainTabsOrder(true); 184 this.element.addStyleClass("sidebar-tabbed-pane"); 185 this.registerRequiredCSS("sidebarPane.css"); 186 } 187 188 WebInspector.SidebarTabbedPane.prototype = { 189 /** 190 * @param {WebInspector.SidebarPane} pane 191 */ 192 addPane: function(pane) 193 { 194 var title = pane.title(); 195 this.appendTab(title, title, pane); 196 pane.element.appendChild(pane.titleElement); 197 pane.setExpandCallback(this.selectTab.bind(this, title)); 198 199 }, 200 201 __proto__: WebInspector.TabbedPane.prototype 202 } 203