8
0
Просмотр исходного кода

Renderer now does not depends on the TreeView, only on DomConverter and Selection.

Piotr Jasiun 9 лет назад
Родитель
Сommit
9c0de7efea

+ 3 - 40
packages/ckeditor5-engine/src/treeview/renderer.js

@@ -10,12 +10,8 @@ import ViewElement from './element.js';
 import ViewPosition from './position.js';
 import { INLINE_FILLER, INLINE_FILLER_SIZE } from './domconverter.js';
 
-import SelectionObserver from './observer/selectionobserver.js';
-
 import diff from '../../utils/diff.js';
 import CKEditorError from '../../utils/ckeditorerror.js';
-import EmitterMixin from '../../utils/emittermixin.js';
-import { keyNames } from '../../utils/keyboard.js';
 
 /**
  * Renderer updates DOM tree, to make it a reflection of the view tree. Changed nodes need to be
@@ -32,14 +28,14 @@ export default class Renderer {
 	 *
 	 * @param {engine.treeView.DomConverter} domConverter Converter instance.
 	 */
-	constructor( treeView ) {
+	constructor( domConverter, selection ) {
 		/**
 		 * Converter instance.
 		 *
 		 * @readonly
 		 * @member {engine.treeView.DomConverter} engine.treeView.Renderer#domConverter
 		 */
-		this.domConverter = treeView.domConverter;
+		this.domConverter = domConverter;
 
 		/**
 		 * Set of nodes which attributes changed and may need to be rendered.
@@ -65,7 +61,7 @@ export default class Renderer {
 		 */
 		this.markedTexts = new Set();
 
-		this.selection = treeView.selection;
+		this.selection = selection;
 
 		/**
 		 * Position of the inline filler. It should always be put BEFORE the text which contains filler.
@@ -77,39 +73,6 @@ export default class Renderer {
 		this._inlineFillerPosition = null;
 
 		this._domSelection = null;
-
-		this._listener = Object.create( EmitterMixin );
-
-		this._listener.listenTo( treeView, 'keydown', ( evt, data ) => {
-			if ( data.keyCode != keyNames.arrowleft ) {
-				return;
-			}
-
-			if ( !this._isInlineFillerAtSelection() ) {
-				return;
-			}
-
-			const selectionPosition = this.selection.getFirstPosition();
-
-			if ( selectionPosition.parent instanceof ViewText && selectionPosition.offset > 0 ) {
-				return;
-			}
-
-			const selectionObserver = treeView.getObserver( SelectionObserver );
-
-			selectionObserver.disable();
-			// Damn iframe! I can not use global window, so element -> document -> window -> selection
-			const domSelection = data.domTarget.ownerDocument.defaultView.getSelection();
-			const domParent = domSelection.getRangeAt( 0 ).startContainer;
-
-			const domRange = new Range();
-			domRange.setStart( domParent, 0 );
-			domRange.collapse( true );
-			domSelection.removeAllRanges();
-			domSelection.addRange( domRange );
-
-			selectionObserver.enable();
-		} );
 	}
 
 	/**

+ 28 - 1
packages/ckeditor5-engine/src/treeview/treeview.js

@@ -9,9 +9,11 @@ import Selection from './selection.js';
 import Renderer from './renderer.js';
 import DomConverter from './domconverter.js';
 import Writer from './writer.js';
+import ViewText from './text.js';
 
 import mix from '../../utils/mix.js';
 import EmitterMixin from '../../utils/emittermixin.js';
+import { keyNames } from '../../utils/keyboard.js';
 
 /**
  * TreeView class creates an abstract layer over the content editable area.
@@ -71,7 +73,7 @@ export default class TreeView {
 		 * @readonly
 		 * @member {engine.treeView.Renderer} engine.treeView.TreeView#renderer
 		 */
-		this.renderer = new Renderer( this );
+		this.renderer = new Renderer( this.domConverter, this.selection );
 
 		/**
 		 * Set of registered {@link engine.treeView.Observer observers}.
@@ -80,6 +82,31 @@ export default class TreeView {
 		 * @member {Set.<engine.treeView.Observer>} engine.treeView.TreeView_#observers
 		 */
 		this._observers = new Map();
+
+		this.on( 'keydown', ( evt, data ) => {
+			if ( data.keyCode != keyNames.arrowleft ) {
+				return;
+			}
+
+			if ( !this.renderer._isInlineFillerAtSelection() ) {
+				return;
+			}
+
+			const selectionPosition = this.selection.getFirstPosition();
+
+			if ( selectionPosition.parent instanceof ViewText && selectionPosition.offset > 0 ) {
+				return;
+			}
+			// Damn iframe! I can not use global window, so element -> document -> window -> selection
+			const domSelection = data.domTarget.ownerDocument.defaultView.getSelection();
+			const domParent = domSelection.getRangeAt( 0 ).startContainer;
+
+			const domRange = new Range();
+			domRange.setStart( domParent, 0 );
+			domRange.collapse( true );
+			domSelection.removeAllRanges();
+			domSelection.addRange( domRange );
+		} );
 	}
 
 	/**

+ 7 - 5
packages/ckeditor5-engine/tests/treeview/renderer.js

@@ -9,16 +9,18 @@
 
 import ViewElement from '/ckeditor5/engine/treeview/element.js';
 import ViewText from '/ckeditor5/engine/treeview/text.js';
-import TreeView from '/ckeditor5/engine/treeview/treeview.js';
+import Selection from '/ckeditor5/engine/treeview/selection.js';
+import DomConverter from '/ckeditor5/engine/treeview/domconverter.js';
+import Renderer from '/ckeditor5/engine/treeview/renderer.js';
 import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
 
 describe( 'Renderer', () => {
-	let treeView, domConverter, renderer;
+	let selection, domConverter, renderer;
 
 	before( () => {
-		treeView = new TreeView();
-		domConverter = treeView.domConverter;
-		renderer = treeView.renderer;
+		selection = new Selection();
+		domConverter = new DomConverter();
+		renderer = new Renderer( domConverter, selection );
 	} );
 
 	describe( 'markToSync', () => {