Merge pull request #546 from nightwing/pullreq
a small followup for structured folding
This commit is contained in:
commit
75f5d06362
5 changed files with 36 additions and 28 deletions
|
|
@ -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;
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -129,7 +129,8 @@ var Gutter = function(parentEl) {
|
|||
|
||||
if (foldWidgets) {
|
||||
var c = foldWidgets[i];
|
||||
if (!c)
|
||||
// check if cached value is invalidated and we need to recompute
|
||||
if (c == null)
|
||||
c = foldWidgets[i] = this.session.getFoldWidget(i);
|
||||
if (c)
|
||||
html.push(
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ var FoldMode = exports.FoldMode = function() {};
|
|||
this.foldingStartMarker = null;
|
||||
this.foldingStopMarker = null;
|
||||
|
||||
// must return "" if there's no fold, to enable caching
|
||||
this.getFoldWidget = function(session, row) {
|
||||
if (this.foldingStartMarker) {
|
||||
if (this.foldingStopMarker)
|
||||
|
|
|
|||
|
|
@ -66,13 +66,13 @@ oop.inherits(FoldMode, BaseFoldMode);
|
|||
var fold = tags[0];
|
||||
|
||||
if (!fold || this.voidElements[fold])
|
||||
return;
|
||||
return "";
|
||||
|
||||
if (fold.charAt(0) == "/")
|
||||
return "end";
|
||||
|
||||
if (tags.indexOf("/" + fold) !== -1)
|
||||
return;
|
||||
return "";
|
||||
|
||||
return "start";
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue