Path: blob/main/src/vs/editor/browser/viewParts/rulers/rulers.ts
5343 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import './rulers.css';6import { FastDomNode, createFastDomNode } from '../../../../base/browser/fastDomNode.js';7import { ViewPart } from '../../view/viewPart.js';8import { RenderingContext, RestrictedRenderingContext } from '../../view/renderingContext.js';9import { ViewContext } from '../../../common/viewModel/viewContext.js';10import * as viewEvents from '../../../common/viewEvents.js';11import { EditorOption, IRulerOption } from '../../../common/config/editorOptions.js';1213/**14* Rulers are vertical lines that appear at certain columns in the editor. There can be >= 0 rulers15* at a time.16*/17export class Rulers extends ViewPart {1819public domNode: FastDomNode<HTMLElement>;20private readonly _renderedRulers: FastDomNode<HTMLElement>[];21private _rulers: IRulerOption[];22private _typicalHalfwidthCharacterWidth: number;2324constructor(context: ViewContext) {25super(context);26this.domNode = createFastDomNode<HTMLElement>(document.createElement('div'));27this.domNode.setAttribute('role', 'presentation');28this.domNode.setAttribute('aria-hidden', 'true');29this.domNode.setClassName('view-rulers');30this._renderedRulers = [];31const options = this._context.configuration.options;32this._rulers = options.get(EditorOption.rulers);33this._typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;34}3536public override dispose(): void {37super.dispose();38}3940// --- begin event handlers4142public override onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {43const options = this._context.configuration.options;44this._rulers = options.get(EditorOption.rulers);45this._typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;46return true;47}48public override onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean {49return e.scrollHeightChanged;50}5152// --- end event handlers5354public prepareRender(ctx: RenderingContext): void {55// Nothing to read56}5758private _ensureRulersCount(): void {59const currentCount = this._renderedRulers.length;60const desiredCount = this._rulers.length;6162if (currentCount === desiredCount) {63// Nothing to do64return;65}6667if (currentCount < desiredCount) {68let addCount = desiredCount - currentCount;69while (addCount > 0) {70const node = createFastDomNode(document.createElement('div'));71node.setClassName('view-ruler');72node.setWidth('1ch');73this.domNode.appendChild(node);74this._renderedRulers.push(node);75addCount--;76}77return;78}7980let removeCount = currentCount - desiredCount;81while (removeCount > 0) {82const node = this._renderedRulers.pop()!;83this.domNode.removeChild(node);84removeCount--;85}86}8788public render(ctx: RestrictedRenderingContext): void {8990this._ensureRulersCount();9192for (let i = 0, len = this._rulers.length; i < len; i++) {93const node = this._renderedRulers[i];94const ruler = this._rulers[i];9596node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);97node.setHeight(Math.min(ctx.scrollHeight, 1000000));98node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);99}100}101}102103104