Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/notebook/browser/services/notebookCellStatusBarServiceImpl.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { CancellationToken } from '../../../../../base/common/cancellation.js';
7
import { onUnexpectedExternalError } from '../../../../../base/common/errors.js';
8
import { Emitter, Event } from '../../../../../base/common/event.js';
9
import { Disposable, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
10
import { URI } from '../../../../../base/common/uri.js';
11
import { INotebookCellStatusBarService } from '../../common/notebookCellStatusBarService.js';
12
import { INotebookCellStatusBarItemList, INotebookCellStatusBarItemProvider } from '../../common/notebookCommon.js';
13
14
export class NotebookCellStatusBarService extends Disposable implements INotebookCellStatusBarService {
15
16
readonly _serviceBrand: undefined;
17
18
private readonly _onDidChangeProviders = this._register(new Emitter<void>());
19
readonly onDidChangeProviders: Event<void> = this._onDidChangeProviders.event;
20
21
private readonly _onDidChangeItems = this._register(new Emitter<void>());
22
readonly onDidChangeItems: Event<void> = this._onDidChangeItems.event;
23
24
private readonly _providers: INotebookCellStatusBarItemProvider[] = [];
25
26
registerCellStatusBarItemProvider(provider: INotebookCellStatusBarItemProvider): IDisposable {
27
this._providers.push(provider);
28
let changeListener: IDisposable | undefined;
29
if (provider.onDidChangeStatusBarItems) {
30
changeListener = provider.onDidChangeStatusBarItems(() => this._onDidChangeItems.fire());
31
}
32
33
this._onDidChangeProviders.fire();
34
35
return toDisposable(() => {
36
changeListener?.dispose();
37
const idx = this._providers.findIndex(p => p === provider);
38
this._providers.splice(idx, 1);
39
});
40
}
41
42
async getStatusBarItemsForCell(docUri: URI, cellIndex: number, viewType: string, token: CancellationToken): Promise<INotebookCellStatusBarItemList[]> {
43
const providers = this._providers.filter(p => p.viewType === viewType || p.viewType === '*');
44
return await Promise.all(providers.map(async p => {
45
try {
46
return await p.provideCellStatusBarItems(docUri, cellIndex, token) ?? { items: [] };
47
} catch (e) {
48
onUnexpectedExternalError(e);
49
return { items: [] };
50
}
51
}));
52
}
53
}
54
55