提交 f28b0590 编写于 作者: B Benjamin Pasero

support dnd from tab into editor area

上级 a403b526
......@@ -16,6 +16,7 @@ import {ProgressBar} from 'vs/base/browser/ui/progressbar/progressbar';
import {BaseEditor} from 'vs/workbench/browser/parts/editor/baseEditor';
import DOM = require('vs/base/browser/dom');
import errors = require('vs/base/common/errors');
import {isMacintosh} from 'vs/base/common/platform';
import {IWorkbenchEditorService, GroupArrangement} from 'vs/workbench/services/editor/common/editorService';
import {IContextMenuService} from 'vs/platform/contextview/browser/contextView';
import {Position, POSITIONS} from 'vs/platform/editor/common/editor';
......@@ -29,8 +30,9 @@ import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingServic
import {IExtensionService} from 'vs/platform/extensions/common/extensions';
import {IDisposable, dispose} from 'vs/base/common/lifecycle';
import {TabsTitleControl} from 'vs/workbench/browser/parts/editor/tabsTitleControl';
import {TitleControl} from 'vs/workbench/browser/parts/editor/titleControl';
import {NoTabsTitleControl} from 'vs/workbench/browser/parts/editor/noTabsTitleControl';
import {IEditorStacksModel, IStacksModelChangeEvent, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor';
import {IEditorStacksModel, IStacksModelChangeEvent, IWorkbenchEditorConfiguration, EditorOptions} from 'vs/workbench/common/editor';
import {ITitleAreaControl} from 'vs/workbench/browser/parts/editor/titleControl';
import {extractResources} from 'vs/base/browser/dnd';
......@@ -761,14 +763,29 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti
DOM.removeClass(node, 'dropfeedback');
destroyOverlay();
const droppedResources = extractResources(e).filter(r => r.scheme === 'file' || r.scheme === 'untitled');
if (droppedResources.length) {
window.focus(); // make sure this window has focus so that the open call reaches the right window!
// Check for transfer from title control
const draggedEditor = TitleControl.getDraggedEditor();
if (draggedEditor) {
const isCopy = (e.ctrlKey && !isMacintosh) || (e.altKey && isMacintosh);
if (isCopy) {
$this.editorService.openEditor(draggedEditor.editor, EditorOptions.create({ pinned: true }), position).done(null, errors.onUnexpectedError);
} else {
const sourcePosition = $this.stacks.positionOfGroup(draggedEditor.group);
$this.editorGroupService.moveEditor(draggedEditor.editor, sourcePosition, position);
}
}
// Open all
$this.editorService.openEditors(droppedResources.map(resource => { return { input: { resource, options: { pinned: true } }, position }; }))
.then(() => $this.editorGroupService.focusGroup(position))
.done(null, errors.onUnexpectedError);
// Check for URI transfer
else {
const droppedResources = extractResources(e).filter(r => r.scheme === 'file' || r.scheme === 'untitled');
if (droppedResources.length) {
window.focus(); // make sure this window has focus so that the open call reaches the right window!
// Open all
$this.editorService.openEditors(droppedResources.map(resource => { return { input: { resource, options: { pinned: true } }, position }; }))
.then(() => $this.editorGroupService.focusGroup(position))
.done(null, errors.onUnexpectedError);
}
}
}
......
......@@ -35,9 +35,6 @@ import {ScrollbarVisibility} from 'vs/base/browser/ui/scrollbar/scrollableElemen
import {extractResources} from 'vs/base/browser/dnd';
export class TabsTitleControl extends TitleControl {
private static draggedEditor: IEditorIdentifier;
private titleContainer: HTMLElement;
private tabsContainer: HTMLElement;
private activeTab: HTMLElement;
......@@ -127,20 +124,23 @@ export class TabsTitleControl extends TitleControl {
const targetIndex = group.count;
// Local DND
if (TabsTitleControl.draggedEditor) {
const draggedEditor = TitleControl.getDraggedEditor();
if (draggedEditor) {
DOM.EventHelper.stop(e, true);
const sourcePosition = this.stacks.positionOfGroup(TabsTitleControl.draggedEditor.group);
const sourcePosition = this.stacks.positionOfGroup(draggedEditor.group);
// Move editor to target position and index
if (this.isMoveOperation(e, TabsTitleControl.draggedEditor.group, group)) {
this.editorGroupService.moveEditor(TabsTitleControl.draggedEditor.editor, sourcePosition, targetPosition, targetIndex);
if (this.isMoveOperation(e, draggedEditor.group, group)) {
this.editorGroupService.moveEditor(draggedEditor.editor, sourcePosition, targetPosition, targetIndex);
}
// Copy: just open editor at target index
else {
this.editorService.openEditor(TabsTitleControl.draggedEditor.editor, EditorOptions.create({ pinned: true, index: targetIndex }), targetPosition).done(null, errors.onUnexpectedError);
this.editorService.openEditor(draggedEditor.editor, EditorOptions.create({ pinned: true, index: targetIndex }), targetPosition).done(null, errors.onUnexpectedError);
}
this.onEditorDragEnd();
}
// External DND
......@@ -416,7 +416,7 @@ export class TabsTitleControl extends TitleControl {
// Drag start
this.tabDisposeables.push(DOM.addDisposableListener(tab, DOM.EventType.DRAG_START, (e: DragEvent) => {
DOM.addClass(tab, 'dragged');
TabsTitleControl.draggedEditor = { editor, group };
this.onEditorDragStart({ editor, group });
e.dataTransfer.effectAllowed = 'copyMove';
// Enable support to drag a file to desktop
......@@ -440,7 +440,7 @@ export class TabsTitleControl extends TitleControl {
this.tabDisposeables.push(DOM.addDisposableListener(tab, DOM.EventType.DRAG_END, (e: DragEvent) => {
DOM.removeClass(tab, 'dragged');
DOM.removeClass(tab, 'dropfeedback');
TabsTitleControl.draggedEditor = void 0;
this.onEditorDragEnd();
}));
// Drop
......@@ -449,20 +449,23 @@ export class TabsTitleControl extends TitleControl {
const targetIndex = group.indexOf(editor);
// Local DND
if (TabsTitleControl.draggedEditor) {
const draggedEditor = TabsTitleControl.getDraggedEditor();
if (draggedEditor) {
DOM.EventHelper.stop(e, true);
const sourcePosition = this.stacks.positionOfGroup(TabsTitleControl.draggedEditor.group);
const sourcePosition = this.stacks.positionOfGroup(draggedEditor.group);
// Move editor to target position and index
if (this.isMoveOperation(e, TabsTitleControl.draggedEditor.group, group)) {
this.editorGroupService.moveEditor(TabsTitleControl.draggedEditor.editor, sourcePosition, targetPosition, targetIndex);
if (this.isMoveOperation(e, draggedEditor.group, group)) {
this.editorGroupService.moveEditor(draggedEditor.editor, sourcePosition, targetPosition, targetIndex);
}
// Copy: just open editor at target index
else {
this.editorService.openEditor(TabsTitleControl.draggedEditor.editor, EditorOptions.create({ pinned: true, index: targetIndex }), targetPosition).done(null, errors.onUnexpectedError);
this.editorService.openEditor(draggedEditor.editor, EditorOptions.create({ pinned: true, index: targetIndex }), targetPosition).done(null, errors.onUnexpectedError);
}
this.onEditorDragEnd();
}
// External DND
......
......@@ -51,6 +51,9 @@ export interface ITitleAreaControl {
}
export abstract class TitleControl {
private static draggedEditor: IEditorIdentifier;
protected stacks: IEditorStacksModel;
protected context: IEditorGroup;
protected toDispose: IDisposable[];
......@@ -98,6 +101,18 @@ export abstract class TitleControl {
this.registerListeners();
}
public static getDraggedEditor(): IEditorIdentifier {
return TitleControl.draggedEditor;
}
protected onEditorDragStart(editor: IEditorIdentifier): void {
TitleControl.draggedEditor = editor;
}
protected onEditorDragEnd(): void {
TitleControl.draggedEditor = void 0;
}
private registerListeners(): void {
this.toDispose.push(this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config)));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册