notebookEditor.ts 19.6 KB
Newer Older
P
Peng Lyu 已提交
1 2 3 4 5 6 7 8 9 10 11
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import 'vs/css!./notebook';
import * as DOM from 'vs/base/browser/dom';
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import { IStorageService } from 'vs/platform/storage/common/storage';
P
Peng Lyu 已提交
12
import { NotebookEditorInput, NotebookEditorModel } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput';
R
rebornix 已提交
13
import { EditorOptions, IEditorMemento } from 'vs/workbench/common/editor';
P
Peng Lyu 已提交
14 15 16 17
import { CancellationToken } from 'vs/base/common/cancellation';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { IModelService } from 'vs/editor/common/services/modelService';
import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils';
P
Peng Lyu 已提交
18 19
import { textLinkForeground, textLinkActiveForeground, focusBorder, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder, editorBackground, foreground } from 'vs/platform/theme/common/colorRegistry';
import { WorkbenchList } from 'vs/platform/list/browser/listService';
P
Peng Lyu 已提交
20
import { IModeService } from 'vs/editor/common/services/modeService';
R
rebornix 已提交
21
import { ViewCell, MarkdownCellRenderer, CodeCellRenderer, NotebookCellListDelegate } from 'vs/workbench/contrib/notebook/browser/renderers/cellRenderer';
R
rebornix 已提交
22
import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
P
Peng Lyu 已提交
23
import { IWebviewService } from 'vs/workbench/contrib/webview/browser/webview';
P
Peng Lyu 已提交
24
import { BackLayerWebView } from 'vs/workbench/contrib/notebook/browser/contentWidget';
P
Peng Lyu 已提交
25
import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent';
26
import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
R
rebornix 已提交
27
import { INotebookService } from 'vs/workbench/contrib/notebook/browser/notebookService';
28 29 30 31
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
import { IEditorOptions } from 'vs/editor/common/config/editorOptions';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { getZoomLevel } from 'vs/base/browser/browser';
R
rebornix 已提交
32
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
R
rebornix 已提交
33
import { INotebook } from 'vs/editor/common/modes';
R
rebornix 已提交
34
import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
R
rebornix 已提交
35
import { NotebookHandler, CELL_MARGIN } from 'vs/workbench/contrib/notebook/browser/renderers/interfaces';
P
Peng Lyu 已提交
36 37

const $ = DOM.$;
R
rebornix 已提交
38 39
const NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'NotebookEditorViewState';

R
rebornix 已提交
40 41
export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey<boolean>('notebookEditorFocused', false);

R
rebornix 已提交
42 43 44
interface INotebookEditorViewState {
	editingCells: { [key: number]: boolean };
}
P
Peng Lyu 已提交
45

P
Peng Lyu 已提交
46
export class NotebookEditor extends BaseEditor implements NotebookHandler {
P
Peng Lyu 已提交
47 48 49
	static readonly ID: string = 'workbench.editor.notebook';
	private rootElement!: HTMLElement;
	private body!: HTMLElement;
P
Peng Lyu 已提交
50
	private contentWidgets!: HTMLElement;
P
Peng Lyu 已提交
51
	private webview: BackLayerWebView | null = null;
P
Peng Lyu 已提交
52

P
Peng Lyu 已提交
53
	private list: WorkbenchList<ViewCell> | undefined;
P
Peng Lyu 已提交
54
	private model: NotebookEditorModel | undefined;
R
rebornix 已提交
55
	private notebook: INotebook | undefined;
R
rebornix 已提交
56
	viewType: string | undefined;
P
Peng Lyu 已提交
57
	private viewCells: ViewCell[] = [];
58
	private localStore: DisposableStore = new DisposableStore();
R
rebornix 已提交
59
	private editorMemento: IEditorMemento<INotebookEditorViewState>;
60
	private fontInfo: BareFontInfo | undefined;
61 62
	private relayoutDisposable: IDisposable | null = null;
	private dimension: DOM.Dimension | null = null;
R
rebornix 已提交
63
	private editorFocus: IContextKey<boolean> | null = null;
P
Peng Lyu 已提交
64 65 66 67 68

