range.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. 'use strict';
  6. import Position from './position.js';
  7. /**
  8. * Tree view range.
  9. *
  10. * @memberOf engine.treeView
  11. */
  12. export default class Range {
  13. /**
  14. * Creates a range spanning from `start` position to `end` position.
  15. * **Note:** Constructor creates it's own {@link engine.treeView.Position} instances basing on passed values.
  16. *
  17. * @param {engine.treeView.Position} start Start position.
  18. * @param {engine.treeView.Position} end End position.
  19. */
  20. constructor( start, end ) {
  21. /**
  22. * Start position.
  23. *
  24. * @member engine.treeView.Range#start
  25. * @type {engine.treeView.Position}
  26. */
  27. this.start = Position.createFromPosition( start );
  28. /**
  29. * End position.
  30. *
  31. * @member engine.treeView.Range#end
  32. * @type {engine.treeView.Position}
  33. */
  34. this.end = Position.createFromPosition( end );
  35. }
  36. /**
  37. * Returns whether the range is collapsed, that is it start and end positions are equal.
  38. *
  39. * @type {Boolean}
  40. */
  41. get isCollapsed() {
  42. return this.start.isEqual( this.end );
  43. }
  44. /**
  45. * Two ranges equal if their start and end positions equal.
  46. *
  47. * @param {engine.treeView.Range} otherRange Range to compare with.
  48. * @returns {Boolean} True if ranges equal.
  49. */
  50. isEqual( otherRange ) {
  51. return this == otherRange || ( this.start.isEqual( otherRange.start ) && this.end.isEqual( otherRange.end ) );
  52. }
  53. /**
  54. * Checks and returns whether this range intersects with given range.
  55. *
  56. * @param {engine.treeView.Range} otherRange Range to compare with.
  57. * @returns {Boolean} True if ranges intersect.
  58. */
  59. isIntersecting( otherRange ) {
  60. return this.start.isBefore( otherRange.end ) && this.end.isAfter( otherRange.start );
  61. }
  62. /**
  63. * Creates a range from given parents and offsets.
  64. *
  65. * @param {engine.treeView.Element} startElement Start position parent element.
  66. * @param {Number} startOffset Start position offset.
  67. * @param {engine.treeView.Element} endElement End position parent element.
  68. * @param {Number} endOffset End position offset.
  69. * @returns {engine.treeView.Range} Created range.
  70. */
  71. static createFromParentsAndOffsets( startElement, startOffset, endElement, endOffset ) {
  72. return new this(
  73. new Position( startElement, startOffset ),
  74. new Position( endElement, endOffset )
  75. );
  76. }
  77. /**
  78. * Creates and returns a new instance of Range which is equal to passed range.
  79. *
  80. * @param {engine.treeView.Range} range Range to clone.
  81. * @returns {engine.treeView.Range}
  82. */
  83. static createFromRange( range ) {
  84. return new this( range.start, range.end );
  85. }
  86. }