Break out Anchor.onChange helper functions
This should be faster since we don't have to re-initialize the helper functions each time Anchor.onChange is fired.
This commit is contained in:
parent
6b280bf6bb
commit
7f1bc7af2f
1 changed files with 39 additions and 39 deletions
|
|
@ -100,50 +100,50 @@ var Anchor = exports.Anchor = function(doc, row, column) {
|
|||
*
|
||||
**/
|
||||
this.onChange = function(e) {
|
||||
var delta = e.data;
|
||||
var point = this.$getTransformedPoint(delta, {row: this.row, column: this.column});
|
||||
this.setPosition(point.row, point.column, true);
|
||||
};
|
||||
|
||||
function $pointsInOrder(point1, point2, equalPointsInOrder) {
|
||||
var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
|
||||
return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
|
||||
}
|
||||
|
||||
this.$getTransformedPoint = function (delta, point) {
|
||||
|
||||
function _pointsInOrder(point1, point2, equalPointsInOrder) {
|
||||
var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column;
|
||||
return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter);
|
||||
}
|
||||
|
||||
function getTransformedPoint(delta, point, moveIfEqual) {
|
||||
|
||||
// Get delta info.
|
||||
var deltaIsInsert = (delta.action == 'insert')
|
||||
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.row - delta.range.start.row);
|
||||
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.column - delta.range.start.column);
|
||||
var deltaStart = delta.range.start;
|
||||
var deltaEnd = (deltaIsInsert ? deltaStart : delta.range.end); // Collapse insert range.
|
||||
|
||||
// DELTA AFTER POINT: No change needed.
|
||||
if (_pointsInOrder(point, deltaStart, moveIfEqual)) {
|
||||
return {
|
||||
row: point.row,
|
||||
column: point.column
|
||||
};
|
||||
}
|
||||
|
||||
// DELTA BEFORE POINT: Move point by delta shift.
|
||||
if (_pointsInOrder(deltaEnd, point, !moveIfEqual)) {
|
||||
return {
|
||||
row: point.row + deltaRowShift,
|
||||
column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
|
||||
};
|
||||
}
|
||||
|
||||
// DELTA ENVELOPS POINT (delete only): Move point to delta start.
|
||||
if (delta.action != 'remove')
|
||||
throw 'Delete action expected.';
|
||||
|
||||
// Get delta info.
|
||||
var moveIfEqual = this.$insertRight;
|
||||
var deltaIsInsert = (delta.action == 'insert')
|
||||
var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.row - delta.range.start.row);
|
||||
var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.range.end.column - delta.range.start.column);
|
||||
var deltaStart = delta.range.start;
|
||||
var deltaEnd = (deltaIsInsert ? deltaStart : delta.range.end); // Collapse insert range.
|
||||
|
||||
// DELTA AFTER POINT: No change needed.
|
||||
if ($pointsInOrder(point, deltaStart, moveIfEqual)) {
|
||||
return {
|
||||
row: deltaStart.row,
|
||||
column: deltaStart.column
|
||||
row: point.row,
|
||||
column: point.column
|
||||
};
|
||||
}
|
||||
|
||||
var delta = e.data;
|
||||
var point = getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight);
|
||||
this.setPosition(point.row, point.column, true);
|
||||
// DELTA BEFORE POINT: Move point by delta shift.
|
||||
if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {
|
||||
return {
|
||||
row: point.row + deltaRowShift,
|
||||
column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0)
|
||||
};
|
||||
}
|
||||
|
||||
// DELTA ENVELOPS POINT (delete only): Move point to delta start.
|
||||
if (delta.action != 'remove')
|
||||
throw 'Delete action expected.';
|
||||
|
||||
return {
|
||||
row: deltaStart.row,
|
||||
column: deltaStart.column
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue