Skip to content

Commit 9f065d0

Browse files
authored
Lazily create notebook find widget (microsoft#163962)
The notebook find widget is currently created when the notebook is opened. This is somewhat expensive, so we should defer this until the find widget is needed
1 parent c5832ef commit 9f065d0

File tree

4 files changed

+40
-11
lines changed

4 files changed

+40
-11
lines changed

src/vs/workbench/contrib/interactive/browser/interactiveEditor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import { NOTEBOOK_KERNEL } from 'vs/workbench/contrib/notebook/common/notebookCo
5858
import { ICursorPositionChangedEvent } from 'vs/editor/common/cursorEvents';
5959
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
6060
import { isEqual } from 'vs/base/common/resources';
61-
import { NotebookFindWidget } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
61+
import { NotebookFindContrib } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
6262
import { INTERACTIVE_WINDOW_EDITOR_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon';
6363

6464
const DECORATION_KEY = 'interactiveInputDecoration';
@@ -329,7 +329,7 @@ export class InteractiveEditor extends EditorPane {
329329
contributions: NotebookEditorExtensionsRegistry.getSomeEditorContributions([
330330
ExecutionStateCellStatusBarContrib.id,
331331
TimerCellStatusBarContrib.id,
332-
NotebookFindWidget.id
332+
NotebookFindContrib.id
333333
]),
334334
menuIds: {
335335
notebookToolbar: MenuId.InteractiveToolbar,

src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFind.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ import { Action2, registerAction2 } from 'vs/platform/actions/common/actions';
1818
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
1919
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
2020
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
21-
import { IShowNotebookFindWidgetOptions, NotebookFindWidget } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
21+
import { IShowNotebookFindWidgetOptions, NotebookFindContrib } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
2222
import { getNotebookEditorFromEditorPane } from 'vs/workbench/contrib/notebook/browser/notebookBrowser';
2323
import { registerNotebookContribution } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions';
2424
import { CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon';
2525
import { INTERACTIVE_WINDOW_IS_ACTIVE_EDITOR, KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/common/notebookContextKeys';
2626
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
2727
import { EditorOption } from 'vs/editor/common/config/editorOptions';
2828

29-
registerNotebookContribution(NotebookFindWidget.id, NotebookFindWidget);
29+
registerNotebookContribution(NotebookFindContrib.id, NotebookFindContrib);
3030

3131
registerAction2(class extends Action2 {
3232
constructor() {
@@ -49,7 +49,7 @@ registerAction2(class extends Action2 {
4949
return;
5050
}
5151

52-
const controller = editor.getContribution<NotebookFindWidget>(NotebookFindWidget.id);
52+
const controller = editor.getContribution<NotebookFindContrib>(NotebookFindContrib.id);
5353
controller.hide();
5454
editor.focus();
5555
}
@@ -76,7 +76,7 @@ registerAction2(class extends Action2 {
7676
return;
7777
}
7878

79-
const controller = editor.getContribution<NotebookFindWidget>(NotebookFindWidget.id);
79+
const controller = editor.getContribution<NotebookFindContrib>(NotebookFindContrib.id);
8080
controller.show();
8181
}
8282
});
@@ -139,7 +139,7 @@ StartFindAction.addImplementation(100, (accessor: ServicesAccessor, codeEditor:
139139
}
140140
}
141141

142-
const controller = editor.getContribution<NotebookFindWidget>(NotebookFindWidget.id);
142+
const controller = editor.getContribution<NotebookFindContrib>(NotebookFindContrib.id);
143143

144144
const searchStringOptions = getSearchStringOptions(codeEditor, {
145145
forceRevealReplace: false,
@@ -180,7 +180,7 @@ StartFindReplaceAction.addImplementation(100, (accessor: ServicesAccessor, codeE
180180
return false;
181181
}
182182

183-
const controller = editor.getContribution<NotebookFindWidget>(NotebookFindWidget.id);
183+
const controller = editor.getContribution<NotebookFindContrib>(NotebookFindContrib.id);
184184

185185
const searchStringOptions = getSearchStringOptions(codeEditor, {
186186
forceRevealReplace: false,

src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import * as DOM from 'vs/base/browser/dom';
77
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
88
import { alert as alertFn } from 'vs/base/browser/ui/aria/aria';
99
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
10+
import { Lazy } from 'vs/base/common/lazy';
11+
import { Disposable } from 'vs/base/common/lifecycle';
1012
import * as strings from 'vs/base/common/strings';
1113
import { Range } from 'vs/editor/common/core/range';
1214
import { FindMatch } from 'vs/editor/common/model';
@@ -40,8 +42,35 @@ export interface IShowNotebookFindWidgetOptions {
4042
searchStringSeededFrom?: { cell: ICellViewModel; range: Range };
4143
}
4244

45+
export class NotebookFindContrib extends Disposable implements INotebookEditorContribution {
46+
47+
static readonly id: string = 'workbench.notebook.find';
48+
49+
private readonly widget: Lazy<NotebookFindWidget>;
50+
51+
constructor(
52+
private readonly notebookEditor: INotebookEditor,
53+
@IInstantiationService private readonly instantiationService: IInstantiationService,
54+
) {
55+
super();
56+
57+
this.widget = new Lazy(() => this._register(this.instantiationService.createInstance(NotebookFindWidget, this.notebookEditor)));
58+
}
59+
60+
show(initialInput?: string, options?: IShowNotebookFindWidgetOptions): Promise<void> {
61+
return this.widget.getValue().show(initialInput, options);
62+
}
63+
64+
hide() {
65+
this.widget.rawValue?.hide();
66+
}
67+
68+
replace(searchString: string | undefined) {
69+
return this.widget.getValue().replace(searchString);
70+
}
71+
}
72+
4373
export class NotebookFindWidget extends SimpleFindReplaceWidget implements INotebookEditorContribution {
44-
static id: string = 'workbench.notebook.find';
4574
protected _findWidgetFocused: IContextKey<boolean>;
4675
private _showTimeout: number | null = null;
4776
private _hideTimeout: number | null = null;

src/vs/workbench/contrib/search/browser/searchView.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/vie
5959
import { IEditorPane } from 'vs/workbench/common/editor';
6060
import { Memento, MementoObject } from 'vs/workbench/common/memento';
6161
import { IViewDescriptorService } from 'vs/workbench/common/views';
62-
import { NotebookFindWidget } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
62+
import { NotebookFindContrib } from 'vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget';
6363
import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor';
6464
import { ExcludePatternInputWidget, IncludePatternInputWidget } from 'vs/workbench/contrib/search/browser/patternInputWidget';
6565
import { appendKeyBindingLabel, IFindInFilesArgs } from 'vs/workbench/contrib/search/browser/searchActions';
@@ -1789,7 +1789,7 @@ export class SearchView extends ViewPane {
17891789
}
17901790

17911791
if (editor instanceof NotebookEditor) {
1792-
const controller = editor.getControl()?.getContribution<NotebookFindWidget>(NotebookFindWidget.id);
1792+
const controller = editor.getControl()?.getContribution<NotebookFindContrib>(NotebookFindContrib.id);
17931793
const matchIndex = element instanceof Match ? element.parent().matches().findIndex(e => e.id() === element.id()) : undefined;
17941794
controller?.show(this.searchWidget.searchInput.getValue(), { matchIndex, focus: false });
17951795
}

0 commit comments

Comments
 (0)