setCurrentElement: function(element, params) {
params = _.extend({caretTo: 'end'}, params);
- var findFirstDirectTextChild = function(e) {
+ var findFirstDirectTextChild = function(e, nodeToLand) {
+ var byBrowser = this.getCursor().getPosition().element;
+ if(byBrowser && byBrowser.parent().sameNode(nodeToLand))
+ return byBrowser;
var children = e.children();
for(var i = 0; i < children.length; i++) {
if(children[i] instanceof documentElement.DocumentTextElement)
return children[i];
}
return null;
- };
+ }.bind(this);
var _markAsCurrent = function(element) {
if(element instanceof documentElement.DocumentTextElement) {
this.wrapper.find('.current-text-element').removeClass('current-text-element');
this.publisher('currentElementChanged', element);
}
}.bind(this);
- var _moveCaretToTextElement = function(element, where) {
- var range = document.createRange();
- range.selectNodeContents(element.dom().contents()[0]);
-
- var collapseArg = true;
- if(where === 'end')
- collapseArg = false;
- range.collapse(collapseArg);
- var selection = document.getSelection();
- selection.removeAllRanges();
- selection.addRange(range);
- };
+
var isTextElement = element instanceof documentElement.DocumentTextElement,
- textElementToLand = isTextElement ? element : findFirstDirectTextChild(element),
nodeElementToLand = isTextElement ? element.parent() : element,
+ textElementToLand = isTextElement ? element : findFirstDirectTextChild(element, nodeElementToLand),
currentTextElement = this.getCurrentTextElement(),
currentNodeElement = this.getCurrentNodeElement();
if(currentTextElement && !(currentTextElement.sameNode(textElementToLand)))
this.wrapper.find('.current-text-element').removeClass('current-text-element');
- if(textElementToLand && !(textElementToLand.sameNode(currentTextElement))) {
+ if(textElementToLand) {
_markAsCurrent(textElementToLand);
- if(params.caretTo)
- _moveCaretToTextElement(textElementToLand, params.caretTo); // as method on element?
- this.publisher('currentTextElementSet', element);
+ if(params.caretTo || !textElementToLand.sameNode(this.getCursor().getPosition().element))
+ this._moveCaretToTextElement(textElementToLand, params.caretTo); // as method on element?
+ if(!(textElementToLand.sameNode(currentTextElement)))
+ this.publisher('currentTextElementSet', element);
+ } else {
+ document.getSelection().removeAllRanges();
}
if(!(currentNodeElement && currentNodeElement.sameNode(nodeElementToLand))) {
_markAsCurrent(nodeElementToLand);
- if(!textElementToLand)
- document.getSelection().removeAllRanges();
+
this.publisher('currentNodeElementSet', nodeElementToLand);
}
- }
+ },
+
+ _moveCaretToTextElement: function(element, where) {
+ var range = document.createRange(),
+ node = element.dom().contents()[0];
+ if(typeof where !== 'number') {
+ range.selectNodeContents(node);
+ } else {
+ range.setStart(node, where);
+ }
+
+ var collapseArg = true;
+ if(where === 'end')
+ collapseArg = false;
+ range.collapse(collapseArg);
+
+ var selection = document.getSelection();
+
+ selection.removeAllRanges();
+ selection.addRange(range);
+ this.wrapper.focus(); // FF requires this for caret to be put where range colllapses, Chrome doesn't.
+ },
+
+ setCursorPosition: function(position) {
+ if(position.element)
+ this._moveCaretToTextElement(position.element, position.offset);
+ }
});
$.extend(Canvas.prototype.list, {