monaco-editor-core
Version:
A browser based code editor
85 lines (84 loc) • 3.99 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as dom from '../../../base/browser/dom.js';
import { DomEmitter } from '../../../base/browser/event.js';
import { Event } from '../../../base/common/event.js';
import { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';
import { Gesture, EventType as GestureEventType } from '../../../base/browser/touch.js';
import { renderLabelWithIcons } from '../../../base/browser/ui/iconLabel/iconLabels.js';
import { IdGenerator } from '../../../base/common/idGenerator.js';
import { parseLinkedText } from '../../../base/common/linkedText.js';
import './media/quickInput.css';
import { localize } from '../../../nls.js';
const iconPathToClass = {};
const iconClassGenerator = new IdGenerator('quick-input-button-icon-');
function getIconClass(iconPath) {
if (!iconPath) {
return undefined;
}
let iconClass;
const key = iconPath.dark.toString();
if (iconPathToClass[key]) {
iconClass = iconPathToClass[key];
}
else {
iconClass = iconClassGenerator.nextId();
dom.createCSSRule(`.${iconClass}, .hc-light .${iconClass}`, `background-image: ${dom.asCSSUrl(iconPath.light || iconPath.dark)}`);
dom.createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: ${dom.asCSSUrl(iconPath.dark)}`);
iconPathToClass[key] = iconClass;
}
return iconClass;
}
export function quickInputButtonToAction(button, id, run) {
let cssClasses = button.iconClass || getIconClass(button.iconPath);
if (button.alwaysVisible) {
cssClasses = cssClasses ? `${cssClasses} always-visible` : 'always-visible';
}
return {
id,
label: '',
tooltip: button.tooltip || '',
class: cssClasses,
enabled: true,
run
};
}
export function renderQuickInputDescription(description, container, actionHandler) {
dom.reset(container);
const parsed = parseLinkedText(description);
let tabIndex = 0;
for (const node of parsed.nodes) {
if (typeof node === 'string') {
container.append(...renderLabelWithIcons(node));
}
else {
let title = node.title;
if (!title && node.href.startsWith('command:')) {
title = localize('executeCommand', "Click to execute command '{0}'", node.href.substring('command:'.length));
}
else if (!title) {
title = node.href;
}
const anchor = dom.$('a', { href: node.href, title, tabIndex: tabIndex++ }, node.label);
anchor.style.textDecoration = 'underline';
const handleOpen = (e) => {
if (dom.isEventLike(e)) {
dom.EventHelper.stop(e, true);
}
actionHandler.callback(node.href);
};
const onClick = actionHandler.disposables.add(new DomEmitter(anchor, dom.EventType.CLICK)).event;
const onKeydown = actionHandler.disposables.add(new DomEmitter(anchor, dom.EventType.KEY_DOWN)).event;
const onSpaceOrEnter = Event.chain(onKeydown, $ => $.filter(e => {
const event = new StandardKeyboardEvent(e);
return event.equals(10 /* KeyCode.Space */) || event.equals(3 /* KeyCode.Enter */);
}));
actionHandler.disposables.add(Gesture.addTarget(anchor));
const onTap = actionHandler.disposables.add(new DomEmitter(anchor, GestureEventType.Tap)).event;
Event.any(onClick, onTap, onSpaceOrEnter)(handleOpen, null, actionHandler.disposables);
container.appendChild(anchor);
}
}
}