@@ -66,7 +66,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
66
66
import { IHoverService } from 'vs/workbench/services/hover/browser/hover' ;
67
67
import { ThemeSettings } from 'vs/workbench/services/themes/common/workbenchThemeService' ;
68
68
import { ITreeViewsService } from 'vs/workbench/services/views/browser/treeViewsService' ;
69
- import { CodeDataTransfers } from 'vs/platform/dnd/browser/dnd' ;
69
+ import { CodeDataTransfers , FileAdditionalNativeProperties } from 'vs/platform/dnd/browser/dnd' ;
70
70
71
71
export class TreeViewPane extends ViewPane {
72
72
@@ -1503,40 +1503,21 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop<ITreeItem> {
1503
1503
}
1504
1504
const treeDataTransfer = new VSDataTransfer ( ) ;
1505
1505
const uris : URI [ ] = [ ] ;
1506
- let itemsCount = Array . from ( originalEvent . dataTransfer . items ) . reduce ( ( previous , current ) => {
1507
- if ( ( current . kind === 'string' ) || ( current . kind === 'file' ) ) {
1508
- return previous + 1 ;
1509
- }
1510
- return previous ;
1511
- } , 0 ) ;
1512
1506
1513
1507
let treeSourceInfo : TreeDragSourceInfo | undefined ;
1514
1508
let willDropUuid : string | undefined ;
1515
1509
if ( this . treeItemsTransfer . hasData ( DraggedTreeItemsIdentifier . prototype ) ) {
1516
1510
willDropUuid = this . treeItemsTransfer . getData ( DraggedTreeItemsIdentifier . prototype ) ! [ 0 ] . identifier ;
1517
1511
}
1518
- await new Promise < void > ( resolve => {
1519
- function decrementStringCount ( ) {
1520
- itemsCount -- ;
1521
- if ( itemsCount === 0 ) {
1522
- // Check if there are uris to add and add them
1523
- if ( uris . length ) {
1524
- treeDataTransfer . setString ( Mimes . uriList , uris . map ( uri => uri . toString ( ) ) . join ( '\n' ) ) ;
1525
- }
1526
- resolve ( ) ;
1527
- }
1528
- }
1529
1512
1530
- if ( ! originalEvent . dataTransfer ) {
1531
- return ;
1532
- }
1533
- for ( const dataItem of originalEvent . dataTransfer . items ) {
1534
- const type = dataItem . type ;
1535
- const kind = dataItem . kind ;
1536
- const convertedType = this . convertKnownMimes ( type , kind ) . type ;
1537
- if ( ( INTERNAL_MIME_TYPES . indexOf ( convertedType ) < 0 )
1538
- && ( convertedType === this . treeMimeType ) || ( dndController . dropMimeTypes . indexOf ( convertedType ) >= 0 ) ) {
1539
- if ( dataItem . kind === 'string' ) {
1513
+ await Promise . all ( [ ...originalEvent . dataTransfer . items ] . map ( async dataItem => {
1514
+ const type = dataItem . type ;
1515
+ const kind = dataItem . kind ;
1516
+ const convertedType = this . convertKnownMimes ( type , kind ) . type ;
1517
+ if ( ( INTERNAL_MIME_TYPES . indexOf ( convertedType ) < 0 )
1518
+ && ( convertedType === this . treeMimeType ) || ( dndController . dropMimeTypes . indexOf ( convertedType ) >= 0 ) ) {
1519
+ if ( dataItem . kind === 'string' ) {
1520
+ await new Promise < void > ( resolve =>
1540
1521
dataItem . getAsString ( dataValue => {
1541
1522
if ( convertedType === this . treeMimeType ) {
1542
1523
treeSourceInfo = JSON . parse ( dataValue ) ;
@@ -1545,20 +1526,27 @@ export class CustomTreeViewDragAndDrop implements ITreeDragAndDrop<ITreeItem> {
1545
1526
const converted = this . convertKnownMimes ( type , kind , dataValue ) ;
1546
1527
treeDataTransfer . setString ( converted . type , converted . value + '' ) ;
1547
1528
}
1548
- decrementStringCount ( ) ;
1549
- } ) ;
1550
- } else if ( dataItem . kind === 'file' ) {
1551
- const dataValue = dataItem . getAsFile ( ) ;
1552
- if ( dataValue ) {
1553
- uris . push ( URI . file ( dataValue . path ) ) ;
1529
+ resolve ( ) ;
1530
+ } ) ) ;
1531
+ } else if ( dataItem . kind === 'file' ) {
1532
+ const file = dataItem . getAsFile ( ) ;
1533
+ if ( file ) {
1534
+ uris . push ( URI . file ( file . path ) ) ;
1535
+ const uri = ( file as FileAdditionalNativeProperties ) . path ? URI . parse ( ( file as FileAdditionalNativeProperties ) . path ! ) : undefined ;
1536
+ if ( dndController . supportsFileDataTransfers ) {
1537
+ treeDataTransfer . setFile ( type , file . name , uri , async ( ) => {
1538
+ return new Uint8Array ( await file . arrayBuffer ( ) ) ;
1539
+ } ) ;
1554
1540
}
1555
- decrementStringCount ( ) ;
1556
1541
}
1557
- } else if ( dataItem . kind === 'string' || dataItem . kind === 'file' ) {
1558
- decrementStringCount ( ) ;
1559
1542
}
1560
1543
}
1561
- } ) ;
1544
+ } ) ) ;
1545
+
1546
+ // Check if there are uris to add and add them
1547
+ if ( uris . length ) {
1548
+ treeDataTransfer . setString ( Mimes . uriList , uris . map ( uri => uri . toString ( ) ) . join ( '\n' ) ) ;
1549
+ }
1562
1550
1563
1551
const additionalWillDropPromise = this . treeViewsDragAndDropService . removeDragOperationTransfer ( willDropUuid ) ;
1564
1552
if ( ! additionalWillDropPromise ) {
0 commit comments