diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/components/DockController.js')
-rw-r--r-- | chromium/third_party/WebKit/Source/devtools/front_end/components/DockController.js | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/components/DockController.js b/chromium/third_party/WebKit/Source/devtools/front_end/components/DockController.js new file mode 100644 index 00000000000..24179082f47 --- /dev/null +++ b/chromium/third_party/WebKit/Source/devtools/front_end/components/DockController.js @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @constructor + * @extends {WebInspector.Object} + * @param {boolean} canDock + */ +WebInspector.DockController = function(canDock) +{ + this._canDock = canDock; + if (!canDock) { + this._dockSide = WebInspector.DockController.State.Undocked; + this._updateUI(); + return; + } + + WebInspector.settings.currentDockState = WebInspector.settings.createSetting("currentDockState", ""); + WebInspector.settings.lastDockState = WebInspector.settings.createSetting("lastDockState", ""); +} + +WebInspector.DockController.State = { + DockedToBottom: "bottom", + DockedToRight: "right", + DockedToLeft: "left", + Undocked: "undocked" +} + +// Use BeforeDockSideChanged to do something before all the UI bits are updated, +// DockSideChanged to update UI, and AfterDockSideChanged to perform actions +// after frontend is docked/undocked in the browser. +WebInspector.DockController.Events = { + BeforeDockSideChanged: "BeforeDockSideChanged", + DockSideChanged: "DockSideChanged", + AfterDockSideChanged: "AfterDockSideChanged" +} + +WebInspector.DockController.prototype = { + initialize: function() + { + if (!this._canDock) + return; + + this._states = [WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked, WebInspector.DockController.State.DockedToRight]; + this._titles = [WebInspector.UIString("Dock to main window."), WebInspector.UIString("Undock into separate window."), WebInspector.UIString("Dock to main window.")]; + if (WebInspector.experimentsSettings.dockToLeft.isEnabled()) { + this._states.push(WebInspector.DockController.State.DockedToLeft); + this._titles.push(WebInspector.UIString("Dock to main window.")); + } + var initialState = WebInspector.settings.currentDockState.get(); + initialState = this._states.indexOf(initialState) >= 0 ? initialState : this._states[0]; + this._dockSideChanged(initialState); + }, + + /** + * @return {string} + */ + dockSide: function() + { + return this._dockSide; + }, + + /** + * @return {boolean} + */ + canDock: function() + { + return this._canDock; + }, + + /** + * @return {boolean} + */ + isVertical: function() + { + return this._dockSide === WebInspector.DockController.State.DockedToRight || this._dockSide === WebInspector.DockController.State.DockedToLeft; + }, + + /** + * @param {string} dockSide + */ + _dockSideChanged: function(dockSide) + { + if (this._dockSide === dockSide) + return; + + var eventData = { from: this._dockSide, to: dockSide }; + this.dispatchEventToListeners(WebInspector.DockController.Events.BeforeDockSideChanged, eventData); + InspectorFrontendHost.setIsDocked(dockSide !== WebInspector.DockController.State.Undocked, this._setIsDockedResponse.bind(this, eventData)); + this._dockSide = dockSide; + this._updateUI(); + this.dispatchEventToListeners(WebInspector.DockController.Events.DockSideChanged, eventData); + }, + + /** + * @param {{from: string, to: string}} eventData + */ + _setIsDockedResponse: function(eventData) + { + this.dispatchEventToListeners(WebInspector.DockController.Events.AfterDockSideChanged, eventData); + }, + + _updateUI: function() + { + var body = document.body; + switch (this._dockSide) { + case WebInspector.DockController.State.DockedToBottom: + body.classList.remove("undocked"); + body.classList.remove("dock-to-right"); + body.classList.remove("dock-to-left"); + body.classList.add("dock-to-bottom"); + break; + case WebInspector.DockController.State.DockedToRight: + body.classList.remove("undocked"); + body.classList.add("dock-to-right"); + body.classList.remove("dock-to-left"); + body.classList.remove("dock-to-bottom"); + break; + case WebInspector.DockController.State.DockedToLeft: + body.classList.remove("undocked"); + body.classList.remove("dock-to-right"); + body.classList.add("dock-to-left"); + body.classList.remove("dock-to-bottom"); + break; + case WebInspector.DockController.State.Undocked: + body.classList.add("undocked"); + body.classList.remove("dock-to-right"); + body.classList.remove("dock-to-left"); + body.classList.remove("dock-to-bottom"); + break; + } + }, + + __proto__: WebInspector.Object.prototype +} + +/** + * @constructor + * @implements {WebInspector.StatusBarButton.Provider} + */ +WebInspector.DockController.ButtonProvider = function() +{ +} + +WebInspector.DockController.ButtonProvider.prototype = { + /** + * @return {?WebInspector.StatusBarButton} + */ + button: function() + { + if (!WebInspector.dockController.canDock()) + return null; + + if (!this._dockToggleButton) { + this._dockToggleButton = new WebInspector.StatusBarStatesSettingButton( + "dock-status-bar-item", + WebInspector.dockController._states, + WebInspector.dockController._titles, + WebInspector.dockController.dockSide(), + WebInspector.settings.currentDockState, + WebInspector.settings.lastDockState, + WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController)); + } + return this._dockToggleButton; + } +} + +/** + * @type {!WebInspector.DockController} + */ +WebInspector.dockController; |