From c21cb36c5af5ec5705aaa0fe92bf47eab80e78bb Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 13 Jun 2016 16:07:32 +0200 Subject: [PATCH] DND: allow to copy a tab to a new group instead of moving --- .../browser/parts/editor/tabsTitleControl.ts | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index c0d732b70de..44e52e58f62 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -13,9 +13,10 @@ import {prepareActions} from 'vs/workbench/browser/actionBarRegistry'; import arrays = require('vs/base/common/arrays'); import errors = require('vs/base/common/errors'); import DOM = require('vs/base/browser/dom'); +import {isMacintosh} from 'vs/base/common/platform'; import {Builder, $} from 'vs/base/browser/builder'; import {MIME_BINARY} from 'vs/base/common/mime'; -import {IEditorGroup, IEditorIdentifier, asFileEditorInput} from 'vs/workbench/common/editor'; +import {IEditorGroup, IEditorIdentifier, asFileEditorInput, EditorOptions} from 'vs/workbench/common/editor'; import {ToolBar} from 'vs/base/browser/ui/toolbar/toolbar'; import {StandardKeyboardEvent} from 'vs/base/browser/keyboardEvent'; import {CommonKeybindings} from 'vs/base/common/keyCodes'; @@ -126,9 +127,17 @@ export class TabsTitleControl extends TitleControl { const sourcePosition = this.stacks.positionOfGroup(TabsTitleControl.draggedEditor.group); const targetPosition = this.stacks.positionOfGroup(group); + const targetIndex = group.count; - // Move editor to target position at the end - this.editorGroupService.moveEditor(TabsTitleControl.draggedEditor.editor, sourcePosition, targetPosition, group.count); + // Move editor to target position and index + if (this.isMoveOperation(e, TabsTitleControl.draggedEditor.group, group)) { + this.editorGroupService.moveEditor(TabsTitleControl.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); + } } } } @@ -387,7 +396,7 @@ export class TabsTitleControl extends TitleControl { this.tabDisposeables.push(DOM.addDisposableListener(tab, DOM.EventType.DRAG_START, (e: DragEvent) => { DOM.addClass(tab, 'dragged'); TabsTitleControl.draggedEditor = { editor, group }; - e.dataTransfer.effectAllowed = 'move'; + e.dataTransfer.effectAllowed = 'copyMove'; // Enable support to drag a file to desktop const fileInput = asFileEditorInput(editor, true); @@ -423,11 +432,24 @@ export class TabsTitleControl extends TitleControl { const targetIndex = group.indexOf(editor); // Move editor to target position and index - this.editorGroupService.moveEditor(TabsTitleControl.draggedEditor.editor, sourcePosition, targetPosition, targetIndex); + if (this.isMoveOperation(e, TabsTitleControl.draggedEditor.group, group)) { + this.editorGroupService.moveEditor(TabsTitleControl.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); + } } })); } + private isMoveOperation(e: DragEvent, source: IEditorGroup, target: IEditorGroup) { + const isCopy = (e.ctrlKey && !isMacintosh) || (e.altKey && isMacintosh); + + return !isCopy || source.id === target.id; + } + private getTabActions(identifier: IEditorIdentifier): IAction[] { const {editor, group} = identifier;