	constructor(
		@ITelemetryService telemetryService: ITelemetryService,
		@IThemeService themeService: IThemeService,
		@IInstantiationService private readonly instantiationService: IInstantiationService,
P
Peng Lyu 已提交
69 70
		@IModelService private readonly modelService: IModelService,
		@IModeService private readonly modeService: IModeService,
P
Peng Lyu 已提交
71
		@IStorageService storageService: IStorageService,
R
rebornix 已提交
72
		@IWebviewService private webviewService: IWebviewService,
R
rebornix 已提交
73
		@INotebookService private notebookService: INotebookService,
74
		@IEditorGroupsService editorGroupService: IEditorGroupsService,
R
rebornix 已提交
75
		@IConfigurationService private readonly configurationService: IConfigurationService,
R
rebornix 已提交
76 77
		@IEnvironmentService private readonly environmentSerice: IEnvironmentService,
		@IContextKeyService private readonly contextKeyService: IContextKeyService
P
Peng Lyu 已提交
78 79
	) {
		super(NotebookEditor.ID, telemetryService, themeService, storageService);
R
rebornix 已提交
80 81

		this.editorMemento = this.getEditorMemento<INotebookEditorViewState>(editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY);
P
Peng Lyu 已提交
82
	}
P
Peng Lyu 已提交
83

P
Peng Lyu 已提交
84 85 86 87 88 89 90 91 92 93 94
	get minimumWidth(): number { return 375; }
	get maximumWidth(): number { return Number.POSITIVE_INFINITY; }

	// these setters need to exist because this extends from BaseEditor
	set minimumWidth(value: number) { /*noop*/ }
	set maximumWidth(value: number) { /*noop*/ }


	protected createEditor(parent: HTMLElement): void {
		this.rootElement = DOM.append(parent, $('.notebook-editor'));
		this.createBody(this.rootElement);
95
		this.generateFontInfo();
R
rebornix 已提交
96 97 98 99 100 101 102 103
		this.editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService);
		this._register(this.onDidFocus(() => {
			this.editorFocus?.set(true);
		}));

		this._register(this.onDidBlur(() => {
			this.editorFocus?.set(false);
		}));
104 105 106 107 108
	}

	private generateFontInfo(): void {
		const editorOptions = this.configurationService.getValue<IEditorOptions>('editor');
		this.fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel());
P
Peng Lyu 已提交
109 110 111
	}

	private createBody(parent: HTMLElement): void {
P
Peng Lyu 已提交
112
		this.body = document.createElement('div');
P
Peng Lyu 已提交
113 114 115
		DOM.addClass(this.body, 'cell-list-container');
		this.createCellList();
		DOM.append(parent, this.body);
P
Peng Lyu 已提交
116 117 118 119

		this.contentWidgets = document.createElement('div');
		DOM.addClass(this.contentWidgets, 'notebook-content-widgets');
		DOM.append(this.body, this.contentWidgets);
P
Peng Lyu 已提交
120 121
	}

P
Peng Lyu 已提交
122 123
	private createCellList(): void {
		DOM.addClass(this.body, 'cell-list-container');
P
Peng Lyu 已提交
124

P
Peng Lyu 已提交
125
		const renders = [
P
Peng Lyu 已提交
126 127
			this.instantiationService.createInstance(MarkdownCellRenderer, this),
			this.instantiationService.createInstance(CodeCellRenderer, this)
P
Peng Lyu 已提交
128 129
		];

P
Peng Lyu 已提交
130
		this.list = this.instantiationService.createInstance<typeof WorkbenchList, WorkbenchList<ViewCell>>(
P
Peng Lyu 已提交
131 132 133 134 135 136 137 138 139 140
			WorkbenchList,
			'NotebookCellList',
			this.body,
			this.instantiationService.createInstance(NotebookCellListDelegate),
			renders,
			{
				setRowLineHeight: false,
				supportDynamicHeights: true,
				horizontalScrolling: false,
				keyboardSupport: false,
R
rebornix 已提交
141
				mouseSupport: true,
P
Peng Lyu 已提交
142
				multipleSelectionSupport: false,
R
rebornix 已提交
143
				enableKeyboardNavigation: true,
P
Peng Lyu 已提交
144 145 146 147 148 149 150 151 152 153
				overrideStyles: {
					listBackground: editorBackground,
					listActiveSelectionBackground: editorBackground,
					listActiveSelectionForeground: foreground,
					listFocusAndSelectionBackground: editorBackground,
					listFocusAndSelectionForeground: foreground,
					listFocusBackground: editorBackground,
					listFocusForeground: foreground,
					listHoverForeground: foreground,
					listHoverBackground: editorBackground,
154 155
					listHoverOutline: focusBorder,
					listFocusOutline: focusBorder,
156 157 158 159
					listInactiveSelectionBackground: editorBackground,
					listInactiveSelectionForeground: foreground,
					listInactiveFocusBackground: editorBackground,
					listInactiveFocusOutline: editorBackground,
P
Peng Lyu 已提交
160 161 162
				}
			}
		);
P
Peng Lyu 已提交
163

R
rebornix 已提交
164
		this.webview = new BackLayerWebView(this.webviewService, this.notebookService, this, this.environmentSerice);
P
Peng Lyu 已提交
165
		this.list.view.rowsContainer.appendChild(this.webview.element);
P
Peng Lyu 已提交
166 167 168
		this._register(this.list);
	}

