mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-11 18:48:33 -05:00
Merge from vscode 61d5f2b82f17bf9f99f56405204caab88a7e8747
This commit is contained in:
@@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri';
|
||||
import { ITextFileService, stringToSnapshot } from 'vs/workbench/services/textfile/common/textfiles';
|
||||
import { Schemas } from 'vs/base/common/network';
|
||||
import { IEditorViewState } from 'vs/editor/common/editorCommon';
|
||||
import { DataTransfers } from 'vs/base/browser/dnd';
|
||||
import { DataTransfers, IDragAndDropData } from 'vs/base/browser/dnd';
|
||||
import { DragMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
import { normalizeDriveLetter } from 'vs/base/common/labels';
|
||||
import { MIME_BINARY } from 'vs/base/common/mime';
|
||||
@@ -21,7 +21,7 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation
|
||||
import { isCodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { IEditorIdentifier, GroupIdentifier } from 'vs/workbench/common/editor';
|
||||
import { IEditorService, IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService';
|
||||
import { Disposable } from 'vs/base/common/lifecycle';
|
||||
import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle';
|
||||
import { addDisposableListener, EventType, asDomUri } from 'vs/base/browser/dom';
|
||||
import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService';
|
||||
import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing';
|
||||
@@ -29,6 +29,7 @@ import { withNullAsUndefined } from 'vs/base/common/types';
|
||||
import { IHostService } from 'vs/workbench/services/host/browser/host';
|
||||
import { isStandalone } from 'vs/base/browser/browser';
|
||||
import { IBackupFileService } from 'vs/workbench/services/backup/common/backup';
|
||||
import { Emitter } from 'vs/base/common/event';
|
||||
|
||||
export interface IDraggedResource {
|
||||
resource: URI;
|
||||
@@ -507,3 +508,219 @@ export function containsDragType(event: DragEvent, ...dragTypesToFind: string[])
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
export interface ICompositeDragAndDrop {
|
||||
drop(data: IDragAndDropData, target: string | undefined, originalEvent: DragEvent, before?: boolean): void;
|
||||
onDragOver(data: IDragAndDropData, target: string | undefined, originalEvent: DragEvent): boolean;
|
||||
onDragEnter(data: IDragAndDropData, target: string | undefined, originalEvent: DragEvent): boolean;
|
||||
}
|
||||
|
||||
export interface ICompositeDragAndDropObserverCallbacks {
|
||||
onDragEnter?: (e: IDraggedCompositeData) => void;
|
||||
onDragLeave?: (e: IDraggedCompositeData) => void;
|
||||
onDrop?: (e: IDraggedCompositeData) => void;
|
||||
onDragOver?: (e: IDraggedCompositeData) => void;
|
||||
onDragStart?: (e: IDraggedCompositeData) => void;
|
||||
onDragEnd?: (e: IDraggedCompositeData) => void;
|
||||
}
|
||||
|
||||
export class CompositeDragAndDropData implements IDragAndDropData {
|
||||
constructor(private type: 'view' | 'composite', private id: string) { }
|
||||
update(dataTransfer: DataTransfer): void {
|
||||
// no-op
|
||||
}
|
||||
getData(): {
|
||||
type: 'view' | 'composite';
|
||||
id: string;
|
||||
} {
|
||||
return { type: this.type, id: this.id };
|
||||
}
|
||||
}
|
||||
|
||||
export interface IDraggedCompositeData {
|
||||
eventData: DragEvent;
|
||||
dragAndDropData: CompositeDragAndDropData;
|
||||
}
|
||||
|
||||
export class DraggedCompositeIdentifier {
|
||||
constructor(private _compositeId: string) { }
|
||||
|
||||
get id(): string {
|
||||
return this._compositeId;
|
||||
}
|
||||
}
|
||||
|
||||
export class DraggedViewIdentifier {
|
||||
constructor(private _viewId: string) { }
|
||||
|
||||
get id(): string {
|
||||
return this._viewId;
|
||||
}
|
||||
}
|
||||
|
||||
export type ViewType = 'composite' | 'view';
|
||||
|
||||
export class CompositeDragAndDropObserver extends Disposable {
|
||||
private transferData: LocalSelectionTransfer<DraggedCompositeIdentifier | DraggedViewIdentifier>;
|
||||
private _onDragStart = this._register(new Emitter<IDraggedCompositeData>());
|
||||
private _onDragEnd = this._register(new Emitter<IDraggedCompositeData>());
|
||||
private static _instance: CompositeDragAndDropObserver | undefined;
|
||||
static get INSTANCE(): CompositeDragAndDropObserver {
|
||||
if (!CompositeDragAndDropObserver._instance) {
|
||||
CompositeDragAndDropObserver._instance = new CompositeDragAndDropObserver();
|
||||
}
|
||||
return CompositeDragAndDropObserver._instance;
|
||||
}
|
||||
private constructor() {
|
||||
super();
|
||||
this.transferData = LocalSelectionTransfer.getInstance<DraggedCompositeIdentifier | DraggedViewIdentifier>();
|
||||
}
|
||||
private readDragData(type: ViewType): CompositeDragAndDropData | undefined {
|
||||
if (this.transferData.hasData(type === 'view' ? DraggedViewIdentifier.prototype : DraggedCompositeIdentifier.prototype)) {
|
||||
const data = this.transferData.getData(type === 'view' ? DraggedViewIdentifier.prototype : DraggedCompositeIdentifier.prototype);
|
||||
if (data && data[0]) {
|
||||
return new CompositeDragAndDropData(type, data[0].id);
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
private writeDragData(id: string, type: ViewType): void {
|
||||
this.transferData.setData([type === 'view' ? new DraggedViewIdentifier(id) : new DraggedCompositeIdentifier(id)], type === 'view' ? DraggedViewIdentifier.prototype : DraggedCompositeIdentifier.prototype);
|
||||
}
|
||||
registerTarget(element: HTMLElement, callbacks: ICompositeDragAndDropObserverCallbacks): IDisposable {
|
||||
const disposableStore = new DisposableStore();
|
||||
disposableStore.add(new DragAndDropObserver(element, {
|
||||
onDragEnd: e => {
|
||||
// no-op
|
||||
},
|
||||
onDragEnter: e => {
|
||||
e.preventDefault();
|
||||
if (callbacks.onDragEnter) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (data) {
|
||||
callbacks.onDragEnter({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
}
|
||||
},
|
||||
onDragLeave: e => {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (callbacks.onDragLeave && data) {
|
||||
callbacks.onDragLeave({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
},
|
||||
onDrop: e => {
|
||||
if (callbacks.onDrop) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
callbacks.onDrop({ eventData: e, dragAndDropData: data! });
|
||||
|
||||
// Fire drag event in case drop handler destroys the dragged element
|
||||
this._onDragEnd.fire({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
},
|
||||
onDragOver: e => {
|
||||
e.preventDefault();
|
||||
if (callbacks.onDragOver) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
callbacks.onDragOver({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
}
|
||||
}));
|
||||
if (callbacks.onDragStart) {
|
||||
this._onDragStart.event(e => {
|
||||
callbacks.onDragStart!(e);
|
||||
}, this, disposableStore);
|
||||
}
|
||||
if (callbacks.onDragEnd) {
|
||||
this._onDragEnd.event(e => {
|
||||
callbacks.onDragEnd!(e);
|
||||
});
|
||||
}
|
||||
return this._register(disposableStore);
|
||||
}
|
||||
registerDraggable(element: HTMLElement, type: ViewType, id: string, callbacks: ICompositeDragAndDropObserverCallbacks): IDisposable {
|
||||
element.draggable = true;
|
||||
const disposableStore = new DisposableStore();
|
||||
disposableStore.add(addDisposableListener(element, EventType.DRAG_START, e => {
|
||||
this.writeDragData(id, type);
|
||||
this._onDragStart.fire({ eventData: e, dragAndDropData: this.readDragData(type)! });
|
||||
}));
|
||||
disposableStore.add(new DragAndDropObserver(element, {
|
||||
onDragEnd: e => {
|
||||
const data = this.readDragData(type);
|
||||
if (data && data.getData().id === id) {
|
||||
this.transferData.clearData(type === 'view' ? DraggedViewIdentifier.prototype : DraggedCompositeIdentifier.prototype);
|
||||
}
|
||||
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._onDragEnd.fire({ eventData: e, dragAndDropData: data! });
|
||||
},
|
||||
onDragEnter: e => {
|
||||
if (callbacks.onDragEnter) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (data) {
|
||||
callbacks.onDragEnter({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
}
|
||||
},
|
||||
onDragLeave: e => {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (callbacks.onDragLeave) {
|
||||
callbacks.onDragLeave({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
},
|
||||
onDrop: e => {
|
||||
if (callbacks.onDrop) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
callbacks.onDrop({ eventData: e, dragAndDropData: data! });
|
||||
|
||||
// Fire drag event in case drop handler destroys the dragged element
|
||||
this._onDragEnd.fire({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
},
|
||||
onDragOver: e => {
|
||||
if (callbacks.onDragOver) {
|
||||
const data = this.readDragData('composite') || this.readDragData('view');
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
callbacks.onDragOver({ eventData: e, dragAndDropData: data! });
|
||||
}
|
||||
}
|
||||
}));
|
||||
if (callbacks.onDragStart) {
|
||||
this._onDragStart.event(e => {
|
||||
callbacks.onDragStart!(e);
|
||||
}, this, disposableStore);
|
||||
}
|
||||
if (callbacks.onDragEnd) {
|
||||
this._onDragEnd.event(e => {
|
||||
callbacks.onDragEnd!(e);
|
||||
});
|
||||
}
|
||||
return this._register(disposableStore);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user