diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js')
-rw-r--r-- | Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js b/Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js new file mode 100644 index 000000000..13c585e15 --- /dev/null +++ b/Source/WebInspectorUI/UserInterface/Views/DashboardContainerView.js @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2013-2015 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. + */ + +WebInspector.DashboardContainerView = class DashboardContainerView extends WebInspector.Object +{ + constructor() + { + super(); + + this._toolbarItem = new WebInspector.NavigationItem("dashboard-container", "group", WebInspector.UIString("Activity Viewer")); + + this._advanceForwardArrowElement = this._toolbarItem.element.appendChild(document.createElement("div")); + this._advanceForwardArrowElement.className = "advance-arrow advance-forward"; + this._advanceBackwardArrowElement = this._toolbarItem.element.appendChild(document.createElement("div")); + this._advanceBackwardArrowElement.className = "advance-arrow advance-backward"; + + this._advanceForwardArrowElement.addEventListener("click", this._advanceForwardArrowClicked.bind(this)); + this._advanceBackwardArrowElement.addEventListener("click", this._advanceBackwardArrowClicked.bind(this)); + + // Represents currently open dashboards, with the most recent entries appended to the end. + this._dashboardStack = []; + this._currentIndex = -1; + + this._updateAdvanceArrowVisibility(); + } + + // Public + + get toolbarItem() + { + return this._toolbarItem; + } + + get currentDashboardView() + { + if (this._currentIndex === -1) + return null; + + return this._dashboardStack[this._currentIndex]; + } + + showDashboardViewForRepresentedObject(representedObject) + { + var dashboardView = this._dashboardViewForRepresentedObject(representedObject); + if (!dashboardView) + return null; + + if (this.currentDashboardView === dashboardView) + return dashboardView; + + var index = this._dashboardStack.indexOf(dashboardView); + this._showDashboardAtIndex(index); + return dashboardView; + } + + hideDashboardViewForRepresentedObject(representedObject) + { + var onlyReturnExistingViews = true; + var dashboardView = this._dashboardViewForRepresentedObject(representedObject, onlyReturnExistingViews); + + if (this.currentDashboardView !== dashboardView) + return; + + console.assert(this._currentIndex > 0); + this._showDashboardAtIndex(this._currentIndex - 1); + } + + closeDashboardViewForRepresentedObject(representedObject) + { + var onlyReturnExistingViews = true; + var dashboardView = this._dashboardViewForRepresentedObject(representedObject, onlyReturnExistingViews); + if (!dashboardView) + return; + + this._closeDashboardView(dashboardView); + } + + // Private + + _advanceForwardArrowClicked() + { + this._showDashboardAtIndex(this._currentIndex + 1); + } + + _advanceBackwardArrowClicked() + { + this._showDashboardAtIndex(this._currentIndex - 1); + } + + _dismissAdvanceArrows() + { + this._advanceForwardArrowElement.classList.add(WebInspector.DashboardContainerView.InactiveStyleClassName); + this._advanceBackwardArrowElement.classList.add(WebInspector.DashboardContainerView.InactiveStyleClassName); + } + + _updateAdvanceArrowVisibility() + { + var canAdvanceForward = this._currentIndex < this._dashboardStack.length - 1; + var canAdvanceBackward = this._currentIndex > 0; + this._advanceForwardArrowElement.classList.toggle(WebInspector.DashboardContainerView.InactiveStyleClassName, !canAdvanceForward); + this._advanceBackwardArrowElement.classList.toggle(WebInspector.DashboardContainerView.InactiveStyleClassName, !canAdvanceBackward); + } + + _dashboardViewForRepresentedObject(representedObject, onlyReturnExistingViews) + { + console.assert(representedObject); + + // Iterate over all known dashboard views and see if any are for this object. + for (var dashboardView of this._dashboardStack) { + if (dashboardView.representedObject === representedObject) + return dashboardView; + } + + if (onlyReturnExistingViews) + return null; + + // No existing content view found, make a new one. + dashboardView = WebInspector.DashboardView.create(representedObject); + + console.assert(dashboardView, "Unknown representedObject", representedObject); + if (!dashboardView) + return null; + + this._dashboardStack.push(dashboardView); + this._toolbarItem.element.appendChild(dashboardView.element); + + return dashboardView; + } + + _showDashboardAtIndex(index) + { + console.assert(index >= 0 && index <= this._dashboardStack.length - 1); + + if (this._currentIndex === index) + return; + + var advanceDirection = null; + if (this._currentIndex < index) + advanceDirection = WebInspector.DashboardContainerView.AdvanceDirection.Forward; + else + advanceDirection = WebInspector.DashboardContainerView.AdvanceDirection.Backward; + var initialDirection = WebInspector.DashboardContainerView.AdvanceDirection.None; + var isInitialDashboard = this._currentIndex === -1; + if (!isInitialDashboard) + this._hideDashboardView(this.currentDashboardView, advanceDirection); + + this._currentIndex = index; + this._showDashboardView(this.currentDashboardView, isInitialDashboard ? initialDirection : advanceDirection); + } + + _showDashboardView(dashboardView, advanceDirection) + { + console.assert(dashboardView instanceof WebInspector.DashboardView); + + dashboardView.shown(); + this._dismissAdvanceArrows(); + + var animationClass = null; + if (advanceDirection === WebInspector.DashboardContainerView.AdvanceDirection.Forward) + animationClass = WebInspector.DashboardContainerView.ForwardIncomingDashboardStyleClassName; + if (advanceDirection === WebInspector.DashboardContainerView.AdvanceDirection.Backward) + animationClass = WebInspector.DashboardContainerView.BackwardIncomingDashboardStyleClassName; + + var container = this; + dashboardView.element.classList.add(WebInspector.DashboardContainerView.VisibleDashboardStyleClassName); + + function animationEnded(event) { + if (event.target !== dashboardView.element) + return; + + dashboardView.element.removeEventListener("animationend", animationEnded); + dashboardView.element.classList.remove(animationClass); + container._updateAdvanceArrowVisibility(); + } + + if (animationClass) { + dashboardView.element.classList.add(animationClass); + dashboardView.element.addEventListener("animationend", animationEnded); + } + + return dashboardView; + } + + _hideDashboardView(dashboardView, advanceDirection, callback) + { + console.assert(dashboardView instanceof WebInspector.DashboardView); + console.assert(this.currentDashboardView === dashboardView); + + dashboardView.hidden(); + this._dismissAdvanceArrows(); + + var animationClass = null; + if (advanceDirection === WebInspector.DashboardContainerView.AdvanceDirection.Forward) + animationClass = WebInspector.DashboardContainerView.ForwardOutgoingDashboardStyleClassName; + if (advanceDirection === WebInspector.DashboardContainerView.AdvanceDirection.Backward) + animationClass = WebInspector.DashboardContainerView.BackwardOutgoingDashboardStyleClassName; + + var container = this; + + function animationEnded(event) { + if (event.target !== dashboardView.element) + return; + + dashboardView.element.removeEventListener("animationend", animationEnded); + dashboardView.element.classList.remove(animationClass); + dashboardView.element.classList.remove(WebInspector.DashboardContainerView.VisibleDashboardStyleClassName); + container._updateAdvanceArrowVisibility(); + + if (typeof callback === "function") + callback(); + } + + if (animationClass) { + dashboardView.element.classList.add(animationClass); + dashboardView.element.addEventListener("animationend", animationEnded); + } else + dashboardView.element.classList.remove(WebInspector.DashboardContainerView.VisibleDashboardStyleClassName); + } + + _closeDashboardView(dashboardView) + { + console.assert(dashboardView instanceof WebInspector.DashboardView); + + function dissociateDashboardView() { + dashboardView.closed(); + dashboardView.element.parentNode.removeChild(dashboardView.element); + } + + var index = this._dashboardStack.indexOf(dashboardView); + + if (this.currentDashboardView === dashboardView) { + var direction = WebInspector.DashboardContainerView.AdvanceDirection.Backward; + this._hideDashboardView(this.currentDashboardView, direction, dissociateDashboardView); + this._dashboardStack.splice(index, 1); + --this._currentIndex; + this._showDashboardView(this.currentDashboardView, direction); + return; + } + + this._dashboardStack.splice(index, 1); + if (this._currentIndex > index) + --this._currentIndex; + dissociateDashboardView.call(this); + + this._updateAdvanceArrowVisibility(); + } +}; + +WebInspector.DashboardContainerView.VisibleDashboardStyleClassName = "visible"; +WebInspector.DashboardContainerView.InactiveStyleClassName = "inactive"; + +WebInspector.DashboardContainerView.AdvanceDirection = { + Forward: Symbol("dashboard-container-view-advance-direction-forward"), + Backward: Symbol("dashboard-container-view-advance-direction-backward"), + None: Symbol("dashboard-container-view-advance-direction-none") +}; + +WebInspector.DashboardContainerView.ForwardIncomingDashboardStyleClassName = "slide-in-down"; +WebInspector.DashboardContainerView.BackwardIncomingDashboardStyleClassName = "slide-in-up"; +WebInspector.DashboardContainerView.ForwardOutgoingDashboardStyleClassName = "slide-out-down"; +WebInspector.DashboardContainerView.BackwardOutgoingDashboardStyleClassName = "slide-out-up"; |