Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/browser/dataTransfer.ts
3292 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { DataTransfers } from '../../base/browser/dnd.js';
7
import { createFileDataTransferItem, createStringDataTransferItem, IDataTransferItem, UriList, VSDataTransfer } from '../../base/common/dataTransfer.js';
8
import { Mimes } from '../../base/common/mime.js';
9
import { URI } from '../../base/common/uri.js';
10
import { CodeDataTransfers, getPathForFile } from '../../platform/dnd/browser/dnd.js';
11
12
13
export function toVSDataTransfer(dataTransfer: DataTransfer): VSDataTransfer {
14
const vsDataTransfer = new VSDataTransfer();
15
for (const item of dataTransfer.items) {
16
const type = item.type;
17
if (item.kind === 'string') {
18
const asStringValue = new Promise<string>(resolve => item.getAsString(resolve));
19
vsDataTransfer.append(type, createStringDataTransferItem(asStringValue));
20
} else if (item.kind === 'file') {
21
const file = item.getAsFile();
22
if (file) {
23
vsDataTransfer.append(type, createFileDataTransferItemFromFile(file));
24
}
25
}
26
}
27
return vsDataTransfer;
28
}
29
30
function createFileDataTransferItemFromFile(file: File): IDataTransferItem {
31
const path = getPathForFile(file);
32
const uri = path ? URI.parse(path!) : undefined;
33
return createFileDataTransferItem(file.name, uri, async () => {
34
return new Uint8Array(await file.arrayBuffer());
35
});
36
}
37
38
const INTERNAL_DND_MIME_TYPES = Object.freeze([
39
CodeDataTransfers.EDITORS,
40
CodeDataTransfers.FILES,
41
DataTransfers.RESOURCES,
42
DataTransfers.INTERNAL_URI_LIST,
43
]);
44
45
export function toExternalVSDataTransfer(sourceDataTransfer: DataTransfer, overwriteUriList = false): VSDataTransfer {
46
const vsDataTransfer = toVSDataTransfer(sourceDataTransfer);
47
48
// Try to expose the internal uri-list type as the standard type
49
const uriList = vsDataTransfer.get(DataTransfers.INTERNAL_URI_LIST);
50
if (uriList) {
51
vsDataTransfer.replace(Mimes.uriList, uriList);
52
} else {
53
if (overwriteUriList || !vsDataTransfer.has(Mimes.uriList)) {
54
// Otherwise, fallback to adding dragged resources to the uri list
55
const editorData: string[] = [];
56
for (const item of sourceDataTransfer.items) {
57
const file = item.getAsFile();
58
if (file) {
59
const path = getPathForFile(file);
60
try {
61
if (path) {
62
editorData.push(URI.file(path).toString());
63
} else {
64
editorData.push(URI.parse(file.name, true).toString());
65
}
66
} catch {
67
// Parsing failed. Leave out from list
68
}
69
}
70
}
71
72
if (editorData.length) {
73
vsDataTransfer.replace(Mimes.uriList, createStringDataTransferItem(UriList.create(editorData)));
74
}
75
}
76
}
77
78
for (const internal of INTERNAL_DND_MIME_TYPES) {
79
vsDataTransfer.delete(internal);
80
}
81
82
return vsDataTransfer;
83
}
84
85