From 4627a401abbf96504bbd5119f114952e4c6558e2 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 8 Aug 2016 11:04:49 +0200 Subject: [PATCH] handle editor commands from one file --- .../parts/editor/editor.contribution.ts | 94 +----------- .../browser/parts/editor/editorCommands.ts | 140 ++++++++++++++---- 2 files changed, 121 insertions(+), 113 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 947e8292e00..bfe488bf55e 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -16,12 +16,10 @@ import {StringEditor} from 'vs/workbench/browser/parts/editor/stringEditor'; import {DiffEditorInput} from 'vs/workbench/common/editor/diffEditorInput'; import {UntitledEditorInput} from 'vs/workbench/common/editor/untitledEditorInput'; import {ResourceEditorInput} from 'vs/workbench/common/editor/resourceEditorInput'; -import {IInstantiationService, ServicesAccessor} from 'vs/platform/instantiation/common/instantiation'; +import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; import {KbExpr, IKeybindings} from 'vs/platform/keybinding/common/keybinding'; -import {ICommandService} from 'vs/platform/commands/common/commands'; -import {IMessageService, Severity, CloseAction} from 'vs/platform/message/common/message'; -import {TextCompareEditorVisible, TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; +import {TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binaryDiffEditor'; import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; @@ -32,14 +30,13 @@ import {Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarC import {SyncActionDescriptor} from 'vs/platform/actions/common/actions'; import {SyncDescriptor} from 'vs/platform/instantiation/common/descriptors'; import {KeyMod, KeyCode} from 'vs/base/common/keyCodes'; -import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel'; import {CloseEditorsInGroupAction, CloseEditorsInOtherGroupsAction, CloseAllEditorsAction, MoveGroupLeftAction, MoveGroupRightAction, SplitEditorAction, KeepEditorAction, CloseOtherEditorsInGroupAction, OpenToSideAction, NavigateBetweenGroupsAction, FocusFirstGroupAction, FocusSecondGroupAction, FocusThirdGroupAction, EvenGroupWidthsAction, MaximizeGroupAction, MinimizeOtherGroupsAction, FocusPreviousGroup, FocusNextGroup, ShowEditorsInLeftGroupAction, toEditorQuickOpenEntry, CloseLeftEditorsInGroupAction, CloseRightEditorsInGroupAction, OpenNextEditor, OpenPreviousEditor, NavigateBackwardsAction, NavigateForwardAction, ReopenClosedEditorAction, OpenPreviousRecentlyUsedEditorInGroupAction, NAVIGATE_IN_LEFT_GROUP_PREFIX, GlobalQuickOpenAction, OpenPreviousEditorFromHistoryAction, QuickOpenNavigateNextAction, QuickOpenNavigatePreviousAction, ShowAllEditorsAction, NAVIGATE_ALL_EDITORS_GROUP_PREFIX, ClearEditorHistoryAction, ShowEditorsInCenterGroupAction, NAVIGATE_IN_CENTER_GROUP_PREFIX, ShowEditorsInRightGroupAction, NAVIGATE_IN_RIGHT_GROUP_PREFIX, RemoveFromEditorHistoryAction, FocusLastEditorInStackAction, OpenNextRecentlyUsedEditorInGroupAction, MoveEditorToLeftGroupAction, MoveEditorToRightGroupAction } from 'vs/workbench/browser/parts/editor/editorActions'; -import {registerEditorComamnds} from 'vs/workbench/browser/parts/editor/editorCommands'; +import * as editorCommands from 'vs/workbench/browser/parts/editor/editorCommands'; // Register String Editor (Registry.as(EditorExtensions.Editors)).registerEditor( @@ -83,61 +80,15 @@ import {registerEditorComamnds} from 'vs/workbench/browser/parts/editor/editorCo ); // Register Editor Status -let statusBar = (Registry.as(StatusExtensions.Statusbar)); +const statusBar = (Registry.as(StatusExtensions.Statusbar)); statusBar.registerStatusbarItem(new StatusbarItemDescriptor(EditorStatus, StatusbarAlignment.RIGHT, 100 /* High Priority */)); // Register Status Actions -let registry = Registry.as(ActionExtensions.WorkbenchActions); +const registry = Registry.as(ActionExtensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(ChangeModeAction, ChangeModeAction.ID, ChangeModeAction.LABEL, { primary: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_M) }), 'Change Language Mode'); registry.registerWorkbenchAction(new SyncActionDescriptor(ChangeEOLAction, ChangeEOLAction.ID, ChangeEOLAction.LABEL), 'Change End of Line Sequence'); registry.registerWorkbenchAction(new SyncActionDescriptor(ChangeEncodingAction, ChangeEncodingAction.ID, ChangeEncodingAction.LABEL), 'Change File Encoding'); -// Register keybinding for "Next Change" & "Previous Change" in visible diff editor -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'workbench.action.compareEditor.nextChange', - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: TextCompareEditorVisible, - primary: null, - handler: accessor => navigateInDiffEditor(accessor, true) -}); - -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'workbench.action.compareEditor.previousChange', - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), - when: TextCompareEditorVisible, - primary: null, - handler: accessor => navigateInDiffEditor(accessor, false) -}); - -function navigateInDiffEditor(accessor: ServicesAccessor, next: boolean): void { - let editorService = accessor.get(IWorkbenchEditorService); - const candidates = [editorService.getActiveEditor(), ...editorService.getVisibleEditors()].filter(e => e instanceof TextDiffEditor); - - if (candidates.length > 0) { - next ? (candidates[0]).getDiffNavigator().next() : (candidates[0]).getDiffNavigator().previous(); - } -} - -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: '_workbench.printStacksModel', - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), - handler(accessor: ServicesAccessor) { - console.log(`${accessor.get(IEditorGroupService).getStacksModel().toString()}\n\n`); - }, - when: undefined, - primary: undefined -}); - -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: '_workbench.validateStacksModel', - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), - handler(accessor: ServicesAccessor) { - (accessor.get(IEditorGroupService).getStacksModel()).validate(); - }, - when: undefined, - primary: undefined -}); - export class QuickOpenActionContributor extends ActionBarContributor { private openToSideActionInstance: OpenToSideAction; @@ -379,7 +330,7 @@ function toKeyCode(index: number): KeyCode { } // Configuration -let configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); +const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ 'id': 'workbench', 'order': 7, @@ -410,34 +361,5 @@ configurationRegistry.registerConfiguration({ } }); -registerEditorComamnds(); - -const mapDeprecatedCommands = { - 'workbench.action.terminal.focus': 'workbench.action.focusPanel' -}; - -Object.keys(mapDeprecatedCommands).forEach(deprecatedCommandId => { - const newCommandId = mapDeprecatedCommands[deprecatedCommandId]; - - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: deprecatedCommandId, - weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), - handler(accessor: ServicesAccessor) { - const messageService = accessor.get(IMessageService); - const commandService = accessor.get(ICommandService); - - messageService.show(Severity.Warning, { - message: nls.localize('commandDeprecated', "Command **{0}** has been removed. You can use **{1}** instead", deprecatedCommandId, newCommandId), - actions: [ - CloseAction, - new Action('openKeybindings', nls.localize('openKeybindings', "Configure Keyboard Shortcuts"), null, true, () => { - return commandService.executeCommand('workbench.action.openGlobalKeybindings'); - }) - ] - }); - }, - when: undefined, - primary: undefined - }); -}); - +// Editor Commands +editorCommands.setup(); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index 0c1afc44ff9..4cd7dd5a7e2 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -5,25 +5,32 @@ import * as nls from 'vs/nls'; import * as types from 'vs/base/common/types'; -import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { KeybindingsRegistry } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; -import { IWorkbenchEditorConfiguration, ActiveEditorMoveArguments, ActiveEditorMovePositioning, ActiveEditorMovePositioningBy, EditorCommands } from 'vs/workbench/common/editor'; -import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditor, Position, POSITIONS } from 'vs/platform/editor/common/editor'; -import { EditorContextKeys } from 'vs/editor/common/editorCommon'; - -export function registerEditorComamnds() { - _registerActiveEditorMoveCommand(); +import {ServicesAccessor} from 'vs/platform/instantiation/common/instantiation'; +import {KeybindingsRegistry} from 'vs/platform/keybinding/common/keybindingsRegistry'; +import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; +import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; +import {IWorkbenchEditorConfiguration, ActiveEditorMoveArguments, ActiveEditorMovePositioning, ActiveEditorMovePositioningBy, EditorCommands} from 'vs/workbench/common/editor'; +import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; +import {IEditor, Position, POSITIONS} from 'vs/platform/editor/common/editor'; +import {EditorContextKeys} from 'vs/editor/common/editorCommon'; +import {TextCompareEditorVisible, TextDiffEditor} from 'vs/workbench/browser/parts/editor/textDiffEditor'; +import {EditorStacksModel} from 'vs/workbench/common/editor/editorStacksModel'; +import {ICommandService} from 'vs/platform/commands/common/commands'; +import {IMessageService, Severity, CloseAction} from 'vs/platform/message/common/message'; +import {Action} from 'vs/base/common/actions'; + +export function setup() { + registerActiveEditorMoveCommand(); + registerDiffEditorCommands(); + handleCommandDeprecations(); } -let isActiveEditorMoveArg= function(arg): boolean { +const isActiveEditorMoveArg = function (arg): boolean { if (!types.isObject(arg)) { return false; } - let activeEditorMoveArg: ActiveEditorMoveArguments = arg; + const activeEditorMoveArg: ActiveEditorMoveArguments = arg; if (!types.isString(activeEditorMoveArg.to)) { return false; @@ -40,14 +47,13 @@ let isActiveEditorMoveArg= function(arg): boolean { return true; }; - -function _registerActiveEditorMoveCommand() { +function registerActiveEditorMoveCommand() { KeybindingsRegistry.registerCommandAndKeybindingRule({ id: EditorCommands.MoveActiveEditor, weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), when: EditorContextKeys.TextFocus, primary: null, - handler: (accessor, args: any) => _moveActiveEditor(args, accessor), + handler: (accessor, args: any) => moveActiveEditor(args, accessor), description: { description: nls.localize('editorCommand.activeEditorMove.description', "Move the active editor by tabs or groups"), args: [ @@ -66,26 +72,26 @@ function _registerActiveEditorMoveCommand() { }); } -function _moveActiveEditor(args: ActiveEditorMoveArguments = {}, accessor: ServicesAccessor) { - let tabsShown = !!(accessor.get(IConfigurationService).getConfiguration()).workbench.editor.showTabs; +function moveActiveEditor(args: ActiveEditorMoveArguments = {}, accessor: ServicesAccessor) { + const tabsShown = !!(accessor.get(IConfigurationService).getConfiguration()).workbench.editor.showTabs; args.to = args.to || ActiveEditorMovePositioning.RIGHT; args.by = tabsShown ? args.by || ActiveEditorMovePositioningBy.TAB : ActiveEditorMovePositioningBy.GROUP; args.value = types.isUndefined(args.value) ? 1 : args.value; - let activeEditor = accessor.get(IWorkbenchEditorService).getActiveEditor(); + const activeEditor = accessor.get(IWorkbenchEditorService).getActiveEditor(); switch (args.by) { case ActiveEditorMovePositioningBy.TAB: - return _moveActiveTab(args, activeEditor, accessor); + return moveActiveTab(args, activeEditor, accessor); case ActiveEditorMovePositioningBy.GROUP: - return _moveActiveEditorToGroup(args, activeEditor, accessor); + return moveActiveEditorToGroup(args, activeEditor, accessor); } } -function _moveActiveTab(args: ActiveEditorMoveArguments, activeEditor: IEditor, accessor: ServicesAccessor) { - let editorGroupsService: IEditorGroupService = accessor.get(IEditorGroupService); - let editorGroup = editorGroupsService.getStacksModel().getGroup(activeEditor.position); - let index= editorGroup.indexOf(activeEditor.input); +function moveActiveTab(args: ActiveEditorMoveArguments, activeEditor: IEditor, accessor: ServicesAccessor) { + const editorGroupsService: IEditorGroupService = accessor.get(IEditorGroupService); + const editorGroup = editorGroupsService.getStacksModel().getGroup(activeEditor.position); + let index = editorGroup.indexOf(activeEditor.input); switch (args.to) { case ActiveEditorMovePositioning.FIRST: index = 0; @@ -106,12 +112,13 @@ function _moveActiveTab(args: ActiveEditorMoveArguments, activeEditor: IEditor, index = args.value - 1; break; } + index = index < 0 ? 0 : index >= editorGroup.count ? editorGroup.count - 1 : index; editorGroupsService.moveEditor(activeEditor.input, editorGroup, editorGroup, index); } -function _moveActiveEditorToGroup(args: ActiveEditorMoveArguments, activeEditor: IEditor, accessor: ServicesAccessor) { - let newPosition= activeEditor.position; +function moveActiveEditorToGroup(args: ActiveEditorMoveArguments, activeEditor: IEditor, accessor: ServicesAccessor) { + let newPosition = activeEditor.position; switch (args.to) { case ActiveEditorMovePositioning.FIRST: case ActiveEditorMovePositioning.LEFT: @@ -128,6 +135,85 @@ function _moveActiveEditorToGroup(args: ActiveEditorMoveArguments, activeEditor: newPosition = args.value - 1; break; } + newPosition = POSITIONS.indexOf(newPosition) !== -1 ? newPosition : activeEditor.position; accessor.get(IEditorGroupService).moveEditor(activeEditor.input, activeEditor.position, newPosition); +} + +function registerDiffEditorCommands(): void { + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'workbench.action.compareEditor.nextChange', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: TextCompareEditorVisible, + primary: null, + handler: accessor => navigateInDiffEditor(accessor, true) + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'workbench.action.compareEditor.previousChange', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(), + when: TextCompareEditorVisible, + primary: null, + handler: accessor => navigateInDiffEditor(accessor, false) + }); + + function navigateInDiffEditor(accessor: ServicesAccessor, next: boolean): void { + let editorService = accessor.get(IWorkbenchEditorService); + const candidates = [editorService.getActiveEditor(), ...editorService.getVisibleEditors()].filter(e => e instanceof TextDiffEditor); + + if (candidates.length > 0) { + next ? (candidates[0]).getDiffNavigator().next() : (candidates[0]).getDiffNavigator().previous(); + } + } + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: '_workbench.printStacksModel', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), + handler(accessor: ServicesAccessor) { + console.log(`${accessor.get(IEditorGroupService).getStacksModel().toString()}\n\n`); + }, + when: undefined, + primary: undefined + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: '_workbench.validateStacksModel', + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), + handler(accessor: ServicesAccessor) { + (accessor.get(IEditorGroupService).getStacksModel()).validate(); + }, + when: undefined, + primary: undefined + }); +} + +function handleCommandDeprecations(): void { + const mapDeprecatedCommands = { + 'workbench.action.terminal.focus': 'workbench.action.focusPanel' + }; + + Object.keys(mapDeprecatedCommands).forEach(deprecatedCommandId => { + const newCommandId = mapDeprecatedCommands[deprecatedCommandId]; + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: deprecatedCommandId, + weight: KeybindingsRegistry.WEIGHT.workbenchContrib(0), + handler(accessor: ServicesAccessor) { + const messageService = accessor.get(IMessageService); + const commandService = accessor.get(ICommandService); + + messageService.show(Severity.Warning, { + message: nls.localize('commandDeprecated', "Command **{0}** has been removed. You can use **{1}** instead", deprecatedCommandId, newCommandId), + actions: [ + CloseAction, + new Action('openKeybindings', nls.localize('openKeybindings', "Configure Keyboard Shortcuts"), null, true, () => { + return commandService.executeCommand('workbench.action.openGlobalKeybindings'); + }) + ] + }); + }, + when: undefined, + primary: undefined + }); + }); } \ No newline at end of file -- GitLab