movedelta.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /**
  2. * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. import Delta from './delta.js';
  7. import { register } from '../batch-base.js';
  8. import MoveOperation from '../operation/moveoperation.js';
  9. import Position from '../position.js';
  10. import Range from '../range.js';
  11. import CKEditorError from '../../ckeditorerror.js';
  12. /**
  13. * @classdesc
  14. * To provide specific OT behavior and better collisions solving, {@link core.treeModel.Batch#move} method
  15. * uses the `MoveDelta` class which inherits from the `Delta` class and may overwrite some methods.
  16. *
  17. * @memberOf core.treeModel.delta
  18. */
  19. export default class MoveDelta extends Delta {}
  20. function addMoveOperation( batch, delta, sourcePosition, howMany, targetPosition ) {
  21. const operation = new MoveOperation( sourcePosition, howMany, targetPosition, batch.doc.version );
  22. batch.doc.applyOperation( operation );
  23. delta.addOperation( operation );
  24. }
  25. /**
  26. * Moves given node or given range of nodes to target position.
  27. *
  28. * @chainable
  29. * @method core.treeModel.Batch#move
  30. * @param {core.treeModel.Node|core.treeModel.Range} nodeOrRange Node or range of nodes to move.
  31. * @param {core.treeModel.Position} targetPosition Position where moved nodes will be inserted.
  32. */
  33. register( 'move', function( nodeOrRange, targetPosition ) {
  34. const delta = new MoveDelta();
  35. if ( nodeOrRange instanceof Range ) {
  36. if ( !nodeOrRange.isFlat ) {
  37. /**
  38. * Range to move is not flat.
  39. *
  40. * @error batch-move-range-not-flat
  41. */
  42. throw new CKEditorError( 'batch-move-range-not-flat: Range to move is not flat.' );
  43. }
  44. addMoveOperation( this, delta, nodeOrRange.start, nodeOrRange.end.offset - nodeOrRange.start.offset, targetPosition );
  45. } else {
  46. addMoveOperation( this, delta, Position.createBefore( nodeOrRange ), 1, targetPosition );
  47. }
  48. this.addDelta( delta );
  49. return this;
  50. } );