Преглед на файлове

Added view.observers.FakeSelectionObserver.

Szymon Kupś преди 9 години
родител
ревизия
19c889c089
променени са 2 файла, в които са добавени 74 реда и са изтрити 1 реда
  1. 4 1
      packages/ckeditor5-engine/src/view/document.js
  2. 70 0
      packages/ckeditor5-engine/src/view/observer/fakeselecitonobserver.js

+ 4 - 1
packages/ckeditor5-engine/src/view/document.js

@@ -13,6 +13,7 @@ import MutationObserver from './observer/mutationobserver.js';
 import SelectionObserver from './observer/selectionobserver.js';
 import FocusObserver from './observer/focusobserver.js';
 import KeyObserver from './observer/keyobserver.js';
+import FakeSelectionObserver from './observer/fakeselecitonobserver.js';
 import mix from '../../utils/mix.js';
 import ObservableMixin from '../../utils/observablemixin.js';
 
@@ -30,7 +31,8 @@ import ObservableMixin from '../../utils/observablemixin.js';
  * * {@link view.observer.MutationObserver},
  * * {@link view.observer.SelectionObserver},
  * * {@link view.observer.FocusObserver},
- * * {@link view.observer.KeyObserver}.
+ * * {@link view.observer.KeyObserver},
+ * * {@link view.observer.FakeSelectionObserver}.
  *
  * @memberOf engine.view
  * @mixes utils.EmitterMixin
@@ -107,6 +109,7 @@ export default class Document {
 		this.addObserver( SelectionObserver );
 		this.addObserver( FocusObserver );
 		this.addObserver( KeyObserver );
+		this.addObserver( FakeSelectionObserver );
 
 		injectQuirksHandling( this );
 

+ 70 - 0
packages/ckeditor5-engine/src/view/observer/fakeselecitonobserver.js

@@ -0,0 +1,70 @@
+/**
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+import Observer from './observer.js';
+import ViewSelection from '../selection.js';
+import { keyCodes } from '../../../utils/keyboard.js';
+
+/**
+ * Fake selection observer class. If view selection is fake it is placed in dummy DOM container. This observer listens
+ * on {@link engine.view.Document#keydown keydown} events and handles moving fake view selection to the correct place
+ * if arrow keys are pressed.
+ * Fires {@link engine.view.Document#selectionChage selectionChage event} simulating natural behaviour of
+ * {@link engine.view.observer.SelectionObserver SelectionObserver}.
+ *
+ * @memberOf engine.view.observer
+ * @extends engine.view.observer.Observer
+ * @fires engine.view.Document#selectionChage
+ */
+export default class FakeSelectionObserver extends Observer {
+	constructor( document ) {
+		super( document );
+
+		document.on( 'keydown', ( eventInfo, data ) => {
+			const selection = document.selection;
+
+			if ( selection.isFake && _isArrowKeyCode( data.keyCode ) ) {
+				// Prevents default keydown handling - no selection change will occur.
+				data.preventDefault();
+
+				const newSelection = ViewSelection.createFromSelection( selection );
+				newSelection.setFake( false );
+
+				// Left or up arrow pressed - move selection to start.
+				if ( data.keyCode == keyCodes.arrowleft || data.keyCode == keyCodes.arrowup ) {
+					newSelection.collapseToStart();
+				}
+
+				// Right or down arro pressed - move selection to end.
+				if ( data.keyCode == keyCodes.arrowright || data.keyCode == keyCodes.arrowdown ) {
+					newSelection.collapseToEnd();
+				}
+
+				document.fire( 'selectionChange', {
+					oldSelection: selection,
+					newSelection: newSelection,
+					domSelection: null
+				} );
+			}
+		}, { priority: 'lowest' } );
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	observe() {}
+}
+
+// Checks if one of the arrow keys is pressed.
+//
+// @private
+// @param {Number} keyCode
+// @returns {Boolean}
+function _isArrowKeyCode( keyCode ) {
+	return keyCode == keyCodes.arrowright ||
+		keyCode == keyCodes.arrowleft ||
+		keyCode == keyCodes.arrowup ||
+		keyCode == keyCodes.arrowdown;
+}