Path: blob/main/src/vs/workbench/contrib/notebook/browser/services/notebookCellStatusBarServiceImpl.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { CancellationToken } from '../../../../../base/common/cancellation.js';6import { onUnexpectedExternalError } from '../../../../../base/common/errors.js';7import { Emitter, Event } from '../../../../../base/common/event.js';8import { Disposable, IDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';9import { URI } from '../../../../../base/common/uri.js';10import { INotebookCellStatusBarService } from '../../common/notebookCellStatusBarService.js';11import { INotebookCellStatusBarItemList, INotebookCellStatusBarItemProvider } from '../../common/notebookCommon.js';1213export class NotebookCellStatusBarService extends Disposable implements INotebookCellStatusBarService {1415readonly _serviceBrand: undefined;1617private readonly _onDidChangeProviders = this._register(new Emitter<void>());18readonly onDidChangeProviders: Event<void> = this._onDidChangeProviders.event;1920private readonly _onDidChangeItems = this._register(new Emitter<void>());21readonly onDidChangeItems: Event<void> = this._onDidChangeItems.event;2223private readonly _providers: INotebookCellStatusBarItemProvider[] = [];2425registerCellStatusBarItemProvider(provider: INotebookCellStatusBarItemProvider): IDisposable {26this._providers.push(provider);27let changeListener: IDisposable | undefined;28if (provider.onDidChangeStatusBarItems) {29changeListener = provider.onDidChangeStatusBarItems(() => this._onDidChangeItems.fire());30}3132this._onDidChangeProviders.fire();3334return toDisposable(() => {35changeListener?.dispose();36const idx = this._providers.findIndex(p => p === provider);37this._providers.splice(idx, 1);38});39}4041async getStatusBarItemsForCell(docUri: URI, cellIndex: number, viewType: string, token: CancellationToken): Promise<INotebookCellStatusBarItemList[]> {42const providers = this._providers.filter(p => p.viewType === viewType || p.viewType === '*');43return await Promise.all(providers.map(async p => {44try {45return await p.provideCellStatusBarItems(docUri, cellIndex, token) ?? { items: [] };46} catch (e) {47onUnexpectedExternalError(e);48return { items: [] };49}50}));51}52}535455