169 170 171 172
	getFontInfo(): BareFontInfo | undefined {
		return this.fontInfo;
	}

173 174 175 176
	getListDimension(): DOM.Dimension | null {
		return this.dimension;
	}

P
Peng Lyu 已提交
177 178
	triggerWheel(event: IMouseWheelEvent) {
		this.list?.triggerScrollFromMouseWheelEvent(event);
P
Peng Lyu 已提交
179 180
	}

R
rebornix 已提交
181
	createContentWidget(cell: ViewCell, outputIndex: number, shadowContent: string, offset: number) {
182 183 184 185
		if (!this.webview) {
			return;
		}

P
Peng Lyu 已提交
186 187 188
		if (!this.webview!.mapping.has(cell.id)) {
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
189
			this.webview!.createContentWidget(cell, offset, shadowContent, top + offset);
R
rebornix 已提交
190 191 192 193 194 195
			this.webview!.outputMapping.set(cell.id + `-${outputIndex}`, true);
		} else if (!this.webview!.outputMapping.has(cell.id + `-${outputIndex}`)) {
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
			this.webview!.outputMapping.set(cell.id + `-${outputIndex}`, true);
			this.webview!.createContentWidget(cell, offset, shadowContent, top + offset);
P
Peng Lyu 已提交
196
		} else {
P
Peng Lyu 已提交
197 198 199 200
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
			let top = this.list?.getElementTop(index) || 0;
			let scrollTop = this.list?.scrollTop || 0;

201
			this.webview!.updateViewScrollTop(-scrollTop, [{ id: cell.id, top: top + offset }]);
P
Peng Lyu 已提交
202
		}
P
Peng Lyu 已提交
203
	}
P
Peng Lyu 已提交
204

P
Peng Lyu 已提交
205 206 207
	disposeViewCell(cell: ViewCell) {
	}

P
Peng Lyu 已提交
208
	onHide() {
R
rebornix 已提交
209 210 211 212 213
		this.viewCells.forEach(cell => {
			if (cell.getText() !== '') {
				cell.isEditing = false;
			}
		});
214 215 216 217 218 219 220 221 222

		if (this.webview) {
			this.localStore.clear();
			this.list?.view.rowsContainer.removeChild(this.webview?.element);
			this.webview?.dispose();
			this.webview = null;
		}

		this.list?.splice(0, this.list?.length);
R
rebornix 已提交
223 224 225 226 227 228 229 230

		if (this.model && !this.model.isDirty()) {
			this.notebookService.destoryNotebookDocument(this.viewType!, this.notebook!);
			this.model = undefined;
			this.notebook = undefined;
			this.viewType = undefined;
		}

231
		super.onHide();
P
Peng Lyu 已提交
232 233
	}

234
	setVisible(visible: boolean, group?: IEditorGroup): void {
R
rebornix 已提交
235
		super.setVisible(visible, group);
236
		if (!visible) {
R
rebornix 已提交
237 238 239 240 241
			this.viewCells.forEach(cell => {
				if (cell.getText() !== '') {
					cell.isEditing = false;
				}
			});
242 243 244
		}
	}

