Skip to content

Commit 8d18e6c

Browse files
committed
Merge branch 'joao/explorer-welcome-view'
2 parents c02b8d1 + c2902aa commit 8d18e6c

File tree

3 files changed

+32
-65
lines changed

3 files changed

+32
-65
lines changed

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,9 @@ export abstract class ViewPane extends Pane implements IView {
307307
}
308308

309309
focus(): void {
310-
if (this.element) {
310+
if (this.shouldShowWelcome()) {
311+
this.viewWelcomeContainer.focus();
312+
} else if (this.element) {
311313
this.element.focus();
312314
this._onDidFocus.fire();
313315
}

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

+18-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
1818
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
1919
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2020
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection';
21-
import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey';
21+
import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
2222
import { IThemeService } from 'vs/platform/theme/common/themeService';
2323
import { IViewsRegistry, IViewDescriptor, Extensions, ViewContainer, IViewContainersRegistry, ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views';
2424
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
@@ -34,6 +34,7 @@ import { KeyChord, KeyMod, KeyCode } from 'vs/base/common/keyCodes';
3434
import { Registry } from 'vs/platform/registry/common/platform';
3535
import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress';
3636
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
37+
import { WorkbenchStateContext, RemoteNameContext, IsWebContext } from 'vs/workbench/browser/contextkeys';
3738

3839
export class ExplorerViewletViewsContribution extends Disposable implements IWorkbenchContribution {
3940

@@ -61,6 +62,22 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor
6162

6263
private registerViews(): void {
6364
const viewsRegistry = Registry.as<IViewsRegistry>(Extensions.ViewsRegistry);
65+
66+
viewsRegistry.registerViewWelcomeContent(EmptyView.ID, {
67+
content: localize('noWorkspaceHelp', "You have not yet added a folder to the workspace.\n[Add Folder](command:workbench.action.addRootFolder)"),
68+
when: WorkbenchStateContext.isEqualTo('workspace')
69+
});
70+
71+
viewsRegistry.registerViewWelcomeContent(EmptyView.ID, {
72+
content: localize('remoteNoFolderHelp', "Connected to remote.\n[Open Folder](command:workbench.action.files.openFolder)"),
73+
when: ContextKeyExpr.and(WorkbenchStateContext.notEqualsTo('workspace'), RemoteNameContext.notEqualsTo(''), IsWebContext.toNegated())
74+
});
75+
76+
viewsRegistry.registerViewWelcomeContent(EmptyView.ID, {
77+
content: localize('noFolderHelp', "You have not yet opened a folder.\n[Open Folder](command:workbench.action.files.openFolder)"),
78+
when: ContextKeyExpr.or(ContextKeyExpr.and(WorkbenchStateContext.notEqualsTo('workspace'), RemoteNameContext.isEqualTo('')), ContextKeyExpr.and(WorkbenchStateContext.notEqualsTo('workspace'), IsWebContext))
79+
});
80+
6481
const viewDescriptors = viewsRegistry.getViews(VIEW_CONTAINER);
6582

6683
let viewDescriptorsToRegister: IViewDescriptor[] = [];

src/vs/workbench/contrib/files/browser/views/emptyView.ts

+11-63
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,8 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as nls from 'vs/nls';
7-
import * as errors from 'vs/base/common/errors';
8-
import * as DOM from 'vs/base/browser/dom';
9-
import { Button } from 'vs/base/browser/ui/button/button';
107
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
118
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
12-
import { OpenFolderAction, AddRootFolderAction } from 'vs/workbench/browser/actions/workspaceActions';
13-
import { attachButtonStyler } from 'vs/platform/theme/common/styler';
149
import { IThemeService } from 'vs/platform/theme/common/themeService';
1510
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
1611
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
@@ -20,23 +15,16 @@ import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/vie
2015
import { ResourcesDropHandler, DragAndDropObserver } from 'vs/workbench/browser/dnd';
2116
import { listDropBackground } from 'vs/platform/theme/common/colorRegistry';
2217
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
23-
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
2418
import { ILabelService } from 'vs/platform/label/common/label';
25-
import { Schemas } from 'vs/base/common/network';
26-
import { isWeb } from 'vs/base/common/platform';
2719
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
2820
import { IViewDescriptorService } from 'vs/workbench/common/views';
2921
import { IOpenerService } from 'vs/platform/opener/common/opener';
30-
import { ActionRunner } from 'vs/base/common/actions';
3122

3223
export class EmptyView extends ViewPane {
3324

3425
static readonly ID: string = 'workbench.explorer.emptyView';
3526
static readonly NAME = nls.localize('noWorkspace', "No Folder Opened");
3627

37-
private button!: Button;
38-
private messageElement!: HTMLElement;
39-
4028
constructor(
4129
options: IViewletViewOptions,
4230
@IThemeService themeService: IThemeService,
@@ -46,53 +34,31 @@ export class EmptyView extends ViewPane {
4634
@IContextMenuService contextMenuService: IContextMenuService,
4735
@IWorkspaceContextService private readonly contextService: IWorkspaceContextService,
4836
@IConfigurationService configurationService: IConfigurationService,
49-
@IWorkbenchEnvironmentService private environmentService: IWorkbenchEnvironmentService,
5037
@ILabelService private labelService: ILabelService,
5138
@IContextKeyService contextKeyService: IContextKeyService,
5239
@IOpenerService openerService: IOpenerService
5340
) {
5441
super({ ...(options as IViewPaneOptions), ariaHeaderLabel: nls.localize('explorerSection', "Explorer Section: No Folder Opened") }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService);
55-
this._register(this.contextService.onDidChangeWorkbenchState(() => this.setLabels()));
56-
this._register(this.labelService.onDidChangeFormatters(() => this.setLabels()));
42+
43+
this._register(this.contextService.onDidChangeWorkbenchState(() => this.refreshTitle()));
44+
this._register(this.labelService.onDidChangeFormatters(() => this.refreshTitle()));
45+
}
46+
47+
shouldShowWelcome(): boolean {
48+
return true;
5749
}
5850

5951
protected renderBody(container: HTMLElement): void {
6052
super.renderBody(container);
6153

62-
DOM.addClass(container, 'explorer-empty-view');
63-
container.tabIndex = 0;
64-
65-
const messageContainer = document.createElement('div');
66-
DOM.addClass(messageContainer, 'section');
67-
container.appendChild(messageContainer);
68-
69-
this.messageElement = document.createElement('p');
70-
messageContainer.appendChild(this.messageElement);
71-
72-
this.button = new Button(messageContainer);
73-
attachButtonStyler(this.button, this.themeService);
74-
75-
const actionRunner = new ActionRunner();
76-
this._register(this.button.onDidClick(() => {
77-
const action = this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE
78-
? this.instantiationService.createInstance(AddRootFolderAction, AddRootFolderAction.ID, AddRootFolderAction.LABEL)
79-
: this.instantiationService.createInstance(OpenFolderAction, OpenFolderAction.ID, OpenFolderAction.LABEL);
80-
actionRunner.run(action).then(() => {
81-
action.dispose();
82-
}, err => {
83-
action.dispose();
84-
errors.onUnexpectedError(err);
85-
});
86-
}));
87-
8854
this._register(new DragAndDropObserver(container, {
8955
onDrop: e => {
9056
const color = this.themeService.getTheme().getColor(SIDE_BAR_BACKGROUND);
9157
container.style.backgroundColor = color ? color.toString() : '';
9258
const dropHandler = this.instantiationService.createInstance(ResourcesDropHandler, { allowWorkspaceOpen: true });
93-
dropHandler.handleDrop(e, () => undefined, targetGroup => undefined);
59+
dropHandler.handleDrop(e, () => undefined, () => undefined);
9460
},
95-
onDragEnter: (e) => {
61+
onDragEnter: () => {
9662
const color = this.themeService.getTheme().getColor(listDropBackground);
9763
container.style.backgroundColor = color ? color.toString() : '';
9864
},
@@ -111,36 +77,18 @@ export class EmptyView extends ViewPane {
11177
}
11278
}));
11379

114-
this.setLabels();
80+
this.refreshTitle();
11581
}
11682

117-
private setLabels(): void {
83+
private refreshTitle(): void {
11884
if (this.contextService.getWorkbenchState() === WorkbenchState.WORKSPACE) {
119-
this.messageElement.textContent = nls.localize('noWorkspaceHelp', "You have not yet added a folder to the workspace.");
120-
if (this.button) {
121-
this.button.label = nls.localize('addFolder', "Add Folder");
122-
}
12385
this.updateTitle(EmptyView.NAME);
12486
} else {
125-
if (this.environmentService.configuration.remoteAuthority && !isWeb) {
126-
const hostLabel = this.labelService.getHostLabel(Schemas.vscodeRemote, this.environmentService.configuration.remoteAuthority);
127-
this.messageElement.textContent = hostLabel ? nls.localize('remoteNoFolderHelp', "Connected to {0}", hostLabel) : nls.localize('connecting', "Connecting...");
128-
} else {
129-
this.messageElement.textContent = nls.localize('noFolderHelp', "You have not yet opened a folder.");
130-
}
131-
if (this.button) {
132-
this.button.label = nls.localize('openFolder', "Open Folder");
133-
}
13487
this.updateTitle(this.title);
13588
}
13689
}
13790

13891
layoutBody(_size: number): void {
13992
// no-op
14093
}
141-
142-
focus(): void {
143-
this.button.element.focus();
144-
}
145-
14694
}

0 commit comments

Comments
 (0)