| /* |
| * 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. |
| */ |
| |
| WI.ScopeBarItem = class ScopeBarItem extends WI.Object |
| { |
| constructor(id, label, {className, exclusive, independent, hidden} = {}) |
| { |
| super(); |
| |
| this._element = document.createElement("li"); |
| this._element.classList.toggle("exclusive", !!exclusive); |
| if (className) |
| this._element.classList.add(className); |
| this._element.textContent = label; |
| |
| this._element.addEventListener("mousedown", this._handleMouseDown.bind(this)); |
| this._element.addEventListener("keydown", this._handleKeyDown.bind(this)); |
| |
| this._id = id; |
| this._label = label; |
| this._exclusive = !!exclusive; |
| this._independent = !!independent; |
| this._hidden = !!hidden; |
| this._scopeBar = null; |
| |
| this._selectedSetting = new WI.Setting("scopebaritem-" + id, false); |
| this._updateSelected(this._selectedSetting.value); |
| |
| this._element.classList.toggle("hidden", this._hidden); |
| } |
| |
| // Public |
| |
| get scopeBar() { return this._scopeBar; } |
| set scopeBar(scopeBar) { this._scopeBar = scopeBar; } |
| |
| get element() |
| { |
| return this._element; |
| } |
| |
| get id() |
| { |
| return this._id; |
| } |
| |
| get label() |
| { |
| return this._label; |
| } |
| |
| get exclusive() |
| { |
| return this._exclusive; |
| } |
| |
| get selected() |
| { |
| return this._selectedSetting.value; |
| } |
| |
| set selected(selected) |
| { |
| this.toggle(selected, { |
| extendSelection: this._independent || (WI.modifierKeys.metaKey && !WI.modifierKeys.ctrlKey && !WI.modifierKeys.altKey && !WI.modifierKeys.shiftKey), |
| }); |
| } |
| |
| get hidden() |
| { |
| return this._hidden; |
| } |
| |
| set hidden(flag) |
| { |
| if (this._hidden === flag) |
| return; |
| |
| this._hidden = flag; |
| |
| this._element.classList.toggle("hidden", flag); |
| |
| this.dispatchEventToListeners(WI.ScopeBarItem.Event.HiddenChanged); |
| } |
| |
| toggle(selected, {extendSelection} = {}) |
| { |
| if (this._selectedSetting.value === selected) |
| return; |
| |
| this._updateSelected(selected); |
| this._selectedSetting.value = selected; |
| |
| this.dispatchEventToListeners(WI.ScopeBarItem.Event.SelectionChanged, {extendSelection}); |
| } |
| |
| // Private |
| |
| _updateSelected(selected) |
| { |
| selected = !!selected; |
| this._element.classList.toggle("selected", selected); |
| this._element.ariaPressed = selected; |
| this._element.tabIndex = selected ? 0 : -1; |
| } |
| |
| _handleMouseDown(event) |
| { |
| // Only handle left mouse clicks. |
| if (event.button !== 0) |
| return; |
| |
| this.selected = !this.selected; |
| |
| // Move the focus to the clicked element only when the focus is already inside the scope bar element. |
| if (!this._scopeBar?.element.contains(document.activeElement)) |
| event.preventDefault(); |
| } |
| |
| _handleKeyDown(event) |
| { |
| if (event.code === "Space" || event.code === "Enter") { |
| event.stop(); |
| this.selected = !this.selected; |
| } |
| } |
| }; |
| |
| WI.ScopeBarItem.Event = { |
| SelectionChanged: "scope-bar-item-selection-changed", |
| HiddenChanged: "scope-bar-item-hidden-changed", |
| }; |