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.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