460e5b52915cffd40bb59aa4bde640789941f166
[WebKit-https.git] / Source / WebCore / inspector / front-end / 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  */
34 WebInspector.DockController = function()
35 {
36     this._dockToggleButton = new WebInspector.StatusBarButton("", "dock-status-bar-item", 3);
37     this._dockToggleButtonOption = new WebInspector.StatusBarButton("", "dock-status-bar-item", 3);
38     this._dockToggleButton.addEventListener("click", this._toggleDockState, this);
39     this._dockToggleButtonOption.addEventListener("click", this._toggleDockState, this);
40     if (Preferences.showDockToRight)
41         this._dockToggleButton.makeLongClickEnabled(this._createDockOptions.bind(this));
42
43     this.setDockSide(WebInspector.queryParamsObject["dockSide"] || "bottom");
44     WebInspector.settings.showToolbarIcons.addChangeListener(this._updateUI.bind(this));
45 }
46
47 WebInspector.DockController.State = {
48     DockedToBottom: "bottom",
49     DockedToRight: "right",
50     Undocked: "undocked"
51 }
52
53 WebInspector.DockController.prototype = {
54     /**
55      * @return {Element}
56      */
57     get element()
58     {
59         return this._dockToggleButton.element;
60     },
61
62     /**
63      * @param {string} dockSide
64      */
65     setDockSide: function(dockSide)
66     {
67         if (this._dockSide === dockSide)
68             return;
69
70         if (this._dockSide)
71             WebInspector.settings.lastDockState.set(this._dockSide);
72
73         this._dockSide = dockSide;
74         if (dockSide === WebInspector.DockController.State.Undocked) 
75             WebInspector.userMetrics.WindowDocked.record();
76         else
77             WebInspector.userMetrics.WindowUndocked.record();
78         this._updateUI();
79     },
80
81     /**
82      * @return {boolean}
83      */
84     isDockedToBottom: function()
85     {
86         return this._dockSide == WebInspector.DockController.State.DockedToBottom;
87     },
88
89     /**
90      * @param {boolean} unavailable
91      */
92     setDockingUnavailable: function(unavailable)
93     {
94         this._isDockingUnavailable = unavailable;
95         this._updateUI();
96     },
97
98     _updateUI: function()
99     {
100         var body = document.body;
101         switch (this._dockSide) {
102         case WebInspector.DockController.State.DockedToBottom:
103             body.removeStyleClass("undocked");
104             body.removeStyleClass("dock-to-right");
105             body.addStyleClass("dock-to-bottom");
106             break;
107         case WebInspector.DockController.State.DockedToRight: 
108             body.removeStyleClass("undocked");
109             body.addStyleClass("dock-to-right");
110             body.removeStyleClass("dock-to-bottom");
111             break;
112         case WebInspector.DockController.State.Undocked: 
113             body.addStyleClass("undocked");
114             body.removeStyleClass("dock-to-right");
115             body.removeStyleClass("dock-to-bottom");
116             break;
117         }
118
119         if (WebInspector.settings.showToolbarIcons.get())
120             document.body.addStyleClass("show-toolbar-icons");
121         else
122             document.body.removeStyleClass("show-toolbar-icons");
123
124         if (this._isDockingUnavailable && this._dockSide === WebInspector.DockController.State.Undocked) {
125             this._dockToggleButton.state = "undock";
126             this._dockToggleButton.setEnabled(false);
127             return;
128         }
129
130         this._dockToggleButton.setEnabled(true);
131
132         // Choose different last state based on the current one if missing or if is the same.
133         var sides = [WebInspector.DockController.State.DockedToBottom, WebInspector.DockController.State.Undocked, WebInspector.DockController.State.DockedToRight];
134         sides.remove(this._dockSide);
135         var lastState = WebInspector.settings.lastDockState.get();
136
137         sides.remove(lastState);
138         if (sides.length === 2) { // last state was not from the list of potential values
139             lastState = sides[0];
140             sides.remove(lastState);
141         }
142         this._decorateButtonForTargetState(this._dockToggleButton, lastState);
143         this._decorateButtonForTargetState(this._dockToggleButtonOption, sides[0]);
144     },
145
146     /**
147      * @param {WebInspector.StatusBarButton} button
148      * @param {string} state
149      */
150     _decorateButtonForTargetState: function(button, state)
151     {
152         switch (state) {
153         case WebInspector.DockController.State.DockedToBottom:
154             button.title = WebInspector.UIString("Dock to main window.");
155             button.state = "bottom";
156             break;
157         case WebInspector.DockController.State.DockedToRight:
158             button.title = WebInspector.UIString("Dock to main window.");
159             button.state = "right";
160             break;
161         case WebInspector.DockController.State.Undocked: 
162             button.title = WebInspector.UIString("Undock into separate window.");
163             button.state = "undock";
164             break;
165         }
166     },
167
168     _createDockOptions: function()
169     {
170         return [this._dockToggleButtonOption];
171     },
172
173     /**
174      * @param {WebInspector.Event} e
175      */
176     _toggleDockState: function(e)
177     {
178         var action;
179         switch (e.target.state) {
180         case "bottom": action = "bottom"; break;
181         case "right": action = "right"; break;
182         case "undock": action = "undocked"; break;
183         }
184         InspectorFrontendHost.requestSetDockSide(action);
185     }
186 }
187
188 /**
189  * @type {?WebInspector.DockController}
190  */
191 WebInspector.dockController = null;