diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js
index 6ad0ca82..b251d9bb 100644
--- a/lib/ace/layer/text.js
+++ b/lib/ace/layer/text.js
@@ -215,7 +215,7 @@ var Text = function(parentEl) {
var html = [];
var tokens = this.session.getTokens(i, i);
- this.$renderLine(html, i, tokens[0].tokens, true);
+ this.$renderLine(html, i, tokens[0].tokens, !this.$useLineGroups());
lineElement = dom.setInnerHtml(lineElement, html.join(""));
i = this.session.getRowFoldEnd(i);
@@ -284,9 +284,14 @@ var Text = function(parentEl) {
// don't use setInnerHtml since we are working with an empty DIV
container.innerHTML = html.join("");
- var lines = container.childNodes
- while(lines.length)
- fragment.appendChild(lines[0]);
+ if (this.$useLineGroups()) {
+ container.className = 'ace_line_group';
+ fragment.appendChild(container);
+ } else {
+ var lines = container.childNodes
+ while(lines.length)
+ fragment.appendChild(lines[0]);
+ }
row++;
}
@@ -313,6 +318,9 @@ var Text = function(parentEl) {
if(row > lastRow)
break;
+ if (this.$useLineGroups())
+ html.push("
")
+
// Get the tokens per line as there might be some lines in between
// beeing folded.
// OPTIMIZE: If there is a long block of unfolded lines, just make
@@ -321,6 +329,9 @@ var Text = function(parentEl) {
if (tokens.length == 1)
this.$renderLine(html, row, tokens[0].tokens, false);
+ if (this.$useLineGroups())
+ html.push("
"); // end the line group
+
row++;
}
this.element = dom.setInnerHtml(this.element, html.join(""));
@@ -530,6 +541,15 @@ var Text = function(parentEl) {
var splits = this.session.$useWrapMode?this.session.$wrapData[row]:null;
this.$renderLineCore(stringBuilder, row, renderTokens, splits, onlyContents);
};
+
+ this.$useLineGroups = function() {
+ // For the updateLines function to work correctly, it's important that the
+ // child nodes of this.element correspond on a 1-to-1 basis to rows in the
+ // document (as distinct from lines on the screen). For sessions that are
+ // wrapped, this means we need to add a layer to the node hierarchy (tagged
+ // with the class name ace_line_group).
+ return this.session.getUseWrapMode();
+ };
this.destroy = function() {
clearInterval(this.$pollSizeChangesTimer);