Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / devtools / front_end / components / DockController.js
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     /**
132      * @suppressGlobalPropertiesCheck
133      */
134     _updateUI: function()
135     {
136         var body = document.body;  // Only for main window.
137         switch (this._dockSide) {
138         case WebInspector.DockController.State.DockedToBottom:
139             body.classList.remove("undocked");
140             body.classList.remove("dock-to-right");
141             body.classList.remove("dock-to-left");
142             body.classList.add("dock-to-bottom");
143             break;
144         case WebInspector.DockController.State.DockedToRight:
145             body.classList.remove("undocked");
146             body.classList.add("dock-to-right");
147             body.classList.remove("dock-to-left");
148             body.classList.remove("dock-to-bottom");
149             break;
150         case WebInspector.DockController.State.DockedToLeft:
151             body.classList.remove("undocked");
152             body.classList.remove("dock-to-right");
153             body.classList.add("dock-to-left");
154             body.classList.remove("dock-to-bottom");
155             break;
156         case WebInspector.DockController.State.Undocked:
157             body.classList.add("undocked");
158             body.classList.remove("dock-to-right");
159             body.classList.remove("dock-to-left");
160             body.classList.remove("dock-to-bottom");
161             break;
162         }
163     },
164
165     __proto__: WebInspector.Object.prototype
166 }
167
168 /**
169  * @constructor
170  * @implements {WebInspector.StatusBarItem.Provider}
171  */
172 WebInspector.DockController.ButtonProvider = function()
173 {
174 }
175
176 WebInspector.DockController.ButtonProvider.prototype = {
177     /**
178      * @return {?WebInspector.StatusBarItem}
179      */
180     item: function()
181     {
182         if (!WebInspector.dockController.canDock())
183             return null;
184
185         if (!this._dockToggleButton) {
186             this._dockToggleButton = new WebInspector.StatusBarStatesSettingButton(
187                     "dock-status-bar-item",
188                     WebInspector.dockController._states,
189                     WebInspector.dockController._titles,
190                     WebInspector.dockController.dockSide(),
191                     WebInspector.settings.currentDockState,
192                     WebInspector.settings.lastDockState,
193                     WebInspector.dockController._dockSideChanged.bind(WebInspector.dockController));
194         }
195         return this._dockToggleButton;
196     }
197 }
198
199 /**
200  * @type {!WebInspector.DockController}
201  */
202 WebInspector.dockController;