/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // import 'vs/css!./hover'; import * as dom from '../../../../../vs/base/browser/dom'; import { IDisposable, Disposable, } from '../../../../../vs/base/common/lifecycle'; import { DomScrollableElement } from '../../../../../vs/base/browser/ui/scrollbar/scrollableElement'; const $ = dom.$; export const enum HoverPosition { LEFT, RIGHT, BELOW, ABOVE, } export class HoverWidget extends Disposable { public readonly containerDomNode: HTMLElement; public readonly contentsDomNode: HTMLElement; private readonly _scrollbar: DomScrollableElement; constructor() { super(); this.containerDomNode = document.createElement('div'); this.containerDomNode.className = 'monaco-hover'; this.containerDomNode.tabIndex = 0; this.containerDomNode.setAttribute('role', 'tooltip'); this.contentsDomNode = document.createElement('div'); this.contentsDomNode.className = 'monaco-hover-content'; this._scrollbar = this._register( new DomScrollableElement(this.contentsDomNode, { consumeMouseWheelIfScrollbarIsNeeded: true, }) ); this.containerDomNode.appendChild(this._scrollbar.getDomNode()); } public onContentsChanged(): void { this._scrollbar.scanDomNode(); } } export function renderHoverAction( parent: HTMLElement, actionOptions: { label: string; iconClass?: string; run: (target: HTMLElement) => void; commandId: string; }, keybindingLabel: string | null ): IDisposable { const actionContainer = dom.append(parent, $('div.action-container')); const action = dom.append(actionContainer, $('a.action')); action.setAttribute('href', '#'); action.setAttribute('role', 'button'); if (actionOptions.iconClass) { dom.append(action, $(`span.icon.${actionOptions.iconClass}`)); } const label = dom.append(action, $('span')); label.textContent = keybindingLabel ? `${actionOptions.label} (${keybindingLabel})` : actionOptions.label; return dom.addDisposableListener( actionContainer, dom.EventType.CLICK, (e) => { e.stopPropagation(); e.preventDefault(); actionOptions.run(actionContainer); } ); }