diff --git a/src/sql/parts/query/common/resultSerializer.ts b/src/sql/parts/query/common/resultSerializer.ts index e099014701..aad83e0413 100644 --- a/src/sql/parts/query/common/resultSerializer.ts +++ b/src/sql/parts/query/common/resultSerializer.ts @@ -30,6 +30,8 @@ import { ISlickRange } from 'angular2-slickgrid'; import * as path from 'path'; import Severity from 'vs/base/common/severity'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { getBaseLabel } from 'vs/base/common/labels'; +import { ShowFileInFolderAction, OpenFileInFolderAction } from 'sql/workbench/common/workspaceActions'; let prevSavePath: string; @@ -289,6 +291,31 @@ export class ResultSerializer { return (selection && !((selection.fromCell === selection.toCell) && (selection.fromRow === selection.toRow))); } + + private promptFileSavedNotification(savedFilePath: string) { + let label = getBaseLabel(paths.dirname(savedFilePath)); + + this._notificationService.prompt( + Severity.Info, + LocalizedConstants.msgSaveSucceeded + savedFilePath, + [{ + label: nls.localize('openLocation', "Open file location"), + run: () => { + let action = new ShowFileInFolderAction(savedFilePath, label || paths.sep, this._windowsService); + action.run(); + action.dispose(); + } + }, { + label: nls.localize('openFile', "Open file"), + run: () => { + let action = new OpenFileInFolderAction(savedFilePath, label || paths.sep, this._windowsService); + action.run(); + action.dispose(); + } + }] + ); + } + /** * Send request to sql tools service to save a result set */ @@ -306,10 +333,7 @@ export class ResultSerializer { }); this.logToOutputChannel(LocalizedConstants.msgSaveFailed + result.messages); } else { - this._notificationService.notify({ - severity: Severity.Info, - message: LocalizedConstants.msgSaveSucceeded + this._filePath - }); + this.promptFileSavedNotification(this._filePath); this.logToOutputChannel(LocalizedConstants.msgSaveSucceeded + filePath); this.openSavedFile(this._filePath, format); } @@ -329,13 +353,7 @@ export class ResultSerializer { * Open the saved file in a new vscode editor pane */ private openSavedFile(filePath: string, format: string): void { - if (format === SaveFormat.EXCEL) { - // This will not open in VSCode as it's treated as binary. Use the native file opener instead - // Note: must use filePath here, URI does not open correctly - // TODO see if there is an alternative opener that includes error handling - let fileUri = URI.from({ scheme: PathUtilities.FILE_SCHEMA, path: filePath }); - this._windowsService.openExternal(fileUri.toString()); - } else { + if (format !== SaveFormat.EXCEL) { let uri = URI.file(filePath); this._editorService.openEditor({ resource: uri }).then((result) => { diff --git a/src/sql/parts/query/services/queryEditorService.ts b/src/sql/parts/query/services/queryEditorService.ts index d8198ed497..9d5d1335ef 100644 --- a/src/sql/parts/query/services/queryEditorService.ts +++ b/src/sql/parts/query/services/queryEditorService.ts @@ -62,7 +62,7 @@ export class QueryEditorService implements IQueryEditorService { @IWorkbenchEditorService private _editorService: IWorkbenchEditorService, @IEditorGroupService private _editorGroupService: IEditorGroupService, @INotificationService private _notificationService: INotificationService, - @IConnectionManagementService private _connectionManagementService: IConnectionManagementService, + @IConnectionManagementService private _connectionManagementService: IConnectionManagementService ) { QueryEditorService.editorService = _editorService; QueryEditorService.instantiationService = _instantiationService; diff --git a/src/sql/workbench/common/workspaceActions.ts b/src/sql/workbench/common/workspaceActions.ts new file mode 100644 index 0000000000..945f4985d8 --- /dev/null +++ b/src/sql/workbench/common/workspaceActions.ts @@ -0,0 +1,25 @@ +import { TPromise } from 'vs/base/common/winjs.base'; +import { Action } from 'vs/base/common/actions'; +import { IWindowsService } from 'vs/platform/windows/common/windows'; + +export class ShowFileInFolderAction extends Action { + + constructor(private path: string, label: string, private windowsService: IWindowsService) { + super('showItemInFolder.action.id', label); + } + + run(): TPromise { + return this.windowsService.showItemInFolder(this.path); + } +} + +export class OpenFileInFolderAction extends Action { + + constructor(private path: string, label: string, private windowsService: IWindowsService) { + super('showItemInFolder.action.id', label); + } + + run() { + return this.windowsService.openExternal(this.path); + } +} \ No newline at end of file