extensionsViewlet.ts 4.4 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

J
Joao Moreno 已提交
8
import 'vs/css!./media/extensionsViewlet';
J
Joao Moreno 已提交
9 10
import { localize } from 'vs/nls';
import { ThrottledDelayer, always } from 'vs/base/common/async';
J
Joao Moreno 已提交
11 12 13 14
import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { Builder, Dimension } from 'vs/base/browser/builder';
import { Viewlet } from 'vs/workbench/browser/viewlet';
J
Joao Moreno 已提交
15
import { append, emmet as $ } from 'vs/base/browser/dom';
J
Joao Moreno 已提交
16
import { PagedModel, SinglePagePagedModel } from 'vs/base/common/paging';
J
Joao Moreno 已提交
17
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
J
Joao Moreno 已提交
18 19
import { PagedList } from 'vs/base/browser/ui/list/listPaging';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
J
Joao Moreno 已提交
20
import { Delegate, Renderer } from './extensionsList';
J
Joao Moreno 已提交
21
import { IExtensionManagementService, IExtensionGalleryService, ILocalExtension, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement';
J
Joao Moreno 已提交
22
import { ExtensionsInput } from '../common/extensionsInput';
J
Joao Moreno 已提交
23
import { IProgressService } from 'vs/platform/progress/common/progress';
J
Joao Moreno 已提交
24
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
J
Joao Moreno 已提交
25

J
Joao Moreno 已提交
26 27 28 29
export class ExtensionsViewlet extends Viewlet {

	static ID: string = 'workbench.viewlet.extensions';

J
Joao Moreno 已提交
30
	private disposables: IDisposable[];
J
Joao Moreno 已提交
31
	private searchDelayer: ThrottledDelayer<any>;
J
Joao Moreno 已提交
32
	private root: HTMLElement;
J
Joao Moreno 已提交
33 34
	private searchBox: HTMLInputElement;
	private extensionsBox: HTMLElement;
J
Joao Moreno 已提交
35
	private list: PagedList<ILocalExtension | IGalleryExtension>;
J
Joao Moreno 已提交
36

J
Joao Moreno 已提交
37 38
	constructor(
		@ITelemetryService telemetryService: ITelemetryService,
39
		@IExtensionGalleryService private galleryService: IExtensionGalleryService,
J
Joao Moreno 已提交
40
		@IExtensionManagementService private extensionService: IExtensionManagementService,
J
Joao Moreno 已提交
41
		@IProgressService private progressService: IProgressService,
J
Joao Moreno 已提交
42 43
		@IInstantiationService private instantiationService: IInstantiationService,
		@IWorkbenchEditorService private editorService: IWorkbenchEditorService
J
Joao Moreno 已提交
44
	) {
J
Joao Moreno 已提交
45
		super(ExtensionsViewlet.ID, telemetryService);
J
Joao Moreno 已提交
46
		this.searchDelayer = new ThrottledDelayer(500);
J
Joao Moreno 已提交
47
		this.disposables = [];
J
Joao Moreno 已提交
48 49 50 51
	}

	create(parent: Builder): TPromise<void> {
		super.create(parent);
J
Joao Moreno 已提交
52 53 54
		parent.addClass('extensions-viewlet');
		this.root = parent.getHTMLElement();

J
Joao Moreno 已提交
55 56 57 58
		const header = append(this.root, $('.header'));

		this.searchBox = append(header, $<HTMLInputElement>('input.search-box'));
		this.searchBox.placeholder = localize('searchExtensions', "Search Extensions in Marketplace");
J
Joao Moreno 已提交
59 60 61 62 63
		this.extensionsBox = append(this.root, $('.extensions'));

		const delegate = new Delegate();
		const renderer = this.instantiationService.createInstance(Renderer);
		this.list = new PagedList(this.extensionsBox, delegate, [renderer]);
J
Joao Moreno 已提交
64

J
Joao Moreno 已提交
65
		this.searchBox.oninput = () => this.triggerSearch(this.searchBox.value);
J
Joao Moreno 已提交
66

J
Joao Moreno 已提交
67
		this.list.onSelectionChange(e => {
J
Joao Moreno 已提交
68
			const [extension] = e.elements;
J
Joao Moreno 已提交
69

J
Joao Moreno 已提交
70
			if (!extension) {
J
Joao Moreno 已提交
71 72 73
				return;
			}

J
Joao Moreno 已提交
74
			return this.editorService.openEditor(new ExtensionsInput(extension));
J
Joao Moreno 已提交
75 76
		}, null, this.disposables);

J
Joao Moreno 已提交
77 78 79 80
		return TPromise.as(null);
	}

	setVisible(visible:boolean): TPromise<void> {
J
Joao Moreno 已提交
81 82 83 84 85 86
		return super.setVisible(visible).then(() => {
			if (visible) {
				this.searchBox.value = '';
				this.triggerSearch('', 0);
			}
		});
J
Joao Moreno 已提交
87 88 89
	}

	focus(): void {
J
Joao Moreno 已提交
90
		this.searchBox.focus();
J
Joao Moreno 已提交
91 92
	}

J
Joao Moreno 已提交
93
	layout({ height }: Dimension):void {
J
Joao Moreno 已提交
94
		this.list.layout(height - 38);
J
Joao Moreno 已提交
95 96 97
	}

	private triggerSearch(text: string = '', delay = 500): void {
J
Joao Moreno 已提交
98
		this.searchDelayer.trigger(() => this.doSearch(text), text ? delay : 0);
J
Joao Moreno 已提交
99 100 101
	}

	private doSearch(text: string = ''): TPromise<any> {
J
Joao Moreno 已提交
102
		const progressRunner = this.progressService.show(true);
J
Joao Moreno 已提交
103
		let promise: TPromise<PagedModel<ILocalExtension | IGalleryExtension>>;
J
Joao Moreno 已提交
104 105 106 107 108 109 110 111 112 113

		if (text) {
			promise = this.galleryService.query({ text })
				.then(result => new PagedModel(result));
		} else {
			promise = this.extensionService.getInstalled()
				.then(result => new SinglePagePagedModel(result));
		}

		return always(promise, () => progressRunner.done())
J
Joao Moreno 已提交
114
			.then(model => this.list.model = model);
J
Joao Moreno 已提交
115 116 117
	}

	dispose(): void {
J
Joao Moreno 已提交
118
		this.disposables = dispose(this.disposables);
J
Joao Moreno 已提交
119 120 121
		super.dispose();
	}
}