Merge "Added reversed boolean for translateOffset"

This commit is contained in:
Catrope 2012-10-10 22:01:32 +00:00 committed by Gerrit Code Review
commit ba8fa2d429
3 changed files with 65 additions and 27 deletions

View file

@ -173,19 +173,20 @@ ve.dm.Surface.prototype.breakpoint = function ( selection ) {
};
ve.dm.Surface.prototype.undo = function () {
var diff, item, i, selection;
var item, i, transaction, selection;
this.breakpoint();
this.undoIndex++;
if ( this.bigStack[this.bigStack.length - this.undoIndex] ) {
this.emit( 'lock' );
diff = 0;
item = this.bigStack[this.bigStack.length - this.undoIndex];
for ( i = item.stack.length - 1; i >= 0; i-- ) {
this.documentModel.rollback( item.stack[i] );
diff += item.stack[i].lengthDifference;
}
selection = item.selection;
selection.end -= diff;
for ( i = item.stack.length - 1; i >= 0; i-- ) {
transaction = item.stack[i];
selection = transaction.translateRange( selection, true );
this.documentModel.rollback( item.stack[i] );
}
this.emit( 'unlock' );
this.emit( 'history' );
return selection;
@ -194,19 +195,15 @@ ve.dm.Surface.prototype.undo = function () {
};
ve.dm.Surface.prototype.redo = function () {
var selection, diff, item, i;
var selection, item, i;
this.breakpoint();
if ( this.undoIndex > 0 ) {
if ( this.undoIndex > 0 && this.bigStack[this.bigStack.length - this.undoIndex] ) {
this.emit( 'lock' );
if ( this.bigStack[this.bigStack.length - this.undoIndex] ) {
diff = 0;
item = this.bigStack[this.bigStack.length - this.undoIndex];
for ( i = 0; i < item.stack.length; i++ ) {
this.documentModel.commit( item.stack[i] );
diff += item.stack[i].lengthDifference;
}
selection = item.selection;
selection.end += diff;
item = this.bigStack[this.bigStack.length - this.undoIndex];
selection = item.selection;
for ( i = 0; i < item.stack.length; i++ ) {
this.documentModel.commit( item.stack[i] );
}
this.undoIndex--;
this.emit( 'unlock' );

View file

@ -495,20 +495,22 @@ ve.dm.Transaction.prototype.getLengthDifference = function () {
* @param {Number} offset Offset in the linear model before the transaction has been processed
* @returns {Number} Translated offset, as it will be after processing transaction
*/
ve.dm.Transaction.prototype.translateOffset = function ( offset ) {
var i, cursor = 0, adjustment = 0, op;
ve.dm.Transaction.prototype.translateOffset = function ( offset, reversed ) {
var i, cursor = 0, adjustment = 0, op, insertLength, removeLength;
for ( i = 0; i < this.operations.length; i++ ) {
op = this.operations[i];
if ( op.type === 'replace' ) {
adjustment += op.insert.length - op.remove.length;
if ( offset === cursor + op.remove.length ) {
insertLength = reversed ? op.remove.length : op.insert.length;
removeLength = reversed ? op.insert.length : op.remove.length;
adjustment += insertLength - removeLength;
if ( offset === cursor + removeLength ) {
// Offset points to right after the removal, translate it
return offset + adjustment;
} else if ( offset >= cursor && offset < cursor + op.remove.length ) {
} else if ( offset >= cursor && offset < cursor + removeLength ) {
// The offset points inside of the removal
return cursor + op.remove.length + adjustment;
return cursor + removeLength + adjustment;
}
cursor += op.remove.length;
cursor += removeLength;
} else if ( op.type === 'retain' ) {
if ( offset >= cursor && offset < cursor + op.length ) {
return offset + adjustment;
@ -530,8 +532,8 @@ ve.dm.Transaction.prototype.translateOffset = function ( offset ) {
* @param {ve.Range} range Range in the linear model before the transaction has been processed
* @returns {ve.Range} Translated range, as it will be after processing transaction
*/
ve.dm.Transaction.prototype.translateRange = function ( range ) {
return new ve.Range( this.translateOffset( range.from ), this.translateOffset( range.to ) );
ve.dm.Transaction.prototype.translateRange = function ( range, reversed ) {
return new ve.Range( this.translateOffset( range.from, reversed ), this.translateOffset( range.to, reversed ) );
};
/**

View file

@ -805,6 +805,45 @@ QUnit.test( 'translateOffset', function ( assert ) {
}
} );
QUnit.test( 'translateOffsetReversed', function ( assert ) {
var tx, mapping, offset;
// Populate a transaction with bogus data
tx = new ve.dm.Transaction();
tx.pushReplace( [], ['a','b','c'] );
tx.pushRetain ( 5 );
tx.pushReplace( ['d', 'e', 'f', 'g'], [] );
tx.pushRetain( 2 );
tx.pushStartAnnotating( 'set', { 'type': 'textStyle/bold' } );
tx.pushRetain( 1 );
tx.pushReplace( ['h'], ['i', 'j', 'k', 'l', 'm'] );
tx.pushRetain( 2 );
tx.pushReplace( [], ['n', 'o', 'p'] );
mapping = {
0: 0,
1: 0,
2: 0,
3: 0,
4: 1,
5: 2,
6: 3,
7: 4,
8: 9,
9: 10,
10: 11,
11: 13,
12: 13,
13: 13,
14: 13,
15: 13,
16: 13
};
QUnit.expect( 17 );
for ( offset in mapping ) {
assert.strictEqual( tx.translateOffset( Number( offset ), true ), mapping[offset] );
}
} );
QUnit.test( 'pushRetain', function ( assert ) {
var cases = {
'retain': {