From f02c04965b9a07363da549b2c47c5039ddc680cc Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 1 Dec 2011 23:58:16 +0400 Subject: [PATCH] shift+click must fold all subfolds as well --- lib/ace/edit_session/folding.js | 48 +++++++++++++++++++++------------ lib/ace/mode/folding/cstyle.js | 8 ------ 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index 207e5436..5c8c5af2 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -570,10 +570,10 @@ function Folding() { var token = iterator.getCurrentToken(); if (token && /^comment|string/.test(token.type)) { var range = new Range(); - var t; + var re = new RegExp(token.type.replace(/\..*/, "\\.")); do { - t = iterator.stepBackward(); - } while(t && t.type == token.type); + token = iterator.stepBackward(); + } while(token && re.test(token.type)) iterator.stepForward(); range.start.row = iterator.getCurrentTokenRow(); @@ -582,29 +582,33 @@ function Folding() { var iterator = new TokenIterator(this, row, column); do { - t = iterator.stepForward(); - } while(t && t.type == token.type); - t = iterator.stepBackward(); + token = iterator.stepForward(); + } while(token && re.test(token.type)) + token = iterator.stepBackward(); range.end.row = iterator.getCurrentTokenRow(); - range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1; - return range; + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1; + return range } }; - this.foldAll = function() { + this.foldAll = function(startRow, endRow) { var foldWidgets = this.foldWidgets; - for (var row = foldWidgets.length; row--; ) { + endRow = endRow || foldWidgets.length; + for (var row = startRow || 0; row < endRow; row++) { if (foldWidgets[row] == null) foldWidgets[row] = this.getFoldWidget(row); if (foldWidgets[row] != "start") continue; var range = this.getFoldWidgetRange(row); - if (range) + // sometimes range can be incompatible with existing fold + // wouldn't it be better for addFold to return null istead of throwing? + if (range && range.end.row < endRow) try { this.addFold("...", range); + } catch(e) {} } - }; + } // structured folding this.$setFolding = function(foldMode) { @@ -628,9 +632,11 @@ function Folding() { this.on('change', this.$updateFoldWidgets); }; - this.onFoldWidgetClick = function(row, htmlEvent) { + this.onFoldWidgetClick = function(row, e) { var type = this.getFoldWidget(row); var line = this.getLine(row); + var onlySubfolds = e.shiftKey; + var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey; var fold; if (type == "end") @@ -639,13 +645,21 @@ function Folding() { fold = this.getFoldAt(row, line.length, 1); if (fold) { - this.expandFold(fold); + if (addSubfolds) + this.removeFold(fold); + else + this.expandFold(fold); return; } var range = this.getFoldWidgetRange(row); - if (range) - this.addFold("...", range); + if (range) { + if (!onlySubfolds) + this.addFold("...", range); + + if (addSubfolds) + this.foldAll(range.start.row + 1, range.end.row); + } }; this.updateFoldWidgets = function(e) { @@ -669,4 +683,4 @@ function Folding() { exports.Folding = Folding; -}); \ No newline at end of file +}); diff --git a/lib/ace/mode/folding/cstyle.js b/lib/ace/mode/folding/cstyle.js index 7b06fe35..d44a7de6 100644 --- a/lib/ace/mode/folding/cstyle.js +++ b/lib/ace/mode/folding/cstyle.js @@ -69,9 +69,6 @@ oop.inherits(FoldMode, BaseFoldMode); end.row --; end.column = session.getLine(end.row).length; } - - } else { - end = {row: session.getLength(), column: 0}; } return Range.fromPoints(start, end); @@ -90,11 +87,6 @@ oop.inherits(FoldMode, BaseFoldMode); if (start) { start.column++; end.column--; - } else { - start = { - row: 0, - column: session.getLine(0).length - }; } return Range.fromPoints(start, end);