- handling delete key on empty text element,
- blocking ctrl-x on whole element text (todo: handle like del/backspace)
- handling deletion of whole element text via del/backspace
ARROW_UP: 38,
ARROW_RIGHT: 39,
ARROW_DOWN: 40,
ARROW_UP: 38,
ARROW_RIGHT: 39,
ARROW_DOWN: 40,
+ BACKSPACE: 8,
+ DELETE: 46,
+ X: 88
}
this.wrapper.on('keyup', function(e) {
}
this.wrapper.on('keyup', function(e) {
});
this.wrapper.on('keydown', function(e) {
});
this.wrapper.on('keydown', function(e) {
- var position = canvas.getCursor().getPosition(),
+ var cursor = canvas.getCursor(),
+ position = canvas.getCursor().getPosition(),
element = position.element;
if(e.which >= 37 && e.which <= 40) {
element = position.element;
if(e.which >= 37 && e.which <= 40) {
- if(e.which === KEYS.BACKSPACE) {
- if(element.getText().length === 1) {
+
+ 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()) {
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(),
e.preventDefault();
var parent = element.parent(),
if(grandParent && grandParent.children().length === 1) {
goto = grandParent.append({text: ''});
} else {
if(grandParent && grandParent.children().length === 1) {
goto = grandParent.append({text: ''});
} else {
- goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', 'above', element.dom()[0]));
+ goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, element.dom()[0]));
}
parent.detach();
} else {
}
parent.detach();
} else {
- goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', 'above', element.dom()[0]));
+ goto = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, element.dom()[0]));
- canvas.setCurrentElement(goto, {caretTo: 'end'});
+ canvas.setCurrentElement(goto, {caretTo: caretTo});
- else if(position.offset === 0) {
+ else if(cursorAtOperationEdge) {