diff --git a/src/vs/workbench/browser/parts/editor/media/tabstitle.css b/src/vs/workbench/browser/parts/editor/media/tabstitle.css new file mode 100644 index 0000000000000000000000000000000000000000..73a54da80021c9b53054bb0c1ba2cd936499d97b --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/media/tabstitle.css @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/* Title Actions */ +.monaco-workbench > .part.editor > .content > .one-editor-container > .title .title-actions { + display: flex; + flex: initial; +} + +.monaco-workbench > .part.editor > .content > .one-editor-container .title.inactive .title-actions { + opacity: 0.5; +} + +.monaco-workbench > .part.editor > .content > .one-editor-container > .title .title-actions .action-label { + display: block; + height: 35px; + width: 28px; + background-size: 16px; + background-position: center center; + background-repeat: no-repeat; +} + +.monaco-workbench > .part.editor > .content > .one-editor-container > .title .title-actions .action-label .label { + display: none; +} + +.monaco-workbench > .part.editor > .content > .one-editor-container > .title .title-actions .editor-group-toolbar { + padding-left: 4px; + background-color: rgba(128, 128, 128, 0.2); +} \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts index baee848cda9b9319fdde82d002755e59e8cc4f3d..3197699ed5d8ca1374bcf8571978cd6b528406f9 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts @@ -26,7 +26,7 @@ import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService'; import {IDisposable, dispose} from 'vs/base/common/lifecycle'; -import {NoTabsTitleControl} from 'vs/workbench/browser/parts/editor/noTabsTitleControl'; +import {TabsTitleControl} from 'vs/workbench/browser/parts/editor/tabsTitleControl'; import {IEditorStacksModel} from 'vs/workbench/common/editor'; import {ITitleAreaControl} from 'vs/workbench/browser/parts/editor/titleControl'; @@ -699,7 +699,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti this.titleContainer[position] = $(this.containers[position]).div({ 'class': 'title' }); this.hookTitleDragListener(position); - this.titleAreaControl[position] = this.instantiationService.createInstance(NoTabsTitleControl); + this.titleAreaControl[position] = this.instantiationService.createInstance(TabsTitleControl); this.titleAreaControl[position].create($(this.titleContainer[position])); this.titleAreaControl[position].setContext(this.stacks.groupAt(position)); }); diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts new file mode 100644 index 0000000000000000000000000000000000000000..3488a1819f328c4fd393348d5b8641a4a8265261 --- /dev/null +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -0,0 +1,102 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import 'vs/css!./media/tabstitle'; +import {prepareActions} from 'vs/workbench/browser/actionBarRegistry'; +import arrays = require('vs/base/common/arrays'); +import {Builder, $} from 'vs/base/browser/builder'; +import {IEditorGroup} from 'vs/workbench/common/editor'; +import {ToolBar} from 'vs/base/browser/ui/toolbar/toolbar'; +import {IWorkbenchEditorService} from 'vs/workbench/services/editor/common/editorService'; +import {IContextMenuService} from 'vs/platform/contextview/browser/contextView'; +import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; +import {IMessageService} from 'vs/platform/message/common/message'; +import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; +import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; +import {IKeybindingService} from 'vs/platform/keybinding/common/keybindingService'; +import {TitleControl} from 'vs/workbench/browser/parts/editor/titleControl'; + +export class TabsTitleControl extends TitleControl { + private titleContainer: Builder; + + private groupActionsToolbar: ToolBar; + + private currentPrimaryGroupActionIds: string[]; + private currentSecondaryGroupActionIds: string[]; + + constructor( + @IContextMenuService contextMenuService: IContextMenuService, + @IInstantiationService instantiationService: IInstantiationService, + @IWorkbenchEditorService editorService: IWorkbenchEditorService, + @IEditorGroupService editorGroupService: IEditorGroupService, + @IKeybindingService keybindingService: IKeybindingService, + @ITelemetryService telemetryService: ITelemetryService, + @IMessageService messageService: IMessageService + ) { + super(contextMenuService, instantiationService, editorService, editorGroupService, keybindingService, telemetryService, messageService); + + this.currentPrimaryGroupActionIds = []; + this.currentSecondaryGroupActionIds = []; + } + + public setContext(group: IEditorGroup): void { + super.setContext(group); + + this.groupActionsToolbar.context = { group }; + } + + public create(parent: Builder): void { + this.titleContainer = $(parent); + + // Group Actions Container + parent.div({ + 'class': 'title-actions' + }, (div) => { + + // Editor actions + this.groupActionsToolbar = this.doCreateToolbar(div); + this.groupActionsToolbar.getContainer().addClass('editor-group-toolbar'); + }); + } + + public refresh(): void { + if (!this.context) { + return; + } + + const group = this.context; + const editor = group.activeEditor; + if (!editor) { + this.groupActionsToolbar.setActions([], [])(); + + this.currentPrimaryGroupActionIds = []; + this.currentSecondaryGroupActionIds = []; + + return; // return early if we are being closed + } + + // Update Group Actions Toolbar + const groupActions = this.getGroupActions(group); + const primaryGroupActions = prepareActions(groupActions.primary); + const secondaryGroupActions = prepareActions(groupActions.secondary); + const primaryGroupActionIds = primaryGroupActions.map(a => a.id); + const secondaryGroupActionIds = secondaryGroupActions.map(a => a.id); + + if (!arrays.equals(primaryGroupActionIds, this.currentPrimaryGroupActionIds) || !arrays.equals(secondaryGroupActionIds, this.currentSecondaryGroupActionIds)) { + this.groupActionsToolbar.setActions(primaryGroupActions, secondaryGroupActions)(); + this.currentPrimaryGroupActionIds = primaryGroupActionIds; + this.currentSecondaryGroupActionIds = secondaryGroupActionIds; + } + } + + public dispose(): void { + super.dispose(); + + // Toolbars + this.groupActionsToolbar.dispose(); + } +} \ No newline at end of file