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:
aldendaniels 2014-01-11 15:48:38 -06:00
commit 7f1bc7af2f

View file

@ -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
};
};
/**