diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 2996f6261f0..afe3aad22d5 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -26,6 +26,7 @@ import {BinaryResourceDiffEditor} from 'vs/workbench/browser/parts/editor/binary import {IEditorGroupService} from 'vs/workbench/services/group/common/groupService'; import {IFrameEditor} from 'vs/workbench/browser/parts/editor/iframeEditor'; import {IFrameEditorInput} from 'vs/workbench/common/editor/iframeEditorInput'; +import {IConfigurationRegistry, Extensions as ConfigurationExtensions} from 'vs/platform/configuration/common/configurationRegistry'; import {ChangeEncodingAction, ChangeEOLAction, ChangeModeAction, EditorStatus} from 'vs/workbench/browser/parts/editor/editorStatus'; import {IWorkbenchActionRegistry, Extensions as ActionExtensions} from 'vs/workbench/common/actionRegistry'; import {Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor} from 'vs/workbench/browser/actionBarRegistry'; @@ -393,4 +394,20 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(OpenPreviousEditorFrom registry.registerWorkbenchAction(new SyncActionDescriptor(ClearEditorHistoryAction, ClearEditorHistoryAction.ID, ClearEditorHistoryAction.LABEL), 'Clear Editor History'); registry.registerWorkbenchAction(new SyncActionDescriptor(RemoveFromEditorHistoryAction, RemoveFromEditorHistoryAction.ID, RemoveFromEditorHistoryAction.LABEL), 'Remove From Editor History'); registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigateNextAction, QuickOpenNavigateNextAction.ID, QuickOpenNavigateNextAction.LABEL, navigateKeybinding(false), KbExpr.has('inQuickOpen')), 'Navigate Next in Quick Open'); -registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open'); \ No newline at end of file +registry.registerWorkbenchAction(new SyncActionDescriptor(QuickOpenNavigatePreviousAction, QuickOpenNavigatePreviousAction.ID, QuickOpenNavigatePreviousAction.LABEL, navigateKeybinding(true), KbExpr.has('inQuickOpen'), KeybindingsRegistry.WEIGHT.workbenchContrib(50)), 'Navigate Previous in Quick Open'); + +// Configuration +let configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); +configurationRegistry.registerConfiguration({ + 'id': 'workbench', + 'order': 7, + 'title': nls.localize('workbenchConfigurationTitle', "Workbench configuration"), + 'type': 'object', + 'properties': { + 'workbench.showTabs': { + 'type': 'boolean', + 'description': nls.localize('showTabs', "Controls if opened editors should show in tabs or not."), + 'default': false + } + } +}); \ 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 cf5e105ef5e..74eb3a9af12 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditorControl.ts @@ -23,16 +23,15 @@ import {IEditorGroupService} from 'vs/workbench/services/group/common/groupServi import {IEventService} from 'vs/platform/event/common/event'; import {IMessageService} from 'vs/platform/message/common/message'; import {ITelemetryService} from 'vs/platform/telemetry/common/telemetry'; +import {IConfigurationService} from 'vs/platform/configuration/common/configuration'; 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 {TabsTitleControl} from 'vs/workbench/browser/parts/editor/tabsTitleControl'; import {NoTabsTitleControl} from 'vs/workbench/browser/parts/editor/noTabsTitleControl'; -import {IEditorStacksModel, IStacksModelChangeEvent} from 'vs/workbench/common/editor'; +import {IEditorStacksModel, IStacksModelChangeEvent, IWorkbenchEditorConfiguration} from 'vs/workbench/common/editor'; import {ITitleAreaControl} from 'vs/workbench/browser/parts/editor/titleControl'; -const useTabs = true; - export enum Rochade { NONE, CENTER_TO_LEFT, @@ -123,6 +122,7 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti @ITelemetryService private telemetryService: ITelemetryService, @IContextMenuService private contextMenuService: IContextMenuService, @IEventService private eventService: IEventService, + @IConfigurationService private configurationService: IConfigurationService, @IKeybindingService private keybindingService: IKeybindingService, @IInstantiationService private instantiationService: IInstantiationService ) { @@ -153,6 +153,26 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti private registerListeners(): void { this.toDispose.push(this.stacks.onModelChanged(e => this.onStacksChanged(e))); + this.toDispose.push(this.configurationService.onDidUpdateConfiguration(e => this.onConfigurationUpdated(e.config))); + } + + private onConfigurationUpdated(configuration: IWorkbenchEditorConfiguration): void { + POSITIONS.forEach(position => { + const titleControl = this.titleAreaControl[position]; + if (titleControl) { + const usingTabs = (titleControl instanceof TabsTitleControl); + const useTabs = configuration.workbench.showTabs; + if (usingTabs !== useTabs) { + + // Dispose old + titleControl.dispose(); + this.titleContainer[position].empty(); + + // Create new + this.createTitleControl(position); + } + } + }); } private onStacksChanged(e: IStacksModelChangeEvent): void { @@ -714,10 +734,8 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti this.titleContainer[position] = $(this.containers[position]).div({ 'class': 'title' }); this.hookTitleDragListener(position); - this.titleAreaControl[position] = useTabs ? this.instantiationService.createInstance(TabsTitleControl) : this.instantiationService.createInstance(NoTabsTitleControl); - this.titleAreaControl[position].create($(this.titleContainer[position])); - this.titleAreaControl[position].setContext(this.stacks.groupAt(position)); - this.titleAreaControl[position].refresh(true); + // Title Control + this.createTitleControl(position); }); // Progress Bars per position @@ -732,6 +750,15 @@ export class SideBySideEditorControl implements ISideBySideEditorControl, IVerti } } + private createTitleControl(position: Position): void { + const useTabs = !!this.configurationService.getConfiguration().workbench.showTabs; + + this.titleAreaControl[position] = useTabs ? this.instantiationService.createInstance(TabsTitleControl) : this.instantiationService.createInstance(NoTabsTitleControl); + this.titleAreaControl[position].create($(this.titleContainer[position])); + this.titleAreaControl[position].setContext(this.stacks.groupAt(position)); + this.titleAreaControl[position].refresh(true); + } + private hookTitleDragListener(position: Position): void { let wasDragged = false; diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 5767709335e..4f234276907 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -661,4 +661,10 @@ export interface IEditorContext extends IEditorIdentifier { event: any; } -export type GroupIdentifier = number; \ No newline at end of file +export type GroupIdentifier = number; + +export interface IWorkbenchEditorConfiguration { + workbench: { + showTabs: boolean; + }; +} \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index d1731fb57b2..0ffb3c42635 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -41,7 +41,7 @@ if (platform.isWindows || platform.isLinux) { const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ 'id': 'window', - 'order': 6, + 'order': 8, 'title': nls.localize('windowConfigurationTitle', "Window configuration"), 'type': 'object', 'properties': { @@ -72,7 +72,7 @@ configurationRegistry.registerConfiguration({ // Configuration: Update configurationRegistry.registerConfiguration({ 'id': 'update', - 'order': 10, + 'order': 15, 'title': nls.localize('updateConfigurationTitle', "Update configuration"), 'type': 'object', 'properties': { diff --git a/src/vs/workbench/parts/emmet/node/emmet.contribution.ts b/src/vs/workbench/parts/emmet/node/emmet.contribution.ts index 12a93b730e7..2cf673e010c 100644 --- a/src/vs/workbench/parts/emmet/node/emmet.contribution.ts +++ b/src/vs/workbench/parts/emmet/node/emmet.contribution.ts @@ -38,7 +38,7 @@ KeybindingsRegistry.registerCommandRule({ const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ 'id': 'emmet', - 'order': 7, + 'order': 6, 'title': nls.localize('emmetConfigurationTitle', "Emmet configuration"), 'type': 'object', 'properties': { diff --git a/src/vs/workbench/parts/files/browser/files.contribution.ts b/src/vs/workbench/parts/files/browser/files.contribution.ts index d6b922a6355..fe7e3440c06 100644 --- a/src/vs/workbench/parts/files/browser/files.contribution.ts +++ b/src/vs/workbench/parts/files/browser/files.contribution.ts @@ -161,7 +161,7 @@ let configurationRegistry = Registry.as(ConfigurationExt configurationRegistry.registerConfiguration({ 'id': 'files', - 'order': 7, + 'order': 9, 'title': nls.localize('filesConfigurationTitle', "Files configuration"), 'type': 'object', 'properties': { @@ -234,7 +234,7 @@ configurationRegistry.registerConfiguration({ configurationRegistry.registerConfiguration({ 'id': 'explorer', - 'order': 8, + 'order': 10, 'title': nls.localize('explorerConfigurationTitle', "File Explorer configuration"), 'type': 'object', 'properties': { diff --git a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts index dedf7e8e38f..9ebd95cea45 100644 --- a/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts +++ b/src/vs/workbench/parts/git/browser/gitWorkbenchContributions.ts @@ -509,7 +509,7 @@ export function registerContributions(): void { var configurationRegistry = platform.Registry.as(confregistry.Extensions.Configuration); configurationRegistry.registerConfiguration({ id: 'git', - order: 10, + order: 15, title: nls.localize('gitConfigurationTitle', "Git configuration"), type: 'object', properties: { diff --git a/src/vs/workbench/parts/search/browser/search.contribution.ts b/src/vs/workbench/parts/search/browser/search.contribution.ts index 9e0f95fb1eb..65337825936 100644 --- a/src/vs/workbench/parts/search/browser/search.contribution.ts +++ b/src/vs/workbench/parts/search/browser/search.contribution.ts @@ -166,7 +166,7 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(ShowAllSymbolsAction, const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); configurationRegistry.registerConfiguration({ 'id': 'search', - 'order': 10, + 'order': 13, 'title': nls.localize('searchConfigurationTitle', "Search configuration"), 'type': 'object', 'properties': { diff --git a/src/vs/workbench/services/request/node/requestService.ts b/src/vs/workbench/services/request/node/requestService.ts index b8e49c5c9c1..98f0a0a4b9f 100644 --- a/src/vs/workbench/services/request/node/requestService.ts +++ b/src/vs/workbench/services/request/node/requestService.ts @@ -145,7 +145,7 @@ export class RequestService extends BaseRequestService { let confRegistry = platform.Registry.as(Extensions.Configuration); confRegistry.registerConfiguration({ id: 'http', - order: 9, + order: 15, title: nls.localize('httpConfigurationTitle', "HTTP configuration"), type: 'object', properties: {