diff --git a/src/sql/base/browser/ui/panel/panel.ts b/src/sql/base/browser/ui/panel/panel.ts index 94b485033a..d3b69bfa22 100644 --- a/src/sql/base/browser/ui/panel/panel.ts +++ b/src/sql/base/browser/ui/panel/panel.ts @@ -311,7 +311,7 @@ export class TabbedPanel extends Disposable { } } - private focusCurrentTab(): void { + public focusCurrentTab(): void { if (this._shownTabId) { const tab = this._tabMap.get(this._shownTabId); if (tab) { diff --git a/src/sql/workbench/contrib/query/browser/keyboardQueryActions.ts b/src/sql/workbench/contrib/query/browser/keyboardQueryActions.ts index 8c3366304a..3310099657 100644 --- a/src/sql/workbench/contrib/query/browser/keyboardQueryActions.ts +++ b/src/sql/workbench/contrib/query/browser/keyboardQueryActions.ts @@ -306,6 +306,32 @@ export class ToggleQueryResultsKeyboardAction extends Action { } } + + +/** + * Toggle the focus between query editor and results pane + */ +export class ToggleFocusBetweenQueryEditorAndResultsAction extends Action { + public static ID = 'ToggleFocusBetweenQueryEditorAndResultsAction'; + public static LABEL = nls.localize('ToggleFocusBetweenQueryEditorAndResultsAction', "Toggle Focus Between Query And Results"); + + constructor( + id: string, + label: string, + @IEditorService private _editorService: IEditorService + ) { + super(id, label); + this.enabled = true; + } + + public async run(): Promise { + const editor = this._editorService.activeEditorPane; + if (editor instanceof QueryEditor) { + editor.toggleFocusBetweenQueryEditorAndResults(); + } + } +} + /** * Action class that runs a query in the active SQL text document. */ diff --git a/src/sql/workbench/contrib/query/browser/query.contribution.ts b/src/sql/workbench/contrib/query/browser/query.contribution.ts index dd292880d1..c5f4a8170f 100644 --- a/src/sql/workbench/contrib/query/browser/query.contribution.ts +++ b/src/sql/workbench/contrib/query/browser/query.contribution.ts @@ -19,7 +19,7 @@ import { QueryResultsInput } from 'sql/workbench/common/editor/query/queryResult import * as queryContext from 'sql/workbench/contrib/query/common/queryContext'; import { RunQueryKeyboardAction, RunCurrentQueryKeyboardAction, CancelQueryKeyboardAction, RefreshIntellisenseKeyboardAction, ToggleQueryResultsKeyboardAction, - RunQueryShortcutAction, RunCurrentQueryWithActualPlanKeyboardAction, CopyQueryWithResultsKeyboardAction, FocusOnCurrentQueryKeyboardAction, ParseSyntaxAction + RunQueryShortcutAction, RunCurrentQueryWithActualPlanKeyboardAction, CopyQueryWithResultsKeyboardAction, FocusOnCurrentQueryKeyboardAction, ParseSyntaxAction, ToggleFocusBetweenQueryEditorAndResultsAction } from 'sql/workbench/contrib/query/browser/keyboardQueryActions'; import * as gridActions from 'sql/workbench/contrib/editData/browser/gridActions'; import * as gridCommands from 'sql/workbench/contrib/editData/browser/gridCommands'; @@ -200,6 +200,17 @@ actionRegistry.registerWorkbenchAction( ToggleQueryResultsKeyboardAction.LABEL ); +actionRegistry.registerWorkbenchAction( + SyncActionDescriptor.create( + ToggleFocusBetweenQueryEditorAndResultsAction, + ToggleFocusBetweenQueryEditorAndResultsAction.ID, + ToggleFocusBetweenQueryEditorAndResultsAction.LABEL, + { primary: KeyMod.WinCtrl | KeyMod.Shift | KeyCode.KEY_F }, + QueryEditorVisibleCondition + ), + ToggleFocusBetweenQueryEditorAndResultsAction.LABEL +); + // Register Flavor Action actionRegistry.registerWorkbenchAction( SyncActionDescriptor.create( diff --git a/src/sql/workbench/contrib/query/browser/queryEditor.ts b/src/sql/workbench/contrib/query/browser/queryEditor.ts index 6146315f35..8f9fe14a7f 100644 --- a/src/sql/workbench/contrib/query/browser/queryEditor.ts +++ b/src/sql/workbench/contrib/query/browser/queryEditor.ts @@ -470,6 +470,14 @@ export class QueryEditor extends EditorPane { this.currentTextEditor.focus(); } + public toggleFocusBetweenQueryEditorAndResults(): void { + if (!this.resultsVisible || this.resultsEditorContainer.contains(document.activeElement)) { + this.focus(); + } else { + this.resultsEditor.focus(); + } + } + /** * Updates the internal variable keeping track of the editor's size, and re-calculates the sash position. * To be called when the container of this editor changes size. diff --git a/src/sql/workbench/contrib/query/browser/queryResultsEditor.ts b/src/sql/workbench/contrib/query/browser/queryResultsEditor.ts index 8f49103a06..d1bd1edc91 100644 --- a/src/sql/workbench/contrib/query/browser/queryResultsEditor.ts +++ b/src/sql/workbench/contrib/query/browser/queryResultsEditor.ts @@ -153,4 +153,8 @@ export class QueryResultsEditor extends EditorPane { public registerQueryModelViewTab(title: string, componentId: string): void { this.resultsView.registerQueryModelViewTab(title, componentId); } + + public focus(): void { + this.resultsView.focus(); + } } diff --git a/src/sql/workbench/contrib/query/browser/queryResultsView.ts b/src/sql/workbench/contrib/query/browser/queryResultsView.ts index f846681e6b..c66d22b01e 100644 --- a/src/sql/workbench/contrib/query/browser/queryResultsView.ts +++ b/src/sql/workbench/contrib/query/browser/queryResultsView.ts @@ -430,4 +430,8 @@ export class QueryResultsView extends Disposable { tab.putState(this.input.state.dynamicModelViewTabsState); } } + + public focus(): void { + this._panelView.focusCurrentTab(); + } }