提交 b6e0f97f 编写于 作者: I isidor

open editors: multi select dnd

上级 3f38333b
...@@ -143,9 +143,18 @@ export class OpenEditorsView extends ViewsViewletPanel { ...@@ -143,9 +143,18 @@ export class OpenEditorsView extends ViewsViewletPanel {
dom.addClass(container, 'show-file-icons'); dom.addClass(container, 'show-file-icons');
const delegate = new OpenEditorsDelegate(); const delegate = new OpenEditorsDelegate();
const getSelectedElements = () => {
const selected = this.list.getSelectedElements();
const focused = this.list.getFocusedElements();
if (focused.length && selected.indexOf(focused[0]) >= 0) {
return selected;
}
return focused;
};
this.list = new WorkbenchList<OpenEditor | IEditorGroup>(container, delegate, [ this.list = new WorkbenchList<OpenEditor | IEditorGroup>(container, delegate, [
new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService), new EditorGroupRenderer(this.keybindingService, this.instantiationService, this.editorGroupService),
new OpenEditorRenderer(this.instantiationService, this.keybindingService, this.configurationService, this.editorGroupService) new OpenEditorRenderer(getSelectedElements, this.instantiationService, this.keybindingService, this.configurationService, this.editorGroupService)
], { ], {
keyboardSupport: false, keyboardSupport: false,
identityProvider: element => element instanceof OpenEditor ? element.getId() : element.id.toString() identityProvider: element => element instanceof OpenEditor ? element.getId() : element.id.toString()
...@@ -459,7 +468,7 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat ...@@ -459,7 +468,7 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat
editorGroupTemplate.toDispose = []; editorGroupTemplate.toDispose = [];
editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, (e: DragEvent) => { editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, (e: DragEvent) => {
if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { if (OpenEditorRenderer.DRAGGED_OPEN_EDITORS) {
dom.addClass(container, 'focused'); dom.addClass(container, 'focused');
} }
})); }));
...@@ -468,10 +477,11 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat ...@@ -468,10 +477,11 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat
})); }));
editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, () => { editorGroupTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, () => {
dom.removeClass(container, 'focused'); dom.removeClass(container, 'focused');
if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { if (OpenEditorRenderer.DRAGGED_OPEN_EDITORS) {
const model = this.editorGroupService.getStacksModel(); const model = this.editorGroupService.getStacksModel();
const positionOfTargetGroup = model.positionOfGroup(editorGroupTemplate.editorGroup); const positionOfTargetGroup = model.positionOfGroup(editorGroupTemplate.editorGroup);
this.editorGroupService.moveEditor(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorInput, model.positionOfGroup(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorGroup), positionOfTargetGroup, { preserveFocus: true }); OpenEditorRenderer.DRAGGED_OPEN_EDITORS.forEach(oe =>
this.editorGroupService.moveEditor(oe.editorInput, model.positionOfGroup(oe.editorGroup), positionOfTargetGroup, { preserveFocus: true }));
this.editorGroupService.activateGroup(positionOfTargetGroup); this.editorGroupService.activateGroup(positionOfTargetGroup);
} }
})); }));
...@@ -493,9 +503,10 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat ...@@ -493,9 +503,10 @@ class EditorGroupRenderer implements IRenderer<IEditorGroup, IEditorGroupTemplat
class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateData> { class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateData> {
static readonly ID = 'openeditor'; static readonly ID = 'openeditor';
public static DRAGGED_OPEN_EDITOR: OpenEditor; public static DRAGGED_OPEN_EDITORS: OpenEditor[];
constructor( constructor(
private getSelectedElements: () => (OpenEditor | IEditorGroup)[],
private instantiationService: IInstantiationService, private instantiationService: IInstantiationService,
private keybindingService: IKeybindingService, private keybindingService: IKeybindingService,
private configurationService: IConfigurationService, private configurationService: IConfigurationService,
...@@ -532,24 +543,26 @@ class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateDat ...@@ -532,24 +543,26 @@ class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateDat
e.dataTransfer.setDragImage(dragImage, -10, -10); e.dataTransfer.setDragImage(dragImage, -10, -10);
setTimeout(() => document.body.removeChild(dragImage), 0); setTimeout(() => document.body.removeChild(dragImage), 0);
OpenEditorRenderer.DRAGGED_OPEN_EDITOR = editorTemplate.openEditor; const dragged = <OpenEditor[]>this.getSelectedElements().filter(e => e instanceof OpenEditor);
OpenEditorRenderer.DRAGGED_OPEN_EDITORS = dragged;
if (editorTemplate.openEditor && editorTemplate.openEditor.editorInput) { if (editorTemplate.openEditor && editorTemplate.openEditor.editorInput) {
const resource = editorTemplate.openEditor.editorInput.getResource(); // enables dropping editor resource path into text controls
if (resource) { e.dataTransfer.setData(DataTransfers.TEXT, dragged.map(d => d.getResource()).map(resource => resource.scheme === 'file' ? getPathLabel(resource) : resource.toString()).join('\n'));
const resourceStr = resource.toString();
if (dragged.length === 1) {
const resource = dragged[0].getResource();
e.dataTransfer.setData(DataTransfers.URL, resource.toString()); // enables dropping editor into editor area e.dataTransfer.setData(DataTransfers.URL, resource.toString()); // enables dropping editor into editor area
e.dataTransfer.setData(DataTransfers.TEXT, getPathLabel(resource)); // enables dropping editor resource path into text controls
if (resource.scheme === 'file') { if (resource.scheme === 'file') {
e.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, getBaseLabel(resource), resourceStr].join(':')); // enables support to drag an editor as file to desktop e.dataTransfer.setData(DataTransfers.DOWNLOAD_URL, [MIME_BINARY, getBaseLabel(resource), resource.toString()].join(':')); // enables support to drag an editor as file to desktop
} }
} else {
e.dataTransfer.setData(DataTransfers.URLS, JSON.stringify(dragged.map(s => s.getResource().toString())));
} }
} }
})); }));
editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, () => { editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_OVER, () => {
if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { if (OpenEditorRenderer.DRAGGED_OPEN_EDITORS) {
dom.addClass(container, 'focused'); dom.addClass(container, 'focused');
} }
})); }));
...@@ -558,18 +571,18 @@ class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateDat ...@@ -558,18 +571,18 @@ class OpenEditorRenderer implements IRenderer<OpenEditor, IOpenEditorTemplateDat
})); }));
editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, (e: DragEvent) => { editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DROP, (e: DragEvent) => {
dom.removeClass(container, 'focused'); dom.removeClass(container, 'focused');
if (OpenEditorRenderer.DRAGGED_OPEN_EDITOR) { if (OpenEditorRenderer.DRAGGED_OPEN_EDITORS) {
const model = this.editorGroupService.getStacksModel(); const model = this.editorGroupService.getStacksModel();
const positionOfTargetGroup = model.positionOfGroup(editorTemplate.openEditor.editorGroup); const positionOfTargetGroup = model.positionOfGroup(editorTemplate.openEditor.editorGroup);
const index = editorTemplate.openEditor.editorGroup.indexOf(editorTemplate.openEditor.editorInput); const index = editorTemplate.openEditor.editorGroup.indexOf(editorTemplate.openEditor.editorInput);
this.editorGroupService.moveEditor(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorInput, OpenEditorRenderer.DRAGGED_OPEN_EDITORS.forEach(oe =>
model.positionOfGroup(OpenEditorRenderer.DRAGGED_OPEN_EDITOR.editorGroup), positionOfTargetGroup, { index, preserveFocus: true }); this.editorGroupService.moveEditor(oe.editorInput, model.positionOfGroup(oe.editorGroup), positionOfTargetGroup, { index, preserveFocus: true }));
this.editorGroupService.activateGroup(positionOfTargetGroup); this.editorGroupService.activateGroup(positionOfTargetGroup);
} }
})); }));
editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_END, () => { editorTemplate.toDispose.push(dom.addDisposableListener(container, dom.EventType.DRAG_END, () => {
OpenEditorRenderer.DRAGGED_OPEN_EDITOR = undefined; OpenEditorRenderer.DRAGGED_OPEN_EDITORS = undefined;
})); }));
return editorTemplate; return editorTemplate;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册