Path: blob/main/src/vs/editor/browser/viewParts/rulers/rulers.ts
3296 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) {68const { tabSize } = this._context.viewModel.model.getOptions();69const rulerWidth = tabSize;70let addCount = desiredCount - currentCount;71while (addCount > 0) {72const node = createFastDomNode(document.createElement('div'));73node.setClassName('view-ruler');74node.setWidth(rulerWidth);75this.domNode.appendChild(node);76this._renderedRulers.push(node);77addCount--;78}79return;80}8182let removeCount = currentCount - desiredCount;83while (removeCount > 0) {84const node = this._renderedRulers.pop()!;85this.domNode.removeChild(node);86removeCount--;87}88}8990public render(ctx: RestrictedRenderingContext): void {9192this._ensureRulersCount();9394for (let i = 0, len = this._rulers.length; i < len; i++) {95const node = this._renderedRulers[i];96const ruler = this._rulers[i];9798node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);99node.setHeight(Math.min(ctx.scrollHeight, 1000000));100node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);101}102}103}104105106