1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/sourceeditor/codemirror/fold/foldcode.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,86 @@ 1.4 +(function() { 1.5 + "use strict"; 1.6 + 1.7 + function doFold(cm, pos, options, force) { 1.8 + var finder = options && (options.call ? options : options.rangeFinder); 1.9 + if (!finder) finder = CodeMirror.fold.auto; 1.10 + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); 1.11 + var minSize = options && options.minFoldSize || 0; 1.12 + 1.13 + function getRange(allowFolded) { 1.14 + var range = finder(cm, pos); 1.15 + if (!range || range.to.line - range.from.line < minSize) return null; 1.16 + var marks = cm.findMarksAt(range.from); 1.17 + for (var i = 0; i < marks.length; ++i) { 1.18 + if (marks[i].__isFold && force !== "fold") { 1.19 + if (!allowFolded) return null; 1.20 + range.cleared = true; 1.21 + marks[i].clear(); 1.22 + } 1.23 + } 1.24 + return range; 1.25 + } 1.26 + 1.27 + var range = getRange(true); 1.28 + if (options && options.scanUp) while (!range && pos.line > cm.firstLine()) { 1.29 + pos = CodeMirror.Pos(pos.line - 1, 0); 1.30 + range = getRange(false); 1.31 + } 1.32 + if (!range || range.cleared || force === "unfold") return; 1.33 + 1.34 + var myWidget = makeWidget(options); 1.35 + CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); }); 1.36 + var myRange = cm.markText(range.from, range.to, { 1.37 + replacedWith: myWidget, 1.38 + clearOnEnter: true, 1.39 + __isFold: true 1.40 + }); 1.41 + myRange.on("clear", function(from, to) { 1.42 + CodeMirror.signal(cm, "unfold", cm, from, to); 1.43 + }); 1.44 + CodeMirror.signal(cm, "fold", cm, range.from, range.to); 1.45 + } 1.46 + 1.47 + function makeWidget(options) { 1.48 + var widget = (options && options.widget) || "\u2194"; 1.49 + if (typeof widget == "string") { 1.50 + var text = document.createTextNode(widget); 1.51 + widget = document.createElement("span"); 1.52 + widget.appendChild(text); 1.53 + widget.className = "CodeMirror-foldmarker"; 1.54 + } 1.55 + return widget; 1.56 + } 1.57 + 1.58 + // Clumsy backwards-compatible interface 1.59 + CodeMirror.newFoldFunction = function(rangeFinder, widget) { 1.60 + return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; 1.61 + }; 1.62 + 1.63 + // New-style interface 1.64 + CodeMirror.defineExtension("foldCode", function(pos, options, force) { 1.65 + doFold(this, pos, options, force); 1.66 + }); 1.67 + 1.68 + CodeMirror.commands.fold = function(cm) { 1.69 + cm.foldCode(cm.getCursor()); 1.70 + }; 1.71 + 1.72 + CodeMirror.registerHelper("fold", "combine", function() { 1.73 + var funcs = Array.prototype.slice.call(arguments, 0); 1.74 + return function(cm, start) { 1.75 + for (var i = 0; i < funcs.length; ++i) { 1.76 + var found = funcs[i](cm, start); 1.77 + if (found) return found; 1.78 + } 1.79 + }; 1.80 + }); 1.81 + 1.82 + CodeMirror.registerHelper("fold", "auto", function(cm, start) { 1.83 + var helpers = cm.getHelpers(start, "fold"); 1.84 + for (var i = 0; i < helpers.length; i++) { 1.85 + var cur = helpers[i](cm, start); 1.86 + if (cur) return cur; 1.87 + } 1.88 + }); 1.89 +})();