/* * Copyright (C) 2017 Apple 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. 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 INC. 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. */ WI.ConsoleDrawer = class ConsoleDrawer extends WI.ContentBrowser { constructor(element) { const delegate = null; super(element, delegate, { hideBackForwardButtons: true, disableBackForwardNavigation: true, disableFindBanner: true, flexibleNavigationItem: new WI.NavigationItem, }); this.element.classList.add("console-drawer"); this._drawerHeightSetting = new WI.Setting("console-drawer-height", 150); this.navigationBar.element.addEventListener("mousedown", this._consoleResizerMouseDown.bind(this)); this._toggleDrawerButton = new WI.ToggleButtonNavigationItem("toggle-drawer", WI.UIString("Hide Console"), WI.UIString("Show Console"), "Images/HideConsoleDrawer.svg", "Images/ShowConsoleDrawer.svg"); this._toggleDrawerButton.visibilityPriority = WI.NavigationItem.VisibilityPriority.High; this._toggleDrawerButton.addEventListener(WI.ButtonNavigationItem.Event.Clicked, function(event) { WI.toggleSplitConsole(); }, this._toggleDrawerButton); this.navigationBar.insertNavigationItem(this._toggleDrawerButton, 0); this.collapsed = true; WI.TabBrowser.addEventListener(WI.TabBrowser.Event.SelectedTabContentViewDidChange, this._selectedTabContentViewDidChange, this); } // Public toggleButtonShortcutTooltip(keyboardShortcut) { this._toggleDrawerButton.defaultToolTip = WI.UIString("Hide Console (%s)").format(keyboardShortcut.displayName); } get collapsed() { return this._collapsed; } set collapsed(flag) { if (flag === this._collapsed) return; this._collapsed = flag || false; this._toggleDrawerButton.toggled = this._collapsed; this.element.classList.toggle("hidden", this._collapsed); // Manually call `attached`/`detached` because we never expect to actually remove this node // from the DOM, meaning that the `WI.ContentViewContainer` would not show/hide entries in // the back/forward list, which is what adds/removes subviews from the DOM. this._didMoveToParent(this._collapsed ? null : WI.View.rootView()); this.dispatchEventToListeners(WI.ConsoleDrawer.Event.CollapsedStateChanged); } get height() { return this.element.offsetHeight; } // Protected attached() { super.attached(); this._restoreDrawerHeight(); } sizeDidChange() { super.sizeDidChange(); if (this._collapsed) return; let height = this.height; this._restoreDrawerHeight(); if (height !== this.height) this.dispatchEventToListeners(WI.ConsoleDrawer.Event.Resized); } // Private _consoleResizerMouseDown(event) { if (event.button !== 0 || event.ctrlKey) return; // Only start dragging if the target is one of the elements that we expect. if (event.target !== this.navigationBar.element && !event.target.classList.contains("flexible-space")) return; let resizerElement = event.target; let quickConsoleHeight = window.innerHeight - (this.element.totalOffsetTop + this.height); let mouseOffset = quickConsoleHeight - (event.pageY - resizerElement.totalOffsetTop); function dockedResizerDrag(event) { let height = window.innerHeight - event.pageY - mouseOffset; this._drawerHeightSetting.value = height; this._updateDrawerHeight(height); this.collapsed = false; } function dockedResizerDragEnd(event) { if (event.button !== 0) return; WI.elementDragEnd(event); } WI.elementDragStart(resizerElement, dockedResizerDrag.bind(this), dockedResizerDragEnd.bind(this), event, "row-resize"); } _restoreDrawerHeight() { this._updateDrawerHeight(this._drawerHeightSetting.value); } _updateDrawerHeight(height) { const minimumHeight = 64; const maximumHeight = this.element.parentNode.offsetHeight - 100; let heightCSSValue = Number.constrain(height, minimumHeight, maximumHeight) + "px"; if (this.element.style.height === heightCSSValue) return; this.element.style.height = heightCSSValue; this.dispatchEventToListeners(WI.ConsoleDrawer.Event.Resized); } _selectedTabContentViewDidChange() { if (WI.doesCurrentTabSupportSplitContentBrowser()) return; this.element.classList.add("hidden"); } }; WI.ConsoleDrawer.Event = { CollapsedStateChanged: "console-drawer-collapsed-state-changed", Resized: "console-drawer-resized", };