extensionEditor.ts 4.2 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/extensionEditor';
J
Joao Moreno 已提交
9 10
import { TPromise } from 'vs/base/common/winjs.base';
import { marked } from 'vs/base/common/marked/marked';
J
Joao Moreno 已提交
11
import { IDisposable, empty, dispose, toDisposable } from 'vs/base/common/lifecycle';
J
Joao Moreno 已提交
12
import { Builder } from 'vs/base/browser/builder';
J
Joao Moreno 已提交
13
import { append, emmet as $, addClass, removeClass } from 'vs/base/browser/dom';
J
Joao Moreno 已提交
14 15 16
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
J
Joao Moreno 已提交
17
import { IRequestService } from 'vs/platform/request/common/request';
J
Joao Moreno 已提交
18 19
// import { IExtension } from './extensionsModel';
import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
J
Joao Moreno 已提交
20
import { ExtensionsInput } from '../common/extensionsInput';
21
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
J
Joao Moreno 已提交
22 23 24 25 26 27 28
import { ITemplateData } from './extensionsList';
import { EditorOptions } from 'vs/workbench/common/editor';

export class ExtensionEditor extends BaseEditor {

	static ID: string = 'workbench.editor.extension';

J
Joao Moreno 已提交
29
	private icon: HTMLElement;
J
Joao Moreno 已提交
30 31 32 33 34
	private name: HTMLElement;
	private publisher: HTMLElement;
	private installCount: HTMLElement;
	private rating: HTMLElement;
	private description: HTMLElement;
J
Joao Moreno 已提交
35
	private body: HTMLElement;
J
Joao Moreno 已提交
36 37 38 39

	private _highlight: ITemplateData;
	private highlightDisposable: IDisposable;

J
Joao Moreno 已提交
40 41
	private transientDisposables: IDisposable[];
	private disposables: IDisposable[];
J
Joao Moreno 已提交
42 43 44

	constructor(
		@ITelemetryService telemetryService: ITelemetryService,
45 46
		@IExtensionGalleryService private galleryService: IExtensionGalleryService,
		@IConfigurationService private configurationService: IConfigurationService,
J
Joao Moreno 已提交
47 48
		@IInstantiationService private instantiationService: IInstantiationService,
		@IRequestService private requestService: IRequestService
J
Joao Moreno 已提交
49 50 51 52
	) {
		super(ExtensionEditor.ID, telemetryService);
		this._highlight = null;
		this.highlightDisposable = empty;
J
Joao Moreno 已提交
53
		this.disposables = [];
J
Joao Moreno 已提交
54 55 56 57
	}

	createEditor(parent: Builder): void {
		const container = parent.getHTMLElement();
J
Joao Moreno 已提交
58 59 60

		const root = append(container, $('.extension-editor'));
		const header = append(root, $('.header'));
J
Joao Moreno 已提交
61 62 63

		this.icon = append(header, $('.icon'));

J
Joao Moreno 已提交
64 65 66 67 68 69 70 71 72 73
		const details = append(header, $('.details'));
		this.name = append(details, $('.name'));

		const subtitle = append(details, $('.subtitle'));
		this.publisher = append(subtitle, $('span.publisher'));
		this.installCount = append(subtitle, $('span.install'));
		this.rating = append(subtitle, $('span.rating'));

		this.description = append(details, $('p.description'));

J
Joao Moreno 已提交
74
		this.body = append(root, $('.body'));
J
Joao Moreno 已提交
75 76 77
	}

	setInput(input: ExtensionsInput, options: EditorOptions): TPromise<void> {
J
Joao Moreno 已提交
78 79 80
		this.transientDisposables = dispose(this.transientDisposables);

		this.body.innerHTML = '';
J
Joao Moreno 已提交
81

J
Joao Moreno 已提交
82
		let promise = TPromise.as<void>(null);
J
Joao Moreno 已提交
83
		const extension = input.extension;
J
Joao Moreno 已提交
84

J
Joao Moreno 已提交
85
		this.icon.style.backgroundImage = `url("${ extension.iconUrl }")`;
J
Joao Moreno 已提交
86 87 88
		this.name.textContent = extension.displayName;
		this.publisher.textContent = extension.publisherDisplayName;
		this.description.textContent = extension.description;
J
Joao Moreno 已提交
89

J
Joao Moreno 已提交
90 91
		if (!extension.readmeUrl) {
			this.body.innerHTML = 'no readme :(';
J
Joao Moreno 已提交
92 93 94 95
		} else {
			addClass(this.body, 'loading');

			promise = super.setInput(input, options)
J
Joao Moreno 已提交
96 97
				.then(() => this.requestService.makeRequest({ url: extension.readmeUrl }))
				.then(response => response.responseText)
J
Joao Moreno 已提交
98 99 100 101 102 103
				.then(marked.parse)
				.then(html => {
					removeClass(this.body, 'loading');
					this.body.innerHTML = html;
				});
		}
J
Joao Moreno 已提交
104 105 106 107

		this.transientDisposables.push(toDisposable(() => promise.cancel()));

		return TPromise.as(null);
J
Joao Moreno 已提交
108 109 110 111 112 113 114 115
	}

	layout(): void {
		return;
	}

	dispose(): void {
		this._highlight = null;
J
Joao Moreno 已提交
116 117
		this.transientDisposables = dispose(this.transientDisposables);
		this.disposables = dispose(this.disposables);
J
Joao Moreno 已提交
118 119 120
		super.dispose();
	}
}