Home | History | Annotate | Download | only in components
      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