Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/codeEditor/browser/toggleColumnSelection.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { localize, localize2 } from '../../../../nls.js';
7
import { Action2, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';
8
import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js';
9
import { ContextKeyExpr } from '../../../../platform/contextkey/common/contextkey.js';
10
import { ICodeEditorService } from '../../../../editor/browser/services/codeEditorService.js';
11
import { EditorOption } from '../../../../editor/common/config/editorOptions.js';
12
import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js';
13
import { CoreNavigationCommands } from '../../../../editor/browser/coreCommands.js';
14
import { Position } from '../../../../editor/common/core/position.js';
15
import { Selection } from '../../../../editor/common/core/selection.js';
16
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
17
18
export class ToggleColumnSelectionAction extends Action2 {
19
20
static readonly ID = 'editor.action.toggleColumnSelection';
21
22
constructor() {
23
super({
24
id: ToggleColumnSelectionAction.ID,
25
title: {
26
...localize2('toggleColumnSelection', "Toggle Column Selection Mode"),
27
mnemonicTitle: localize({ key: 'miColumnSelection', comment: ['&& denotes a mnemonic'] }, "Column &&Selection Mode"),
28
},
29
f1: true,
30
toggled: ContextKeyExpr.equals('config.editor.columnSelection', true),
31
menu: {
32
id: MenuId.MenubarSelectionMenu,
33
group: '4_config',
34
order: 2
35
}
36
});
37
}
38
39
override async run(accessor: ServicesAccessor): Promise<void> {
40
const configurationService = accessor.get(IConfigurationService);
41
const codeEditorService = accessor.get(ICodeEditorService);
42
43
const oldValue = configurationService.getValue('editor.columnSelection');
44
const codeEditor = this._getCodeEditor(codeEditorService);
45
await configurationService.updateValue('editor.columnSelection', !oldValue);
46
const newValue = configurationService.getValue('editor.columnSelection');
47
if (!codeEditor || codeEditor !== this._getCodeEditor(codeEditorService) || oldValue === newValue || !codeEditor.hasModel() || typeof oldValue !== 'boolean' || typeof newValue !== 'boolean') {
48
return;
49
}
50
const viewModel = codeEditor._getViewModel();
51
if (codeEditor.getOption(EditorOption.columnSelection)) {
52
const selection = codeEditor.getSelection();
53
const modelSelectionStart = new Position(selection.selectionStartLineNumber, selection.selectionStartColumn);
54
const viewSelectionStart = viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelSelectionStart);
55
const modelPosition = new Position(selection.positionLineNumber, selection.positionColumn);
56
const viewPosition = viewModel.coordinatesConverter.convertModelPositionToViewPosition(modelPosition);
57
58
CoreNavigationCommands.MoveTo.runCoreEditorCommand(viewModel, {
59
position: modelSelectionStart,
60
viewPosition: viewSelectionStart
61
});
62
const visibleColumn = viewModel.cursorConfig.visibleColumnFromColumn(viewModel, viewPosition);
63
CoreNavigationCommands.ColumnSelect.runCoreEditorCommand(viewModel, {
64
position: modelPosition,
65
viewPosition: viewPosition,
66
doColumnSelect: true,
67
mouseColumn: visibleColumn + 1
68
});
69
} else {
70
const columnSelectData = viewModel.getCursorColumnSelectData();
71
const fromViewColumn = viewModel.cursorConfig.columnFromVisibleColumn(viewModel, columnSelectData.fromViewLineNumber, columnSelectData.fromViewVisualColumn);
72
const fromPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(columnSelectData.fromViewLineNumber, fromViewColumn));
73
const toViewColumn = viewModel.cursorConfig.columnFromVisibleColumn(viewModel, columnSelectData.toViewLineNumber, columnSelectData.toViewVisualColumn);
74
const toPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Position(columnSelectData.toViewLineNumber, toViewColumn));
75
76
codeEditor.setSelection(new Selection(fromPosition.lineNumber, fromPosition.column, toPosition.lineNumber, toPosition.column));
77
}
78
}
79
80
private _getCodeEditor(codeEditorService: ICodeEditorService): ICodeEditor | null {
81
const codeEditor = codeEditorService.getFocusedCodeEditor();
82
if (codeEditor) {
83
return codeEditor;
84
}
85
return codeEditorService.getActiveCodeEditor();
86
}
87
}
88
89
registerAction2(ToggleColumnSelectionAction);
90
91