annotate .cms/lib/codemirror/addon/selection/active-line.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function(mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function(CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 "use strict";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 var WRAP_CLASS = "CodeMirror-activeline";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14 var BACK_CLASS = "CodeMirror-activeline-background";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 var GUTT_CLASS = "CodeMirror-activeline-gutter";
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var prev = old == CodeMirror.Init ? false : old;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 if (val == prev) return
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 if (prev) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21 cm.off("beforeSelectionChange", selectionChange);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 clearActiveLines(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 delete cm.state.activeLines;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 if (val) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 cm.state.activeLines = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 updateActiveLines(cm, cm.listSelections());
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 cm.on("beforeSelectionChange", selectionChange);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 function clearActiveLines(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 for (var i = 0; i < cm.state.activeLines.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40 function sameArray(a, b) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 if (a.length != b.length) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 for (var i = 0; i < a.length; i++)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43 if (a[i] != b[i]) return false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 return true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47 function updateActiveLines(cm, ranges) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 var active = [];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 for (var i = 0; i < ranges.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50 var range = ranges[i];
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 var option = cm.getOption("styleActiveLine");
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty())
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 continue
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 var line = cm.getLineHandleVisualStart(range.head.line);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 if (active[active.length - 1] != line) active.push(line);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 if (sameArray(cm.state.activeLines, active)) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58 cm.operation(function() {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 clearActiveLines(cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 for (var i = 0; i < active.length; i++) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 cm.addLineClass(active[i], "wrap", WRAP_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 cm.addLineClass(active[i], "background", BACK_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 cm.addLineClass(active[i], "gutter", GUTT_CLASS);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 cm.state.activeLines = active;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 function selectionChange(cm, sel) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 updateActiveLines(cm, sel.ranges);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72 });