P
Peng Lyu 已提交
245
	setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise<void> {
R
rebornix 已提交
246 247 248 249
		if (this.input instanceof NotebookEditorInput) {
			this.saveTextEditorViewState(this.input);
		}

250 251 252 253 254
		return super.setInput(input, options, token)
			.then(() => {
				return input.resolve();
			})
			.then(model => {
255
				if (this.model !== undefined && this.model.textModel === model.textModel && this.webview !== null) {
P
Peng Lyu 已提交
256 257 258
					return;
				}

259
				this.localStore.clear();
P
Peng Lyu 已提交
260 261 262 263
				this.viewCells.forEach(cell => {
					cell.save();
				});

264 265 266
				if (this.webview) {
					this.webview?.clearContentWidgets();
				} else {
R
rebornix 已提交
267
					this.webview = new BackLayerWebView(this.webviewService, this.notebookService, this, this.environmentSerice);
268 269 270
					this.list?.view.rowsContainer.insertAdjacentElement('afterbegin', this.webview!.element);
				}

P
Peng Lyu 已提交
271
				this.model = model;
R
rebornix 已提交
272 273 274 275
				this.localStore.add(this.model.onDidChangeCells(() => {
					this.updateViewCells();
				}));

R
rebornix 已提交
276
				let viewState = this.loadTextEditorViewState(input);
R
rebornix 已提交
277
				this.notebook = model.getNotebook();
R
rebornix 已提交
278
				this.viewType = input.viewType;
R
rebornix 已提交
279
				this.viewCells = this.notebook.cells.map(cell => {
R
rebornix 已提交
280
					const isEditing = viewState && viewState.editingCells[cell.handle];
R
rebornix 已提交
281
					return new ViewCell(input.viewType!, this.notebook!.handle, cell, !!isEditing, this.modelService, this.modeService);
P
Peng Lyu 已提交
282
				});
283 284 285 286 287 288

				const updateScrollPosition = () => {
					let scrollTop = this.list?.scrollTop || 0;
					this.webview!.element.style.top = `${scrollTop}px`;
					let updateItems: { top: number, id: string }[] = [];

R
rebornix 已提交
289
					// const date = new Date();
290 291 292 293 294 295 296 297 298 299 300 301 302 303
					this.webview?.mapping.forEach((item) => {
						let index = this.model!.getNotebook().cells.indexOf(item.cell.cell);
						let top = this.list?.getElementTop(index) || 0;
						let newTop = this.webview!.shouldRenderContentWidget(item.cell.id, top);

						if (newTop !== undefined) {
							updateItems.push({
								top: newTop,
								id: item.cell.id
							});
						}
					});

					if (updateItems.length > 0) {
R
rebornix 已提交
304
						// console.log('----- did scroll ----  ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds());
305 306 307 308
						this.webview?.updateViewScrollTop(-scrollTop, updateItems);
					}
				};
				this.localStore.add(this.list!.onWillScroll(e => {
R
rebornix 已提交
309 310
					// const date = new Date();
					// console.log('----- will scroll ----  ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds());
311 312 313 314
					this.webview?.updateViewScrollTop(-e.scrollTop, []);
				}));
				this.localStore.add(this.list!.onDidScroll(() => updateScrollPosition()));
				this.localStore.add(this.list!.onDidChangeContentHeight(() => updateScrollPosition()));
R
rebornix 已提交
315 316 317 318 319
				this.localStore.add(this.list!.onFocusChange((e) => {
					if (e.elements.length > 0) {
						this.notebookService.updateNotebookActiveCell(input.viewType!, input.getResource()!, e.elements[0].cell.handle);
					}
				}));
320

321 322
				this.list?.splice(0, this.list?.length);
				this.list?.splice(0, 0, this.viewCells);
323 324
				this.list?.layout();
			});
P
Peng Lyu 已提交
325 326
	}

