Skip to content

Commit 7ecbcb0

Browse files
tree: forward searchChanged event to extension backend
Expose search text updates through vscode-messenger so extensions can implement backend search for large trees. Also document the new onDidSearchChanged event in the tree README.
1 parent dda8eb6 commit 7ecbcb0

4 files changed

Lines changed: 34 additions & 3 deletions

File tree

src/tree/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ export class TreeDataProvider implements CDTTreeDataProvider<Example, ExampleDTO
6868
}),
6969
webview.onDidToggleNode(event => {
7070
// Handle toggle
71+
}),
72+
webview.onDidSearchChanged(event => {
73+
// Handle search input changes
7174
})
7275
);
7376
}

src/tree/browser/tree.tsx

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import classNames from 'classnames';
1414
import { Resizable } from 're-resizable';
1515
import { default as React, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
1616
import { debounce } from 'throttle-debounce';
17+
import { HOST_EXTENSION } from 'vscode-messenger-common';
1718
import { findNestedValue } from '../../base';
19+
import { messenger } from '../../browser-types';
1820
import { CommandDefinition } from '../../vscode/webview-types';
1921
import {
2022
CDTTreeItem,
@@ -25,6 +27,7 @@ import {
2527
CDTTreeTableStringColumn,
2628
CDTTreeWebviewContext
2729
} from '../common/index';
30+
import { CDTTreeMessengerType } from '../common/tree-messenger-types';
2831
import ActionCell from './components/cells/ActionCell';
2932
import StringCell from './components/cells/StringCell';
3033
import { ExpandIcon } from './components/expand-icon';
@@ -238,12 +241,31 @@ export const CDTTree = <T extends CDTTreeItemResource>(props: CDTTreeProps<T>) =
238241
}
239242
}, []);
240243

241-
const onSearchShow = useCallback(() => setGlobalSearchText(globalSearchRef.current?.value()), []);
244+
const notifySearchChanged = useCallback((text: string) => {
245+
messenger.sendNotification(CDTTreeMessengerType.searchChanged, HOST_EXTENSION, { data: { text } });
246+
}, []);
247+
248+
const onSearchShow = useCallback(() => {
249+
const text = globalSearchRef.current?.value() ?? '';
250+
setGlobalSearchText(text);
251+
notifySearchChanged(text);
252+
}, [notifySearchChanged]);
253+
242254
const onSearchHide = useCallback(() => {
243255
setGlobalSearchText(undefined);
244256
autoSelectRowRef.current = true;
245-
}, [autoSelectRowRef]);
246-
const onSearchChange = useMemo(() => debounce(300, (text: string) => setGlobalSearchText(text)), []);
257+
258+
notifySearchChanged('');
259+
}, [notifySearchChanged]);
260+
261+
const onSearchChange = useMemo(
262+
() =>
263+
debounce(300, (text: string) => {
264+
setGlobalSearchText(text);
265+
notifySearchChanged(text);
266+
}),
267+
[notifySearchChanged]
268+
);
247269

248270
// ==== Selection ====
249271

src/tree/common/tree-messenger-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ export namespace CDTTreeMessengerType {
4545
export const toggleNode: NotificationType<CDTTreeNotification<string>> = { method: 'toggleNode' };
4646
export const clickNode: NotificationType<CDTTreeNotification<string>> = { method: 'clickNode' };
4747
export const openSearch: NotificationType<void> = { method: 'openSearch' };
48+
export const searchChanged: NotificationType<CDTTreeNotification<{ text: string }>> = { method: 'searchChanged' };
4849
}

src/tree/vscode/tree-webview-view-provider.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export abstract class CDTTreeWebviewViewProvider<TNode> implements vscode.Webvie
1818
public readonly onDidExecuteCommand = this.onDidExecuteCommandEvent.event;
1919
protected onDidClickNodeEvent = new vscode.EventEmitter<CDTTreeNotification<string>>();
2020
public readonly onDidClickNode = this.onDidClickNodeEvent.event;
21+
protected onDidSearchChangedEvent = new vscode.EventEmitter<CDTTreeNotification<{ text: string }>>();
22+
public readonly onDidSearchChanged = this.onDidSearchChangedEvent.event;
2123

2224
protected get extensionUri(): vscode.Uri {
2325
return this.context.extensionUri;
@@ -119,6 +121,9 @@ export abstract class CDTTreeWebviewViewProvider<TNode> implements vscode.Webvie
119121
}),
120122
this.messenger.onNotification(CDTTreeMessengerType.clickNode, event => this.onDidClickNodeEvent.fire(event), {
121123
sender: participant
124+
}),
125+
this.messenger.onNotification(CDTTreeMessengerType.searchChanged, event => this.onDidSearchChangedEvent.fire(event), {
126+
sender: participant
122127
})
123128
];
124129

0 commit comments

Comments
 (0)