emit events on add/remove to range_list

This commit is contained in:
nightwing 2012-03-22 19:37:18 +04:00
commit c2e1f8815d
2 changed files with 82 additions and 24 deletions

View file

@ -85,6 +85,8 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) {
endIndex++; endIndex++;
var removed = this.ranges.splice(startIndex, endIndex - startIndex, range); var removed = this.ranges.splice(startIndex, endIndex - startIndex, range);
this._emit("add", {range: range});
if (removed.length)
this._emit("remove", {ranges: removed}); this._emit("remove", {ranges: removed});
return startIndex; return startIndex;
}; };
@ -95,9 +97,11 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) {
this.substractPoint = function(pos) { this.substractPoint = function(pos) {
var i = this.pointIndex(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}); this._emit("remove", {ranges: removed});
return removed[0]
} }
}; };
@ -109,7 +113,13 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) {
for (var i = 1; i < list.length; i++) { for (var i = 1; i < list.length; i++) {
range = next; range = next;
next = list[i]; next = list[i];
if (this.comparePoints(range.end, next.start) > 0) { var cmp = this.comparePoints(range.end, next.start)
if (cmp < 0)
continue;
if (cmp == 0 && !(range.isEmpty() || next.isEmpty()))
continue;
if (this.comparePoints(range.end, next.end) < 0) { if (this.comparePoints(range.end, next.end) < 0) {
range.end.row = next.end.row; range.end.row = next.end.row;
range.end.column = next.end.column; range.end.column = next.end.column;
@ -120,7 +130,6 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) {
next = range; next = range;
i--; i--;
} }
}
if (removed.length) if (removed.length)
this._emit("remove", {ranges: removed}); this._emit("remove", {ranges: removed});
@ -154,6 +163,10 @@ var RangeList = function(startRow, startColumn, endRow, endColumn) {
return clipped; return clipped;
}; };
this.removeAll = function() {
if (this.ranges.length)
this._emit("remove", {ranges: this.ranges.splice(0, this.ranges.length)});
};
this.attach = function(session) { this.attach = function(session) {
if (this.session) if (this.session)

View file

@ -47,6 +47,17 @@ var RangeList = require("./range_list").RangeList;
var EditSession = require("./edit_session").EditSession; var EditSession = require("./edit_session").EditSession;
var assert = require("./test/assertions"); 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 = { module.exports = {
name: "ACE range_list.js", name: "ACE range_list.js",
@ -91,6 +102,19 @@ module.exports = {
assert.range(rangeList.ranges[4], 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() { "test: rangeList merge": function() {
var rangeList = new RangeList(); var rangeList = new RangeList();
rangeList.addList([ rangeList.addList([
@ -115,6 +139,27 @@ module.exports = {
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(removed.length, 2);
assert.equal(rangeList.ranges.length, 1); 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);
} }
}; };