| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- var __param = (this && this.__param) || function (paramIndex, decorator) {
- return function (target, key) { decorator(target, key, paramIndex); }
- };
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
- return new (P || (P = Promise))(function (resolve, reject) {
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
- step((generator = generator.apply(thisArg, _arguments || [])).next());
- });
- };
- import { raceCancellation } from '../../../../base/common/async.js';
- import { VSDataTransfer } from '../../../../base/common/dataTransfer.js';
- import { Disposable } from '../../../../base/common/lifecycle.js';
- import { Mimes } from '../../../../base/common/mime.js';
- import { relativePath } from '../../../../base/common/resources.js';
- import { URI } from '../../../../base/common/uri.js';
- import { addExternalEditorsDropData, toVSDataTransfer, UriList } from '../../../browser/dnd.js';
- import { registerEditorContribution } from '../../../browser/editorExtensions.js';
- import { IBulkEditService, ResourceEdit } from '../../../browser/services/bulkEditService.js';
- import { Range } from '../../../common/core/range.js';
- import { Selection } from '../../../common/core/selection.js';
- import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';
- import { EditorStateCancellationTokenSource } from '../../editorState/browser/editorState.js';
- import { performSnippetEdit } from '../../snippet/browser/snippetController2.js';
- import { SnippetParser } from '../../snippet/browser/snippetParser.js';
- import { localize } from '../../../../nls.js';
- import { IProgressService } from '../../../../platform/progress/common/progress.js';
- import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';
- let DropIntoEditorController = class DropIntoEditorController extends Disposable {
- constructor(editor, _bulkEditService, _languageFeaturesService, _progressService, workspaceContextService) {
- super();
- this._bulkEditService = _bulkEditService;
- this._languageFeaturesService = _languageFeaturesService;
- this._progressService = _progressService;
- this._register(editor.onDropIntoEditor(e => this.onDropIntoEditor(editor, e.position, e.event)));
- this._languageFeaturesService.documentOnDropEditProvider.register('*', new DefaultOnDropProvider(workspaceContextService));
- }
- onDropIntoEditor(editor, position, dragEvent) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!dragEvent.dataTransfer || !editor.hasModel()) {
- return;
- }
- const model = editor.getModel();
- const initialModelVersion = model.getVersionId();
- const ourDataTransfer = yield this.extractDataTransferData(dragEvent);
- if (ourDataTransfer.size === 0) {
- return;
- }
- if (editor.getModel().getVersionId() !== initialModelVersion) {
- return;
- }
- const tokenSource = new EditorStateCancellationTokenSource(editor, 1 /* CodeEditorStateFlag.Value */);
- try {
- const providers = this._languageFeaturesService.documentOnDropEditProvider.ordered(model);
- const edit = yield this._progressService.withProgress({
- location: 15 /* ProgressLocation.Notification */,
- delay: 750,
- title: localize('dropProgressTitle', "Running drop handlers..."),
- cancellable: true,
- }, () => {
- return raceCancellation((() => __awaiter(this, void 0, void 0, function* () {
- for (const provider of providers) {
- const edit = yield provider.provideDocumentOnDropEdits(model, position, ourDataTransfer, tokenSource.token);
- if (tokenSource.token.isCancellationRequested) {
- return undefined;
- }
- if (edit) {
- return edit;
- }
- }
- return undefined;
- }))(), tokenSource.token);
- }, () => {
- tokenSource.cancel();
- });
- if (tokenSource.token.isCancellationRequested || editor.getModel().getVersionId() !== initialModelVersion) {
- return;
- }
- if (edit) {
- const range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);
- performSnippetEdit(editor, typeof edit.insertText === 'string' ? SnippetParser.escape(edit.insertText) : edit.insertText.snippet, [Selection.fromRange(range, 0 /* SelectionDirection.LTR */)]);
- if (edit.additionalEdit) {
- yield this._bulkEditService.apply(ResourceEdit.convert(edit.additionalEdit), { editor });
- }
- return;
- }
- }
- finally {
- tokenSource.dispose();
- }
- });
- }
- extractDataTransferData(dragEvent) {
- return __awaiter(this, void 0, void 0, function* () {
- if (!dragEvent.dataTransfer) {
- return new VSDataTransfer();
- }
- const textEditorDataTransfer = toVSDataTransfer(dragEvent.dataTransfer);
- addExternalEditorsDropData(textEditorDataTransfer, dragEvent);
- return textEditorDataTransfer;
- });
- }
- };
- DropIntoEditorController.ID = 'editor.contrib.dropIntoEditorController';
- DropIntoEditorController = __decorate([
- __param(1, IBulkEditService),
- __param(2, ILanguageFeaturesService),
- __param(3, IProgressService),
- __param(4, IWorkspaceContextService)
- ], DropIntoEditorController);
- export { DropIntoEditorController };
- let DefaultOnDropProvider = class DefaultOnDropProvider {
- constructor(_workspaceContextService) {
- this._workspaceContextService = _workspaceContextService;
- }
- provideDocumentOnDropEdits(_model, _position, dataTransfer, _token) {
- var _a;
- return __awaiter(this, void 0, void 0, function* () {
- const urlListEntry = dataTransfer.get(Mimes.uriList);
- if (urlListEntry) {
- const urlList = yield urlListEntry.asString();
- const snippet = this.getUriListInsertText(urlList);
- if (snippet) {
- return { insertText: snippet };
- }
- }
- const textEntry = (_a = dataTransfer.get('text')) !== null && _a !== void 0 ? _a : dataTransfer.get(Mimes.text);
- if (textEntry) {
- const text = yield textEntry.asString();
- return { insertText: text };
- }
- return undefined;
- });
- }
- getUriListInsertText(strUriList) {
- const uris = [];
- for (const resource of UriList.parse(strUriList)) {
- try {
- uris.push(URI.parse(resource));
- }
- catch (_a) {
- // noop
- }
- }
- if (!uris.length) {
- return;
- }
- return uris
- .map(uri => {
- const root = this._workspaceContextService.getWorkspaceFolder(uri);
- if (root) {
- const rel = relativePath(root.uri, uri);
- if (rel) {
- return rel;
- }
- }
- return uri.fsPath;
- })
- .join(' ');
- }
- };
- DefaultOnDropProvider = __decorate([
- __param(0, IWorkspaceContextService)
- ], DefaultOnDropProvider);
- registerEditorContribution(DropIntoEditorController.ID, DropIntoEditorController);
|