Skip to content

Commit 81a9bb5

Browse files
committed
1 parent 8e42dc8 commit 81a9bb5

6 files changed

Lines changed: 53 additions & 24 deletions

File tree

src/vs/workbench/parts/debug/browser/debugViewlet.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { IDebugService, VIEWLET_ID, State } from 'vs/workbench/parts/debug/commo
1414
import { StartAction, ToggleReplAction, ConfigureAction } from 'vs/workbench/parts/debug/browser/debugActions';
1515
import { StartDebugActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems';
1616
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
17+
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
1718
import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress';
1819
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
1920
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
@@ -38,9 +39,10 @@ export class DebugViewlet extends ComposedViewsViewlet {
3839
@IStorageService storageService: IStorageService,
3940
@IThemeService themeService: IThemeService,
4041
@IContextKeyService contextKeyService: IContextKeyService,
41-
@IContextMenuService contextMenuService: IContextMenuService
42+
@IContextMenuService contextMenuService: IContextMenuService,
43+
@IExtensionService extensionService: IExtensionService
4244
) {
43-
super(VIEWLET_ID, ViewLocation.Debug, `${VIEWLET_ID}.state`, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService);
45+
super(VIEWLET_ID, ViewLocation.Debug, `${VIEWLET_ID}.state`, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService);
4446

4547
this.progressRunner = null;
4648

src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
2424
import { append, $, addStandardDisposableListener, EventType, addClass, removeClass, toggleClass } from 'vs/base/browser/dom';
2525
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2626
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
27+
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
2728
import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, ExtensionState } from '../common/extensions';
2829
import {
2930
ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction,
@@ -92,9 +93,10 @@ export class ExtensionsViewlet extends ComposedViewsViewlet implements IExtensio
9293
@IStorageService storageService: IStorageService,
9394
@IWorkspaceContextService contextService: IWorkspaceContextService,
9495
@IContextKeyService contextKeyService: IContextKeyService,
95-
@IContextMenuService contextMenuService: IContextMenuService
96+
@IContextMenuService contextMenuService: IContextMenuService,
97+
@IExtensionService extensionService: IExtensionService
9698
) {
97-
super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService);
99+
super(VIEWLET_ID, ViewLocation.Extensions, `${VIEWLET_ID}.state`, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService);
98100

99101
this.registerViews();
100102
this.searchDelayer = new ThrottledDelayer(500);

src/vs/workbench/parts/files/browser/explorerViewlet.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { EmptyView } from 'vs/workbench/parts/files/browser/views/emptyView';
2020
import { OpenEditorsView } from 'vs/workbench/parts/files/browser/views/openEditorsView';
2121
import { IStorageService } from 'vs/platform/storage/common/storage';
2222
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
23+
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
2324
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
2425
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2526
import { DelegatingWorkbenchEditorService } from 'vs/workbench/services/editor/browser/editorService';
@@ -52,9 +53,10 @@ export class ExplorerViewlet extends ComposedViewsViewlet {
5253
@IContextKeyService contextKeyService: IContextKeyService,
5354
@IConfigurationEditingService private configurationEditingService: IConfigurationEditingService,
5455
@IThemeService themeService: IThemeService,
55-
@IContextMenuService contextMenuService: IContextMenuService
56+
@IContextMenuService contextMenuService: IContextMenuService,
57+
@IExtensionService extensionService: IExtensionService
5658
) {
57-
super(VIEWLET_ID, ViewLocation.Explorer, ExplorerViewlet.EXPLORER_VIEWS_STATE, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService);
59+
super(VIEWLET_ID, ViewLocation.Explorer, ExplorerViewlet.EXPLORER_VIEWS_STATE, telemetryService, storageService, instantiationService, themeService, contextService, contextKeyService, contextMenuService, extensionService);
5860

5961
this.viewletState = new FileViewletState();
6062
this.viewletVisibleContextKey = ExplorerViewletVisibleContext.bindTo(contextKeyService);

src/vs/workbench/parts/views/browser/views.ts

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { Viewlet, ViewletRegistry, Extensions } from 'vs/workbench/browser/viewl
1919
import { ITree } from 'vs/base/parts/tree/browser/tree';
2020
import { DelayedDragHandler } from 'vs/base/browser/dnd';
2121
import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar';
22+
import { IExtensionService } from 'vs/platform/extensions/common/extensions';
2223
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
2324
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
2425
import { AbstractCollapsibleView, CollapsibleState, IView as IBaseView, SplitView, ViewSizing } from 'vs/base/browser/ui/splitview/splitview';
@@ -310,6 +311,7 @@ export class ComposedViewsViewlet extends Viewlet {
310311

311312
private readonly viewsContextKeys: Set<string> = new Set<string>();
312313
private readonly viewsStates: Map<string, IViewState>;
314+
private areExtensionsReady: boolean = false;
313315

314316
constructor(
315317
id: string,
@@ -321,7 +323,8 @@ export class ComposedViewsViewlet extends Viewlet {
321323
@IThemeService themeService: IThemeService,
322324
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
323325
@IContextKeyService protected contextKeyService: IContextKeyService,
324-
@IContextMenuService private contextMenuService: IContextMenuService
326+
@IContextMenuService private contextMenuService: IContextMenuService,
327+
@IExtensionService extensionService: IExtensionService
325328
) {
326329
super(id, telemetryService, themeService);
327330

@@ -332,6 +335,11 @@ export class ComposedViewsViewlet extends Viewlet {
332335
this._register(ViewsRegistry.onViewsRegistered(() => this.onViewDescriptorsChanged()));
333336
this._register(ViewsRegistry.onViewsDeregistered(() => this.onViewDescriptorsChanged()));
334337
this._register(contextKeyService.onDidChangeContext(keys => this.onContextChanged(keys)));
338+
339+
extensionService.onReady().then(() => {
340+
this.areExtensionsReady = true;
341+
this.onViewsUpdated();
342+
});
335343
}
336344

337345
public create(parent: Builder): TPromise<void> {
@@ -351,22 +359,22 @@ export class ComposedViewsViewlet extends Viewlet {
351359

352360
public getTitle(): string {
353361
let title = Registry.as<ViewletRegistry>(Extensions.Viewlets).getViewlet(this.getId()).name;
354-
if (this.views.length === 1) {
362+
if (this.hasSingleView()) {
355363
title += ': ' + this.views[0].name;
356364
}
357365
return title;
358366
}
359367

360368
public getActions(): IAction[] {
361-
if (this.views.length === 1) {
369+
if (this.hasSingleView()) {
362370
return this.views[0].getActions();
363371
}
364372
return [];
365373
}
366374

367375
public getSecondaryActions(): IAction[] {
368376
let actions = [];
369-
if (this.views.length === 1) {
377+
if (this.hasSingleView()) {
370378
actions = this.views[0].getSecondaryActions();
371379
}
372380

@@ -572,10 +580,12 @@ export class ComposedViewsViewlet extends Viewlet {
572580
}
573581

574582
private onViewsUpdated(): TPromise<void> {
575-
if (this.views.length === 1) {
576-
this.views[0].hideHeader();
577-
if (!this.views[0].isExpanded()) {
578-
this.views[0].expand();
583+
if (this.hasSingleView()) {
584+
if (this.views[0]) {
585+
this.views[0].hideHeader();
586+
if (!this.views[0].isExpanded()) {
587+
this.views[0].expand();
588+
}
579589
}
580590
} else {
581591
for (const view of this.views) {
@@ -593,6 +603,17 @@ export class ComposedViewsViewlet extends Viewlet {
593603
return this.setVisible(this.isVisible());
594604
}
595605

606+
private hasSingleView(): boolean {
607+
if (this.views.length > 1) {
608+
return false;
609+
}
610+
if (ViewLocation.getContributedViewLocation(this.location.id) && !this.areExtensionsReady) {
611+
// Checks in cache so that view do not jump. See #29609
612+
return this.viewsStates.size === 1;
613+
}
614+
return true;
615+
}
616+
596617
private getViewDescriptorsFromRegistry(): IViewDescriptor[] {
597618
return ViewsRegistry.getViews(this.location)
598619
.sort((a, b) => {
@@ -610,8 +631,10 @@ export class ComposedViewsViewlet extends Viewlet {
610631
const viewsStates = {};
611632
this.viewsStates.forEach((viewState, id) => {
612633
const view = this.getView(id);
613-
viewState = view ? this.createViewState(view) : viewState;
614-
viewsStates[id] = { size: viewState.size, collapsed: viewState.collapsed, isHidden: viewState.isHidden };
634+
if (view) {
635+
viewState = view ? this.createViewState(view) : viewState;
636+
viewsStates[id] = { size: viewState.size, collapsed: viewState.collapsed, isHidden: viewState.isHidden };
637+
}
615638
});
616639

617640
this.storageService.store(this.viewletStateStorageId, JSON.stringify(viewsStates), this.contextService.hasWorkspace() ? StorageScope.WORKSPACE : StorageScope.GLOBAL);

src/vs/workbench/parts/views/browser/viewsExtensionPoint.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,6 @@ namespace schema {
2222
when?: string;
2323
}
2424

25-
export function parseLocation(value: string): ViewLocation {
26-
switch (value) {
27-
case ViewLocation.Explorer.id: return ViewLocation.Explorer;
28-
}
29-
return void 0;
30-
}
31-
3225
export function isValidViewDescriptors(viewDescriptors: IUserFriendlyViewDescriptor[], collector: ExtensionMessageCollector): boolean {
3326
if (!Array.isArray(viewDescriptors)) {
3427
collector.error(localize('requirearray', "views must be an array"));
@@ -93,7 +86,7 @@ ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyV
9386
return;
9487
}
9588

96-
const location = schema.parseLocation(entry.key);
89+
const location = ViewLocation.getContributedViewLocation(entry.key);
9790
if (!location) {
9891
collector.warn(localize('locationId.invalid', "`{0}` is not a valid view location", entry.key));
9992
return;

src/vs/workbench/parts/views/browser/viewsRegistry.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ export class ViewLocation {
2020
get id(): string {
2121
return this._id;
2222
}
23+
24+
static getContributedViewLocation(value: string): ViewLocation {
25+
switch (value) {
26+
case ViewLocation.Explorer.id: return ViewLocation.Explorer;
27+
}
28+
return void 0;
29+
}
2330
}
2431

2532
export interface IViewDescriptor {

0 commit comments

Comments
 (0)