Skip to content

Commit b2176de

Browse files
author
Benjamin Pasero
committed
wire in changes to transition workspaces without window reload (for microsoft#32945)
1 parent 269ae60 commit b2176de

12 files changed

Lines changed: 77 additions & 57 deletions

File tree

src/vs/code/electron-main/windows.ts

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,11 +1294,11 @@ export class WindowsManager implements IWindowsMainService {
12941294
});
12951295
}
12961296

1297-
public saveAndOpenWorkspace(win: CodeWindow, path: string): TPromise<void> {
1297+
public saveAndOpenWorkspace(win: CodeWindow, path: string): TPromise<IWorkspaceIdentifier> {
12981298
return this.workspacesManager.saveAndOpenWorkspace(win, path);
12991299
}
13001300

1301-
public createAndOpenWorkspace(win: CodeWindow, folders?: string[], path?: string): TPromise<void> {
1301+
public createAndOpenWorkspace(win: CodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
13021302
return this.workspacesManager.createAndOpenWorkspace(win, folders, path);
13031303
}
13041304

@@ -1637,15 +1637,15 @@ class WorkspacesManager {
16371637
) {
16381638
}
16391639

1640-
public saveAndOpenWorkspace(window: CodeWindow, path: string): TPromise<void> {
1640+
public saveAndOpenWorkspace(window: CodeWindow, path: string): TPromise<IWorkspaceIdentifier> {
16411641
if (!window || !window.win || window.readyState !== ReadyState.READY || !window.openedWorkspace || !path || !this.isValidTargetWorkspacePath(window, path)) {
16421642
return TPromise.as(null); // return early if the window is not ready or disposed or does not have a workspace
16431643
}
16441644

16451645
return this.doSaveAndOpenWorkspace(window, window.openedWorkspace, path);
16461646
}
16471647

1648-
public createAndOpenWorkspace(window: CodeWindow, folders?: string[], path?: string): TPromise<void> {
1648+
public createAndOpenWorkspace(window: CodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
16491649
if (!window || !window.win || window.readyState !== ReadyState.READY || !this.isValidTargetWorkspacePath(window, path)) {
16501650
return TPromise.as(null); // return early if the window is not ready or disposed
16511651
}
@@ -1688,7 +1688,7 @@ class WorkspacesManager {
16881688
return true; // OK
16891689
}
16901690

1691-
private doSaveAndOpenWorkspace(window: CodeWindow, workspace: IWorkspaceIdentifier, path?: string): TPromise<void> {
1691+
private doSaveAndOpenWorkspace(window: CodeWindow, workspace: IWorkspaceIdentifier, path?: string): TPromise<IWorkspaceIdentifier> {
16921692
let savePromise: TPromise<IWorkspaceIdentifier>;
16931693
if (path) {
16941694
savePromise = this.workspacesService.saveWorkspace(workspace, path);
@@ -1699,26 +1699,18 @@ class WorkspacesManager {
16991699
return savePromise.then(workspace => {
17001700
window.focus();
17011701

1702-
// Only open workspace when the window has not vetoed this
1703-
return this.lifecycleService.unload(window, UnloadReason.RELOAD, workspace).done(veto => {
1704-
if (!veto) {
1705-
1706-
// Register window for backups and migrate current backups over
1707-
let backupPath: string;
1708-
if (window.config && !window.config.extensionDevelopmentPath) {
1709-
backupPath = this.backupService.registerWorkspaceBackupSync(workspace, window.config.backupPath);
1710-
}
1702+
// Register window for backups and migrate current backups over
1703+
let backupPath: string;
1704+
if (!window.config.extensionDevelopmentPath) {
1705+
backupPath = this.backupService.registerWorkspaceBackupSync(workspace, window.config.backupPath);
1706+
}
17111707

1712-
// Craft a new window configuration to use for the transition
1713-
const configuration: IWindowConfiguration = mixin({}, window.config);
1714-
configuration.folderPath = void 0;
1715-
configuration.workspace = workspace;
1716-
configuration.backupPath = backupPath;
1708+
// Update window configuration properly based on transition to workspace
1709+
window.config.folderPath = void 0;
1710+
window.config.workspace = workspace;
1711+
window.config.backupPath = backupPath;
17171712

1718-
// Reload
1719-
window.reload(configuration);
1720-
}
1721-
});
1713+
return workspace;
17221714
});
17231715
}
17241716

src/vs/platform/windows/common/windows.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ export interface IWindowsService {
4343
toggleDevTools(windowId: number): TPromise<void>;
4444
closeWorkspace(windowId: number): TPromise<void>;
4545
openWorkspace(windowId: number): TPromise<void>;
46-
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<void>;
47-
saveAndOpenWorkspace(windowId: number, path: string): TPromise<void>;
46+
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
47+
saveAndOpenWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier>;
4848
toggleFullScreen(windowId: number): TPromise<void>;
4949
setRepresentedFilename(windowId: number, fileName: string): TPromise<void>;
5050
addRecentlyOpened(files: string[]): TPromise<void>;
@@ -111,8 +111,8 @@ export interface IWindowService {
111111
closeWorkspace(): TPromise<void>;
112112
openWorkspace(): TPromise<void>;
113113
updateTouchBar(items: ICommandAction[][]): TPromise<void>;
114-
createAndOpenWorkspace(folders?: string[], path?: string): TPromise<void>;
115-
saveAndOpenWorkspace(path: string): TPromise<void>;
114+
createAndOpenWorkspace(folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
115+
saveAndOpenWorkspace(path: string): TPromise<IWorkspaceIdentifier>;
116116
toggleFullScreen(): TPromise<void>;
117117
setRepresentedFilename(fileName: string): TPromise<void>;
118118
getRecentlyOpened(): TPromise<IRecentlyOpened>;

src/vs/platform/windows/common/windowsIpc.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ export interface IWindowsChannel extends IChannel {
2424
call(command: 'toggleDevTools', arg: number): TPromise<void>;
2525
call(command: 'closeWorkspace', arg: number): TPromise<void>;
2626
call(command: 'openWorkspace', arg: number): TPromise<void>;
27-
call(command: 'createAndOpenWorkspace', arg: [number, string[], string]): TPromise<void>;
28-
call(command: 'saveAndOpenWorkspace', arg: [number, string]): TPromise<void>;
27+
call(command: 'createAndOpenWorkspace', arg: [number, string[], string]): TPromise<IWorkspaceIdentifier>;
28+
call(command: 'saveAndOpenWorkspace', arg: [number, string]): TPromise<IWorkspaceIdentifier>;
2929
call(command: 'toggleFullScreen', arg: number): TPromise<void>;
3030
call(command: 'setRepresentedFilename', arg: [number, string]): TPromise<void>;
3131
call(command: 'addRecentlyOpened', arg: string[]): TPromise<void>;
@@ -174,11 +174,11 @@ export class WindowsChannelClient implements IWindowsService {
174174
return this.channel.call('openWorkspace', windowId);
175175
}
176176

177-
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<void> {
177+
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
178178
return this.channel.call('createAndOpenWorkspace', [windowId, folders, path]);
179179
}
180180

181-
saveAndOpenWorkspace(windowId: number, path: string): TPromise<void> {
181+
saveAndOpenWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier> {
182182
return this.channel.call('saveAndOpenWorkspace', [windowId, path]);
183183
}
184184

src/vs/platform/windows/electron-browser/windowService.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { IWindowService, IWindowsService, INativeOpenDialogOptions } from 'vs/pl
1111
import { remote } from 'electron';
1212
import { IRecentlyOpened } from 'vs/platform/history/common/history';
1313
import { ICommandAction } from 'vs/platform/actions/common/actions';
14+
import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces';
1415

1516
export class WindowService implements IWindowService {
1617

@@ -69,11 +70,11 @@ export class WindowService implements IWindowService {
6970
return this.windowsService.openWorkspace(this.windowId);
7071
}
7172

72-
createAndOpenWorkspace(folders?: string[], path?: string): TPromise<void> {
73+
createAndOpenWorkspace(folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
7374
return this.windowsService.createAndOpenWorkspace(this.windowId, folders, path);
7475
}
7576

76-
saveAndOpenWorkspace(path: string): TPromise<void> {
77+
saveAndOpenWorkspace(path: string): TPromise<IWorkspaceIdentifier> {
7778
return this.windowsService.saveAndOpenWorkspace(this.windowId, path);
7879
}
7980

src/vs/platform/windows/electron-main/windows.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ export interface IWindowsMainService {
6161
ready(initialUserEnv: IProcessEnvironment): void;
6262
reload(win: ICodeWindow, cli?: ParsedArgs): void;
6363
openWorkspace(win?: ICodeWindow): void;
64-
createAndOpenWorkspace(win: ICodeWindow, folders?: string[], path?: string): void;
65-
saveAndOpenWorkspace(win: ICodeWindow, path: string): void;
64+
createAndOpenWorkspace(win: ICodeWindow, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier>;
65+
saveAndOpenWorkspace(win: ICodeWindow, path: string): TPromise<IWorkspaceIdentifier>;
6666
closeWorkspace(win: ICodeWindow): void;
6767
open(openConfig: IOpenConfiguration): ICodeWindow[];
6868
openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void;

src/vs/platform/windows/electron-main/windowsService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,21 +135,21 @@ export class WindowsService implements IWindowsService, IDisposable {
135135
return TPromise.as(null);
136136
}
137137

138-
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<void> {
138+
createAndOpenWorkspace(windowId: number, folders?: string[], path?: string): TPromise<IWorkspaceIdentifier> {
139139
const codeWindow = this.windowsMainService.getWindowById(windowId);
140140

141141
if (codeWindow) {
142-
this.windowsMainService.createAndOpenWorkspace(codeWindow, folders, path);
142+
return this.windowsMainService.createAndOpenWorkspace(codeWindow, folders, path);
143143
}
144144

145145
return TPromise.as(null);
146146
}
147147

148-
saveAndOpenWorkspace(windowId: number, path: string): TPromise<void> {
148+
saveAndOpenWorkspace(windowId: number, path: string): TPromise<IWorkspaceIdentifier> {
149149
const codeWindow = this.windowsMainService.getWindowById(windowId);
150150

151151
if (codeWindow) {
152-
this.windowsMainService.saveAndOpenWorkspace(codeWindow, path);
152+
return this.windowsMainService.saveAndOpenWorkspace(codeWindow, path);
153153
}
154154

155155
return TPromise.as(null);

src/vs/workbench/browser/actions/workspaceActions.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ import { TPromise } from 'vs/base/common/winjs.base';
99
import { Action } from 'vs/base/common/actions';
1010
import nls = require('vs/nls');
1111
import { distinct } from 'vs/base/common/arrays';
12-
import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows';
12+
import { IWindowService } from 'vs/platform/windows/common/windows';
1313
import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
1414
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
1515
import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing';
1616
import URI from 'vs/base/common/uri';
1717
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
1818
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
19-
import { IWorkspacesService, WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces';
19+
import { WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces';
2020
import { IMessageService, Severity } from 'vs/platform/message/common/message';
2121
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
2222
import { isLinux } from 'vs/base/common/platform';
@@ -113,10 +113,12 @@ export class AddRootFolderAction extends BaseWorkspacesAction {
113113
if (!folders || !folders.length) {
114114
return TPromise.as(null);
115115
}
116+
116117
return this.workspaceEditingService.addFolders(folders.map(folder => URI.file(folder))).then(() => {
117118
return this.viewletService.openViewlet(this.viewletService.getDefaultViewletId(), true);
118119
});
119120
}
121+
120122
return this.instantiationService.createInstance(NewWorkspaceAction, NewWorkspaceAction.ID, NewWorkspaceAction.LABEL, this.contextService.getWorkspace().folders.map(folder => folder.uri)).run();
121123
}
122124
}
@@ -133,8 +135,7 @@ class NewWorkspaceAction extends BaseWorkspacesAction {
133135
@IWindowService windowService: IWindowService,
134136
@IWorkspaceContextService contextService: IWorkspaceContextService,
135137
@IEnvironmentService environmentService: IEnvironmentService,
136-
@IWorkspacesService protected workspacesService: IWorkspacesService,
137-
@IWindowsService protected windowsService: IWindowsService,
138+
@IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService
138139
) {
139140
super(id, label, windowService, environmentService, contextService);
140141
}
@@ -151,7 +152,7 @@ class NewWorkspaceAction extends BaseWorkspacesAction {
151152
private createWorkspace(folders: URI[]): TPromise<void> {
152153
const workspaceFolders = distinct(folders.map(folder => folder.fsPath), folder => isLinux ? folder : folder.toLowerCase());
153154

154-
return this.windowService.createAndOpenWorkspace(workspaceFolders);
155+
return this.workspaceEditingService.createAndOpenWorkspace(workspaceFolders);
155156
}
156157
}
157158

@@ -185,9 +186,8 @@ export class SaveWorkspaceAsAction extends BaseWorkspacesAction {
185186
@IWindowService windowService: IWindowService,
186187
@IEnvironmentService environmentService: IEnvironmentService,
187188
@IWorkspaceContextService contextService: IWorkspaceContextService,
188-
@IWorkspacesService protected workspacesService: IWorkspacesService,
189-
@IWindowsService private windowsService: IWindowsService,
190-
@IMessageService private messageService: IMessageService
189+
@IMessageService private messageService: IMessageService,
190+
@IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService
191191
) {
192192
super(id, label, windowService, environmentService, contextService);
193193
}
@@ -196,6 +196,7 @@ export class SaveWorkspaceAsAction extends BaseWorkspacesAction {
196196
const workspaceState = this.contextService.getWorkbenchState();
197197
if (workspaceState === WorkbenchState.EMPTY) {
198198
this.messageService.show(Severity.Info, nls.localize('saveEmptyWorkspaceNotSupported', "Please open a workspace first to save."));
199+
199200
return TPromise.as(null);
200201
}
201202

@@ -205,10 +206,10 @@ export class SaveWorkspaceAsAction extends BaseWorkspacesAction {
205206

206207
case WorkbenchState.FOLDER:
207208
const workspaceFolders = this.contextService.getWorkspace().folders.map(root => root.uri.fsPath);
208-
return this.windowService.createAndOpenWorkspace(workspaceFolders, configPath);
209+
return this.workspaceEditingService.createAndOpenWorkspace(workspaceFolders, configPath);
209210

210211
case WorkbenchState.WORKSPACE:
211-
return this.windowService.saveAndOpenWorkspace(configPath);
212+
return this.workspaceEditingService.saveAndOpenWorkspace(configPath);
212213
}
213214
}
214215

src/vs/workbench/electron-browser/window.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ export class ElectronWindow extends Themable {
390390
workspaceFolders.push(...request.foldersToAdd.map(folderToAdd => URI.file(folderToAdd.filePath)));
391391

392392
// Create workspace and open (ensure no duplicates)
393-
this.windowService.createAndOpenWorkspace(arrays.distinct(workspaceFolders.map(folder => folder.fsPath), folder => platform.isLinux ? folder : folder.toLowerCase()));
393+
this.workspaceEditingService.createAndOpenWorkspace(arrays.distinct(workspaceFolders.map(folder => folder.fsPath), folder => platform.isLinux ? folder : folder.toLowerCase()));
394394
}
395395
}
396396

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,8 @@ export class FileDragAndDrop extends SimpleFileResourceDragAndDrop {
906906
const currentFolders = this.contextService.getWorkspace().folders.map(folder => folder.uri);
907907
const newRoots = [...currentFolders, ...folders];
908908

909-
return this.windowService.createAndOpenWorkspace(distinct(newRoots.map(root => root.fsPath)));
909+
// Create and open workspace
910+
return this.workspaceEditingService.createAndOpenWorkspace(distinct(newRoots.map(root => root.fsPath)));
910911
}
911912
}
912913

src/vs/workbench/services/workspace/common/workspaceEditing.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ export interface IWorkspaceEditingService {
2424
* remove folders from the existing workspace
2525
*/
2626
removeFolders(folders: URI[]): TPromise<void>;
27+
28+
/**
29+
* creates a new workspace with the provided folders and opens it. if path is provided
30+
* the workspace will be saved into that location.
31+
*/
32+
createAndOpenWorkspace(folders?: string[], path?: string): TPromise<void>;
33+
34+
/**
35+
* saves the workspace to the provided path and opens it. requires a workspace to be opened.
36+
*/
37+
saveAndOpenWorkspace(path: string): TPromise<void>;
2738
}
2839

2940
export const IWorkspaceMigrationService = createDecorator<IWorkspaceMigrationService>('workspaceMigrationService');

0 commit comments

Comments
 (0)