From c2e1f8815de652e751c9083e8cbe8dfc5d1ed447 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 22 Mar 2012 19:37:18 +0400 Subject: [PATCH] emit events on add/remove to range_list --- lib/ace/range_list.js | 37 +++++++++++++------- lib/ace/range_list_test.js | 69 +++++++++++++++++++++++++++++++------- 2 files changed, 82 insertions(+), 24 deletions(-) diff --git a/lib/ace/range_list.js b/lib/ace/range_list.js index 75885509..fcf9b250 100644 --- a/lib/ace/range_list.js +++ b/lib/ace/range_list.js @@ -85,7 +85,9 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) { endIndex++; var removed = this.ranges.splice(startIndex, endIndex - startIndex, range); - this._emit("remove", {ranges: removed}); + this._emit("add", {range: range}); + if (removed.length) + this._emit("remove", {ranges: removed}); return startIndex; }; @@ -95,9 +97,11 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) { this.substractPoint = function(pos) { var i = this.pointIndex(pos); - if (i > 0){ - var removed = this.splice(i, 1); + + if (i >= 0) { + var removed = this.ranges.splice(i, 1); this._emit("remove", {ranges: removed}); + return removed[0] } }; @@ -109,17 +113,22 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) { for (var i = 1; i < list.length; i++) { range = next; next = list[i]; - if (this.comparePoints(range.end, next.start) > 0) { - if (this.comparePoints(range.end, next.end) < 0) { - range.end.row = next.end.row; - range.end.column = next.end.column; - } + var cmp = this.comparePoints(range.end, next.start) + if (cmp < 0) + continue; - list.splice(i, 1); - removed.push(next); - next = range; - i--; + if (cmp == 0 && !(range.isEmpty() || next.isEmpty())) + continue; + + if (this.comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; } if (removed.length) @@ -154,6 +163,10 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) { return clipped; }; + this.removeAll = function() { + if (this.ranges.length) + this._emit("remove", {ranges: this.ranges.splice(0, this.ranges.length)}); + }; this.attach = function(session) { if (this.session) diff --git a/lib/ace/range_list_test.js b/lib/ace/range_list_test.js index 7865e6d1..a73202f5 100644 --- a/lib/ace/range_list_test.js +++ b/lib/ace/range_list_test.js @@ -47,10 +47,21 @@ var RangeList = require("./range_list").RangeList; var EditSession = require("./edit_session").EditSession; var assert = require("./test/assertions"); +function flatten(rangeList) { + var points = []; + rangeList.ranges.forEach(function(r) { + points.push(r.start.row, r.start.column, r.end.row, r.end.column) + }) + return points; +} +function testRangeList(rangeList, points) { + assert.equal("" + flatten(rangeList), "" + points); +} + module.exports = { - + name: "ACE range_list.js", - + "test: rangeList pointIndex": function() { var rangeList = new RangeList(); rangeList.ranges = [ @@ -58,7 +69,7 @@ module.exports = { new Range(4,2,5,4), new Range(8,8,9,9) ]; - + assert.equal(rangeList.pointIndex({row: 0, column: 1}), -1); assert.equal(rangeList.pointIndex({row: 1, column: 2}), 0); assert.equal(rangeList.pointIndex({row: 1, column: 3}), 0); @@ -68,7 +79,7 @@ module.exports = { assert.equal(rangeList.pointIndex({row: 8, column: 9}), 2); assert.equal(rangeList.pointIndex({row: 18, column: 9}), -4); }, - + "test: rangeList add": function() { var rangeList = new RangeList(); rangeList.addList([ @@ -80,17 +91,30 @@ module.exports = { new Range(6,6,7,7) ]); assert.equal(rangeList.ranges.length, 5); - + rangeList.add(new Range(1,2,3,5)); assert.range(rangeList.ranges[0], 1,2,3,5); assert.equal(rangeList.ranges.length, 5); - + rangeList.add(new Range(7,7,7,7)); assert.range(rangeList.ranges[3], 7,7,7,7); rangeList.add(new Range(7,8,7,8)); assert.range(rangeList.ranges[4], 7,8,7,8); }, - + + "test: rangeList add empty": function() { + var rangeList = new RangeList(); + rangeList.addList([ + new Range(7,10,7,10), + new Range(9,10,9,10), + new Range(8,10,8,10) + ]); + assert.equal(rangeList.ranges.length, 3); + + rangeList.add(new Range(9,10,9,10)); + testRangeList(rangeList, [7,10,7,10,8,10,8,10,9,10,9,10]); + }, + "test: rangeList merge": function() { var rangeList = new RangeList(); rangeList.addList([ @@ -101,22 +125,43 @@ module.exports = { ]); var removed = []; rangeList.on('remove', function(e) {removed = e.ranges}); - + assert.equal(rangeList.ranges.length, 4); - + rangeList.ranges[1].end.row = 7; rangeList.merge(); assert.equal(removed.length, 1); assert.range(rangeList.ranges[1], 4,2,7,7); assert.equal(rangeList.ranges.length, 3); - + rangeList.ranges[0].end.row = 10; rangeList.merge(); - assert.range(rangeList.ranges[0], 1,2,10,4); + assert.range(rangeList.ranges[0], 1,2,10,4); assert.equal(removed.length, 2); assert.equal(rangeList.ranges.length, 1); + + rangeList.ranges.push(new Range(10,10,10,10)); + rangeList.ranges.push(new Range(10,10,10,10)); + rangeList.merge(); + assert.equal(rangeList.ranges.length, 2); + }, + + "test: rangeList remove": function() { + var rangeList = new RangeList(); + var list = [ + new Range(1,2,3,4), + new Range(4,2,5,4), + new Range(6,6,7,7), + new Range(8,8,9,9) + ]; + rangeList.addList(list); + assert.equal(rangeList.ranges.length, 4); + rangeList.substractPoint({row: 1, column: 2}); + assert.equal(rangeList.ranges.length, 3); + rangeList.substractPoint({row: 6, column: 7}); + assert.equal(rangeList.ranges.length, 2); } - + }; });