From be3df0a3962aaef54523e53e13681ba464069a90 Mon Sep 17 00:00:00 2001 From: Kodai Nakamura Date: Sat, 11 Apr 2020 08:50:40 +0900 Subject: [PATCH] Add action to focus query editor widget (#94799) * Add search.action.focusQueryEditorWidget * Implement focusSearchInput method for searchEditor * Add FocusQueryEditorWidgetAction class * Register FocusQueryEditorWidgetAction * Remove existing binding * Add default keybind * Stop toggle focus * Remove mac --- .../contrib/searchEditor/browser/constants.ts | 1 + .../browser/searchEditor.contribution.ts | 6 +++++- .../searchEditor/browser/searchEditor.ts | 9 +++++++-- .../browser/searchEditorActions.ts | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/searchEditor/browser/constants.ts b/src/vs/workbench/contrib/searchEditor/browser/constants.ts index 39c264c57c9..2f90c6bfb06 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/constants.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/constants.ts @@ -8,6 +8,7 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; export const OpenInEditorCommandId = 'search.action.openInEditor'; export const OpenNewEditorCommandId = 'search.action.openNewEditor'; export const OpenNewEditorToSideCommandId = 'search.action.openNewEditorToSide'; +export const FocusQueryEditorWidgetCommandId = 'search.action.focusQueryEditorWidget'; export const ToggleSearchEditorCaseSensitiveCommandId = 'toggleSearchEditorCaseSensitive'; export const ToggleSearchEditorWholeWordCommandId = 'toggleSearchEditorWholeWord'; diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts index 746029df38e..f8bc02ded68 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts @@ -26,7 +26,7 @@ import { Extensions as EditorInputExtensions, IEditorInputFactory, IEditorInputF import * as SearchConstants from 'vs/workbench/contrib/search/common/constants'; import * as SearchEditorConstants from 'vs/workbench/contrib/searchEditor/browser/constants'; import { SearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditor'; -import { modifySearchEditorContextLinesCommand, OpenResultsInEditorAction, OpenSearchEditorAction, OpenSearchEditorToSideAction, RerunSearchEditorSearchAction, selectAllSearchEditorMatchesCommand, toggleSearchEditorCaseSensitiveCommand, toggleSearchEditorContextLinesCommand, toggleSearchEditorRegexCommand, toggleSearchEditorWholeWordCommand } from 'vs/workbench/contrib/searchEditor/browser/searchEditorActions'; +import { modifySearchEditorContextLinesCommand, OpenResultsInEditorAction, OpenSearchEditorAction, OpenSearchEditorToSideAction, RerunSearchEditorSearchAction, selectAllSearchEditorMatchesCommand, toggleSearchEditorCaseSensitiveCommand, toggleSearchEditorContextLinesCommand, toggleSearchEditorRegexCommand, toggleSearchEditorWholeWordCommand, FocusQueryEditorWidgetAction } from 'vs/workbench/contrib/searchEditor/browser/searchEditorActions'; import { getOrMakeSearchEditorInput, SearchEditorInput, SearchConfiguration } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { parseSavedSearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; @@ -209,6 +209,10 @@ registry.registerWorkbenchAction( registry.registerWorkbenchAction(SyncActionDescriptor.create(RerunSearchEditorSearchAction, RerunSearchEditorSearchAction.ID, RerunSearchEditorSearchAction.LABEL, { mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_R } }, ContextKeyExpr.and(SearchEditorConstants.InSearchEditor)), 'Search Editor: Search Again', category); + +registry.registerWorkbenchAction(SyncActionDescriptor.create(FocusQueryEditorWidgetAction, FocusQueryEditorWidgetAction.ID, FocusQueryEditorWidgetAction.LABEL, + { primary: KeyCode.Escape }, ContextKeyExpr.and(SearchEditorConstants.InSearchEditor)), + 'Search Editor: Focus Query Editor Widget', category); //#endregion diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index a258f9d9b39..4be95e5770e 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -224,8 +224,6 @@ export class SearchEditor extends BaseTextEditor { this._register(this.onDidBlur(() => this.saveViewState())); - this._register(this.searchResultEditor.onKeyDown(e => e.keyCode === KeyCode.Escape && this.queryEditorWidget.searchInput.focus())); - this._register(this.searchResultEditor.onDidChangeModelContent(() => this.getInput()?.setDirty(true))); [this.queryEditorWidget.searchInputFocusTracker, this.queryEditorWidget.replaceInputFocusTracker, this.inputPatternExcludes.inputFocusTracker, this.inputPatternIncludes.inputFocusTracker] @@ -248,6 +246,13 @@ export class SearchEditor extends BaseTextEditor { } } + focusSearchInput() { + const viewState = this.loadViewState(); + if (viewState && viewState.focused === 'editor') { + this.queryEditorWidget.searchInput.focus(); + } + } + focusNextInput() { if (this.queryEditorWidget.searchInputHasFocus()) { if (this.showingIncludesExcludes) { diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts index 2932ccfe49a..58622b83976 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts @@ -158,6 +158,24 @@ export class RerunSearchEditorSearchAction extends Action { } } +export class FocusQueryEditorWidgetAction extends Action { + static readonly ID: string = Constants.FocusQueryEditorWidgetCommandId; + static readonly LABEL = localize('search.action.focusQueryEditorWidget', "Focus Query Editor Widget"); + + constructor(id: string, label: string, + @IEditorService private readonly editorService: IEditorService, + ) { + super(id, label); + } + + async run() { + const input = this.editorService.activeEditor; + if (input instanceof SearchEditorInput) { + (this.editorService.activeEditorPane as SearchEditor).focusSearchInput(); + } + } +} + const openNewSearchEditor = async (accessor: ServicesAccessor, toSide = false) => { const editorService = accessor.get(IEditorService);