Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/browser/viewParts/rulers/rulers.ts
5343 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import './rulers.css';
7
import { FastDomNode, createFastDomNode } from '../../../../base/browser/fastDomNode.js';
8
import { ViewPart } from '../../view/viewPart.js';
9
import { RenderingContext, RestrictedRenderingContext } from '../../view/renderingContext.js';
10
import { ViewContext } from '../../../common/viewModel/viewContext.js';
11
import * as viewEvents from '../../../common/viewEvents.js';
12
import { EditorOption, IRulerOption } from '../../../common/config/editorOptions.js';
13
14
/**
15
* Rulers are vertical lines that appear at certain columns in the editor. There can be >= 0 rulers
16
* at a time.
17
*/
18
export class Rulers extends ViewPart {
19
20
public domNode: FastDomNode<HTMLElement>;
21
private readonly _renderedRulers: FastDomNode<HTMLElement>[];
22
private _rulers: IRulerOption[];
23
private _typicalHalfwidthCharacterWidth: number;
24
25
constructor(context: ViewContext) {
26
super(context);
27
this.domNode = createFastDomNode<HTMLElement>(document.createElement('div'));
28
this.domNode.setAttribute('role', 'presentation');
29
this.domNode.setAttribute('aria-hidden', 'true');
30
this.domNode.setClassName('view-rulers');
31
this._renderedRulers = [];
32
const options = this._context.configuration.options;
33
this._rulers = options.get(EditorOption.rulers);
34
this._typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;
35
}
36
37
public override dispose(): void {
38
super.dispose();
39
}
40
41
// --- begin event handlers
42
43
public override onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean {
44
const options = this._context.configuration.options;
45
this._rulers = options.get(EditorOption.rulers);
46
this._typicalHalfwidthCharacterWidth = options.get(EditorOption.fontInfo).typicalHalfwidthCharacterWidth;
47
return true;
48
}
49
public override onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean {
50
return e.scrollHeightChanged;
51
}
52
53
// --- end event handlers
54
55
public prepareRender(ctx: RenderingContext): void {
56
// Nothing to read
57
}
58
59
private _ensureRulersCount(): void {
60
const currentCount = this._renderedRulers.length;
61
const desiredCount = this._rulers.length;
62
63
if (currentCount === desiredCount) {
64
// Nothing to do
65
return;
66
}
67
68
if (currentCount < desiredCount) {
69
let addCount = desiredCount - currentCount;
70
while (addCount > 0) {
71
const node = createFastDomNode(document.createElement('div'));
72
node.setClassName('view-ruler');
73
node.setWidth('1ch');
74
this.domNode.appendChild(node);
75
this._renderedRulers.push(node);
76
addCount--;
77
}
78
return;
79
}
80
81
let removeCount = currentCount - desiredCount;
82
while (removeCount > 0) {
83
const node = this._renderedRulers.pop()!;
84
this.domNode.removeChild(node);
85
removeCount--;
86
}
87
}
88
89
public render(ctx: RestrictedRenderingContext): void {
90
91
this._ensureRulersCount();
92
93
for (let i = 0, len = this._rulers.length; i < len; i++) {
94
const node = this._renderedRulers[i];
95
const ruler = this._rulers[i];
96
97
node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);
98
node.setHeight(Math.min(ctx.scrollHeight, 1000000));
99
node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);
100
}
101
}
102
}
103
104