diff --git a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts index 7dec2cfe039c68f418463412ad4828aa4a6ff453..c0ff3aa3cf9e9839e9db92f0332f75aceabae925 100644 --- a/src/vs/workbench/services/dialogs/browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/fileDialogService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { IWindowService, INativeOpenDialogOptions, OpenDialogOptions, IURIToOpen, FileFilter } from 'vs/platform/windows/common/windows'; +import { IWindowService, INativeOpenDialogOptions, OpenDialogOptions, IURIToOpen, FileFilter, SaveDialogOptions } from 'vs/platform/windows/common/windows'; import { IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -12,7 +12,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import * as resources from 'vs/base/common/resources'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService, optional } from 'vs/platform/instantiation/common/instantiation'; import { RemoteFileDialog } from 'vs/workbench/services/dialogs/browser/remoteFileDialog'; import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; @@ -22,6 +22,10 @@ import { IFileService } from 'vs/platform/files/common/files'; import { isWeb } from 'vs/base/common/platform'; import { IOpenerService } from 'vs/platform/opener/common/opener'; +// TODO@Alex layer breaker +// tslint:disable-next-line: layering import-patterns +import { IElectronService } from 'vs/platform/electron/node/electron'; + export class FileDialogService implements IFileDialogService { _serviceBrand: undefined; @@ -34,7 +38,8 @@ export class FileDialogService implements IFileDialogService { @IInstantiationService private readonly instantiationService: IInstantiationService, @IConfigurationService private readonly configurationService: IConfigurationService, @IFileService private readonly fileService: IFileService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @optional(IElectronService) private readonly electronService: IElectronService ) { } defaultFilePath(schemeFilter = this.getSchemeFilterForWindow()): URI | undefined { @@ -217,15 +222,17 @@ export class FileDialogService implements IFileDialogService { return this.saveRemoteResource(options); } - const result = await this.windowService.showSaveDialog(this.toNativeSaveDialogOptions(options)); - if (result) { - return URI.file(result); + if (this.electronService) { + const result = await this.electronService.showSaveDialog(this.toNativeSaveDialogOptions(options)); + if (result && result.filePath) { + return URI.file(result.filePath); + } } return; } - private toNativeSaveDialogOptions(options: ISaveDialogOptions): Electron.SaveDialogOptions { + private toNativeSaveDialogOptions(options: ISaveDialogOptions): SaveDialogOptions { options.defaultUri = options.defaultUri ? URI.file(options.defaultUri.path) : undefined; return { defaultPath: options.defaultUri && options.defaultUri.fsPath, @@ -245,9 +252,11 @@ export class FileDialogService implements IFileDialogService { return this.saveRemoteResource(options); } - const result = await this.windowService.showSaveDialog(this.toNativeSaveDialogOptions(options)); - if (result) { - return URI.file(result); + if (this.electronService) { + const result = await this.electronService.showSaveDialog(this.toNativeSaveDialogOptions(options)); + if (result && result.filePath) { + return URI.file(result.filePath); + } } return; @@ -289,9 +298,13 @@ export class FileDialogService implements IFileDialogService { newOptions.properties!.push('multiSelections'); } - const result = await this.windowService.showOpenDialog(newOptions); + if (this.electronService) { + const result = await this.electronService.showOpenDialog(newOptions); - return result ? result.map(URI.file) : undefined; + return result && result.filePaths ? result.filePaths.map(URI.file) : undefined; + } + + return; } private pickRemoteResource(options: IOpenDialogOptions): Promise {