P
Peng Lyu 已提交
327
	layoutElement(cell: ViewCell, height: number) {
R
rebornix 已提交
328
		let relayout = (cell: ViewCell, height: number) => {
P
Peng Lyu 已提交
329
			let index = this.model!.getNotebook().cells.indexOf(cell.cell);
R
rebornix 已提交
330 331 332
			if (index >= 0) {
				this.list?.updateDynamicHeight(index, cell, height);
			}
R
rebornix 已提交
333 334 335
		};

		if (this.list?.view.isRendering) {
336 337 338 339 340
			if (this.relayoutDisposable) {
				this.relayoutDisposable.dispose();
				this.relayoutDisposable = null;
			}
			this.relayoutDisposable = DOM.scheduleAtNextAnimationFrame(() => {
R
rebornix 已提交
341
				relayout(cell, height);
342
				this.relayoutDisposable = null;
R
rebornix 已提交
343 344 345 346
			});
		} else {
			relayout(cell, height);
		}
347 348
	}

R
rebornix 已提交
349
	updateViewCells() {
R
rebornix 已提交
350
		if (this.list?.view.isRendering) {
351 352 353 354 355 356
			if (this.relayoutDisposable) {
				this.relayoutDisposable.dispose();
				this.relayoutDisposable = null;
			}

			this.relayoutDisposable = DOM.scheduleAtNextAnimationFrame(() => {
R
rebornix 已提交
357
				this.list?.rerender();
358
				this.relayoutDisposable = null;
R
rebornix 已提交
359 360
			});
		} else {
R
rebornix 已提交
361
			this.list?.rerender();
R
rebornix 已提交
362
		}
R
rebornix 已提交
363 364
	}

R
rebornix 已提交
365 366 367 368 369 370
	async insertEmptyNotebookCell(listIndex: number | undefined, cell: ViewCell, type: 'code' | 'markdown', direction: 'above' | 'below'): Promise<void> {
		let newLanguages = this.notebook!.languages;
		let language = 'markdown';
		if (newLanguages && newLanguages.length) {
			language = newLanguages[0];
		}
P
Peng Lyu 已提交
371

372
		let index = listIndex ? listIndex : this.model!.getNotebook().cells.indexOf(cell.cell);
P
Peng Lyu 已提交
373 374
		const insertIndex = direction === 'above' ? index : index + 1;

R
rebornix 已提交
375 376 377
		let newModeCell = await this.notebookService.createNotebookCell(this.viewType!, this.notebook!.uri, insertIndex, language, type);
		let newCell = new ViewCell(this.viewType!, this.notebook!.handle, newModeCell!, false, this.modelService, this.modeService);

P
Peng Lyu 已提交
378 379
		this.viewCells!.splice(insertIndex, 0, newCell);
		this.model!.insertCell(newCell.cell, insertIndex);
P
Peng Lyu 已提交
380
		this.list?.splice(insertIndex, 0, [newCell]);
P
Peng Lyu 已提交
381 382 383 384

		if (type === 'markdown') {
			newCell.isEditing = true;
		}
R
rebornix 已提交
385 386 387 388

		DOM.scheduleAtNextAnimationFrame(() => {
			this.list?.reveal(insertIndex, 0.33);
		});
P
Peng Lyu 已提交
389 390
	}

391
	editNotebookCell(listIndex: number | undefined, cell: ViewCell): void {
P
Peng Lyu 已提交
392 393 394
		cell.isEditing = true;
	}

395
	saveNotebookCell(listIndex: number | undefined, cell: ViewCell): void {
P
Peng Lyu 已提交
396
		cell.isEditing = false;
P
Peng Lyu 已提交
397 398
	}

R
rebornix 已提交
399 400 401 402 403 404 405 406 407 408
	getActiveCell() {
		let elements = this.list?.getFocusedElements();

		if (elements && elements.length) {
			return elements[0];
		}

		return undefined;
	}

R
rebornix 已提交
409 410 411 412 413 414 415 416 417 418
	focusNotebookCell(cell: ViewCell, focusEditor: boolean) {
		let index = this.model!.getNotebook().cells.indexOf(cell.cell);

		if (focusEditor) {

		} else {
			let itemDOM = this.list?.view.domElement(index);
			if (document.activeElement && itemDOM && itemDOM.contains(document.activeElement)) {
				(document.activeElement as HTMLElement).blur();
			}
419 420

			cell.isEditing = false;
R
rebornix 已提交
421 422 423 424 425 426
		}

		this.list?.setFocus([index]);
		this.list?.view.domNode.focus();
	}

