diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index c0d732b70dec3a17028d189075f8a41672d338bc..44e52e58f62ca63dbc5f79057c133f19ec913975 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;