+ getNearestTextElement: function(direction, relativeToElement, includeInvisible) {
+ includeInvisible = includeInvisible !== undefined ? includeInvisible : false;
+ var selector = '[document-text-element]' + (includeInvisible ? '' : ':visible');
+ return this.getDocumentElement(utils.nearestInDocumentOrder(selector, direction, relativeToElement.dom[0]));
+ },
+
+ contains: function(element) {
+ return element && element.dom && element.dom.parents().index(this.rootWrapper) !== -1;
+ },
+
+ triggerSelectionChanged: function() {
+ var s = this.getSelection(),
+ f;
+ if(!s) {
+ return;
+ }
+ this.trigger('selectionChanged', s);
+ f = s.toDocumentFragment();
+
+ if(f && f instanceof f.RangeFragment) {
+ if(this.currentNodeElement) {
+ this.currentNodeElement.updateState({active: false});
+ this.currentNodeElement = null;
+ }
+ }
+ },
+
+ getSelection: function() {
+ return selection.fromNativeSelection(this);
+ },
+
+ select: function(fragment) {
+ if(fragment instanceof this.wlxmlDocument.RangeFragment) {
+ this.setCurrentElement(fragment.endNode, {caretTo: fragment.endOffset});
+ } else if(fragment instanceof this.wlxmlDocument.NodeFragment) {
+ var params = {
+ caretTo: fragment instanceof this.wlxmlDocument.CaretFragment ? fragment.offset : 'start'
+ };
+ this.setCurrentElement(fragment.node, params);
+ } else {
+ logger.debug('Fragment not supported');
+ }
+ },
+
+ setSelection: function(selection) {
+ this.select(this, selection.toDocumentFragment());
+ },
+
+ createSelection: function(params) {
+ return selection.fromParams(this, params);
+ },