diff --git a/src/vs/workbench/api/browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts index a8ea99b553f..f6eee74afed 100644 --- a/src/vs/workbench/api/browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -32,14 +32,14 @@ export class MainThreadTreeViews extends Disposable implements MainThreadTreeVie this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostTreeViews); } - async $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dragAndDropMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise { + async $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dropMimeTypes: string[] | undefined; dragMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise { this.logService.trace('MainThreadTreeViews#$registerTreeViewDataProvider', treeViewId, options); this.extensionService.whenInstalledExtensionsRegistered().then(() => { const dataProvider = new TreeViewDataProvider(treeViewId, this._proxy, this.notificationService); this._dataProviders.set(treeViewId, dataProvider); - const dndController = options.dragAndDropMimeTypes - ? new TreeViewDragAndDropController(treeViewId, options.dragAndDropMimeTypes, options.hasHandleDrag, this._proxy) : undefined; + const dndController = options.dropMimeTypes + ? new TreeViewDragAndDropController(treeViewId, options.dropMimeTypes, options.dragMimeTypes ?? [], options.hasHandleDrag, this._proxy) : undefined; const viewer = this.getTreeView(treeViewId); if (viewer) { // Order is important here. The internal tree isn't created until the dataProvider is set. @@ -168,7 +168,8 @@ type TreeItemHandle = string; class TreeViewDragAndDropController implements ITreeViewDragAndDropController { constructor(private readonly treeViewId: string, - readonly supportedMimeTypes: string[], + readonly dropMimeTypes: string[], + readonly dragMimeTypes: string[], readonly hasWillDrop: boolean, private readonly _proxy: ExtHostTreeViewsShape) { } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 82125db818c..5849317293a 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -259,7 +259,7 @@ export interface MainThreadTextEditorsShape extends IDisposable { } export interface MainThreadTreeViewsShape extends IDisposable { - $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dragAndDropMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise; + $registerTreeViewDataProvider(treeViewId: string, options: { showCollapseAll: boolean; canSelectMany: boolean; dropMimeTypes: string[] | undefined; dragMimeTypes: string[] | undefined; hasHandleDrag: boolean }): Promise; $refresh(treeViewId: string, itemsToRefresh?: { [treeItemHandle: string]: ITreeItem }): Promise; $reveal(treeViewId: string, itemInfo: { item: ITreeItem; parentChain: ITreeItem[] } | undefined, options: IRevealOptions): Promise; $setMessage(treeViewId: string, message: string): void; diff --git a/src/vs/workbench/api/common/extHostTreeViews.ts b/src/vs/workbench/api/common/extHostTreeViews.ts index 9ed10c3aa8a..689afb1f7c9 100644 --- a/src/vs/workbench/api/common/extHostTreeViews.ts +++ b/src/vs/workbench/api/common/extHostTreeViews.ts @@ -87,9 +87,10 @@ export class ExtHostTreeViews implements ExtHostTreeViewsShape { if (!options || !options.treeDataProvider) { throw new Error('Options with treeDataProvider is mandatory'); } - const dragAndDropMimeTypes = options.dragAndDropController?.supportedMimeTypes; + const dropMimeTypes = options.dragAndDropController?.dropMimeTypes; + const dragMimeTypes = options.dragAndDropController?.dragMimeTypes; const hasHandleDrag = !!options.dragAndDropController?.handleDrag; - const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, dragAndDropMimeTypes, hasHandleDrag: hasHandleDrag }); + const registerPromise = this._proxy.$registerTreeViewDataProvider(viewId, { showCollapseAll: !!options.showCollapseAll, canSelectMany: !!options.canSelectMany, dropMimeTypes, dragMimeTypes, hasHandleDrag: hasHandleDrag }); const treeView = this.createExtHostTreeView(viewId, options, extension); return { get onDidCollapseElement() { return treeView.onDidCollapseElement; }, diff --git a/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts index b87b9fb416b..17554ed9ecc 100644 --- a/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts +++ b/src/vs/workbench/api/test/browser/mainThreadTreeViews.test.ts @@ -74,7 +74,7 @@ suite('MainThreadHostTreeView', function () { } drain(): any { return null; } }, new TestViewsService(), new TestNotificationService(), testExtensionService, new NullLogService()); - mainThreadTreeViews.$registerTreeViewDataProvider(testTreeViewId, { showCollapseAll: false, canSelectMany: false, dragAndDropMimeTypes: [], hasHandleDrag: false }); + mainThreadTreeViews.$registerTreeViewDataProvider(testTreeViewId, { showCollapseAll: false, canSelectMany: false, dropMimeTypes: [], dragMimeTypes: [], hasHandleDrag: false }); await testExtensionService.whenInstalledExtensionsRegistered(); }); diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index e965895185c..54b34e1831a 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -1265,7 +1265,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { this.treeViewsDragAndDropService.addDragOperationTransfer(uuid, this.dndController.handleDrag(itemHandles, uuid)); originalEvent.dataTransfer.setData(TREE_DRAG_UUID_MIME, uuid); this.treeItemsTransfer.setData([new DraggedTreeItemsIdentifier(uuid)], DraggedTreeItemsIdentifier.prototype); - this.dndController.supportedMimeTypes.forEach(supportedType => { + this.dndController.dragMimeTypes.forEach(supportedType => { originalEvent.dataTransfer?.setData(supportedType, ''); }); } @@ -1308,14 +1308,14 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { onDragOver(data: IDragAndDropData, targetElement: ITreeItem, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { this.logService.debug(`TreeView dragged mime types: ${originalEvent.dataTransfer?.types.join(', ')}`); const dndController = this.dndController; - if (!dndController || !originalEvent.dataTransfer || (dndController.supportedMimeTypes.length === 0)) { + if (!dndController || !originalEvent.dataTransfer || (dndController.dropMimeTypes.length === 0)) { return false; } const dragContainersSupportedType = originalEvent.dataTransfer.types.some((value, index) => { if (value === this.treeMimeType) { return true; } else { - return dndController.supportedMimeTypes.indexOf(value) >= 0; + return dndController.dropMimeTypes.indexOf(value) >= 0; } }); if (dragContainersSupportedType) { @@ -1371,7 +1371,7 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop { for (const dataItem of originalEvent.dataTransfer.items) { const type = dataItem.type; if (dataItem.kind === 'string') { - if ((type === this.treeMimeType) || (type === TREE_DRAG_UUID_MIME) || (dndController.supportedMimeTypes.indexOf(type) >= 0)) { + if ((type === this.treeMimeType) || (type === TREE_DRAG_UUID_MIME) || (dndController.dropMimeTypes.indexOf(type) >= 0)) { dataItem.getAsString(dataValue => { if (type === this.treeMimeType) { treeSourceInfo = JSON.parse(dataValue); diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 89caae66fef..bdd2cf16a80 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -832,7 +832,8 @@ export interface ITreeViewDataProvider { } export interface ITreeViewDragAndDropController { - readonly supportedMimeTypes: string[]; + readonly dropMimeTypes: string[]; + readonly dragMimeTypes: string[]; handleDrag(sourceTreeItemHandles: string[], operationUuid: string): Promise; handleDrop(elements: ITreeDataTransfer, target: ITreeItem, operationUuid?: string, sourceTreeId?: string, sourceTreeItemHandles?: string[]): Promise; } diff --git a/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts b/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts index 6ddb4d163dc..dcd29aaadbb 100644 --- a/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts +++ b/src/vscode-dts/vscode.proposed.treeViewDragAndDrop.d.ts @@ -82,8 +82,8 @@ declare module 'vscode' { export interface TreeDragAndDropController { /** - * The mime types that the `drop` method of this `DragAndDropController` supports. This could be well-defined, existing, mime types, - * and also mime types defined by the extension that are returned in the `TreeDataTransfer` from `handleDrag`. + * The mime types that the `handleDrop` method of this `DragAndDropController` supports. + * This could be well-defined, existing, mime types, and also mime types defined by the extension. * * Each tree will automatically support drops from it's own `DragAndDropController`. To support drops from other trees, * you will need to add the mime type of that tree. The mime type of a tree is of the format `tree/treeidlowercase`. @@ -93,7 +93,13 @@ declare module 'vscode' { * 2. Use the Developer: Set Log Level... command to set the level to "Debug" * 3. Open the developer tools and drag the item with unknown mime type over your tree. The mime types will be logged to the developer console */ - readonly supportedMimeTypes: string[]; + readonly dropMimeTypes: string[]; + + /** + * The mime types that the `handleDrag` method of this `TreeDragAndDropController` may add to the tree data transfer. + * This could be well-defined, existing, mime types, and also mime types defined by the extension. + */ + readonly dragMimeTypes: string[]; /** * When the user starts dragging items from this `DragAndDropController`, `handleDrag` will be called.