Skip to content

Commit bb91581

Browse files
committed
[rulers addon] Make sure rulers don't cause scrollbars
Closes codemirror#4042
1 parent dabefce commit bb91581

File tree

2 files changed

+19
-25
lines changed

2 files changed

+19
-25
lines changed

addon/display/rulers.js

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,26 @@
1111
})(function(CodeMirror) {
1212
"use strict";
1313

14-
CodeMirror.defineOption("rulers", false, function(cm, val, old) {
15-
if (old && old != CodeMirror.Init) {
16-
clearRulers(cm);
17-
cm.off("refresh", refreshRulers);
14+
CodeMirror.defineOption("rulers", false, function(cm, val) {
15+
if (cm.state.rulerDiv) {
16+
cm.display.lineSpace.removeChild(cm.state.rulerDiv)
17+
cm.state.rulerDiv = null
18+
cm.off("refresh", drawRulers)
1819
}
1920
if (val && val.length) {
20-
setRulers(cm);
21-
cm.on("refresh", refreshRulers);
21+
cm.state.rulerDiv = cm.display.lineSpace.insertBefore(document.createElement("div"), cm.display.cursorDiv)
22+
cm.state.rulerDiv.className = "CodeMirror-rulers"
23+
drawRulers(cm)
24+
cm.on("refresh", drawRulers)
2225
}
2326
});
2427

25-
function clearRulers(cm) {
26-
for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) {
27-
var node = cm.display.lineSpace.childNodes[i];
28-
if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className))
29-
node.parentNode.removeChild(node);
30-
}
31-
}
32-
33-
function setRulers(cm) {
28+
function drawRulers(cm) {
29+
cm.state.rulerDiv.textContent = ""
3430
var val = cm.getOption("rulers");
3531
var cw = cm.defaultCharWidth();
3632
var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left;
37-
var minH = cm.display.scroller.offsetHeight + 30;
33+
cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + "px";
3834
for (var i = 0; i < val.length; i++) {
3935
var elt = document.createElement("div");
4036
elt.className = "CodeMirror-ruler";
@@ -49,15 +45,7 @@
4945
if (conf.width) elt.style.borderLeftWidth = conf.width;
5046
}
5147
elt.style.left = (left + col * cw) + "px";
52-
elt.style.top = "-50px";
53-
elt.style.bottom = "-20px";
54-
elt.style.minHeight = minH + "px";
55-
cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv);
48+
cm.state.rulerDiv.appendChild(elt)
5649
}
5750
}
58-
59-
function refreshRulers(cm) {
60-
clearRulers(cm);
61-
setRulers(cm);
62-
}
6351
});

lib/codemirror.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,14 @@
8888

8989
.cm-tab { display: inline-block; text-decoration: inherit; }
9090

91+
.CodeMirror-rulers {
92+
position: absolute;
93+
left: 0; right: 0; top: -50px; bottom: -20px;
94+
overflow: hidden;
95+
}
9196
.CodeMirror-ruler {
9297
border-left: 1px solid #ccc;
98+
top: 0; bottom: 0;
9399
position: absolute;
94100
}
95101

0 commit comments

Comments
 (0)