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
3296 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
const { tabSize } = this._context.viewModel.model.getOptions();
70
const rulerWidth = tabSize;
71
let addCount = desiredCount - currentCount;
72
while (addCount > 0) {
73
const node = createFastDomNode(document.createElement('div'));
74
node.setClassName('view-ruler');
75
node.setWidth(rulerWidth);
76
this.domNode.appendChild(node);
77
this._renderedRulers.push(node);
78
addCount--;
79
}
80
return;
81
}
82
83
let removeCount = currentCount - desiredCount;
84
while (removeCount > 0) {
85
const node = this._renderedRulers.pop()!;
86
this.domNode.removeChild(node);
87
removeCount--;
88
}
89
}
90
91
public render(ctx: RestrictedRenderingContext): void {
92
93
this._ensureRulersCount();
94
95
for (let i = 0, len = this._rulers.length; i < len; i++) {
96
const node = this._renderedRulers[i];
97
const ruler = this._rulers[i];
98
99
node.setBoxShadow(ruler.color ? `1px 0 0 0 ${ruler.color} inset` : ``);
100
node.setHeight(Math.min(ctx.scrollHeight, 1000000));
101
node.setLeft(ruler.column * this._typicalHalfwidthCharacterWidth);
102
}
103
}
104
}
105
106