From 3a23eacda282ec2d08115c1987c0e62b110c48f0 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 26 Aug 2013 21:55:34 +0400 Subject: [PATCH] fix foldAll --- lib/ace/edit_session/folding.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index b36857c6..1735e6f9 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -272,7 +272,8 @@ function Folding() { var endColumn = fold.end.column; // --- Some checking --- - if (startRow == endRow && endColumn - startColumn < 2) + if (!(startRow < endRow || + startRow == endRow && startColumn < endColumn - 2)) throw "The range has to be at least 2 characters width"; var startFold = this.getFoldAt(startRow, startColumn, 1); @@ -627,19 +628,25 @@ function Folding() { depth = 100000; // JSON.stringify doesn't hanle Infinity var foldWidgets = this.foldWidgets; endRow = endRow || this.getLength(); - for (var row = startRow || 0; row < endRow; row++) { + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { if (foldWidgets[row] == null) foldWidgets[row] = this.getFoldWidget(row); if (foldWidgets[row] != "start") continue; var range = this.getFoldWidgetRange(row); + var rangeEndRow = range.end.row; // sometimes range can be incompatible with existing fold // TODO change addFold to return null istead of throwing - if (range && range.end.row <= endRow) try { + if (range && range.isMultiLine() + && rangeEndRow <= endRow + && range.start.row >= startRow + ) try { var fold = this.addFold("...", range); fold.collapseChildren = depth; - row = range.end.row; + // addFold can change the range + row = rangeEndRow; } catch(e) {} } };