diff --git a/lib/ace/anchor.js b/lib/ace/anchor.js index 7991038a..ab5946ac 100644 --- a/lib/ace/anchor.js +++ b/lib/ace/anchor.js @@ -71,8 +71,17 @@ var Anchor = exports.Anchor = function(doc, row, column) { this.onChange = function(e) { var delta = e.data; var range = delta.range; - var pos = this.getPosition(); + + if (range.start.row == range.end.row && range.start.row != this.pos.row) + return; + + if (range.start.row > this.pos.row) + return; + + if (range.start.row == this.pos.row && range.start.column > this.pos.column) + return; + var pos = this.getPosition(); if (delta.action === "insertText") { if (range.start.row === pos.row && range.start.column <= pos.column) { if (range.start.row === range.end.row) { @@ -92,8 +101,12 @@ var Anchor = exports.Anchor = function(doc, row, column) { } } else if (delta.action == "removeText") { - if (range.start.row == pos.row && range.start.column <= pos.column) { - pos.column -= Math.max(0, range.end.column - range.start.column); + if (range.start.row == pos.row && range.start.column < pos.column) { + if (range.end.column >= pos.column) + pos.column = range.start.column; + else + pos.column = Math.max(0, pos.column - (range.end.column - range.start.column)); + } else if (range.start.row !== range.end.row && range.start.row < pos.row) { if (range.end.row == pos.row) { pos.column = Math.max(0, pos.column - range.end.column) + range.start.column; @@ -102,7 +115,7 @@ var Anchor = exports.Anchor = function(doc, row, column) { } else if (range.end.row == pos.row) { pos.row -= range.end.row - range.start.row; - pos.column = pos.column - range.end.column + range.start.column; + pos.column = Math.max(0, pos.column - range.end.column) + range.start.column; } } else if (delta.action == "removeLines") { if (range.start.row <= pos.row) { diff --git a/lib/ace/test/anchor_test.js b/lib/ace/test/anchor_test.js index 1fcd32b1..1eb86287 100644 --- a/lib/ace/test/anchor_test.js +++ b/lib/ace/test/anchor_test.js @@ -91,6 +91,23 @@ var Test = { assert.position(anchor.getPosition(), 1, 2); }, + "test remove range which contains the anchor should move the anchor to the start of the range": function() { + var doc = new Document("juhu\nkinners"); + var anchor = new Anchor(doc, 0, 3); + + doc.remove(new Range(0, 1, 1, 3)); + assert.position(anchor.getPosition(), 0, 1); + }, + + "test delete character before the anchor should have no effect": function() { + var doc = new Document("juhu\nkinners"); + var anchor = new Anchor(doc, 1, 4); + + doc.remove(new Range(1, 4, 1, 5)); + console.log(doc.$lines); + assert.position(anchor.getPosition(), 1, 4); + }, + "test delete lines in anchor line before anchor should move anchor row": function() { var doc = new Document("juhu\n1\n2\nkinners"); var anchor = new Anchor(doc, 3, 4); @@ -123,6 +140,14 @@ var Test = { assert.position(anchor.getPosition(), 1, 0); }, + "test remove after the anchor should have no effect": function() { + var doc = new Document("juhu\nkinners\n123"); + var anchor = new Anchor(doc, 1, 2); + + doc.remove(new Range(1, 4, 2, 2)); + assert.position(anchor.getPosition(), 1, 2); + }, + "test anchor changes triggered by document changes should emit change event": function(next) { var doc = new Document("juhu\nkinners\n123"); var anchor = new Anchor(doc, 1, 5);