From 7b7719158c1c7bfc6be6206a7a006e4b9bb96687 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Thu, 15 Sep 2016 18:38:04 +0200 Subject: [PATCH] install vsix action --- .../extensions/electron-browser/extensions.ts | 1 + .../electron-browser/extensionsActions.ts | 31 ++++++++++++++++++- .../electron-browser/extensionsViewlet.ts | 6 ++-- .../extensionsWorkbenchService.ts | 6 +++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index 8408f2b4c14..d2a89d7b136 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -57,6 +57,7 @@ export interface IExtensionsWorkbenchService { queryLocal(): TPromise; queryGallery(options?: IQueryOptions): TPromise>; canInstall(extension: IExtension): boolean; + install(vsix: string): TPromise; install(extension: IExtension): TPromise; uninstall(extension: IExtension): TPromise; openExtensionsFile(sideBySide?: boolean): TPromise; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index b85d4565d3d..cc8992fd2b6 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -20,7 +20,9 @@ import { ToggleViewletAction } from 'vs/workbench/browser/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Query } from '../common/extensionQuery'; -import { shell } from 'electron'; +import { shell, remote } from 'electron'; + +const dialog = remote.dialog; export class InstallAction extends Action { @@ -565,4 +567,31 @@ export class ConfigureWorkspaceRecommendedExtensionsAction extends Action { public run(event: any): TPromise { return this.extensionsService.openExtensionsFile(); } +} + +export class InstallVSIXAction extends Action { + + static ID = 'workbench.extensions.action.installVSIX'; + static LABEL = localize('installVSIX', "Install from VSIX..."); + + constructor( + id = InstallVSIXAction.ID, + label = InstallVSIXAction.LABEL, + @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService + ) { + super(id, label, 'extension-action install-vsix', true); + } + + run(): TPromise { + const result = dialog.showOpenDialog(remote.getCurrentWindow(), { + filters: [{ name: 'VSIX Extensions', extensions: ['vsix'] }], + properties: ['openFile'] + }); + + if (!result) { + return TPromise.as(null); + } + + return TPromise.join(result.map(vsix => this.extensionsWorkbenchService.install(vsix))); + } } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index 69f948b7580..cc31cf39fbd 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -30,7 +30,7 @@ import { PagedList } from 'vs/base/browser/ui/list/listPaging'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Delegate, Renderer } from './extensionsList'; import { IExtensionsWorkbenchService, IExtension, IExtensionsViewlet, VIEWLET_ID, ExtensionState } from './extensions'; -import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction } from './extensionsActions'; +import { ShowRecommendedExtensionsAction, ShowWorkspaceRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowInstalledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, InstallVSIXAction } from './extensionsActions'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, SortBy, SortOrder, IQueryOptions } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionsInput } from './extensionsInput'; import { Query } from '../common/extensionQuery'; @@ -175,7 +175,9 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort.rating', localize('sort by rating', "Sort By: Rating"), this.onSearchChange, 'rating', undefined), new Separator(), this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort..asc', localize('ascending', "Sort Order: ↑"), this.onSearchChange, undefined, 'asc'), - this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort..desc', localize('descending', "Sort Order: ↓"), this.onSearchChange, undefined, 'desc') + this.instantiationService.createInstance(ChangeSortAction, 'extensions.sort..desc', localize('descending', "Sort Order: ↓"), this.onSearchChange, undefined, 'desc'), + new Separator(), + this.instantiationService.createInstance(InstallVSIXAction, InstallVSIXAction.ID, InstallVSIXAction.LABEL) ]; } diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index e64c761fb34..e0df38f173a 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -367,7 +367,11 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { return !!(extension as Extension).gallery; } - install(extension: IExtension): TPromise { + install(extension: string | IExtension): TPromise { + if (typeof extension === 'string') { + return this.extensionService.install(extension); + } + if (!(extension instanceof Extension)) { return; }