diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index ab0a883d089..920a7527d62 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -175,9 +175,9 @@ class TreeViewDragAndDropController implements ITreeViewDragAndDropController { readonly hasWillDrop: boolean, private readonly _proxy: ExtHostTreeViewsShape) { } - async handleDrop(dataTransfer: IDataTransfer, targetTreeItem: ITreeItem, token: CancellationToken, + async handleDrop(dataTransfer: IDataTransfer, targetTreeItem: ITreeItem | undefined, token: CancellationToken, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise { - return this._proxy.$handleDrop(this.treeViewId, await DataTransferConverter.toDataTransferDTO(dataTransfer), targetTreeItem.handle, token, operationUuid, sourceTreeId, sourceTreeItemHandles); + return this._proxy.$handleDrop(this.treeViewId, await DataTransferConverter.toDataTransferDTO(dataTransfer), targetTreeItem?.handle, token, operationUuid, sourceTreeId, sourceTreeItemHandles); } async handleDrag(sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index ab5bce8eb6a..773323e7738 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -1330,7 +1330,7 @@ export interface ExtHostDocumentsAndEditorsShape { export interface ExtHostTreeViewsShape { $getChildren(treeViewId: string, treeItemHandle?: string): Promise; - $handleDrop(destinationViewId: string, treeDataTransfer: DataTransferDTO, newParentTreeItemHandle: string, token: CancellationToken, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise; + $handleDrop(destinationViewId: string, treeDataTransfer: DataTransferDTO, targetHandle: string | undefined, token: CancellationToken, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise; $handleDrag(sourceViewId: string, sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise; $setExpanded(treeViewId: string, treeItemHandle: string, expanded: boolean): void; $setSelection(treeViewId: string, treeItemHandles: string[]): void; diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 29524c764e9..dbeca3fdaf4 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -135,7 +135,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { return treeView.getChildren(treeItemHandle); } - async $handleDrop(destinationViewId: string, treeDataTransferDTO: DataTransferDTO, newParentItemHandle: string, token: CancellationToken, + async $handleDrop(destinationViewId: string, treeDataTransferDTO: DataTransferDTO, targetItemHandle: string | undefined, token: CancellationToken, operationUuid?: string, sourceViewId?: string, sourceTreeItemHandles?: string[]): Promise { const treeView = this.treeViews.get(destinationViewId); if (!treeView) { @@ -146,7 +146,7 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { if ((sourceViewId === destinationViewId) && sourceTreeItemHandles) { await this.addAdditionalTransferItems(treeDataTransfer, treeView, sourceTreeItemHandles, token, operationUuid); } - return treeView.onDrop(treeDataTransfer, newParentItemHandle, token); + return treeView.onDrop(treeDataTransfer, targetItemHandle, token); } private async addAdditionalTransferItems(treeDataTransfer: IDataTransfer, treeView: ExtHostTreeView, @@ -452,9 +452,9 @@ class ExtHostTreeView extends Disposable { return !!this.dndController?.handleDrag; } - async onDrop(treeDataTransfer: vscode.DataTransfer, targetHandleOrNode: TreeItemHandle, token: CancellationToken): Promise { - const target = this.getExtensionElement(targetHandleOrNode); - if (!target || !this.dndController?.handleDrop) { + async onDrop(treeDataTransfer: vscode.DataTransfer, targetHandleOrNode: TreeItemHandle | undefined, token: CancellationToken): Promise { + const target = targetHandleOrNode ? this.getExtensionElement(targetHandleOrNode) : undefined; + if ((!target && targetHandleOrNode) || !this.dndController?.handleDrop) { return; } return asPromise(() => this.dndController?.handleDrop diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index b91ab4fd1ba..e57c5e32667 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -1419,7 +1419,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { async drop(data: IDragAndDropData, targetNode: ITreeItem | undefined, targetIndex: number | undefined, originalEvent: DragEvent): Promise { const dndController = this.dndController; - if (!originalEvent.dataTransfer || !dndController || !targetNode) { + if (!originalEvent.dataTransfer || !dndController) { return; } const treeDataTransfer: IDataTransfer = new Map(); @@ -1443,7 +1443,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { } } - if (!originalEvent.dataTransfer || !targetNode) { + if (!originalEvent.dataTransfer) { return; } for (const dataItem of originalEvent.dataTransfer.items) { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 20cd1212787..e7793928e29 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -830,7 +830,7 @@ export interface ITreeViewDragAndDropController { readonly dropMimeTypes: string[]; readonly dragMimeTypes: string[]; handleDrag(sourceTreeItemHandles: string[], operationUuid: string, token: CancellationToken): Promise; - handleDrop(elements: IDataTransfer, target: ITreeItem, token: CancellationToken, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise; + handleDrop(elements: IDataTransfer, target: ITreeItem | undefined, token: CancellationToken, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise; } export interface IEditableData { diff --git a/src/vscode-dts/vscode.d.ts b/src/vscode-dts/vscode.d.ts index d145176d809..b283dfeaed1 100644 --- a/src/vscode-dts/vscode.d.ts +++ b/src/vscode-dts/vscode.d.ts @@ -9860,10 +9860,10 @@ declare module 'vscode' { * Extensions should fire {@link TreeDataProvider.onDidChangeTreeData onDidChangeTreeData} for any elements that need to be refreshed. * * @param dataTransfer The data transfer items of the source of the drag. - * @param target The target tree element that the drop is occurring on. + * @param target The target tree element that the drop is occurring on. When undefined, the target is the root. * @param token A cancellation token indicating that the drop has been cancelled. */ - handleDrop?(target: T, dataTransfer: DataTransfer, token: CancellationToken): Thenable | void; + handleDrop?(target: T | undefined, dataTransfer: DataTransfer, token: CancellationToken): Thenable | void; } /**