mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-24 18:49:00 +01:00
88 lines
2.3 KiB
TypeScript
88 lines
2.3 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { addDisposableListener } from './dom.js';
|
|
import { Disposable } from '../common/lifecycle.js';
|
|
import { Mimes } from '../common/mime.js';
|
|
|
|
/**
|
|
* A helper that will execute a provided function when the provided HTMLElement receives
|
|
* dragover event for 800ms. If the drag is aborted before, the callback will not be triggered.
|
|
*/
|
|
export class DelayedDragHandler extends Disposable {
|
|
private timeout: Timeout | undefined = undefined;
|
|
|
|
constructor(container: HTMLElement, callback: () => void) {
|
|
super();
|
|
|
|
this._register(addDisposableListener(container, 'dragover', e => {
|
|
e.preventDefault(); // needed so that the drop event fires (https://stackoverflow.com/questions/21339924/drop-event-not-firing-in-chrome)
|
|
|
|
if (!this.timeout) {
|
|
this.timeout = setTimeout(() => {
|
|
callback();
|
|
|
|
this.timeout = undefined;
|
|
}, 800);
|
|
}
|
|
}));
|
|
|
|
['dragleave', 'drop', 'dragend'].forEach(type => {
|
|
this._register(addDisposableListener(container, type, () => {
|
|
this.clearDragTimeout();
|
|
}));
|
|
});
|
|
}
|
|
|
|
private clearDragTimeout(): void {
|
|
if (this.timeout) {
|
|
clearTimeout(this.timeout);
|
|
this.timeout = undefined;
|
|
}
|
|
}
|
|
|
|
override dispose(): void {
|
|
super.dispose();
|
|
|
|
this.clearDragTimeout();
|
|
}
|
|
}
|
|
|
|
// Common data transfers
|
|
export const DataTransfers = {
|
|
|
|
/**
|
|
* Application specific resource transfer type
|
|
*/
|
|
RESOURCES: 'ResourceURLs',
|
|
|
|
/**
|
|
* Browser specific transfer type to download
|
|
*/
|
|
DOWNLOAD_URL: 'DownloadURL',
|
|
|
|
/**
|
|
* Browser specific transfer type for files
|
|
*/
|
|
FILES: 'Files',
|
|
|
|
/**
|
|
* Typically transfer type for copy/paste transfers.
|
|
*/
|
|
TEXT: Mimes.text,
|
|
|
|
/**
|
|
* Internal type used to pass around text/uri-list data.
|
|
*
|
|
* This is needed to work around https://bugs.chromium.org/p/chromium/issues/detail?id=239745.
|
|
*/
|
|
INTERNAL_URI_LIST: 'application/vnd.code.uri-list',
|
|
};
|
|
|
|
export interface IDragAndDropData {
|
|
update(dataTransfer: DataTransfer): void;
|
|
getData(): unknown;
|
|
}
|