], function(documentElement, utils) {
'use strict';
-
+/* globals gettext */
var KEYS = {
ENTER: 13,
};
var handles = function(handler, event) {
- if(handler.key === event.which)
+ if(handler.key === event.which) {
return true;
- if(handler.keys && handler.keys.indexOf(event.which) !== -1)
+ }
+ if(handler.keys && handler.keys.indexOf(event.which) !== -1) {
return true;
+ }
return false;
};
if(Object.keys(cursor.getPosition()).length === 0) {
var currentElement = canvas.getCurrentNodeElement();
if(currentElement) {
- var added = currentElement.after({tag: currentElement.getWlxmlTag() || 'div', klass: currentElement.getWlxmlClass() || 'p'});
- added.append({text:''});
- canvas.setCurrentElement(added, {caretTo: 'start'});
+ canvas.wlxmlDocument.transaction(function() {
+ var added = currentElement.wlxmlNode.after({
+ tagName: currentElement.getWlxmlTag() || 'div',
+ attrs: {'class': currentElement.getWlxmlClass() || 'p'}
+ });
+ added.append({text:''});
+ return added;
+ }, {
+ metadata: {
+ description: gettext('Splitting text')
+ },
+ success: function(ret) {
+ canvas.setCurrentElement(utils.findCanvasElement(ret), {caretTo: 'start'});
+ }
+ });
+
}
return;
}
if(!cursor.isSelecting()) {
if(event.ctrlKey) {
- var added = element.after({tag: element.getWlxmlTag() || 'div', klass: element.getWlxmlClass() || 'p'});
- added.append({text:''});
- canvas.setCurrentElement(added, {caretTo: 'start'});
+ if(element instanceof documentElement.DocumentTextElement) {
+ element = element.parent();
+ }
+
+ canvas.wlxmlDocument.transaction(function() {
+ var added = element.wlxmlNode.after(
+ {tagName: element.getWlxmlTag() || 'div', attrs: {'class': element.getWlxmlClass() || 'p'}}
+ );
+ added.append({text: ''});
+ return added;
+ }, {
+ metadata: {
+ description: gettext('Splitting text')
+ },
+ success: function(ret) {
+ canvas.setCurrentElement(utils.findCanvasElement(ret), {caretTo: 'start'});
+ }
+ });
} else {
return false; // top level element is unsplittable
}
- var elements = position.element.split({offset: position.offset}),
- newEmpty,
- goto,
- gotoOptions;
+ //var nodes = position.element.data('wlxmlNode').split({offset: position.offset}),
+ // var nodes = position.element.data('wlxmlNode').transform('split', {offset: position.offset}),
+ // newEmpty,
+ // goto,
+ // gotoOptions;
- if(position.offsetAtBeginning)
- newEmpty = elements.first;
- else if(position.offsetAtEnd)
- newEmpty = elements.second;
+ // if(position.offsetAtBeginning)
+ // newEmpty = nodes.first;
+ // else if(position.offsetAtEnd)
+ // newEmpty = nodes.second;
- if(newEmpty) {
- goto = newEmpty.append(documentElement.DocumentTextElement.create({text: ''}, this));
+ // if(newEmpty) {
+ // //goto = newEmpty.append({text: ''});
+ // gotoOptions = {};
+ // } else {
+ // goto = nodes.second;
+ // gotoOptions = {caretTo: 'start'};
+ // }
+ var node = position.element.wlxmlNode,
+ result, goto, gotoOptions;
+
+ node.document.transaction(function() {
+ result = position.element.wlxmlNode.breakContent({offset: position.offset});
+ }, {
+ metadata: {
+ description: gettext('Splitting text')
+ }
+ });
+
+ if(result.emptyText) {
+ goto = result.emptyText;
gotoOptions = {};
} else {
- goto = elements.second;
+ goto = result.second;
gotoOptions = {caretTo: 'start'};
}
- canvas.setCurrentElement(goto, gotoOptions);
+ canvas.setCurrentElement(utils.findCanvasElement(goto), gotoOptions);
}
}
}
caretTo = 'start';
}
var el = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]', direction, element.dom()[0]));
- canvas.setCurrentElement(el, {caretTo: caretTo});
+ if(el) {
+ canvas.setCurrentElement(el, {caretTo: caretTo});
+ }
}
},
keyup: function(event, canvas) {
caretTo = false;
if(!element) {
// Chrome hack
- var direction;
- if(event.which === KEYS.ARROW_LEFT || event.which === KEYS.ARROW_UP) {
- direction = 'above';
- caretTo = 'end';
- } else {
- direction = 'below';
- caretTo = 'start';
+
+ var moves = [{direction: 'above', caretTo: 'end'}, {direction: 'below', caretTo: 'start'}];
+ if(event.which === KEYS.ARROW_RIGHT || event.which === KEYS.ARROW_DOWN) {
+ moves.reverse();
}
- element = canvas.getDocumentElement(utils.nearestInDocumentOrder('[document-text-element]:visible', direction, window.getSelection().focusNode));
+ moves.some(function(move) {
+ /* globals window */
+ var targetNode = utils.nearestInDocumentOrder('[document-text-element]:visible', move.direction, window.getSelection().focusNode);
+ if(targetNode) {
+ element = canvas.getDocumentElement(targetNode);
+ caretTo = move.caretTo;
+ return true; // break
+ }
+ });
+ }
+ if(element) {
+ canvas.setCurrentElement(element, {caretTo: caretTo});
}
- canvas.setCurrentElement(element, {caretTo: caretTo});
}
});
var selectsWholeTextElement = function(cursor) {
- if(cursor.isSelecting() && cursor.getSelectionStart().offsetAtBeginning && cursor.getSelectionEnd().offsetAtEnd)
+ if(cursor.isSelecting() && cursor.getSelectionStart().offsetAtBeginning && cursor.getSelectionEnd().offsetAtEnd) {
return true;
+ }
return false;
-}
+};
handlers.push({key: KEYS.X,
keydown: function(event, canvas) {
- if(event.ctrlKey && selectsWholeTextElement(canvas.getCursor()))
+ if(event.ctrlKey && selectsWholeTextElement(canvas.getCursor())) {
event.preventDefault();
+ }
}
});
keydown: function(event, canvas) {
var cursor = canvas.getCursor(),
position = canvas.getCursor().getPosition(),
- element = position.element;
+ element = position.element,
+ node = element ? element.wlxmlNode : null,
+ direction = 'above',
+ caretTo = 'end',
+ goto;
+
+ if(!element || !node) {
+ return;
+ }
+
+ if(event.which === KEYS.DELETE) {
+ direction = 'below';
+ caretTo = 'start';
+ }
if(cursor.isSelecting() && !cursor.isSelectingWithinElement()) {
event.preventDefault();
+ var start = cursor.getSelectionStart(),
+ end = cursor.getSelectionEnd();
+
+ if(direction === 'above') {
+ if(start.offsetAtBeginning) {
+ goto = start.element.getNearestTextElement('above');
+ caretTo = 'end';
+ } else {
+ goto = start.element;
+ caretTo = start.offset;
+ }
+ } else {
+ if(end.offsetAtEnd) {
+ goto = start.element.getNearestTextElement('below');
+ caretTo = 'start';
+ } else {
+ goto = end.element;
+ caretTo = 0;
+ }
+ }
+
+ canvas.wlxmlDocument.deleteText({
+ from: {
+ node: start.element.wlxmlNode,
+ offset: start.offset
+ },
+ to: {
+ node: end.element.wlxmlNode,
+ offset: end.offset
+ }
+ });
+ if(goto) {
+ canvas.setCurrentElement(goto, {caretTo: caretTo});
+ }
return;
}
var willDeleteWholeText = function() {
return element.getText().length === 1 || selectsWholeTextElement(cursor);
- }
+ };
- if(willDeleteWholeText()) {
- event.preventDefault();
- element.setText('');
- }
- else if(element.isEmpty()) {
-
- var direction = 'above',
- caretTo = 'end';
-
- if(event.which === KEYS.DELETE) {
- direction = 'below';
- caretTo = 'start';
+ canvas.wlxmlDocument.transaction(function() {
+ if(willDeleteWholeText()) {
+ event.preventDefault();
+ node.setText('');
}
-
- event.preventDefault();
-
- var parent = element.parent(),
- grandParent = parent ? parent.parent() : null,
- goto;
- if(parent.children().length === 1 && parent.children()[0].sameNode(element)) {
- if(grandParent && grandParent.children().length === 1) {
- goto = grandParent.append({text: ''});
+ else if(element.isEmpty()) {
+ event.preventDefault();
+ var parent = element.parent(),
+ grandParent = parent ? parent.parent() : null;
+ if(!grandParent && parent.children().length === 1) {
+ return;
+ }
+ if(parent.children().length === 1 && parent.children()[0].sameNode(element)) {
+ if(grandParent && grandParent.children().length === 1) {
+ goto = grandParent.wlxmlNode.append({text: ''});
+ } else {
+ goto = element.getNearestTextElement(direction);
+ }
+ parent.wlxmlNode.detach();
} else {
goto = element.getNearestTextElement(direction);
+ element.wlxmlNode.detach();
}
- parent.detach();
- } else {
- goto = element.getNearestTextElement(direction);
- element.detach();
+ canvas.setCurrentElement(goto, {caretTo: caretTo});
}
- canvas.setCurrentElement(goto, {caretTo: caretTo});
- canvas.publisher('contentChanged');
- }
- else if(cursorAtOperationEdge) {
- // todo
- event.preventDefault();
- }
+ else if(cursorAtOperationEdge) {
+ if(direction === 'below') {
+ element = element.getNearestTextElement(direction);
+ }
+ if(element) {
+ goto = element.wlxmlNode.mergeContentUp();
+ if(goto) {
+ canvas.setCurrentElement(goto.node, {caretTo: goto.offset});
+ }
+ }
+ event.preventDefault();
+ }
+ }, {
+ metadata: {
+ description: gettext('Remove text')
+ }
+ });
}
});