• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2 * Copyright (C) 2006, 2007, 2008 Apple Inc.  All rights reserved.
3 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com).
4 * Copyright (C) 2009 Joseph Pecoraro
5 * Copyright (C) 2011 Google Inc. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1.  Redistributions of source code must retain the above copyright
12 *     notice, this list of conditions and the following disclaimer.
13 * 2.  Redistributions in binary form must reproduce the above copyright
14 *     notice, this list of conditions and the following disclaimer in the
15 *     documentation and/or other materials provided with the distribution.
16 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
17 *     its contributors may be used to endorse or promote products derived
18 *     from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
24 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32WebInspector.Toolbar = function()
33{
34    this.element = document.getElementById("toolbar");
35    this.element.addEventListener("mousedown", this._toolbarDragStart.bind(this), true);
36
37    this._dropdownButton = document.getElementById("toolbar-dropdown-arrow");
38    this._dropdownButton.addEventListener("click", this._toggleDropdown.bind(this), false);
39
40    document.getElementById("close-button-left").addEventListener("click", this._onClose, true);
41    document.getElementById("close-button-right").addEventListener("click", this._onClose, true);
42}
43
44WebInspector.Toolbar.prototype = {
45    resize: function()
46    {
47        this._updateDropdownButtonAndHideDropdown();
48    },
49
50    addPanel: function(panel)
51    {
52        this.element.appendChild(panel.toolbarItem);
53        this.resize();
54    },
55
56    _toolbarDragStart: function(event)
57    {
58        if ((!WebInspector.attached && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacLeopard && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacSnowLeopard) || WebInspector.port == "qt")
59            return;
60
61        var target = event.target;
62        if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable"))
63            return;
64
65        if (target !== this.element && !target.hasStyleClass("toolbar-item"))
66            return;
67
68        this.element.lastScreenX = event.screenX;
69        this.element.lastScreenY = event.screenY;
70
71        WebInspector.elementDragStart(this.element, this._toolbarDrag.bind(this), this._toolbarDragEnd.bind(this), event, (WebInspector.attached ? "row-resize" : "default"));
72    },
73
74    _toolbarDragEnd: function(event)
75    {
76        WebInspector.elementDragEnd(event);
77
78        delete this.element.lastScreenX;
79        delete this.element.lastScreenY;
80    },
81
82    _toolbarDrag: function(event)
83    {
84        if (WebInspector.attached) {
85            var height = window.innerHeight - (event.screenY - this.element.lastScreenY);
86
87            InspectorFrontendHost.setAttachedWindowHeight(height);
88        } else {
89            var x = event.screenX - this.element.lastScreenX;
90            var y = event.screenY - this.element.lastScreenY;
91
92            // We cannot call window.moveBy here because it restricts the movement
93            // of the window at the edges.
94            InspectorFrontendHost.moveWindowBy(x, y);
95        }
96
97        this.element.lastScreenX = event.screenX;
98        this.element.lastScreenY = event.screenY;
99
100        event.preventDefault();
101    },
102
103    _onClose: function()
104    {
105        WebInspector.close();
106    },
107
108    _setDropdownVisible: function(visible)
109    {
110        if (!this._dropdown) {
111            if (!visible)
112                return;
113            this._dropdown = new WebInspector.ToolbarDropdown();
114        }
115        if (visible)
116            this._dropdown.show();
117        else
118            this._dropdown.hide();
119    },
120
121    _toggleDropdown: function()
122    {
123        this._setDropdownVisible(!this._dropdown || !this._dropdown.visible);
124    },
125
126    _updateDropdownButtonAndHideDropdown: function()
127    {
128        this._setDropdownVisible(false);
129
130        var toolbar = document.getElementById("toolbar");
131        if (this.element.scrollHeight > this.element.clientHeight)
132            this._dropdownButton.removeStyleClass("hidden");
133        else
134            this._dropdownButton.addStyleClass("hidden");
135    }
136};
137
138WebInspector.Toolbar.createPanelToolbarItem = function(panel)
139{
140    var toolbarItem = document.createElement("button");
141    toolbarItem.className = "toolbar-item toggleable";
142    toolbarItem.panel = panel;
143    toolbarItem.addStyleClass(panel._panelName);
144    function onToolbarItemClicked()
145    {
146        WebInspector.toolbar._updateDropdownButtonAndHideDropdown();
147        WebInspector.currentPanel = panel;
148    }
149    toolbarItem.addEventListener("click", onToolbarItemClicked);
150
151    var iconElement = toolbarItem.createChild("div", "toolbar-icon");
152
153    if ("toolbarItemLabel" in panel)
154        toolbarItem.createChild("div", "toolbar-label").textContent = panel.toolbarItemLabel;
155
156    if (panel === WebInspector.currentPanel)
157        toolbarItem.addStyleClass("toggled-on");
158
159    return toolbarItem;
160}
161
162WebInspector.ToolbarDropdown = function()
163{
164    this._toolbar = document.getElementById("toolbar");
165    this._arrow = document.getElementById("toolbar-dropdown-arrow");
166    this.element = document.createElement("div");
167    this.element.id = "toolbar-dropdown";
168    this._contentElement = this.element.createChild("div", "scrollable-content");
169    this._contentElement.tabIndex = 0;
170    this._contentElement.addEventListener("keydown", this._onKeyDown.bind(this), true);
171}
172
173WebInspector.ToolbarDropdown.prototype = {
174    show: function()
175    {
176        if (this.visible)
177            return;
178        var style = this.element.style;
179        this._populate();
180        var top = this._arrow.totalOffsetTop + this._arrow.clientHeight;
181        this._arrow.addStyleClass("dropdown-visible");
182        this.element.style.top = top + "px";
183        this.element.style.left = this._arrow.totalOffsetLeft + "px";
184        this._contentElement.style.maxHeight = window.innerHeight - top - 20 + "px";
185        this._toolbar.appendChild(this.element);
186        WebInspector.currentFocusElement = this.contentElement;
187    },
188
189    hide: function()
190    {
191        if (!this.visible)
192            return;
193        this._arrow.removeStyleClass("dropdown-visible");
194        this.element.parentNode.removeChild(this.element);
195        this._contentElement.removeChildren();
196    },
197
198    get visible()
199    {
200        return !!this.element.parentNode;
201    },
202
203    _populate: function()
204    {
205        var toolbarItems = this._toolbar.querySelectorAll(".toolbar-item.toggleable");
206
207        for (var i = 0; i < toolbarItems.length; ++i) {
208            if (toolbarItems[i].offsetTop > 0)
209                this._contentElement.appendChild(WebInspector.Toolbar.createPanelToolbarItem(toolbarItems[i].panel));
210        }
211    },
212
213    _onKeyDown: function(event)
214    {
215        if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.Esc.code)
216            return;
217        event.stopPropagation();
218        this.hide();
219    }
220};
221