e.preventDefault();
var cursor = canvas.getCursor();
if(!cursor.isSelecting()) {
- var position = cursor.getPosition();
- position.element.split({offset: position.offset});
+ var position = cursor.getPosition(),
+ elements = position.element.split({offset: position.offset}),
+ newEmpty,
+ goto;
+
+ if(position.offsetAtBeginning)
+ newEmpty = elements.first;
+ else if(position.offsetAtEnd)
+ newEmpty = elements.second;
+ if(newEmpty) {
+ goto = newEmpty.append(documentElement.DocumentTextElement.create({text: '\u200B'}, this));
+ canvas.setCurrentElement(goto);
+ }
}
}
});
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');
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(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);
+ this.publisher('currentTextElementSet', textElementToLand);
+ } else {
+ document.getSelection().removeAllRanges();
}
if(!(currentNodeElement && currentNodeElement.sameNode(nodeElementToLand))) {
_markAsCurrent(nodeElementToLand);
- if(!textElementToLand)
- document.getSelection().removeAllRanges();
+
this.publisher('currentNodeElementSet', nodeElementToLand);
}
},
anchorElement = this.canvas.getDocumentElement(selection.anchorNode),
focusElement = this.canvas.getDocumentElement(selection.focusNode);
+ if(anchorElement instanceof documentElement.DocumentNodeElement || focusElement instanceof documentElement.DocumentNodeElement)
+ return {};
+
if(which === 'anchor') {
return {
element: anchorElement,
- offset: selection.anchorOffset
+ offset: selection.anchorOffset,
+ offsetAtBeginning: selection.anchorOffset === 0,
+ offsetAtEnd: anchorElement && anchorElement.getText().length === selection.anchorOffset
};
}
return {
element: element,
- offset: offset
+ offset: offset,
+ offsetAtBeginning: offset === 0,
+ offsetAtEnd: element.getText().length === offset
}
}
})