diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index b3297b13..b4d93ca0 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -861,7 +861,9 @@ var EditSession = function(text, mode) { var len; var action = e.data.action; var firstRow = e.data.range.start.row, - lastRow = e.data.range.end.row; + lastRow = e.data.range.end.row, + start = e.data.range.start, + end = e.data.range.end; if (action.indexOf("Lines") != -1) { if (action == "insertLines") { @@ -900,6 +902,15 @@ var EditSession = function(text, mode) { // TODO: Expand folds here if needed. // TODO: Split foldLine in case there are new lines added in // between of a foldLine. + + // If some new line is added inside of a foldLine, then split + // the fold line up. + var foldLine = this.getFoldLine(firstRow); + if (foldLine && foldLine.range.inside(start.row, start.column)) { + var foldLine = foldLine.split(start.row, start.column); + + } + var foldLines = this.$foldData; for (var i = 0; i < foldLines.length; i++) { var foldLine = foldLines[i]; @@ -909,8 +920,8 @@ var EditSession = function(text, mode) { } } } else { - len = Math.abs(e.data.range.start.column - e.data.range.end.column); var column; + len = Math.abs(e.data.range.start.column - e.data.range.end.column); if (action.indexOf("insert") != -1) { column = e.data.range.start.column; } else { @@ -919,29 +930,7 @@ var EditSession = function(text, mode) { } var foldLine = this.getFoldLine(firstRow); if (foldLine) { - // TODO: Adding new characters into a fold range should - // expand/remove the fold. - // for (var i = 0; i <= ) - var ret = foldLine.getNextFoldTo(firstRow, column); - if (ret) { - var fold = ret.fold; - if (ret.kind == "inside" - && fold.start.column != column - && fold.start.row != firstRow) - { - // TODO: Implement adding new characters inside of an - // fold. This should extend/remove the fold etc. - } else if (ret.fold.start.row == firstRow){ - var folds = foldLine.folds; - for (var i = folds.indexOf(ret.fold); i < folds.length; i++) { - folds[i].start.column += len; - if (!folds[i].sameRow) { - break; - } - folds[i].end.column += len; - } - } - } + foldLine.addRemoveChars(firstRow, column, len); } } @@ -1455,6 +1444,13 @@ var EditSession = function(text, mode) { this.folds.sort(function(a, b) { return -a.range.compareEnd(b.start.row, b.start.column); }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } } else if (fold.start.row == this.end.row) { this.folds.push(fold); this.end.row = fold.end.row; @@ -1573,6 +1569,36 @@ var EditSession = function(text, mode) { return str; } } + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + // TODO: Implement adding new characters inside of an + // fold. This should extend/remove the fold etc. + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i == 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + } }).call(FoldLine.prototype); this.getFoldAt = function(row, column, side) { diff --git a/lib/ace/edit_session_test.js b/lib/ace/edit_session_test.js index d7811f7d..cc36b6aa 100644 --- a/lib/ace/edit_session_test.js +++ b/lib/ace/edit_session_test.js @@ -449,6 +449,59 @@ module.exports = { // Test one position after the folds. Should be all like normal. assertScreen2Doc(3, 0, 2, 0); + }, + + "test fold one-line text insert": function() { + // These are mostly test for the FoldLine.addRemoveChars function. + var session = createFoldTestSession(), + foldLines = session.$foldData; + function insert(row, column, text) { + session.insert({row: row, column: column}, text); + } + + var foldLine, fold, folds; + // First line. + foldLine = session.$foldData[0]; + fold = foldLine.folds[0]; + + insert(0, 0, "F"); + assert.range(foldLine.range, 0, 14, 0, 19); + assert.range(fold.range, 0, 14, 0, 19); + insert(0, 14, "F"); + assert.range(foldLine.range, 0, 15, 0, 20); + assert.range(fold.range, 0, 15, 0, 20); + insert(0, 20, "F"); + assert.range(foldLine.range, 0, 15, 0, 20); + assert.range(fold.range, 0, 15, 0, 20); + + // Second line. + foldLine = session.$foldData[1]; + folds = foldLine.folds; + + insert(1, 0, "F"); + assert.range(foldLine.range, 1, 11, 2, 25); + assert.range(folds[0].range, 1, 11, 2, 10); + assert.range(folds[1].range, 2, 20, 2, 25); + + insert(1, 11, "F"); + assert.range(foldLine.range, 1, 12, 2, 25); + assert.range(folds[0].range, 1, 12, 2, 10); + assert.range(folds[1].range, 2, 20, 2, 25); + + insert(2, 10, "F"); + assert.range(foldLine.range, 1, 12, 2, 26); + assert.range(folds[0].range, 1, 12, 2, 10); + assert.range(folds[1].range, 2, 21, 2, 26); + + insert(2, 21, "F"); + assert.range(foldLine.range, 1, 12, 2, 27); + assert.range(folds[0].range, 1, 12, 2, 10); + assert.range(folds[1].range, 2, 22, 2, 27); + + insert(2, 27, "F"); + assert.range(foldLine.range, 1, 12, 2, 27); + assert.range(folds[0].range, 1, 12, 2, 10); + assert.range(folds[1].range, 2, 22, 2, 27); } };