diff --git a/src/vs/platform/actions/browser/menusExtensionPoint.ts b/src/vs/platform/actions/browser/menusExtensionPoint.ts index 3eb906cc83d..8c9d818d1b1 100644 --- a/src/vs/platform/actions/browser/menusExtensionPoint.ts +++ b/src/vs/platform/actions/browser/menusExtensionPoint.ts @@ -30,6 +30,7 @@ namespace schema { case 'editor/title': return MenuId.EditorTitle; case 'editor/context': return MenuId.EditorContext; case 'explorer/context': return MenuId.ExplorerContext; + case 'editortab/context': return MenuId.EditorTabContext; } } @@ -97,6 +98,11 @@ namespace schema { type: 'array', items: menuItem }, + 'editortab/context': { + description: localize('menus.editorTabContext', "The editor tabs context menu"), + type: 'array', + items: menuItem + }, 'explorer/context': { description: localize('menus.explorerContext', "The file explorer context menu"), type: 'array', diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 250504ec6eb..5e517209238 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -39,7 +39,8 @@ export interface IMenuItem { export enum MenuId { EditorTitle = 1, EditorContext = 2, - ExplorerContext = 3 + ExplorerContext = 3, + EditorTabContext = 4 } export const IMenuService = createDecorator('menuService'); diff --git a/src/vs/workbench/browser/parts/editor/titleControl.ts b/src/vs/workbench/browser/parts/editor/titleControl.ts index 436e2b5b14d..6bbe529c0d5 100644 --- a/src/vs/workbench/browser/parts/editor/titleControl.ts +++ b/src/vs/workbench/browser/parts/editor/titleControl.ts @@ -35,7 +35,7 @@ import {IContextKeyService} from 'vs/platform/contextkey/common/contextkey'; import {CloseEditorsInGroupAction, SplitEditorAction, CloseEditorAction, KeepEditorAction, CloseOtherEditorsInGroupAction, CloseRightEditorsInGroupAction, ShowEditorsInGroupAction} from 'vs/workbench/browser/parts/editor/editorActions'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; import {createActionItem, fillInActions} from 'vs/platform/actions/browser/menuItemActionItem'; -import {IMenuService, MenuId} from 'vs/platform/actions/common/actions'; +import {IMenuService, MenuId, IMenu} from 'vs/platform/actions/common/actions'; import {ResourceContextKey} from 'vs/platform/actions/common/resourceContextKey'; export interface IToolbarActions { @@ -90,6 +90,8 @@ export abstract class TitleControl implements ITitleAreaControl { private resourceContext: ResourceContextKey; private disposeOnEditorActions: IDisposable[] = []; + private contextMenu: IMenu; + constructor( @IContextMenuService protected contextMenuService: IContextMenuService, @IInstantiationService protected instantiationService: IInstantiationService, @@ -114,6 +116,9 @@ export abstract class TitleControl implements ITitleAreaControl { this.resourceContext = instantiationService.createInstance(ResourceContextKey); + this.contextMenu = this.menuService.createMenu(MenuId.EditorTabContext, this.contextKeyService); + this.toDispose.push(this.contextMenu); + this.initActions(); this.registerListeners(); } @@ -417,6 +422,12 @@ export abstract class TitleControl implements ITitleAreaControl { } protected onContextMenu(identifier: IEditorIdentifier, e: Event, node: HTMLElement): void { + + // Update the resource context + const currentContext = this.resourceContext.get(); + this.resourceContext.set(identifier.editor && getResource(identifier.editor)); + + // Find target anchor let anchor: HTMLElement | { x: number, y: number } = node; if (e instanceof MouseEvent) { const event = new StandardMouseEvent(e); @@ -434,6 +445,9 @@ export abstract class TitleControl implements ITitleAreaControl { } return null; + }, + onHide: (cancel) => { + this.resourceContext.set(currentContext); // restore previous context } }); } @@ -462,6 +476,9 @@ export abstract class TitleControl implements ITitleAreaControl { actions.push(new Separator(), this.pinEditorAction); } + // Fill in contributed actions + fillInActions(this.contextMenu, actions); + return actions; }