/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import './marginDecorations.css'; import { DecorationToRender, DedupOverlay } from '../glyphMargin/glyphMargin.js'; export class MarginViewLineDecorationsOverlay extends DedupOverlay { constructor(context) { super(); this._context = context; this._renderResult = null; this._context.addEventHandler(this); } dispose() { this._context.removeEventHandler(this); this._renderResult = null; super.dispose(); } // --- begin event handlers onConfigurationChanged(e) { return true; } onDecorationsChanged(e) { return true; } onFlushed(e) { return true; } onLinesChanged(e) { return true; } onLinesDeleted(e) { return true; } onLinesInserted(e) { return true; } onScrollChanged(e) { return e.scrollTopChanged; } onZonesChanged(e) { return true; } // --- end event handlers _getDecorations(ctx) { const decorations = ctx.getDecorationsInViewport(); const r = []; let rLen = 0; for (let i = 0, len = decorations.length; i < len; i++) { const d = decorations[i]; const marginClassName = d.options.marginClassName; if (marginClassName) { r[rLen++] = new DecorationToRender(d.range.startLineNumber, d.range.endLineNumber, marginClassName); } } return r; } prepareRender(ctx) { const visibleStartLineNumber = ctx.visibleRange.startLineNumber; const visibleEndLineNumber = ctx.visibleRange.endLineNumber; const toRender = this._render(visibleStartLineNumber, visibleEndLineNumber, this._getDecorations(ctx)); const output = []; for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { const lineIndex = lineNumber - visibleStartLineNumber; const classNames = toRender[lineIndex]; let lineOutput = ''; for (let i = 0, len = classNames.length; i < len; i++) { lineOutput += '
'; } output[lineIndex] = lineOutput; } this._renderResult = output; } render(startLineNumber, lineNumber) { if (!this._renderResult) { return ''; } return this._renderResult[lineNumber - startLineNumber]; } }