Path: blob/main/src/vs/platform/editor/browser/editor.ts
4777 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { addDisposableListener, EventHelper, EventType, getWindow } from '../../../base/browser/dom.js';6import { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';7import { StandardMouseEvent } from '../../../base/browser/mouseEvent.js';8import { KeyCode, KeyMod } from '../../../base/common/keyCodes.js';9import { DisposableStore, IDisposable } from '../../../base/common/lifecycle.js';10import { isMacintosh } from '../../../base/common/platform.js';11import { IEditorOptions } from '../common/editor.js';1213//#region Editor Open Event Listeners1415export interface IOpenEditorOptions {16readonly editorOptions: IEditorOptions;17readonly openToSide: boolean;18}1920export function registerOpenEditorListeners(element: HTMLElement, onOpenEditor: (options: IOpenEditorOptions) => void): IDisposable {21const disposables = new DisposableStore();2223disposables.add(addDisposableListener(element, EventType.CLICK, e => {24if (e.detail === 2) {25return; // ignore double click as it is handled below26}2728EventHelper.stop(e, true);29onOpenEditor(toOpenEditorOptions(new StandardMouseEvent(getWindow(element), e)));30}));3132disposables.add(addDisposableListener(element, EventType.DBLCLICK, e => {33EventHelper.stop(e, true);3435onOpenEditor(toOpenEditorOptions(new StandardMouseEvent(getWindow(element), e), true));36}));3738disposables.add(addDisposableListener(element, EventType.KEY_DOWN, e => {39const options = toOpenEditorOptions(new StandardKeyboardEvent(e));40if (!options) {41return;42}4344EventHelper.stop(e, true);45onOpenEditor(options);46}));4748return disposables;49}5051export function toOpenEditorOptions(event: StandardMouseEvent, isDoubleClick?: boolean): IOpenEditorOptions;52export function toOpenEditorOptions(event: StandardKeyboardEvent): IOpenEditorOptions | undefined;53export function toOpenEditorOptions(event: StandardMouseEvent | StandardKeyboardEvent): IOpenEditorOptions | undefined;54export function toOpenEditorOptions(event: StandardMouseEvent | StandardKeyboardEvent, isDoubleClick?: boolean): IOpenEditorOptions | undefined {55if (event instanceof StandardKeyboardEvent) {56let preserveFocus: boolean | undefined = undefined;57if (event.equals(KeyCode.Enter) || (isMacintosh && event.equals(KeyMod.CtrlCmd | KeyCode.DownArrow))) {58preserveFocus = false;59} else if (event.equals(KeyCode.Space)) {60preserveFocus = true;61}6263if (typeof preserveFocus === 'undefined') {64return;65}6667return { editorOptions: { preserveFocus, pinned: !preserveFocus }, openToSide: false };68} else {69return { editorOptions: { preserveFocus: !isDoubleClick, pinned: isDoubleClick || event.middleButton }, openToSide: event.ctrlKey || event.metaKey || event.altKey };70}71}7273//#endregion747576