mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-30 05:26:19 +00:00
96d4a3ecf7
Due to historical reasons, the code is in subfolder "1". With SVN removal, we place the code back and remove the annoying "1" folder.
72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|
|
|
// Because sometimes you need to style the cursor's line.
|
|
//
|
|
// Adds an option 'styleActiveLine' which, when enabled, gives the
|
|
// active line's wrapping <div> the CSS class "CodeMirror-activeline",
|
|
// and gives its background <div> the class "CodeMirror-activeline-background".
|
|
|
|
(function(mod) {
|
|
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
mod(require("../../lib/codemirror"));
|
|
else if (typeof define == "function" && define.amd) // AMD
|
|
define(["../../lib/codemirror"], mod);
|
|
else // Plain browser env
|
|
mod(CodeMirror);
|
|
})(function(CodeMirror) {
|
|
"use strict";
|
|
var WRAP_CLASS = "CodeMirror-activeline";
|
|
var BACK_CLASS = "CodeMirror-activeline-background";
|
|
|
|
CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
|
|
var prev = old && old != CodeMirror.Init;
|
|
if (val && !prev) {
|
|
cm.state.activeLines = [];
|
|
updateActiveLines(cm, cm.listSelections());
|
|
cm.on("beforeSelectionChange", selectionChange);
|
|
} else if (!val && prev) {
|
|
cm.off("beforeSelectionChange", selectionChange);
|
|
clearActiveLines(cm);
|
|
delete cm.state.activeLines;
|
|
}
|
|
});
|
|
|
|
function clearActiveLines(cm) {
|
|
for (var i = 0; i < cm.state.activeLines.length; i++) {
|
|
cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
|
|
cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
|
|
}
|
|
}
|
|
|
|
function sameArray(a, b) {
|
|
if (a.length != b.length) return false;
|
|
for (var i = 0; i < a.length; i++)
|
|
if (a[i] != b[i]) return false;
|
|
return true;
|
|
}
|
|
|
|
function updateActiveLines(cm, ranges) {
|
|
var active = [];
|
|
for (var i = 0; i < ranges.length; i++) {
|
|
var range = ranges[i];
|
|
if (!range.empty()) continue;
|
|
var line = cm.getLineHandleVisualStart(range.head.line);
|
|
if (active[active.length - 1] != line) active.push(line);
|
|
}
|
|
if (sameArray(cm.state.activeLines, active)) return;
|
|
cm.operation(function() {
|
|
clearActiveLines(cm);
|
|
for (var i = 0; i < active.length; i++) {
|
|
cm.addLineClass(active[i], "wrap", WRAP_CLASS);
|
|
cm.addLineClass(active[i], "background", BACK_CLASS);
|
|
}
|
|
cm.state.activeLines = active;
|
|
});
|
|
}
|
|
|
|
function selectionChange(cm, sel) {
|
|
updateActiveLines(cm, sel.ranges);
|
|
}
|
|
});
|