/* * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). * Copyright (C) 2009 Joseph Pecoraro * Copyright (C) 2011 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ WebInspector.Toolbar = function() { this.element = document.getElementById("toolbar"); this.element.addEventListener("mousedown", this._toolbarDragStart.bind(this), true); this._dropdownButton = document.getElementById("toolbar-dropdown-arrow"); this._dropdownButton.addEventListener("click", this._toggleDropdown.bind(this), false); document.getElementById("close-button-left").addEventListener("click", this._onClose, true); document.getElementById("close-button-right").addEventListener("click", this._onClose, true); } WebInspector.Toolbar.prototype = { resize: function() { this._updateDropdownButtonAndHideDropdown(); }, addPanel: function(panel) { this.element.appendChild(panel.toolbarItem); this.resize(); }, _toolbarDragStart: function(event) { if ((!WebInspector.attached && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacLeopard && WebInspector.platformFlavor !== WebInspector.PlatformFlavor.MacSnowLeopard) || WebInspector.port == "qt") return; var target = event.target; if (target.hasStyleClass("toolbar-item") && target.hasStyleClass("toggleable")) return; if (target !== this.element && !target.hasStyleClass("toolbar-item")) return; this.element.lastScreenX = event.screenX; this.element.lastScreenY = event.screenY; WebInspector.elementDragStart(this.element, this._toolbarDrag.bind(this), this._toolbarDragEnd.bind(this), event, (WebInspector.attached ? "row-resize" : "default")); }, _toolbarDragEnd: function(event) { WebInspector.elementDragEnd(event); delete this.element.lastScreenX; delete this.element.lastScreenY; }, _toolbarDrag: function(event) { if (WebInspector.attached) { var height = window.innerHeight - (event.screenY - this.element.lastScreenY); InspectorFrontendHost.setAttachedWindowHeight(height); } else { var x = event.screenX - this.element.lastScreenX; var y = event.screenY - this.element.lastScreenY; // We cannot call window.moveBy here because it restricts the movement // of the window at the edges. InspectorFrontendHost.moveWindowBy(x, y); } this.element.lastScreenX = event.screenX; this.element.lastScreenY = event.screenY; event.preventDefault(); }, _onClose: function() { WebInspector.close(); }, _setDropdownVisible: function(visible) { if (!this._dropdown) { if (!visible) return; this._dropdown = new WebInspector.ToolbarDropdown(); } if (visible) this._dropdown.show(); else this._dropdown.hide(); }, _toggleDropdown: function() { this._setDropdownVisible(!this._dropdown || !this._dropdown.visible); }, _updateDropdownButtonAndHideDropdown: function() { this._setDropdownVisible(false); var toolbar = document.getElementById("toolbar"); if (this.element.scrollHeight > this.element.clientHeight) this._dropdownButton.removeStyleClass("hidden"); else this._dropdownButton.addStyleClass("hidden"); } }; WebInspector.Toolbar.createPanelToolbarItem = function(panel) { var toolbarItem = document.createElement("button"); toolbarItem.className = "toolbar-item toggleable"; toolbarItem.panel = panel; toolbarItem.addStyleClass(panel._panelName); function onToolbarItemClicked() { WebInspector.toolbar._updateDropdownButtonAndHideDropdown(); WebInspector.currentPanel = panel; } toolbarItem.addEventListener("click", onToolbarItemClicked); var iconElement = toolbarItem.createChild("div", "toolbar-icon"); if ("toolbarItemLabel" in panel) toolbarItem.createChild("div", "toolbar-label").textContent = panel.toolbarItemLabel; if (panel === WebInspector.currentPanel) toolbarItem.addStyleClass("toggled-on"); return toolbarItem; } WebInspector.ToolbarDropdown = function() { this._toolbar = document.getElementById("toolbar"); this._arrow = document.getElementById("toolbar-dropdown-arrow"); this.element = document.createElement("div"); this.element.id = "toolbar-dropdown"; this._contentElement = this.element.createChild("div", "scrollable-content"); this._contentElement.tabIndex = 0; this._contentElement.addEventListener("keydown", this._onKeyDown.bind(this), true); } WebInspector.ToolbarDropdown.prototype = { show: function() { if (this.visible) return; var style = this.element.style; this._populate(); var top = this._arrow.totalOffsetTop + this._arrow.clientHeight; this._arrow.addStyleClass("dropdown-visible"); this.element.style.top = top + "px"; this.element.style.left = this._arrow.totalOffsetLeft + "px"; this._contentElement.style.maxHeight = window.innerHeight - top - 20 + "px"; this._toolbar.appendChild(this.element); WebInspector.currentFocusElement = this.contentElement; }, hide: function() { if (!this.visible) return; this._arrow.removeStyleClass("dropdown-visible"); this.element.parentNode.removeChild(this.element); this._contentElement.removeChildren(); }, get visible() { return !!this.element.parentNode; }, _populate: function() { var toolbarItems = this._toolbar.querySelectorAll(".toolbar-item.toggleable"); for (var i = 0; i < toolbarItems.length; ++i) { if (toolbarItems[i].offsetTop > 0) this._contentElement.appendChild(WebInspector.Toolbar.createPanelToolbarItem(toolbarItems[i].panel)); } }, _onKeyDown: function(event) { if (event.keyCode !== WebInspector.KeyboardShortcut.Keys.Esc.code) return; event.stopPropagation(); this.hide(); } };