shift+click must fold all subfolds as well

This commit is contained in:
nightwing 2011-12-01 23:58:16 +04:00
commit f02c04965b
2 changed files with 31 additions and 25 deletions

View file

@ -570,10 +570,10 @@ function Folding() {
var token = iterator.getCurrentToken(); var token = iterator.getCurrentToken();
if (token && /^comment|string/.test(token.type)) { if (token && /^comment|string/.test(token.type)) {
var range = new Range(); var range = new Range();
var t; var re = new RegExp(token.type.replace(/\..*/, "\\."));
do { do {
t = iterator.stepBackward(); token = iterator.stepBackward();
} while(t && t.type == token.type); } while(token && re.test(token.type))
iterator.stepForward(); iterator.stepForward();
range.start.row = iterator.getCurrentTokenRow(); range.start.row = iterator.getCurrentTokenRow();
@ -582,29 +582,33 @@ function Folding() {
var iterator = new TokenIterator(this, row, column); var iterator = new TokenIterator(this, row, column);
do { do {
t = iterator.stepForward(); token = iterator.stepForward();
} while(t && t.type == token.type); } while(token && re.test(token.type))
t = iterator.stepBackward(); token = iterator.stepBackward();
range.end.row = iterator.getCurrentTokenRow(); range.end.row = iterator.getCurrentTokenRow();
range.end.column = iterator.getCurrentTokenColumn() + t.value.length - 1; range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 1;
return range; return range
} }
}; };
this.foldAll = function() { this.foldAll = function(startRow, endRow) {
var foldWidgets = this.foldWidgets; 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) if (foldWidgets[row] == null)
foldWidgets[row] = this.getFoldWidget(row); foldWidgets[row] = this.getFoldWidget(row);
if (foldWidgets[row] != "start") if (foldWidgets[row] != "start")
continue; continue;
var range = this.getFoldWidgetRange(row); 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); this.addFold("...", range);
} catch(e) {}
} }
}; }
// structured folding // structured folding
this.$setFolding = function(foldMode) { this.$setFolding = function(foldMode) {
@ -628,9 +632,11 @@ function Folding() {
this.on('change', this.$updateFoldWidgets); this.on('change', this.$updateFoldWidgets);
}; };
this.onFoldWidgetClick = function(row, htmlEvent) { this.onFoldWidgetClick = function(row, e) {
var type = this.getFoldWidget(row); var type = this.getFoldWidget(row);
var line = this.getLine(row); var line = this.getLine(row);
var onlySubfolds = e.shiftKey;
var addSubfolds = onlySubfolds || e.ctrlKey || e.altKey || e.metaKey;
var fold; var fold;
if (type == "end") if (type == "end")
@ -639,13 +645,21 @@ function Folding() {
fold = this.getFoldAt(row, line.length, 1); fold = this.getFoldAt(row, line.length, 1);
if (fold) { if (fold) {
this.expandFold(fold); if (addSubfolds)
this.removeFold(fold);
else
this.expandFold(fold);
return; return;
} }
var range = this.getFoldWidgetRange(row); var range = this.getFoldWidgetRange(row);
if (range) if (range) {
this.addFold("...", range); if (!onlySubfolds)
this.addFold("...", range);
if (addSubfolds)
this.foldAll(range.start.row + 1, range.end.row);
}
}; };
this.updateFoldWidgets = function(e) { this.updateFoldWidgets = function(e) {

View file

@ -69,9 +69,6 @@ oop.inherits(FoldMode, BaseFoldMode);
end.row --; end.row --;
end.column = session.getLine(end.row).length; end.column = session.getLine(end.row).length;
} }
} else {
end = {row: session.getLength(), column: 0};
} }
return Range.fromPoints(start, end); return Range.fromPoints(start, end);
@ -90,11 +87,6 @@ oop.inherits(FoldMode, BaseFoldMode);
if (start) { if (start) {
start.column++; start.column++;
end.column--; end.column--;
} else {
start = {
row: 0,
column: session.getLine(0).length
};
} }
return Range.fromPoints(start, end); return Range.fromPoints(start, end);