diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index f8c03f6739a22f6bececccc414337a1397bc0cfe..737ba526e8e82a1708a171e46a789905a2d5b317 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -26,6 +26,7 @@ import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/mode import { CellKind, IProcessedOutput, IRenderOutput, NotebookCellMetadata, NotebookDocumentMetadata, INotebookKernelInfo, IEditor } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; +import { IMenu } from 'vs/platform/actions/common/actions'; export const KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED = new RawContextKey('notebookFindWidgetFocused', false); @@ -451,6 +452,7 @@ export interface BaseCellRenderTemplate { currentRenderedCell?: ICellViewModel; statusBarContainer: HTMLElement; languageStatusBarItem: CellLanguageStatusBarItem; + titleMenu: IMenu; toJSON: () => object; } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts index 7e620e9d37f4f9845a843214ab048f39f079ce39..a34745d0d1f18426f5296f6b384ff16b58ac5c3d 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -170,7 +170,8 @@ export class CellEditorOptions { } abstract class AbstractCellRenderer { - protected editorOptions: CellEditorOptions; + protected readonly editorOptions: CellEditorOptions; + protected readonly cellMenus: CellMenus; constructor( protected readonly instantiationService: IInstantiationService, @@ -184,6 +185,7 @@ abstract class AbstractCellRenderer { protected readonly dndController: CellDragAndDropController ) { this.editorOptions = new CellEditorOptions(configurationService, language); + this.cellMenus = this.instantiationService.createInstance(CellMenus); } dispose() { @@ -259,12 +261,9 @@ abstract class AbstractCellRenderer { return { primary, secondary }; } - protected setupCellToolbarActions(scopedContextKeyService: IContextKeyService, templateData: BaseCellRenderTemplate, disposables: DisposableStore): void { - const cellMenu = this.instantiationService.createInstance(CellMenus); - const menu = disposables.add(cellMenu.getCellTitleMenu(scopedContextKeyService)); - + protected setupCellToolbarActions(templateData: BaseCellRenderTemplate, disposables: DisposableStore): void { const updateActions = () => { - const actions = this.getCellToolbarActions(menu); + const actions = this.getCellToolbarActions(templateData.titleMenu); const hadFocus = DOM.isAncestor(document.activeElement, templateData.toolbar.getContainer()); templateData.toolbar.setActions(actions.primary, actions.secondary); @@ -288,7 +287,7 @@ abstract class AbstractCellRenderer { }; updateActions(); - disposables.add(menu.onDidChange(() => { + disposables.add(templateData.titleMenu.onDidChange(() => { if (this.notebookEditor.isDisposed) { return; } @@ -357,6 +356,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR DOM.append(bottomCellContainer, $('.separator')); const statusBar = this.instantiationService.createInstance(CellEditorStatusBar, editorPart); + const titleMenu = disposables.add(this.cellMenus.getCellTitleMenu(contextKeyService)); const templateData: MarkdownCellRenderTemplate = { contextKeyService, @@ -373,6 +373,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR bottomCellContainer, statusBarContainer: statusBar.statusBarContainer, languageStatusBarItem: statusBar.languageStatusBarItem, + titleMenu, toJSON: () => { return {}; } }; this.dndController.registerDragHandle(templateData, () => this.getDragImage(templateData)); @@ -427,7 +428,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); // render toolbar first - this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); + this.setupCellToolbarActions(templateData, elementDisposables); const toolbarContext = { cell: element, @@ -917,6 +918,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const focusIndicatorBottom = DOM.append(container, $('.cell-focus-indicator.cell-focus-indicator-bottom')); + const titleMenu = disposables.add(this.cellMenus.getCellTitleMenu(contextKeyService)); + const templateData: CodeCellRenderTemplate = { contextKeyService, container, @@ -941,6 +944,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende elementDisposables: new DisposableStore(), bottomCellContainer, timer, + titleMenu, toJSON: () => { return {}; } }; @@ -1091,7 +1095,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende this.updateForOutputs(element, templateData); elementDisposables.add(element.onDidChangeOutputs(_e => this.updateForOutputs(element, templateData))); - this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); + this.setupCellToolbarActions(templateData, elementDisposables); const toolbarContext = { cell: element,