R
rebornix 已提交
427
	async deleteNotebookCell(listIndex: number | undefined, cell: ViewCell): Promise<void> {
P
Peng Lyu 已提交
428
		let index = this.model!.getNotebook().cells.indexOf(cell.cell);
P
Peng Lyu 已提交
429

R
rebornix 已提交
430 431
		// await this.notebookService.createNotebookCell(this.viewType!, this.notebook!.uri, insertIndex, language, type);
		await this.notebookService.deleteNotebookCell(this.viewType!, this.notebook!.uri, index);
P
Peng Lyu 已提交
432 433
		this.viewCells!.splice(index, 1);
		this.model!.deleteCell(cell.cell);
P
Peng Lyu 已提交
434 435 436
		this.list?.splice(index, 1);
	}

P
Peng Lyu 已提交
437
	layout(dimension: DOM.Dimension): void {
438
		this.dimension = new DOM.Dimension(dimension.width, dimension.height);
P
Peng Lyu 已提交
439 440
		DOM.toggleClass(this.rootElement, 'mid-width', dimension.width < 1000 && dimension.width >= 600);
		DOM.toggleClass(this.rootElement, 'narrow-width', dimension.width < 600);
441 442
		DOM.size(this.body, dimension.width, dimension.height);
		this.list?.layout(dimension.height, dimension.width);
P
Peng Lyu 已提交
443
	}
R
rebornix 已提交
444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469

	protected saveState(): void {
		if (this.input instanceof NotebookEditorInput) {
			this.saveTextEditorViewState(this.input);
		}

		super.saveState();
	}

	private saveTextEditorViewState(input: NotebookEditorInput): void {
		if (this.group) {
			let state: { [key: number]: boolean } = {};
			this.viewCells.filter(cell => cell.isEditing).forEach(cell => state[cell.cell.handle] = true);
			this.editorMemento.saveEditorState(this.group, input, {
				editingCells: state
			});
		}
	}

	private loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined {
		if (this.group) {
			return this.editorMemento.loadEditorState(this.group, input);
		}

		return;
	}
470

P
Peng Lyu 已提交
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
}

const embeddedEditorBackground = 'walkThrough.embeddedEditorBackground';

registerThemingParticipant((theme, collector) => {
	const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: '#f4f4f4', hc: null });
	if (color) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-editor-background,
			.monaco-workbench .part.editor > .content .notebook-editor .margin-view-overlays { background: ${color}; }`);
	}
	const link = theme.getColor(textLinkForeground);
	if (link) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor a { color: ${link}; }`);
	}
	const activeLink = theme.getColor(textLinkActiveForeground);
	if (activeLink) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor a:hover,
			.monaco-workbench .part.editor > .content .notebook-editor a:active { color: ${activeLink}; }`);
	}
	const shortcut = theme.getColor(textPreformatForeground);
	if (shortcut) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor code,
			.monaco-workbench .part.editor > .content .notebook-editor .shortcut { color: ${shortcut}; }`);
	}
	const border = theme.getColor(contrastBorder);
	if (border) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-editor { border-color: ${border}; }`);
	}
	const quoteBackground = theme.getColor(textBlockQuoteBackground);
	if (quoteBackground) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor blockquote { background: ${quoteBackground}; }`);
	}
	const quoteBorder = theme.getColor(textBlockQuoteBorder);
	if (quoteBorder) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor blockquote { border-color: ${quoteBorder}; }`);
	}
507 508 509 510 511 512

	const inactiveListItem = theme.getColor('list.inactiveSelectionBackground');

	if (inactiveListItem) {
		collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .output { background-color: ${inactiveListItem}; }`);
	}
513 514 515 516

	// Cell Margin
	collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .monaco-list-row > div.cell { padding: 8px ${CELL_MARGIN}px 8px ${CELL_MARGIN}px; }`);
	collector.addRule(`.monaco-workbench .part.editor > .content .notebook-editor .output { margin: 0px ${CELL_MARGIN}px; }`);
P
Peng Lyu 已提交
517
});