Browse Source

Merge pull request #918 from ckeditor/t/600

Feature: Allow passing ranges to the selection constructors (in the model and in the view). Closes #600.
Piotrek Koszuliński 8 years ago
parent
commit
48fde40e38

+ 10 - 2
packages/ckeditor5-engine/src/model/selection.js

@@ -23,9 +23,13 @@ import mapsEqual from '@ckeditor/ckeditor5-utils/src/mapsequal';
  */
 export default class Selection {
 	/**
-	 * Creates an empty selection.
+	 * Creates new selection instance.
+	 *
+	 * @param {Iterable.<module:engine/view/range~Range>} [ranges] An optional iterable object of ranges to set.
+	 * @param {Boolean} [isLastBackward] An optional flag describing if last added range was selected forward - from start to end
+	 * (`false`) or backward - from end to start (`true`). Defaults to `false`.
 	 */
-	constructor() {
+	constructor( ranges, isLastBackward ) {
 		/**
 		 * Specifies whether the last added range was added as a backward or forward range.
 		 *
@@ -49,6 +53,10 @@ export default class Selection {
 		 * @member {Map} module:engine/model/selection~Selection#_attrs
 		 */
 		this._attrs = new Map();
+
+		if ( ranges ) {
+			this.setRanges( ranges, isLastBackward );
+		}
 	}
 
 	/**

+ 10 - 2
packages/ckeditor5-engine/src/view/selection.js

@@ -33,8 +33,12 @@ import Element from './element';
 export default class Selection {
 	/**
 	 * Creates new selection instance.
+	 *
+	 * @param {Iterable.<module:engine/view/range~Range>} [ranges] An optional array of ranges to set.
+	 * @param {Boolean} [isLastBackward] An optional flag describing if last added range was selected forward - from start to end
+	 * (`false`) or backward - from end to start (`true`). Defaults to `false`.
 	 */
-	constructor() {
+	constructor( ranges, isLastBackward ) {
 		/**
 		 * Stores all ranges that are selected.
 		 *
@@ -66,6 +70,10 @@ export default class Selection {
 		 * @member {String}
 		 */
 		this._fakeSelectionLabel = '';
+
+		if ( ranges ) {
+			this.setRanges( ranges, isLastBackward );
+		}
 	}
 
 	/**
@@ -348,7 +356,7 @@ export default class Selection {
 	 * Accepts a flag describing in which way the selection is made (see {@link #addRange addRange}).
 	 *
 	 * @fires change
-	 * @param {Array.<module:engine/view/range~Range>} newRanges Array of ranges to set.
+	 * @param {Iterable.<module:engine/view/range~Range>} newRanges Iterable object of ranges to set.
 	 * @param {Boolean} [isLastBackward] Flag describing if last added range was selected forward - from start to end
 	 * (`false`) or backward - from end to start (`true`). Defaults to `false`.
 	 */

+ 22 - 0
packages/ckeditor5-engine/tests/model/selection.js

@@ -48,6 +48,28 @@ describe( 'Selection', () => {
 		liveRange.detach();
 	} );
 
+	describe( 'constructor()', () => {
+		it( 'should be able to create an empty selection', () => {
+			const selection = new Selection();
+
+			expect( Array.from( selection.getRanges() ) ).to.deep.equal( [] );
+		} );
+
+		it( 'should be able to create a selection from the given ranges', () => {
+			const ranges = [ range1, range2, range3 ];
+			const selection = new Selection( ranges );
+
+			expect( Array.from( selection.getRanges() ) ).to.deep.equal( ranges );
+		} );
+
+		it( 'should be able to create a selection from the given ranges and isLastBackward flag', () => {
+			const ranges = [ range1, range2, range3 ];
+			const selection = new Selection( ranges, true );
+
+			expect( selection.isBackward ).to.be.true;
+		} );
+	} );
+
 	describe( 'isCollapsed', () => {
 		it( 'should return false for empty selection', () => {
 			expect( selection.isCollapsed ).to.be.false;

+ 22 - 0
packages/ckeditor5-engine/tests/view/selection.js

@@ -26,6 +26,28 @@ describe( 'Selection', () => {
 		range3 = Range.createFromParentsAndOffsets( el, 12, el, 14 );
 	} );
 
+	describe( 'constructor()', () => {
+		it( 'should be able to create an empty selection', () => {
+			const selection = new Selection();
+
+			expect( Array.from( selection.getRanges() ) ).to.deep.equal( [] );
+		} );
+
+		it( 'should be able to create a selection from the given ranges', () => {
+			const ranges = [ range1, range2, range3 ];
+			const selection = new Selection( ranges );
+
+			expect( Array.from( selection.getRanges() ) ).to.deep.equal( ranges );
+		} );
+
+		it( 'should be able to create a selection from the given ranges and isLastBackward flag', () => {
+			const ranges = [ range1, range2, range3 ];
+			const selection = new Selection( ranges, true );
+
+			expect( selection.isBackward ).to.be.true;
+		} );
+	} );
+
 	describe( 'anchor', () => {
 		it( 'should return null if no ranges in selection', () => {
 			expect( selection.anchor ).to.be.null;