PluginProbe ʕ •ᴥ•ʔ
SiteOrigin CSS / 1.5.8
SiteOrigin CSS v1.5.8
1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 1.3.1 1.3.2 1.4.0 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.10 1.5.11 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 trunk 1.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.2.0
so-css / lib / codemirror / addon / scroll / annotatescrollbar.js
so-css / lib / codemirror / addon / scroll Last commit date
annotatescrollbar.js 6 years ago annotatescrollbar.min.js 6 years ago
annotatescrollbar.js
123 lines
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 // Distributed under an MIT license: http://codemirror.net/LICENSE
3
4 (function(mod) {
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
6 mod(require("../../lib/codemirror"));
7 else if (typeof define == "function" && define.amd) // AMD
8 define(["../../lib/codemirror"], mod);
9 else // Plain browser env
10 mod(CodeMirror);
11 })(function(CodeMirror) {
12 "use strict";
13
14 CodeMirror.defineExtension("annotateScrollbar", function(options) {
15 if (typeof options == "string") options = {className: options};
16 return new Annotation(this, options);
17 });
18
19 CodeMirror.defineOption("scrollButtonHeight", 0);
20
21 function Annotation(cm, options) {
22 this.cm = cm;
23 this.options = options;
24 this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight");
25 this.annotations = [];
26 this.doRedraw = this.doUpdate = null;
27 this.div = cm.getWrapperElement().appendChild(document.createElement("div"));
28 this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none";
29 this.computeScale();
30
31 function scheduleRedraw(delay) {
32 clearTimeout(self.doRedraw);
33 self.doRedraw = setTimeout(function() { self.redraw(); }, delay);
34 }
35
36 var self = this;
37 cm.on("refresh", this.resizeHandler = function() {
38 clearTimeout(self.doUpdate);
39 self.doUpdate = setTimeout(function() {
40 if (self.computeScale()) scheduleRedraw(20);
41 }, 100);
42 });
43 cm.on("markerAdded", this.resizeHandler);
44 cm.on("markerCleared", this.resizeHandler);
45 if (options.listenForChanges !== false)
46 cm.on("change", this.changeHandler = function() {
47 scheduleRedraw(250);
48 });
49 }
50
51 Annotation.prototype.computeScale = function() {
52 var cm = this.cm;
53 var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) /
54 cm.getScrollerElement().scrollHeight
55 if (hScale != this.hScale) {
56 this.hScale = hScale;
57 return true;
58 }
59 };
60
61 Annotation.prototype.update = function(annotations) {
62 this.annotations = annotations;
63 this.redraw();
64 };
65
66 Annotation.prototype.redraw = function(compute) {
67 if (compute !== false) this.computeScale();
68 var cm = this.cm, hScale = this.hScale;
69
70 var frag = document.createDocumentFragment(), anns = this.annotations;
71
72 var wrapping = cm.getOption("lineWrapping");
73 var singleLineH = wrapping && cm.defaultTextHeight() * 1.5;
74 var curLine = null, curLineObj = null;
75 function getY(pos, top) {
76 if (curLine != pos.line) {
77 curLine = pos.line;
78 curLineObj = cm.getLineHandle(curLine);
79 }
80 if ((curLineObj.widgets && curLineObj.widgets.length) ||
81 (wrapping && curLineObj.height > singleLineH))
82 return cm.charCoords(pos, "local")[top ? "top" : "bottom"];
83 var topY = cm.heightAtLine(curLineObj, "local");
84 return topY + (top ? 0 : curLineObj.height);
85 }
86
87 var lastLine = cm.lastLine()
88 if (cm.display.barWidth) for (var i = 0, nextTop; i < anns.length; i++) {
89 var ann = anns[i];
90 if (ann.to.line > lastLine) continue;
91 var top = nextTop || getY(ann.from, true) * hScale;
92 var bottom = getY(ann.to, false) * hScale;
93 while (i < anns.length - 1) {
94 if (anns[i + 1].to.line > lastLine) break;
95 nextTop = getY(anns[i + 1].from, true) * hScale;
96 if (nextTop > bottom + .9) break;
97 ann = anns[++i];
98 bottom = getY(ann.to, false) * hScale;
99 }
100 if (bottom == top) continue;
101 var height = Math.max(bottom - top, 3);
102
103 var elt = frag.appendChild(document.createElement("div"));
104 elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: "
105 + (top + this.buttonHeight) + "px; height: " + height + "px";
106 elt.className = this.options.className;
107 if (ann.id) {
108 elt.setAttribute("annotation-id", ann.id);
109 }
110 }
111 this.div.textContent = "";
112 this.div.appendChild(frag);
113 };
114
115 Annotation.prototype.clear = function() {
116 this.cm.off("refresh", this.resizeHandler);
117 this.cm.off("markerAdded", this.resizeHandler);
118 this.cm.off("markerCleared", this.resizeHandler);
119 if (this.changeHandler) this.cm.off("change", this.changeHandler);
120 this.div.parentNode.removeChild(this.div);
121 };
122 });
123