Path: blob/main/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts
3296 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 { localize, localize2 } from '../../../../nls.js';6import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';7import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';8import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';9import { ICodeEditorService } from '../../../../editor/browser/services/codeEditorService.js';10import { EditorOption } from '../../../../editor/common/config/editorOptions.js';11import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js';12import { CoreNavigationCommands } from '../../../../editor/browser/coreCommands.js';13import { Position } from '../../../../editor/common/core/position.js';14import { Selection } from '../../../../editor/common/core/selection.js';15import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';1617export class ToggleColumnSelectionAction extends Action2 {1819static readonly ID = 'editor.action.toggleColumnSelection';2021constructor() {22super({23id: ToggleColumnSelectionAction.ID,24title: {25...localize2('toggleColumnSelection', "Toggle Column Selection Mode"),26mnemonicTitle: localize({ key: 'miColumnSelection', comment: ['&& denotes a mnemonic'] }, "Column &&Selection Mode"),27},28f1: true,29toggled: ContextKeyExpr.equals('config.editor.columnSelection', true),30menu: {31id: MenuId.MenubarSelectionMenu,32group: '4_config',33order: 234}35});36}3738override async run(accessor: ServicesAccessor): Promise<void> {39const configurationService = accessor.get(IConfigurationService);40const codeEditorService = accessor.get(ICodeEditorService);4142const oldValue = configurationService.getValue('editor.columnSelection');43const codeEditor = this._getCodeEditor(codeEditorService);44await configurationService.updateValue('editor.columnSelection', !oldValue);45const newValue = configurationService.getValue('editor.columnSelection');46if (!codeEditor || codeEditor !== this._getCodeEditor(codeEditorService) || oldValue === newValue || !codeEditor.hasModel() || typeof oldValue !== 'boolean' || typeof newValue !== 'boolean') {47return;48}49const viewModel = codeEditor._getViewModel();50if (codeEditor.getOption(EditorOption.columnSelection)) {51const selection = codeEditor.getSelection();52const modelSelectionStart = new Position(selection.selectionStartLineNumber, selection.selectionStartColumn);53const viewSelectionStart = viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelSelectionStart);54const modelPosition = new Position(selection.positionLineNumber, selection.positionColumn);55const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);5657CoreNavigationCommands.MoveTo.runCoreEditorCommand(viewModel, {58position: modelSelectionStart,59viewPosition: viewSelectionStart60});61const visibleColumn = viewModel.cursorConfig.visibleColumnFromColumn(viewModel, viewPosition);62CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(viewModel, {63position: modelPosition,64viewPosition: viewPosition,65doColumnSelect: true,66mouseColumn: visibleColumn + 167});68} else {69const columnSelectData = viewModel.getCursorColumnSelectData();70const fromViewColumn = viewModel.cursorConfig.columnFromVisibleColumn(viewModel, columnSelectData.fromViewLineNumber, columnSelectData.fromViewVisualColumn);71const fromPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(columnSelectData.fromViewLineNumber, fromViewColumn));72const toViewColumn = viewModel.cursorConfig.columnFromVisibleColumn(viewModel, columnSelectData.toViewLineNumber, columnSelectData.toViewVisualColumn);73const toPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(columnSelectData.toViewLineNumber, toViewColumn));7475codeEditor.setSelection(new Selection(fromPosition.lineNumber, fromPosition.column, toPosition.lineNumber, toPosition.column));76}77}7879private _getCodeEditor(codeEditorService: ICodeEditorService): ICodeEditor | null {80const codeEditor = codeEditorService.getFocusedCodeEditor();81if (codeEditor) {82return codeEditor;83}84return codeEditorService.getActiveCodeEditor();85}86}8788registerAction2(ToggleColumnSelectionAction);899091