1 /* 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Joseph Pecoraro 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15 * its contributors may be used to endorse or promote products derived 16 * from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 /** 31 * @constructor 32 * @extends {WebInspector.VBox} 33 * @param {!WebInspector.SplitView} splitView 34 */ 35 WebInspector.Drawer = function(splitView) 36 { 37 WebInspector.VBox.call(this); 38 this.element.id = "drawer-contents"; 39 40 this._splitView = splitView; 41 splitView.hideDefaultResizer(); 42 this.show(splitView.sidebarElement()); 43 44 this._toggleDrawerButton = new WebInspector.StatusBarButton(WebInspector.UIString("Show drawer."), "console-status-bar-item"); 45 this._toggleDrawerButton.addEventListener("click", this.toggle, this); 46 47 this._tabbedPane = new WebInspector.TabbedPane(); 48 this._tabbedPane.element.id = "drawer-tabbed-pane"; 49 this._tabbedPane.closeableTabs = false; 50 this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this); 51 new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane, "drawer-view"); 52 53 splitView.installResizer(this._tabbedPane.headerElement()); 54 this._lastSelectedViewSetting = WebInspector.settings.createSetting("WebInspector.Drawer.lastSelectedView", "console"); 55 this._tabbedPane.show(this.element); 56 } 57 58 WebInspector.Drawer.prototype = { 59 /** 60 * @return {!WebInspector.StatusBarButton} 61 */ 62 toggleButton: function() 63 { 64 return this._toggleDrawerButton; 65 }, 66 67 /** 68 * @param {string} id 69 */ 70 closeView: function(id) 71 { 72 this._tabbedPane.closeTab(id); 73 }, 74 75 /** 76 * @param {string} id 77 * @param {boolean=} immediate 78 */ 79 showView: function(id, immediate) 80 { 81 if (!this._tabbedPane.hasTab(id)) { 82 // Hidden tab. 83 this._innerShow(immediate); 84 return; 85 } 86 this._innerShow(immediate); 87 this._tabbedPane.selectTab(id, true); 88 // In case this id is already selected, anyways persist it as the last saved value. 89 this._lastSelectedViewSetting.set(id); 90 }, 91 92 /** 93 * @param {string} id 94 * @param {string} title 95 * @param {!WebInspector.View} view 96 */ 97 showCloseableView: function(id, title, view) 98 { 99 if (!this._tabbedPane.hasTab(id)) { 100 this._tabbedPane.appendTab(id, title, view, undefined, false, true); 101 } else { 102 this._tabbedPane.changeTabView(id, view); 103 this._tabbedPane.changeTabTitle(id, title); 104 } 105 this._innerShow(); 106 this._tabbedPane.selectTab(id, true); 107 }, 108 109 showDrawer: function() 110 { 111 this.showView(this._lastSelectedViewSetting.get()); 112 }, 113 114 wasShown: function() 115 { 116 this.showView(this._lastSelectedViewSetting.get()); 117 this._toggleDrawerButton.toggled = true; 118 this._toggleDrawerButton.title = WebInspector.UIString("Hide drawer."); 119 }, 120 121 willHide: function() 122 { 123 this._toggleDrawerButton.toggled = false; 124 this._toggleDrawerButton.title = WebInspector.UIString("Show drawer."); 125 }, 126 127 /** 128 * @param {boolean=} immediate 129 */ 130 _innerShow: function(immediate) 131 { 132 if (this.isShowing()) 133 return; 134 135 this._splitView.showBoth(!immediate); 136 137 if (this._visibleView()) 138 this._visibleView().focus(); 139 }, 140 141 closeDrawer: function() 142 { 143 if (!this.isShowing()) 144 return; 145 146 WebInspector.restoreFocusFromElement(this.element); 147 this._splitView.hideSidebar(true); 148 }, 149 150 /** 151 * @return {?WebInspector.View} view 152 */ 153 _visibleView: function() 154 { 155 return this._tabbedPane.visibleView; 156 }, 157 158 /** 159 * @param {!WebInspector.Event} event 160 */ 161 _tabSelected: function(event) 162 { 163 var tabId = this._tabbedPane.selectedTabId; 164 if (tabId && event.data["isUserGesture"] && !this._tabbedPane.isTabCloseable(tabId)) 165 this._lastSelectedViewSetting.set(tabId); 166 }, 167 168 toggle: function() 169 { 170 if (this._toggleDrawerButton.toggled) 171 this.closeDrawer(); 172 else 173 this.showDrawer(); 174 }, 175 176 /** 177 * @return {boolean} 178 */ 179 visible: function() 180 { 181 return this._toggleDrawerButton.toggled; 182 }, 183 184 /** 185 * @return {?string} 186 */ 187 selectedViewId: function() 188 { 189 return this._tabbedPane.selectedTabId; 190 }, 191 192 initialPanelShown: function() 193 { 194 this._initialPanelWasShown = true; 195 }, 196 197 __proto__: WebInspector.VBox.prototype 198 } 199 200 /** 201 * @interface 202 */ 203 WebInspector.Drawer.ViewFactory = function() 204 { 205 } 206 207 WebInspector.Drawer.ViewFactory.prototype = { 208 /** 209 * @return {!WebInspector.View} 210 */ 211 createView: function() {} 212 } 213 214 /** 215 * @constructor 216 * @implements {WebInspector.Drawer.ViewFactory} 217 * @param {function(new:T)} constructor 218 * @template T 219 */ 220 WebInspector.Drawer.SingletonViewFactory = function(constructor) 221 { 222 this._constructor = constructor; 223 } 224 225 WebInspector.Drawer.SingletonViewFactory.prototype = { 226 /** 227 * @return {!WebInspector.View} 228 */ 229 createView: function() 230 { 231 if (!this._instance) 232 this._instance = /** @type {!WebInspector.View} */(new this._constructor()); 233 return this._instance; 234 } 235 } 236