diff --git a/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts b/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts index ad7f97aee27..08688ba632c 100644 --- a/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts +++ b/src/vs/editor/contrib/suggest/suggestWidgetStatus.ts @@ -49,7 +49,7 @@ export class SuggestWidgetStatus { this.element = dom.append(container, dom.$('.suggest-status-bar')); const actionViewItemProvider = (action => { - return action instanceof MenuItemAction ? instantiationService.createInstance(StatusBarViewItem, action) : undefined; + return action instanceof MenuItemAction ? instantiationService.createInstance(StatusBarViewItem, action, undefined) : undefined; }); this._leftActions = new ActionBar(this.element, { actionViewItemProvider }); this._rightActions = new ActionBar(this.element, { actionViewItemProvider }); diff --git a/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts b/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts index df19cf3f10f..d081d4b22f4 100644 --- a/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts +++ b/src/vs/platform/actions/browser/dropdownWithPrimaryActionViewItem.ts @@ -36,7 +36,7 @@ export class DropdownWithPrimaryActionViewItem extends BaseActionViewItem { @INotificationService _notificationService: INotificationService ) { super(null, primaryAction); - this._primaryAction = new MenuEntryActionViewItem(primaryAction, _keybindingService, _notificationService); + this._primaryAction = new MenuEntryActionViewItem(primaryAction, undefined, _keybindingService, _notificationService); this._dropdown = new DropdownMenuActionViewItem(dropdownAction, dropdownMenuActions, this._contextMenuProvider, { menuAsChild: true, classNames: ['codicon', 'codicon-chevron-down'] diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index ae5c10aa2d1..c3b1f163953 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -115,6 +115,10 @@ function fillInActions( } } +export interface IMenuEntryActionViewItemOptions { + draggable?: boolean; +} + export class MenuEntryActionViewItem extends ActionViewItem { private _wantsAltCommand: boolean = false; @@ -123,10 +127,11 @@ export class MenuEntryActionViewItem extends ActionViewItem { constructor( _action: MenuItemAction, + options: IMenuEntryActionViewItemOptions | undefined, @IKeybindingService protected readonly _keybindingService: IKeybindingService, @INotificationService protected _notificationService: INotificationService ) { - super(undefined, _action, { icon: !!(_action.class || _action.item.icon), label: !_action.class && !_action.item.icon }); + super(undefined, _action, { icon: !!(_action.class || _action.item.icon), label: !_action.class && !_action.item.icon, draggable: options?.draggable }); this._altKey = ModifierKeyEmitter.getInstance(); } @@ -302,7 +307,7 @@ export class SubmenuEntryActionViewItem extends DropdownMenuActionViewItem { */ export function createActionViewItem(instaService: IInstantiationService, action: IAction): undefined | MenuEntryActionViewItem | SubmenuEntryActionViewItem { if (action instanceof MenuItemAction) { - return instaService.createInstance(MenuEntryActionViewItem, action); + return instaService.createInstance(MenuEntryActionViewItem, action, undefined); } else if (action instanceof SubmenuItemAction) { return instaService.createInstance(SubmenuEntryActionViewItem, action); } else { diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index 47e21fc4534..db613996341 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -221,7 +221,7 @@ export class CommentNode extends Disposable { let item = new ReactionActionViewItem(action); return item; } else if (action instanceof MenuItemAction) { - return this.instantiationService.createInstance(MenuEntryActionViewItem, action); + return this.instantiationService.createInstance(MenuEntryActionViewItem, action, undefined); } else if (action instanceof SubmenuItemAction) { return this.instantiationService.createInstance(SubmenuEntryActionViewItem, action); } else { diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index de176ed0292..46c5873ec9b 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -517,7 +517,7 @@ class SessionsRenderer implements ICompressibleTreeRenderer { if (action instanceof MenuItemAction) { - return this.instantiationService.createInstance(MenuEntryActionViewItem, action); + return this.instantiationService.createInstance(MenuEntryActionViewItem, action, undefined); } else if (action instanceof SubmenuItemAction) { return this.instantiationService.createInstance(SubmenuEntryActionViewItem, action); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellActionView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellActionView.ts index 0f5a5fb88fe..ace37834b5a 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellActionView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellActionView.ts @@ -16,7 +16,7 @@ export class CodiconActionViewItem extends MenuEntryActionViewItem { keybindingService: IKeybindingService, notificationService: INotificationService, ) { - super(_action, keybindingService, notificationService); + super(_action, undefined, keybindingService, notificationService); } override updateLabel(): void { if (this.options.label && this.label) { @@ -33,7 +33,7 @@ export class ActionViewWithLabel extends MenuEntryActionViewItem { keybindingService: IKeybindingService, notificationService: INotificationService, ) { - super(_action, keybindingService, notificationService); + super(_action, undefined, keybindingService, notificationService); } override render(container: HTMLElement): void { 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 9862ea81e2d..f4329f5a5ee 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -116,7 +116,7 @@ abstract class AbstractCellRenderer { if (notebookOptions.getLayoutConfiguration().insertToolbarAlignment === 'center') { return new CodiconActionViewItem(action, this.keybindingService, this.notificationService); } else { - return new MenuEntryActionViewItem(action, this.keybindingService, this.notificationService); + return new MenuEntryActionViewItem(action, undefined, this.keybindingService, this.notificationService); } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts index 5e557d29a30..dd8b9992310 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts @@ -232,7 +232,7 @@ class TerminalTabsRenderer implements IListRenderer action instanceof MenuItemAction - ? this._instantiationService.createInstance(MenuEntryActionViewItem, action) + ? this._instantiationService.createInstance(MenuEntryActionViewItem, action, undefined) : undefined }); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 8ef6151f92a..286bcacd0f7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -44,6 +44,7 @@ import { ColorScheme } from 'vs/platform/theme/common/theme'; import { getColorClass, getUriClasses } from 'vs/workbench/contrib/terminal/browser/terminalIcon'; import { terminalStrings } from 'vs/workbench/contrib/terminal/common/terminalStrings'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { DataTransfers } from 'vs/base/browser/dnd'; export class TerminalViewPane extends ViewPane { private _actions: IAction[] | undefined; @@ -426,7 +427,9 @@ class SingleTerminalTabActionViewItem extends MenuEntryActionViewItem { undefined, contextKeyService, _commandService - ), keybindingService, notificationService); + ), { + draggable: true + }, keybindingService, notificationService); // Register listeners to update the tab this._register(this._terminalService.onInstancePrimaryStatusChanged(e => this.updateLabel(e))); @@ -457,21 +460,29 @@ class SingleTerminalTabActionViewItem extends MenuEntryActionViewItem { return; } - if (this._elementDisposables.length === 0) { + if (this._elementDisposables.length === 0 && this.element && this.label) { // Right click opens context menu - this._elementDisposables.push(dom.addDisposableListener(this.element!, dom.EventType.CONTEXT_MENU, e => { + this._elementDisposables.push(dom.addDisposableListener(this.element, dom.EventType.CONTEXT_MENU, e => { if (e.button === 2) { this._openContextMenu(); e.preventDefault(); } })); // Middle click kills - this._elementDisposables.push(dom.addDisposableListener(this.element!, dom.EventType.AUXCLICK, e => { + this._elementDisposables.push(dom.addDisposableListener(this.element, dom.EventType.AUXCLICK, e => { if (e.button === 1) { this._terminalService.activeInstance?.dispose(); e.preventDefault(); } })); + // Drag and drop + this._elementDisposables.push(dom.addDisposableListener(this.element, dom.EventType.DRAG_START, e => { + const instance = this._terminalGroupService.activeInstance; + if (e.dataTransfer && instance) { + e.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify([instance.resource.toString()])); + e.dataTransfer.setData(DataTransfers.TERMINALS, JSON.stringify([instance.instanceId])); + } + })); } if (this.label) { const label = this.label; diff --git a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts index aedd6aaadac..4c4d5e99ed7 100644 --- a/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts +++ b/src/vs/workbench/contrib/testing/browser/testingExplorerView.ts @@ -914,7 +914,7 @@ abstract class ActionableItemTemplateData extends actionRunner: this.actionRunner, actionViewItemProvider: action => action instanceof MenuItemAction - ? this.instantiationService.createInstance(MenuEntryActionViewItem, action) + ? this.instantiationService.createInstance(MenuEntryActionViewItem, action, undefined) : undefined }); diff --git a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts index f450190b307..7fa1e04b51f 100644 --- a/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts +++ b/src/vs/workbench/contrib/testing/browser/testingOutputPeek.ts @@ -1223,7 +1223,7 @@ class TestRunElementRenderer implements ICompressibleTreeRenderer action instanceof MenuItemAction - ? this.instantiationService.createInstance(MenuEntryActionViewItem, action) + ? this.instantiationService.createInstance(MenuEntryActionViewItem, action, undefined) : undefined });