+ var cursor = canvas.getCursor(),
+ position = canvas.getCursor().getPosition(),
+ element = position.element;
+ if(e.which >= 37 && e.which <= 40) {
+
+ if(element && (element instanceof documentElement.DocumentTextElement)) {
+ if(element.isEmpty()) {
+ var direction, caretTo;
+ if(e.which === KEYS.ARROW_LEFT || e.which === KEYS.ARROW_UP) {
+ direction = 'above';
+ caretTo = 'end';
+ } else {
+ direction = 'below';
+ caretTo = 'start';
+ }
+ var el = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, window.getSelection().focusNode))
+ canvas.setCurrentElement(element, {caretTo: caretTo});
+ } else {
+ var txt = element.dom().contents()[0].data;
+ if(e.which === KEYS.ARROW_LEFT && position.offset > 1 && txt.charAt(position.offset-2) === utils.unicode.ZWS) {
+ e.preventDefault();
+ canvas._moveCaretToTextElement(element, position.offset-2);
+ }
+ if(e.which === KEYS.ARROW_RIGHT && position.offset < txt.length - 1 && txt.charAt(position.offset+1) === utils.unicode.ZWS) {
+ e.preventDefault();
+ canvas._moveCaretToTextElement(element, position.offset+2);
+ }
+ }
+ }
+
+
+ }
+
+ var selectsWholeTextElement = function() {
+ if(cursor.isSelecting() && cursor.getSelectionStart().offsetAtBeginning && cursor.getSelectionEnd().offsetAtEnd)
+ return true;
+ return false;
+ }
+
+ if(e.which === KEYS.X && e.ctrlKey && selectsWholeTextElement()) {
+ e.preventDefault();
+ }
+
+ if(e.which === KEYS.BACKSPACE || e.which === KEYS.DELETE) {
+ if(cursor.isSelecting() && !cursor.isSelectingWithinElement()) {
+ e.preventDefault();
+ return;
+ }
+
+ var cursorAtOperationEdge = position.offsetAtBeginning;
+ if(e.which === KEYS.DELETE) {
+ cursorAtOperationEdge = position.offsetAtEnd;
+ }
+
+ if(element.getText().length === 1 || selectsWholeTextElement()) {
+ e.preventDefault();
+ element.setText('');
+ }
+ else if(element.isEmpty()) {
+
+ var direction = 'above',
+ caretTo = 'end';
+
+ if(e.which === KEYS.DELETE) {
+ direction = 'below';
+ caretTo = 'start';
+ }
+
+ e.preventDefault();
+
+ var parent = element.parent(),
+ grandParent = parent ? parent.parent() : null,
+ goto;
+ if(parent.children().length === 1) {
+ if(grandParent && grandParent.children().length === 1) {
+ goto = grandParent.append({text: ''});
+ } else {
+ goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, element.dom()[0]));
+ }
+ parent.detach();
+ } else {
+ goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, element.dom()[0]));
+ element.detach();
+ }
+ canvas.setCurrentElement(goto, {caretTo: caretTo});
+ }
+ else if(cursorAtOperationEdge) {
+ // todo
+ e.preventDefault();
+ }
+ }
+
+ if(e.which === KEYS.ENTER) {