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

'use strict';

import { append, emmet as $, addClass, removeClass } from 'vs/base/browser/dom';
J
Joao Moreno 已提交
9 10
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar';
J
Joao Moreno 已提交
11 12 13
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IDelegate } from 'vs/base/browser/ui/list/list';
import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging';
14
import { IExtension } from './extensions';
J
Joao Moreno 已提交
15
import { CombinedInstallAction, UpdateAction } from './extensionsActions';
16
import { Label, RatingsWidget, InstallWidget } from './extensionsWidgets';
J
Joao Moreno 已提交
17 18

export interface ITemplateData {
J
Joao Moreno 已提交
19
	extension: IExtension;
J
Joao Moreno 已提交
20
	element: HTMLElement;
J
Joao Moreno 已提交
21
	icon: HTMLElement;
J
Joao Moreno 已提交
22 23
	name: HTMLElement;
	version: HTMLElement;
24 25
	installCount: HTMLElement;
	ratings: HTMLElement;
J
Joao Moreno 已提交
26 27
	author: HTMLElement;
	description: HTMLElement;
J
Joao Moreno 已提交
28 29
	actionbar: ActionBar;
	disposables: IDisposable[];
J
Joao Moreno 已提交
30 31
}

J
Joao Moreno 已提交
32
export class Delegate implements IDelegate<IExtension> {
J
Joao Moreno 已提交
33
	getHeight() { return 62; }
J
Joao Moreno 已提交
34 35 36
	getTemplateId() { return 'extension'; }
}

J
Joao Moreno 已提交
37
const actionOptions = { icon: true, label: true };
J
Joao Moreno 已提交
38

J
Joao Moreno 已提交
39
export class Renderer implements IPagedRenderer<IExtension, ITemplateData> {
J
Joao Moreno 已提交
40 41 42 43

	private _templates: ITemplateData[];
	get templates(): ITemplateData[] { return this._templates; }

44
	constructor(@IInstantiationService private instantiationService: IInstantiationService) {
J
Joao Moreno 已提交
45 46 47 48 49 50
		this._templates = [];
	}

	get templateId() { return 'extension'; }

	renderTemplate(root: HTMLElement): ITemplateData {
J
Joao Moreno 已提交
51
		const element = append(root, $('.extension'));
J
Joao Moreno 已提交
52
		const icon = append(element, $('.icon'));
J
Joao Moreno 已提交
53 54
		const details = append(element, $('.details'));
		const header = append(details, $('.header'));
55
		const name = append(header, $('span.name'));
J
Joao Moreno 已提交
56
		const version = append(header, $('span.version.ellipsis'));
57 58
		const ratings = append(header, $('span.ratings'));
		const installCount = append(header, $('span.install-count'));
J
Joao Moreno 已提交
59
		const description = append(details, $('.description.ellipsis'));
J
Joao Moreno 已提交
60
		const footer = append(details, $('.footer'));
61
		const author = append(footer, $('.author.ellipsis'));
J
Joao Moreno 已提交
62
		const actionbar = new ActionBar(footer, { animated: false });
J
Joao Moreno 已提交
63
		const disposables = [];
J
Joao Moreno 已提交
64

65
		const result = { extension: null, element, icon, name, version, installCount, ratings, author, description, actionbar, disposables };
J
Joao Moreno 已提交
66 67 68 69 70
		this._templates.push(result);
		return result;
	}

	renderPlaceholder(index: number, data: ITemplateData): void {
J
Joao Moreno 已提交
71 72
		data.disposables = dispose(data.disposables);

J
Joao Moreno 已提交
73 74
		addClass(data.element, 'loading');
		data.extension = null;
J
Joao Moreno 已提交
75
		data.icon.style.backgroundImage = '';
J
Joao Moreno 已提交
76 77 78 79
		data.name.textContent = '';
		data.version.textContent = '';
		data.author.textContent = '';
		data.description.textContent = '';
J
Joao Moreno 已提交
80
		data.actionbar.clear();
J
Joao Moreno 已提交
81 82
	}

J
Joao Moreno 已提交
83
	renderElement(extension: IExtension, index: number, data: ITemplateData): void {
J
Joao Moreno 已提交
84
		data.disposables = dispose(data.disposables);
J
Joao Moreno 已提交
85

J
Joao Moreno 已提交
86 87
		removeClass(data.element, 'loading');
		data.extension = extension;
J
Joao Moreno 已提交
88
		data.icon.style.backgroundImage = `url("${ extension.iconUrl }")`;
J
Joao Moreno 已提交
89 90
		data.name.textContent = extension.displayName;
		data.author.textContent = extension.publisherDisplayName;
J
Joao Moreno 已提交
91
		data.description.textContent = extension.description;
J
Joao Moreno 已提交
92

93
		const version = this.instantiationService.createInstance(Label, data.version, extension, e => e.version);
94 95 96
		const ratings = this.instantiationService.createInstance(RatingsWidget, data.ratings, extension, { small: true });
		const installCount = this.instantiationService.createInstance(InstallWidget, data.installCount, extension, { small: true });

97 98
		const installAction = this.instantiationService.createInstance(CombinedInstallAction, extension);
		const updateAction = this.instantiationService.createInstance(UpdateAction, extension);
99

J
Joao Moreno 已提交
100
		data.actionbar.clear();
J
Joao Moreno 已提交
101
		data.actionbar.push([updateAction, installAction], actionOptions);
J
Joao Moreno 已提交
102

103
		data.disposables.push(version, installCount, ratings, installAction, updateAction);
J
Joao Moreno 已提交
104 105 106 107 108 109 110 111 112 113
	}

	disposeTemplate(data: ITemplateData): void {
		const index = this._templates.indexOf(data);

		if (index > -1) {
			this._templates.splice(index, 1);
		}
	}
}