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 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 /** 32 * @constructor 33 * @extends {WebInspector.Object} 34 * @param {boolean} canDock 35 */ 36 WebInspector.DockController = function(canDock) 37 { 38 this._canDock = canDock; 39 if (!canDock) { 40 this._dockSide = WebInspector.DockController.State.Undocked; 41 this._updateUI(); 42 return; 43 } 44 45 WebInspector.settings.currentDockState = WebInspector.settings.createSetting("currentDockState", ""); 46 WebInspector.settings.lastDockState = WebInspector.settings.createSetting("lastDockState", ""); 47 } 48 49 WebInspector.DockController.State = { 50 DockedToBottom: "bottom", 51 DockedToRight: "right", 52 DockedToLeft: "left", 53 Undocked: "undocked" 54 } 55 56 // Use BeforeDockSideChanged to do something before all the UI bits are updated, 57 // DockSideChanged to update UI, and AfterDockSideChanged to perform actions 58 // after frontend is docked/undocked in the browser. 59 WebInspector.DockController.Events = { 60 BeforeDockSideChanged: "BeforeDockSideChanged", 61 DockSideChanged: "DockSideChanged", 62 AfterDockSideChanged: "AfterDockSideChanged" 63 } 64 65 WebInspector.DockController.prototype = { 66 initialize: function() 67 { 68 if (!this._canDock) 69 return; 70 71 this._states = [WebInspector.DockController.State.DockedToRight, WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked]; 72 this._titles = [WebInspector.UIString("Dock to main window."), WebInspector.UIString("Dock to main window."), WebInspector.UIString("Undock into separate window.")]; 73 if (Runtime.experiments.isEnabled("dockToLeft")) { 74 this._states.push(WebInspector.DockController.State.DockedToLeft); 75 this._titles.push(WebInspector.UIString("Dock to main window.")); 76 } 77 var initialState = WebInspector.settings.currentDockState.get(); 78 initialState = this._states.indexOf(initialState) >= 0 ? initialState : this._states[0]; 79 this._dockSideChanged(initialState); 80 }, 81 82 /** 83 * @return {string} 84 */ 85 dockSide: function() 86 { 87 return this._dockSide; 88 }, 89 90 /** 91 * @return {boolean} 92 */ 93 canDock: function() 94 { 95 return this._canDock; 96 }, 97 98 /** 99 * @return {boolean} 100 */ 101 isVertical: function() 102 { 103 return this._dockSide === WebInspector.DockController.State.DockedToRight || this._dockSide === WebInspector.DockController.State.DockedToLeft; 104 }, 105 106 /** 107 * @param {string} dockSide 108 */ 109 _dockSideChanged: function(dockSide) 110 { 111 if (this._dockSide === dockSide) 112 return; 113 114 var eventData = { from: this._dockSide, to: dockSide }; 115 this.dispatchEventToListeners(WebInspector.DockController.Events.BeforeDockSideChanged, eventData); 116 console.timeStamp("DockController.setIsDocked"); 117 InspectorFrontendHost.setIsDocked(dockSide !== WebInspector.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData)); 118 this._dockSide = dockSide; 119 this._updateUI(); 120 this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged, eventData); 121 }, 122 123 /** 124 * @param {{from: string, to: string}} eventData 125 */ 126 _setIsDockedResponse: function(eventData) 127 { 128 this.dispatchEventToListeners(WebInspector.DockController.Events.AfterDockSideChanged, eventData); 129 }, 130 131 _updateUI: function() 132 { 133 var body = document.body; 134 switch (this._dockSide) { 135 case WebInspector.DockController.State.DockedToBottom: 136 body.classList.remove("undocked"); 137 body.classList.remove("dock-to-right"); 138 body.classList.remove("dock-to-left"); 139 body.classList.add("dock-to-bottom"); 140 break; 141 case WebInspector.DockController.State.DockedToRight: 142 body.classList.remove("undocked"); 143 body.classList.add("dock-to-right"); 144 body.classList.remove("dock-to-left"); 145 body.classList.remove("dock-to-bottom"); 146 break; 147 case WebInspector.DockController.State.DockedToLeft: 148 body.classList.remove("undocked"); 149 body.classList.remove("dock-to-right"); 150 body.classList.add("dock-to-left"); 151 body.classList.remove("dock-to-bottom"); 152 break; 153 case WebInspector.DockController.State.Undocked: 154 body.classList.add("undocked"); 155 body.classList.remove("dock-to-right"); 156 body.classList.remove("dock-to-left"); 157 body.classList.remove("dock-to-bottom"); 158 break; 159 } 160 }, 161 162 __proto__: WebInspector.Object.prototype 163 } 164 165 /** 166 * @constructor 167 * @implements {WebInspector.StatusBarItem.Provider} 168 */ 169 WebInspector.DockController.ButtonProvider = function() 170 { 171 } 172 173 WebInspector.DockController.ButtonProvider.prototype = { 174 /** 175 * @return {?WebInspector.StatusBarItem} 176 */ 177 item: function() 178 { 179 if (!WebInspector.dockController.canDock()) 180 return null; 181 182 if (!this._dockToggleButton) { 183 this._dockToggleButton = new WebInspector.StatusBarStatesSettingButton( 184 "dock-status-bar-item", 185 WebInspector.dockController._states, 186 WebInspector.dockController._titles, 187 WebInspector.dockController.dockSide(), 188 WebInspector.settings.currentDockState, 189 WebInspector.settings.lastDockState, 190 WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController)); 191 } 192 return this._dockToggleButton; 193 } 194 } 195 196 /** 197 * @type {!WebInspector.DockController} 198 */ 199 WebInspector.dockController; 200