From f93f19d23c3e7c71580f0f4336f73cbccf1f94c0 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Wed, 11 Sep 2019 14:48:32 -0700 Subject: [PATCH] Enable/disable webview find buttons based on if results have been found Fixes #80656 --- .../codeEditor/browser/find/simpleFindWidget.ts | 16 ++++++++-------- .../contrib/webview/browser/webviewFindWidget.ts | 6 ++++++ .../webview/electron-browser/webviewElement.ts | 9 +++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index f036bfb8c58..615a53aaad3 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -59,7 +59,7 @@ export abstract class SimpleFindWidget extends Widget { return null; } catch (e) { this.foundMatch = false; - this._updateButtons(); + this.updateButtons(this.foundMatch); return { content: e.message }; } } @@ -70,7 +70,7 @@ export abstract class SimpleFindWidget extends Widget { this.oninput(this._findInput.domNode, (e) => { this.foundMatch = this.onInputChanged(); - this._updateButtons(); + this.updateButtons(this.foundMatch); this._delayedUpdateHistory(); }); @@ -209,7 +209,7 @@ export abstract class SimpleFindWidget extends Widget { } this._isVisible = true; - this._updateButtons(); + this.updateButtons(this.foundMatch); setTimeout(() => { dom.addClass(this._innerDomNode, 'visible'); @@ -240,7 +240,7 @@ export abstract class SimpleFindWidget extends Widget { // Need to delay toggling visibility until after Transition, then visibility hidden - removes from tabIndex list setTimeout(() => { this._isVisible = false; - this._updateButtons(); + this.updateButtons(this.foundMatch); dom.removeClass(this._innerDomNode, 'visible'); }, 200); } @@ -266,10 +266,10 @@ export abstract class SimpleFindWidget extends Widget { return this._findInput.getCaseSensitive(); } - private _updateButtons() { - let hasInput = this.inputValue.length > 0; - this.prevBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); - this.nextBtn.setEnabled(this._isVisible && hasInput && this.foundMatch); + protected updateButtons(foundMatch: boolean) { + const hasInput = this.inputValue.length > 0; + this.prevBtn.setEnabled(this._isVisible && hasInput && foundMatch); + this.nextBtn.setEnabled(this._isVisible && hasInput && foundMatch); } } diff --git a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts index b6c68c732bb..ed69cb1a7f5 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewFindWidget.ts @@ -7,8 +7,10 @@ import { SimpleFindWidget } from 'vs/workbench/contrib/codeEditor/browser/find/s 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'; +import { Event } from 'vs/base/common/event'; export interface WebviewFindDelegate { + readonly hasFindResult: Event; find(value: string, previous: boolean): void; startFind(value: string): void; stopFind(keepSelection?: boolean): void; @@ -25,6 +27,10 @@ export class WebviewFindWidget extends SimpleFindWidget { ) { super(contextViewService, contextKeyService); this._findWidgetFocused = KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_FOCUSED.bindTo(contextKeyService); + + this._register(_delegate.hasFindResult(hasResult => { + this.updateButtons(hasResult); + })); } public find(previous: boolean) { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index 870b7620370..97aeac76f73 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -377,12 +377,17 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview, return; } })); + this._register(addDisposableListener(this._webview, 'devtools-opened', () => { this._send('devtools-opened'); })); if (_options.enableFindWidget) { this._webviewFindWidget = this._register(instantiationService.createInstance(WebviewFindWidget, this)); + + this._register(addDisposableListener(this._webview, 'found-in-page', e => { + this._hasFindResult.fire(e.result.matches > 0); + })); } this.style(themeService.getTheme()); @@ -576,6 +581,9 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview, }); } + private readonly _hasFindResult = this._register(new Emitter()); + public readonly hasFindResult: Event = this._hasFindResult.event; + public startFind(value: string, options?: Electron.FindInPageOptions) { if (!value || !this._webview) { return; @@ -623,6 +631,7 @@ export class ElectronWebviewBasedWebview extends Disposable implements Webview, } public stopFind(keepSelection?: boolean): void { + this._hasFindResult.fire(false); if (!this._webview) { return; } -- GitLab