55 lines
2.2 KiB
TypeScript
55 lines
2.2 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* 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 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, {}));
|
|
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);
|
|
});
|
|
}
|