diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index bb66b64254bd400937498c4d2f45ab97e2e977d5..c691b360893af93364284a799d7d25f04fe35db4 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -36,13 +36,13 @@ export interface IDraggedResource { isExternal: boolean; } -export class DraggedEditorIdentifier { +interface ISerializedDraggedResource { + resource: string; +} - constructor(private _identifier: IEditorIdentifier) { } +export class DraggedEditorIdentifier { - get identifier(): IEditorIdentifier { - return this._identifier; - } + constructor(public readonly identifier: IEditorIdentifier) { } } export class DraggedEditorGroupIdentifier { @@ -50,20 +50,16 @@ export class DraggedEditorGroupIdentifier { constructor(public readonly identifier: GroupIdentifier) { } } -export interface IDraggedEditor extends IDraggedResource { - content?: string; +interface IDraggedEditorProps { + dirtyContent?: string; encoding?: string; mode?: string; options?: ITextEditorOptions; } -export interface ISerializedDraggedEditor { - resource: string; - content?: string; - encoding?: string; - mode?: string; - options?: ITextEditorOptions; -} +export interface IDraggedEditor extends IDraggedResource, IDraggedEditorProps { } + +export interface ISerializedDraggedEditor extends ISerializedDraggedResource, IDraggedEditorProps { } export const CodeDataTransfers = { EDITORS: 'CodeEditors', @@ -85,7 +81,7 @@ export function extractResources(e: DragEvent, externalOnly?: boolean): Array { resources.push({ resource: URI.parse(draggedEditor.resource), - content: draggedEditor.content, + dirtyContent: draggedEditor.dirtyContent, options: draggedEditor.options, encoding: draggedEditor.encoding, mode: draggedEditor.mode, @@ -182,13 +178,12 @@ export class ResourcesDropHandler { // Check for special things being dropped const isWorkspaceOpening = await this.doHandleDrop(untitledOrFileResources); - if (isWorkspaceOpening) { return; // return early if the drop operation resulted in this window changing to a workspace } // Add external ones to recently open list unless dropped resource is a workspace - const recentFiles: IRecentFile[] = untitledOrFileResources.filter(d => d.isExternal && d.resource.scheme === Schemas.file).map(d => ({ fileUri: d.resource })); + const recentFiles: IRecentFile[] = untitledOrFileResources.filter(untitledOrFileResource => untitledOrFileResource.isExternal && untitledOrFileResource.resource.scheme === Schemas.file).map(d => ({ fileUri: d.resource })); if (recentFiles.length) { this.workspacesService.addRecentlyOpened(recentFiles); } @@ -215,15 +210,15 @@ export class ResourcesDropHandler { private async doHandleDrop(untitledOrFileResources: Array): Promise { // Check for dirty editors being dropped - const resourcesWithContent: IDraggedEditor[] = untitledOrFileResources.filter(resource => !resource.isExternal && !!(resource as IDraggedEditor).content); - if (resourcesWithContent.length > 0) { - await Promise.all(resourcesWithContent.map(resourceWithContent => this.handleDirtyEditorDrop(resourceWithContent))); + const dirtyEditors: IDraggedEditor[] = untitledOrFileResources.filter(untitledOrFileResource => !untitledOrFileResource.isExternal && typeof (untitledOrFileResource as IDraggedEditor).dirtyContent === 'string'); + if (dirtyEditors.length > 0) { + await Promise.all(dirtyEditors.map(dirtyEditor => this.handleDirtyEditorDrop(dirtyEditor))); return false; } // Check for workspace file being dropped if we are allowed to do so if (this.options.allowWorkspaceOpen) { - const externalFileOnDiskResources = untitledOrFileResources.filter(d => d.isExternal && d.resource.scheme === Schemas.file).map(d => d.resource); + const externalFileOnDiskResources = untitledOrFileResources.filter(untitledOrFileResource => untitledOrFileResource.isExternal && untitledOrFileResource.resource.scheme === Schemas.file).map(d => d.resource); if (externalFileOnDiskResources.length > 0) { return this.handleWorkspaceFileDrop(externalFileOnDiskResources); } @@ -249,9 +244,9 @@ export class ResourcesDropHandler { // If the dropped editor is dirty with content we simply take that // content and turn it into a backup so that it loads the contents - if (droppedDirtyEditor.content) { + if (typeof droppedDirtyEditor.dirtyContent === 'string') { try { - await this.backupFileService.backup(droppedDirtyEditor.resource, stringToSnapshot(droppedDirtyEditor.content)); + await this.backupFileService.backup(droppedDirtyEditor.resource, stringToSnapshot(droppedDirtyEditor.dirtyContent)); } catch (e) { // Ignore error } @@ -331,9 +326,9 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: } // Resource URLs: allows to drop multiple resources to a target in VS Code (not directories) - const files = sources.filter(s => !s.isDirectory); + const files = sources.filter(source => !source.isDirectory); if (files.length) { - event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(files.map(f => f.resource.toString()))); + event.dataTransfer.setData(DataTransfers.RESOURCES, JSON.stringify(files.map(file => file.resource.toString()))); } // Editors: enables cross window DND of tabs into the editor area @@ -380,13 +375,13 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: // If the resource is dirty or untitled, send over its content // to restore dirty state. Get that from the text model directly - let content: string | undefined = undefined; + let dirtyContent: string | undefined = undefined; if (model?.isDirty()) { - content = model.textEditorModel.getValue(); + dirtyContent = model.textEditorModel.getValue(); } // Add as dragged editor - draggedEditors.push({ resource: file.resource.toString(), content, options, encoding, mode }); + draggedEditors.push({ resource: file.resource.toString(), dirtyContent, options, encoding, mode }); }); if (draggedEditors.length) {