From 79e52cb3e4818c58147ff7d324af63c8be0462e5 Mon Sep 17 00:00:00 2001 From: Peng Lyu Date: Wed, 21 Aug 2019 11:47:34 -0700 Subject: [PATCH] Move Enter handler to commands from input keydown handler. --- .../browser/find/simpleFindWidget.ts | 19 +---- .../extensions/browser/extensionEditor.ts | 70 +++++++++++++++---- .../terminal/browser/terminal.contribution.ts | 4 +- .../terminal/browser/terminalFindWidget.ts | 2 +- .../browser/dynamicWebviewEditorOverlay.ts | 1 + .../webview/browser/webview.contribution.ts | 26 ++++++- .../contrib/webview/browser/webview.ts | 2 + .../webview/browser/webviewCommands.ts | 23 +++++- .../contrib/webview/browser/webviewEditor.ts | 7 +- .../contrib/webview/browser/webviewElement.ts | 4 ++ .../webview/browser/webviewFindWidget.ts | 13 +++- .../electron-browser/webviewElement.ts | 6 ++ 12 files changed, 137 insertions(+), 40 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index 8ba218619a2..f036bfb8c58 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -9,7 +9,7 @@ import * as dom from 'vs/base/browser/dom'; import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { Widget } from 'vs/base/browser/ui/widget'; import { Delayer } from 'vs/base/common/async'; -import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { KeyCode } from 'vs/base/common/keyCodes'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBox'; import { SimpleButton } from 'vs/editor/contrib/find/findWidget'; @@ -42,8 +42,7 @@ export abstract class SimpleFindWidget extends Widget { @IContextViewService private readonly _contextViewService: IContextViewService, @IContextKeyService contextKeyService: IContextKeyService, private readonly _state: FindReplaceState = new FindReplaceState(), - showOptionButtons?: boolean, - private readonly _invertDefaultDirection: boolean = false + showOptionButtons?: boolean ) { super(); @@ -94,20 +93,6 @@ export abstract class SimpleFindWidget extends Widget { this.findFirst(); })); - this._register(this._findInput.onKeyDown((e) => { - if (e.equals(KeyCode.Enter)) { - this.find(this._invertDefaultDirection); - e.preventDefault(); - return; - } - - if (e.equals(KeyMod.Shift | KeyCode.Enter)) { - this.find(!this._invertDefaultDirection); - e.preventDefault(); - return; - } - })); - this.prevBtn = this._register(new SimpleButton({ label: NLS_PREVIOUS_MATCH_BTN_LABEL, className: 'previous', diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 272fa9d0591..17e83bed319 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -50,7 +50,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { getDefaultValue } from 'vs/platform/configuration/common/configurationRegistry'; import { isUndefined } from 'vs/base/common/types'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IWebviewService, Webview } from 'vs/workbench/contrib/webview/browser/webview'; +import { IWebviewService, Webview, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/webview/browser/webview'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { generateUuid } from 'vs/base/common/uuid'; import { platform } from 'vs/base/common/process'; @@ -525,6 +525,12 @@ export class ExtensionEditor extends BaseEditor { } } + runFindAction(previous: boolean): void { + if (this.activeElement && (this.activeElement).runFindAction) { + (this.activeElement).runFindAction(previous); + } + } + private onNavbarChange(extension: IExtension, { id, focus }: { id: string | null, focus: boolean }, template: IExtensionEditorTemplate): void { if (this.editorLoadComplete) { /* __GDPR__ @@ -1314,28 +1320,66 @@ export class ExtensionEditor extends BaseEditor { } } +const contextKeyExpr = ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', ExtensionEditor.ID), ContextKeyExpr.not('editorFocus')); class ShowExtensionEditorFindCommand extends Command { public runCommand(accessor: ServicesAccessor, args: any): void { - const extensionEditor = this.getExtensionEditor(accessor); + const extensionEditor = getExtensionEditor(accessor); if (extensionEditor) { extensionEditor.showFind(); } } +} +(new ShowExtensionEditorFindCommand({ + id: 'editor.action.extensioneditor.showfind', + precondition: contextKeyExpr, + kbOpts: { + primary: KeyMod.CtrlCmd | KeyCode.KEY_F, + weight: KeybindingWeight.EditorContrib + } +})).register(); - private getExtensionEditor(accessor: ServicesAccessor): ExtensionEditor | null { - const activeControl = accessor.get(IEditorService).activeControl as ExtensionEditor; - if (activeControl instanceof ExtensionEditor) { - return activeControl; +class StartExtensionEditorFindNextCommand extends Command { + public runCommand(accessor: ServicesAccessor, args: any): void { + const extensionEditor = getExtensionEditor(accessor); + if (extensionEditor) { + extensionEditor.runFindAction(false); } - return null; } } -const showCommand = new ShowExtensionEditorFindCommand({ - id: 'editor.action.extensioneditor.showfind', - precondition: ContextKeyExpr.and(ContextKeyExpr.equals('activeEditor', ExtensionEditor.ID), ContextKeyExpr.not('editorFocus')), +(new StartExtensionEditorFindNextCommand({ + id: 'editor.action.extensioneditor.findNext', + precondition: ContextKeyExpr.and( + contextKeyExpr, + KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED), kbOpts: { - primary: KeyMod.CtrlCmd | KeyCode.KEY_F, + primary: KeyCode.Enter, weight: KeybindingWeight.EditorContrib } -}); -showCommand.register(); +})).register(); + +class StartExtensionEditorFindPreviousCommand extends Command { + public runCommand(accessor: ServicesAccessor, args: any): void { + const extensionEditor = getExtensionEditor(accessor); + if (extensionEditor) { + extensionEditor.runFindAction(true); + } + } +} +(new StartExtensionEditorFindPreviousCommand({ + id: 'editor.action.extensioneditor.findPrevious', + precondition: ContextKeyExpr.and( + contextKeyExpr, + KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED), + kbOpts: { + primary: KeyMod.Shift | KeyCode.Enter, + weight: KeybindingWeight.EditorContrib + } +})).register(); + +function getExtensionEditor(accessor: ServicesAccessor): ExtensionEditor | null { + const activeControl = accessor.get(IEditorService).activeControl as ExtensionEditor; + if (activeControl instanceof ExtensionEditor) { + return activeControl; + } + return null; +} diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 99c526eedca..b47f264dcb9 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -530,7 +530,7 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FindNext, FindNe }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Find next', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FindNext, FindNext.ID, FindNext.LABEL, { primary: KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3] } + mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_G, secondary: [KeyCode.F3, KeyMod.Shift | KeyCode.Enter] } }, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find next'); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FindPrevious, FindPrevious.ID_TERMINAL_FOCUS, FindPrevious.LABEL, { primary: KeyMod.Shift | KeyCode.F3, @@ -538,7 +538,7 @@ actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FindPrevious, Fi }, KEYBINDING_CONTEXT_TERMINAL_FOCUS), 'Terminal: Find previous', category); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(FindPrevious, FindPrevious.ID, FindPrevious.LABEL, { primary: KeyMod.Shift | KeyCode.F3, - mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3] }, + mac: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_G, secondary: [KeyMod.Shift | KeyCode.F3, KeyCode.Enter] }, }, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED), 'Terminal: Find previous'); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts index 87ca61f2d55..a3d01c1c6e4 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts @@ -19,7 +19,7 @@ export class TerminalFindWidget extends SimpleFindWidget { @IContextKeyService private readonly _contextKeyService: IContextKeyService, @ITerminalService private readonly _terminalService: ITerminalService ) { - super(_contextViewService, _contextKeyService, findState, true, true); + super(_contextViewService, _contextKeyService, findState, true); this._register(findState.onFindReplaceStateChange(() => { this.show(); })); diff --git a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts index 94d8bfa1f36..ead4c72d910 100644 --- a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts +++ b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts @@ -153,6 +153,7 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewEd reload(): void { this.withWebview(webview => webview.reload()); } showFind(): void { this.withWebview(webview => webview.showFind()); } hideFind(): void { this.withWebview(webview => webview.hideFind()); } + runFindAction(previous: boolean): void { this.withWebview(webview => webview.runFindAction(previous)); } public getInnerWebview() { return this._webview.value; diff --git a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts index 56017d4348f..e6bf13abce6 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.contribution.ts @@ -15,8 +15,8 @@ import { EditorDescriptor, Extensions as EditorExtensions, IEditorRegistry } fro import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { WebviewEditorInputFactory } from 'vs/workbench/contrib/webview/browser/webviewEditorInputFactory'; -import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, webviewDeveloperCategory } from 'vs/workbench/contrib/webview/browser/webview'; -import { HideWebViewEditorFindCommand, ReloadWebviewAction, ShowWebViewEditorFindWidgetCommand } from '../browser/webviewCommands'; +import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE, webviewDeveloperCategory, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/webview/browser/webview'; +import { HideWebViewEditorFindCommand, ReloadWebviewAction, ShowWebViewEditorFindWidgetCommand, WebViewEditorFindNextCommand, WebViewEditorFindPreviousCommand } from '../browser/webviewCommands'; import { WebviewEditor } from '../browser/webviewEditor'; import { WebviewEditorInput } from '../browser/webviewEditorInput'; import { IWebviewEditorService, WebviewEditorService } from '../browser/webviewEditorService'; @@ -58,6 +58,28 @@ function registerWebViewCommands(editorId: string): void { weight: KeybindingWeight.EditorContrib } })).register(); + + (new WebViewEditorFindNextCommand({ + id: WebViewEditorFindNextCommand.ID, + precondition: ContextKeyExpr.and( + contextKeyExpr, + KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED), + kbOpts: { + primary: KeyCode.Enter, + weight: KeybindingWeight.EditorContrib + } + })).register(); + + (new WebViewEditorFindPreviousCommand({ + id: WebViewEditorFindPreviousCommand.ID, + precondition: ContextKeyExpr.and( + contextKeyExpr, + KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED), + kbOpts: { + primary: KeyMod.Shift | KeyCode.Enter, + weight: KeybindingWeight.EditorContrib + } + })).register(); } registerWebViewCommands(WebviewEditor.ID); diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index ea7ecb5a720..e7ef6086eaf 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -16,6 +16,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' * Set when the find widget in a webview is visible. */ export const KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE = new RawContextKey('webviewFindWidgetVisible', false); +export const KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED = new RawContextKey('webviewFindWidgetFocused', false); export const IWebviewService = createDecorator('webviewService'); @@ -83,6 +84,7 @@ export interface Webview extends IDisposable { showFind(): void; hideFind(): void; + runFindAction(previous: boolean): void; } export interface WebviewElement extends Webview { diff --git a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts index a5888e3e668..62a3eecece5 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewCommands.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewCommands.ts @@ -32,6 +32,27 @@ export class HideWebViewEditorFindCommand extends Command { } } +export class WebViewEditorFindNextCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.findNext'; + + public runCommand(accessor: ServicesAccessor, args: any): void { + const webViewEditor = getActiveWebviewEditor(accessor); + if (webViewEditor) { + webViewEditor.find(false); + } + } +} + +export class WebViewEditorFindPreviousCommand extends Command { + public static readonly ID = 'editor.action.webvieweditor.findPrevious'; + + public runCommand(accessor: ServicesAccessor, args: any): void { + const webViewEditor = getActiveWebviewEditor(accessor); + if (webViewEditor) { + webViewEditor.find(true); + } + } +} export class ReloadWebviewAction extends Action { static readonly ID = 'workbench.action.webview.reloadWebviewAction'; static readonly LABEL = nls.localize('refreshWebviewLabel', "Reload Webviews"); @@ -62,4 +83,4 @@ function getActiveWebviewEditor(accessor: ServicesAccessor): WebviewEditor | nul const editorService = accessor.get(IEditorService); const activeControl = editorService.activeControl as WebviewEditor; return activeControl.isWebviewEditor ? activeControl : null; -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts index b8d7c6dd48e..33d33303076 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditor.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditor.ts @@ -25,7 +25,6 @@ export class WebviewEditor extends BaseEditor { private readonly _scopedContextKeyService = this._register(new MutableDisposable()); private _findWidgetVisible: IContextKey; - private _editorFrame?: HTMLElement; private _content?: HTMLElement; @@ -79,6 +78,12 @@ export class WebviewEditor extends BaseEditor { this.withWebview(webview => webview.hideFind()); } + public find(previous: boolean) { + this.withWebview(webview => { + webview.runFindAction(previous); + }); + } + public reload() { this.withWebview(webview => webview.reload()); } diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index 7a0015be053..b18f47f0f96 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -268,6 +268,10 @@ export class IFrameWebview extends Disposable implements Webview { throw new Error('Method not implemented.'); } + runFindAction(previous: boolean): void { + throw new Error('Method not implemented.'); + } + public set state(state: string | undefined) { this.content = { html: this.content.html, diff --git a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts index 0d8e6804bc0..b6c68c732bb 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { SimpleFindWidget } from 'vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget'; -import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/webview/browser/webview'; export interface WebviewFindDelegate { find(value: string, previous: boolean): void; @@ -15,6 +16,7 @@ export interface WebviewFindDelegate { } export class WebviewFindWidget extends SimpleFindWidget { + protected _findWidgetFocused: IContextKey; constructor( private readonly _delegate: WebviewFindDelegate, @@ -22,6 +24,7 @@ export class WebviewFindWidget extends SimpleFindWidget { @IContextKeyService contextKeyService: IContextKeyService ) { super(contextViewService, contextKeyService); + this._findWidgetFocused = KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED.bindTo(contextKeyService); } public find(previous: boolean) { @@ -47,9 +50,13 @@ export class WebviewFindWidget extends SimpleFindWidget { return false; } - protected onFocusTrackerFocus() { } + protected onFocusTrackerFocus() { + this._findWidgetFocused.set(true); + } - protected onFocusTrackerBlur() { } + protected onFocusTrackerBlur() { + this._findWidgetFocused.reset(); + } protected onFindInputFocusTrackerFocus() { } diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index bdd1c7e3956..1fd54f62df6 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -640,6 +640,12 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview { } } + public runFindAction(previous: boolean) { + if (this._webviewFindWidget) { + this._webviewFindWidget.find(previous); + } + } + public reload() { this.doUpdateContent(); } -- GitLab