Path: blob/master/web-gui/buildyourownbotnet/assets/js/codemirror/addon/fold/foldgutter.js
1293 views
(function() {1"use strict";23CodeMirror.defineOption("foldGutter", false, function(cm, val, old) {4if (old && old != CodeMirror.Init) {5cm.clearGutter(cm.state.foldGutter.options.gutter);6cm.state.foldGutter = null;7cm.off("gutterClick", onGutterClick);8cm.off("change", onChange);9cm.off("viewportChange", onViewportChange);10cm.off("fold", onFold);11cm.off("unfold", onFold);12cm.off("swapDoc", updateInViewport);13}14if (val) {15cm.state.foldGutter = new State(parseOptions(val));16updateInViewport(cm);17cm.on("gutterClick", onGutterClick);18cm.on("change", onChange);19cm.on("viewportChange", onViewportChange);20cm.on("fold", onFold);21cm.on("unfold", onFold);22cm.on("swapDoc", updateInViewport);23}24});2526var Pos = CodeMirror.Pos;2728function State(options) {29this.options = options;30this.from = this.to = 0;31}3233function parseOptions(opts) {34if (opts === true) opts = {};35if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter";36if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open";37if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded";38return opts;39}4041function isFolded(cm, line) {42var marks = cm.findMarksAt(Pos(line));43for (var i = 0; i < marks.length; ++i)44if (marks[i].__isFold && marks[i].find().from.line == line) return true;45}4647function marker(spec) {48if (typeof spec == "string") {49var elt = document.createElement("div");50elt.className = spec;51return elt;52} else {53return spec.cloneNode(true);54}55}5657function updateFoldInfo(cm, from, to) {58var opts = cm.state.foldGutter.options, cur = from;59cm.eachLine(from, to, function(line) {60var mark = null;61if (isFolded(cm, cur)) {62mark = marker(opts.indicatorFolded);63} else {64var pos = Pos(cur, 0), func = opts.rangeFinder || CodeMirror.fold.auto;65var range = func && func(cm, pos);66if (range && range.from.line + 1 < range.to.line)67mark = marker(opts.indicatorOpen);68}69cm.setGutterMarker(line, opts.gutter, mark);70++cur;71});72}7374function updateInViewport(cm) {75var vp = cm.getViewport(), state = cm.state.foldGutter;76if (!state) return;77cm.operation(function() {78updateFoldInfo(cm, vp.from, vp.to);79});80state.from = vp.from; state.to = vp.to;81}8283function onGutterClick(cm, line, gutter) {84var opts = cm.state.foldGutter.options;85if (gutter != opts.gutter) return;86cm.foldCode(Pos(line, 0), opts.rangeFinder);87}8889function onChange(cm) {90var state = cm.state.foldGutter, opts = cm.state.foldGutter.options;91state.from = state.to = 0;92clearTimeout(state.changeUpdate);93state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600);94}9596function onViewportChange(cm) {97var state = cm.state.foldGutter, opts = cm.state.foldGutter.options;98clearTimeout(state.changeUpdate);99state.changeUpdate = setTimeout(function() {100var vp = cm.getViewport();101if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) {102updateInViewport(cm);103} else {104cm.operation(function() {105if (vp.from < state.from) {106updateFoldInfo(cm, vp.from, state.from);107state.from = vp.from;108}109if (vp.to > state.to) {110updateFoldInfo(cm, state.to, vp.to);111state.to = vp.to;112}113});114}115}, opts.updateViewportTimeSpan || 400);116}117118function onFold(cm, from) {119var state = cm.state.foldGutter, line = from.line;120if (line >= state.from && line < state.to)121updateFoldInfo(cm, line, line + 1);122}123})();124125126