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.DockedToBottom, WebInspector.DockController.State.Undocked, WebInspector.DockController.State.DockedToRight]; 72 this._titles = [WebInspector.UIString("Dock to main window."), WebInspector.UIString("Undock into separate window."), WebInspector.UIString("Dock to main window.")]; 73 if (WebInspector.experimentsSettings.dockToLeft.isEnabled()) { 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 InspectorFrontendHost.setIsDocked(dockSide !== WebInspector.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData)); 117 this._dockSide = dockSide; 118 this._updateUI(); 119 this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged, eventData); 120 }, 121 122 /** 123 * @param {{from: string, to: string}} eventData 124 */ 125 _setIsDockedResponse: function(eventData) 126 { 127 this.dispatchEventToListeners(WebInspector.DockController.Events.AfterDockSideChanged, eventData); 128 }, 129 130 _updateUI: function() 131 { 132 var body = document.body; 133 switch (this._dockSide) { 134 case WebInspector.DockController.State.DockedToBottom: 135 body.classList.remove("undocked"); 136 body.classList.remove("dock-to-right"); 137 body.classList.remove("dock-to-left"); 138 body.classList.add("dock-to-bottom"); 139 break; 140 case WebInspector.DockController.State.DockedToRight: 141 body.classList.remove("undocked"); 142 body.classList.add("dock-to-right"); 143 body.classList.remove("dock-to-left"); 144 body.classList.remove("dock-to-bottom"); 145 break; 146 case WebInspector.DockController.State.DockedToLeft: 147 body.classList.remove("undocked"); 148 body.classList.remove("dock-to-right"); 149 body.classList.add("dock-to-left"); 150 body.classList.remove("dock-to-bottom"); 151 break; 152 case WebInspector.DockController.State.Undocked: 153 body.classList.add("undocked"); 154 body.classList.remove("dock-to-right"); 155 body.classList.remove("dock-to-left"); 156 body.classList.remove("dock-to-bottom"); 157 break; 158 } 159 }, 160 161 __proto__: WebInspector.Object.prototype 162 } 163 164 /** 165 * @constructor 166 * @implements {WebInspector.StatusBarButton.Provider} 167 */ 168 WebInspector.DockController.ButtonProvider = function() 169 { 170 } 171 172 WebInspector.DockController.ButtonProvider.prototype = { 173 /** 174 * @return {?WebInspector.StatusBarButton} 175 */ 176 button: function() 177 { 178 if (!WebInspector.dockController.canDock()) 179 return null; 180 181 if (!this._dockToggleButton) { 182 this._dockToggleButton = new WebInspector.StatusBarStatesSettingButton( 183 "dock-status-bar-item", 184 WebInspector.dockController._states, 185 WebInspector.dockController._titles, 186 WebInspector.dockController.dockSide(), 187 WebInspector.settings.currentDockState, 188 WebInspector.settings.lastDockState, 189 WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController)); 190 } 191 return this._dockToggleButton; 192 } 193 } 194 195 /** 196 * @type {!WebInspector.DockController} 197 */ 198 WebInspector.dockController; 199