From 5add9ceeab367c4c9427f28709c6930971cd7d16 Mon Sep 17 00:00:00 2001 From: Ian Sanders Date: Wed, 20 Jun 2018 17:43:25 -0400 Subject: [PATCH 1/2] Add check to limit focus class on open editors when dragging --- .../parts/files/electron-browser/views/openEditorsView.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index 3d3c8ba0541..c799e2b18d3 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -539,7 +539,9 @@ class EditorGroupRenderer implements IRenderer { - dom.addClass(container, 'focused'); + if (this.transfer.hasData(OpenEditor.prototype)) { + dom.addClass(container, 'focused'); + } })); editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_LEAVE, () => { dom.removeClass(container, 'focused'); @@ -625,7 +627,9 @@ class OpenEditorRenderer implements IRenderer { - dom.addClass(container, 'focused'); + if (this.transfer.hasData(OpenEditor.prototype)) { + dom.addClass(container, 'focused'); + } })); editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_LEAVE, () => { dom.removeClass(container, 'focused'); From f039aed0b7642f5bebc94c6c54308a133f803c42 Mon Sep 17 00:00:00 2001 From: Ian Sanders Date: Thu, 21 Jun 2018 11:15:35 -0400 Subject: [PATCH 2/2] Add and implement check if dragged item can be dropped on open editor --- .../electron-browser/views/openEditorsView.ts | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts index c799e2b18d3..e949d6f6fe6 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts @@ -37,7 +37,7 @@ import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuItemAc import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { DirtyEditorContext, OpenEditorsGroupContext } from 'vs/workbench/parts/files/electron-browser/fileCommands'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { fillResourceDataTransfers, ResourcesDropHandler, LocalSelectionTransfer } from 'vs/workbench/browser/dnd'; +import { fillResourceDataTransfers, ResourcesDropHandler, LocalSelectionTransfer, CodeDataTransfers } from 'vs/workbench/browser/dnd'; import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; @@ -506,6 +506,32 @@ class OpenEditorsDelegate implements IDelegate { } } +/** + * Check if the item being dragged is one of the supported types that can be dropped on an + * open editor or editor group. Fixes https://github.com/Microsoft/vscode/issues/52344. + * @param e + * @returns true if dropping is supported. + */ +function dropOnEditorSupported(e: DragEvent): boolean { + // DataTransfer types are automatically converted to lower case, except Files. + const supportedTransferTypes = { + openEditor: CodeDataTransfers.EDITORS.toLowerCase(), + externalFile: 'Files', + codeFile: CodeDataTransfers.FILES.toLowerCase() + }; + + if ( + e.dataTransfer.types.indexOf(supportedTransferTypes.openEditor) !== -1 || + e.dataTransfer.types.indexOf(supportedTransferTypes.externalFile) !== -1 || + // All Code files should already register as normal files, but just to be safe: + e.dataTransfer.types.indexOf(supportedTransferTypes.codeFile) !== -1 + ) { + return true; + } else { + return false; + } +} + class EditorGroupRenderer implements IRenderer { static readonly ID = 'editorgroup'; @@ -538,8 +564,8 @@ class EditorGroupRenderer implements IRenderer { - if (this.transfer.hasData(OpenEditor.prototype)) { + editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, (e: DragEvent) => { + if (dropOnEditorSupported(e)) { dom.addClass(container, 'focused'); } })); @@ -626,8 +652,8 @@ class OpenEditorRenderer implements IRenderer d.getResource()), e); } })); - editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, () => { - if (this.transfer.hasData(OpenEditor.prototype)) { + editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, (e: DragEvent) => { + if (dropOnEditorSupported(e)) { dom.addClass(container, 'focused'); } }));