|
11 | 11 | })(function(CodeMirror) { |
12 | 12 | "use strict"; |
13 | 13 |
|
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) |
18 | 19 | } |
19 | 20 | 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) |
22 | 25 | } |
23 | 26 | }); |
24 | 27 |
|
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 = "" |
34 | 30 | var val = cm.getOption("rulers"); |
35 | 31 | var cw = cm.defaultCharWidth(); |
36 | 32 | 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"; |
38 | 34 | for (var i = 0; i < val.length; i++) { |
39 | 35 | var elt = document.createElement("div"); |
40 | 36 | elt.className = "CodeMirror-ruler"; |
|
49 | 45 | if (conf.width) elt.style.borderLeftWidth = conf.width; |
50 | 46 | } |
51 | 47 | 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) |
56 | 49 | } |
57 | 50 | } |
58 | | - |
59 | | - function refreshRulers(cm) { |
60 | | - clearRulers(cm); |
61 | | - setRulers(cm); |
62 | | - } |
63 | 51 | }); |
0 commit comments