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,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)

View file

@ -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);
}
};
});