mainThreadQuickOpen.ts 6.0 KB
Newer Older
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  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
Johannes Rieken 已提交
7 8
import { TPromise } from 'vs/base/common/winjs.base';
import { asWinJsPromise } from 'vs/base/common/async';
C
Christof Marti 已提交
9
import { IPickOptions, IInputOptions, IQuickInputService, IQuickInput } from 'vs/platform/quickinput/common/quickInput';
10
import { InputBoxOptions } from 'vscode';
C
Christof Marti 已提交
11
import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, TransferQuickPickItems, MainContext, IExtHostContext, TransferQuickInput, TransferQuickInputButton } from 'vs/workbench/api/node/extHost.protocol';
12
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
C
Christof Marti 已提交
13
import URI from 'vs/base/common/uri';
14

15
@extHostNamedCustomer(MainContext.MainThreadQuickOpen)
16
export class MainThreadQuickOpen implements MainThreadQuickOpenShape {
17

18
	private _proxy: ExtHostQuickOpenShape;
19
	private _quickInputService: IQuickInputService;
C
Christof Marti 已提交
20
	private _doSetItems: (items: TransferQuickPickItems[]) => any;
21
	private _doSetError: (error: Error) => any;
C
Christof Marti 已提交
22
	private _contents: TPromise<TransferQuickPickItems[]>;
23 24
	private _token: number = 0;

A
Alex Dima 已提交
25
	constructor(
26
		extHostContext: IExtHostContext,
27
		@IQuickInputService quickInputService: IQuickInputService
A
Alex Dima 已提交
28
	) {
29
		this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostQuickOpen);
30
		this._quickInputService = quickInputService;
31 32
	}

33 34 35
	public dispose(): void {
	}

36
	$show(options: IPickOptions): TPromise<number | number[]> {
37 38
		const myToken = ++this._token;

C
Christof Marti 已提交
39
		this._contents = new TPromise<TransferQuickPickItems[]>((c, e) => {
40 41 42 43 44 45 46 47 48 49 50 51 52
			this._doSetItems = (items) => {
				if (myToken === this._token) {
					c(items);
				}
			};

			this._doSetError = (error) => {
				if (myToken === this._token) {
					e(error);
				}
			};
		});

C
Christof Marti 已提交
53
		if (options.canPickMany) {
54
			return asWinJsPromise(token => this._quickInputService.pick(this._contents, options as { canPickMany: true }, token)).then(items => {
C
Christof Marti 已提交
55 56 57 58 59 60
				if (items) {
					return items.map(item => item.handle);
				}
				return undefined;
			}, undefined, progress => {
				if (progress) {
C
Christof Marti 已提交
61
					this._proxy.$onItemSelected((<TransferQuickPickItems>progress).handle);
C
Christof Marti 已提交
62 63 64
				}
			});
		} else {
65
			return asWinJsPromise(token => this._quickInputService.pick(this._contents, options, token)).then(item => {
C
Christof Marti 已提交
66 67 68 69 70 71
				if (item) {
					return item.handle;
				}
				return undefined;
			}, undefined, progress => {
				if (progress) {
C
Christof Marti 已提交
72
					this._proxy.$onItemSelected((<TransferQuickPickItems>progress).handle);
C
Christof Marti 已提交
73 74 75
				}
			});
		}
76 77
	}

C
Christof Marti 已提交
78
	$setItems(items: TransferQuickPickItems[]): TPromise<any> {
79 80 81
		if (this._doSetItems) {
			this._doSetItems(items);
		}
M
Matt Bierner 已提交
82
		return undefined;
83 84
	}

J
Johannes Rieken 已提交
85
	$setError(error: Error): TPromise<any> {
86 87 88
		if (this._doSetError) {
			this._doSetError(error);
		}
M
Matt Bierner 已提交
89
		return undefined;
90 91 92 93
	}

	// ---- input

94
	$input(options: InputBoxOptions, validateInput: boolean): TPromise<string> {
95 96 97 98 99
		const inputOptions: IInputOptions = Object.create(null);

		if (options) {
			inputOptions.password = options.password;
			inputOptions.placeHolder = options.placeHolder;
100
			inputOptions.valueSelection = options.valueSelection;
101 102
			inputOptions.prompt = options.prompt;
			inputOptions.value = options.value;
103
			inputOptions.ignoreFocusLost = options.ignoreFocusOut;
104 105 106 107 108 109 110 111
		}

		if (validateInput) {
			inputOptions.validateInput = (value) => {
				return this._proxy.$validateInput(value);
			};
		}

112
		return asWinJsPromise(token => this._quickInputService.input(inputOptions, token));
C
Christof Marti 已提交
113 114
	}

115 116 117 118 119 120 121 122 123 124 125 126 127 128
	// ---- QuickInput

	private sessions = new Map<number, IQuickInput>();

	$createOrUpdate(params: TransferQuickInput): TPromise<void> {
		const sessionId = params.id;
		let session = this.sessions.get(sessionId);
		if (!session) {
			if (params.type === 'quickPick') {
				const input = this._quickInputService.createQuickPick();
				input.onDidAccept(() => {
					this._proxy.$onDidAccept(sessionId);
				});
				input.onDidChangeActive(items => {
C
Christof Marti 已提交
129
					this._proxy.$onDidChangeActive(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
130 131
				});
				input.onDidChangeSelection(items => {
C
Christof Marti 已提交
132 133 134 135
					this._proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
				});
				input.onDidTriggerButton(button => {
					this._proxy.$onDidTriggerButton(sessionId, (button as TransferQuickInputButton).handle);
136
				});
137 138 139 140 141 142
				input.onDidChangeValue(value => {
					this._proxy.$onDidChangeValue(sessionId, value);
				});
				input.onDidHide(() => {
					this._proxy.$onDidHide(sessionId);
				});
143 144 145 146 147 148
				session = input;
			} else {
				const input = this._quickInputService.createInputBox();
				input.onDidAccept(() => {
					this._proxy.$onDidAccept(sessionId);
				});
149 150 151
				input.onDidTriggerButton(button => {
					this._proxy.$onDidTriggerButton(sessionId, (button as TransferQuickInputButton).handle);
				});
152 153 154 155 156 157
				input.onDidChangeValue(value => {
					this._proxy.$onDidChangeValue(sessionId, value);
				});
				input.onDidHide(() => {
					this._proxy.$onDidHide(sessionId);
				});
158 159 160 161 162 163 164 165 166 167 168 169 170
				session = input;
			}
			this.sessions.set(sessionId, session);
		}
		for (const param in params) {
			if (param === 'id' || param === 'type') {
				continue;
			}
			if (param === 'visible') {
				if (params.visible) {
					session.show();
				} else {
					session.hide();
C
Christof Marti 已提交
171
				}
C
Christof Marti 已提交
172 173 174 175 176 177 178 179 180
			} else if (param === 'buttons') {
				params.buttons.forEach(button => {
					const iconPath = button.iconPath;
					iconPath.dark = URI.revive(iconPath.dark);
					if (iconPath.light) {
						iconPath.light = URI.revive(iconPath.light);
					}
				});
				session[param] = params[param];
181 182 183 184 185 186 187 188 189 190 191 192 193 194
			} else {
				session[param] = params[param];
			}
		}
		return TPromise.as(undefined);
	}

	$dispose(sessionId: number): TPromise<void> {
		const session = this.sessions.get(sessionId);
		if (session) {
			session.dispose();
			this.sessions.delete(sessionId);
		}
		return TPromise.as(undefined);
195 196
	}
}