65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
|
|
import { ITextModel, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/model';
|
|
import { FoldingRegions, ILineRange } from 'vs/editor/contrib/folding/foldingRanges';
|
|
import { RangeProvider } from './folding';
|
|
import { CancellationToken } from 'vs/base/common/cancellation';
|
|
import { IFoldingRangeData, sanitizeRanges } from 'vs/editor/contrib/folding/syntaxRangeProvider';
|
|
|
|
export const ID_INIT_PROVIDER = 'init';
|
|
|
|
export class InitializingRangeProvider implements RangeProvider {
|
|
readonly id = ID_INIT_PROVIDER;
|
|
|
|
private decorationIds: string[] | undefined;
|
|
private timeout: any;
|
|
|
|
constructor(private readonly editorModel: ITextModel, initialRanges: ILineRange[], onTimeout: () => void, timeoutTime: number) {
|
|
if (initialRanges.length) {
|
|
let toDecorationRange = (range: ILineRange): IModelDeltaDecoration => {
|
|
return {
|
|
range: {
|
|
startLineNumber: range.startLineNumber,
|
|
startColumn: 0,
|
|
endLineNumber: range.endLineNumber,
|
|
endColumn: editorModel.getLineLength(range.endLineNumber)
|
|
},
|
|
options: {
|
|
stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges
|
|
}
|
|
};
|
|
};
|
|
this.decorationIds = editorModel.deltaDecorations([], initialRanges.map(toDecorationRange));
|
|
this.timeout = setTimeout(onTimeout, timeoutTime);
|
|
}
|
|
}
|
|
|
|
dispose(): void {
|
|
if (this.decorationIds) {
|
|
this.editorModel.deltaDecorations(this.decorationIds, []);
|
|
this.decorationIds = undefined;
|
|
}
|
|
if (typeof this.timeout === 'number') {
|
|
clearTimeout(this.timeout);
|
|
this.timeout = undefined;
|
|
}
|
|
}
|
|
|
|
compute(cancelationToken: CancellationToken): Promise<FoldingRegions> {
|
|
let foldingRangeData: IFoldingRangeData[] = [];
|
|
if (this.decorationIds) {
|
|
for (let id of this.decorationIds) {
|
|
let range = this.editorModel.getDecorationRange(id);
|
|
if (range) {
|
|
foldingRangeData.push({ start: range.startLineNumber, end: range.endLineNumber, rank: 1 });
|
|
}
|
|
}
|
|
}
|
|
return Promise.resolve(sanitizeRanges(foldingRangeData, Number.MAX_VALUE));
|
|
}
|
|
}
|
|
|