2 'libs/jquery-1.9.1.min',
4 ], function($, canvasNode) {
8 var getCursorPosition = function() {
9 var selection = window.getSelection();
10 var anchorNode = $(selection.anchorNode);
11 var parent = anchorNode.parent();
14 textNodeOffset: selection.anchorOffset,
15 textNodeIndex: parent.contents().index(anchorNode),
17 focusNode: $(selection.focusNode).parent(),
18 isAtEnd: selection.anchorOffset === anchorNode.text().length
22 var Manager = function(canvas, sandbox) {
24 this.sandbox = sandbox;
25 this.shownAlready = false;
26 this.gridToggled = false;
27 this.scrollbarPosition = 0;
28 this.currentNode = null;
31 canvas.doc().dom().find('#rng-module-documentCanvas-content').on('keyup', function() {
32 manager.sandbox.publish('contentChanged');
35 canvas.doc().dom().on('mouseover', '[wlxml-tag]', function(e) {
37 manager.sandbox.publish('nodeHovered', canvasNode.create($(e.target)));
39 canvas.doc().dom().on('mouseout', '[wlxml-tag]', function(e) {
41 manager.sandbox.publish('nodeBlured', canvasNode.create($(e.target)));
43 canvas.doc().dom().on('click', '[wlxml-tag]', function(e) {
45 console.log('clicked node type: '+e.target.nodeType);
46 manager.selectNode(canvasNode.create($(e.target)));
49 canvas.doc().dom().on('keyup', '#rng-module-documentCanvas-contentWrapper', function(e) {
50 var anchor = $(window.getSelection().anchorNode);
52 if(anchor[0].nodeType === Node.TEXT_NODE)
53 anchor = anchor.parent();
54 if(!anchor.is('[wlxml-tag]'))
56 manager.selectNode(canvasNode.create(anchor));
59 canvas.doc().dom().on('keydown', '#rng-module-documentCanvas-contentWrapper', function(e) {
61 manager.onEnterKey(e);
64 manager.onBackspaceKey(e);
68 canvas.doc().dom().onShow = function() {
69 if(!manager.shownAlready) {
70 manager.shownAlready = true;
71 manager.selectFirstNode();
72 } else if(manager.currentNode) {
73 manager.movecaretToNode(manager.getNodeElement(manager.currentNode));
74 canvas.doc().dom().find('#rng-module-documentCanvas-contentWrapper').scrollTop(manager.scrollbarPosition);
77 canvas.doc().dom().onHide = function() {
78 manager.scrollbarPosition = canvas.doc().dom().find('#rng-module-documentCanvas-contentWrapper').scrollTop();
82 Manager.prototype.selectNode = function(cnode, options) {
83 options = options || {};
84 var nodeElement = this.getNodeElement(cnode);
88 this.canvas.doc().dom().find('.rng-module-documentCanvas-currentNode').removeClass('rng-module-documentCanvas-currentNode');
89 nodeElement.addClass('rng-module-documentCanvas-currentNode');
91 if(options.movecaret) {
92 this.movecaretToNode(nodeElement, options.movecaret);
95 this.currentNode = cnode;
96 this.sandbox.publish('nodeSelected', cnode);
99 Manager.prototype.getNodeElement = function(cnode) {
100 return this.canvas.doc().dom().find('#'+cnode.getId());
103 Manager.prototype.highlightNode = function(cnode) {
104 var nodeElement = this.getNodeElement(cnode);
105 if(!this.gridToggled) {
106 nodeElement.addClass('rng-common-hoveredNode');
107 var label = nodeElement.attr('wlxml-tag');
108 if(nodeElement.attr('wlxml-class'))
109 label += ' / ' + nodeElement.attr('wlxml-class');
110 var tag = $('<div>').addClass('rng-module-documentCanvas-hoveredNodeTag').text(label);
111 nodeElement.append(tag);
115 Manager.prototype.dimNode = function(cnode) {
116 var nodeElement = this.getNodeElement(cnode);
117 if(!this.gridToggled) {
118 nodeElement.removeClass('rng-common-hoveredNode');
119 nodeElement.find('.rng-module-documentCanvas-hoveredNodeTag').remove();
123 Manager.prototype.selectFirstNode = function() {
124 var firstNodeWithText = this.canvas.doc().dom().find('[wlxml-tag]').filter(function() {
125 return $(this).clone().children().remove().end().text().trim() !== '';
128 if(firstNodeWithText.length)
129 node = $(firstNodeWithText[0]);
131 node = this.canvas.doc().dom().find('[wlxml-class|="p"]');
133 this.selectNode(canvasNode.create(node), {movecaret: true});
136 Manager.prototype.movecaretToNode = function(nodeElement, where) {
137 if(!nodeElement.length)
139 var range = document.createRange();
140 range.selectNodeContents(nodeElement[0]);
142 var collapseArg = true;
145 range.collapse(collapseArg);
146 var selection = document.getSelection();
147 selection.removeAllRanges();
148 selection.addRange(range);
151 Manager.prototype.onEnterKey = function(e) {
153 var pos = getCursorPosition();
154 var contextNode = this.canvas.getNodeById(pos.parentNode.attr('id'));
158 newNode = canvasNode.create({tag: pos.parentNode.attr('wlxml-tag'), klass: pos.parentNode.attr('wlxml-class')});
159 this.canvas.nodeInsertAfter({node: newNode, after: this.canvas.getNodeById(pos.parentNode.attr('id'))});
161 newNode = this.canvas.nodeSplit({node: contextNode, textNodeIdx: pos.textNodeIndex, offset: pos.textNodeOffset});
164 this.selectNode(newNode, {movecaret: true});
165 this.sandbox.publish('contentChanged');
168 Manager.prototype.onBackspaceKey = function(e) {
169 var pos = getCursorPosition();
170 var len = pos.textNode.text().length;
172 // Prevent deleting node by browser after last character removed;
174 pos.parentNode.text('');
178 var toRemove = canvasNode.create(pos.textNode);
179 var prevNode = this.canvas.getPrecedingNode({node:toRemove});
180 this.canvas.nodeRemove({node: toRemove}); // jesli nie ma tekstu, to anchor nie jest tex nodem
181 this.selectNode(prevNode, {movecaret: 'end'});
185 Manager.prototype.toggleList = function(toggle) {
186 var selection = window.getSelection(),
187 node1 = $(selection.anchorNode).parent()[0],
188 node2 = $(selection.focusNode).parent()[0],
189 element1 = this.canvas.getDocumentElement(node1),
190 element2 = this.canvas.getDocumentElement(node2);
194 Manager.prototype.command = function(command, params) {
196 var cursor = this.canvas.getCursor(),
197 selectionStart = cursor.getSelectionStart(),
198 selectionEnd = cursor.getSelectionEnd(),
199 parent1 = selectionStart.element.parent() || undefined,
200 parent2 = selectionEnd.element.parent() || undefined;
202 if(command === 'unwrap-node') {
203 if(this.canvas.list.areItemsOfTheSameList({element1: parent1, element2: parent2})) {
204 this.canvas.list.extractItems({element1: parent1, element2: parent2});
205 } else if(!cursor.isSelecting()) {
206 cursor.getPosition().element.unwrap();
208 } else if(command === 'wrap-node') {
209 if(this.canvas.list.areItemsOfTheSameList({element1: parent1, element2: parent2})) {
210 this.canvas.list.create({element1: parent1, element2: parent2});
212 } else if(command === 'toggle-list') {
214 this.canvas.list.create({element1: parent1, element2: parent2});
216 if(this.canvas.list.areItemsOfTheSameList({element1: parent1, element2: parent2})) {
217 this.canvas.list.extractItems({element1: parent1, element2: parent2, merge: false});
220 } else if(command == 'toggle-grid') {
221 this.canvas.doc().dom().find('[wlxml-tag]').toggleClass('rng-common-hoveredNode', params.toggle);
222 this.gridToggled = params.toggle;
223 } else if(command == 'newNodeRequested') {
224 if(cursor.isSelecting() && cursor.isSelectingSiblings()) {
225 if(cursor.isSelectingWithinElement()) {
226 selectionStart.element.wrapWithNodeElement({tag: params.wlxmlTag, klass: params.wlxmlClass, start: selectionStart.offset, end: selectionEnd.offset});
229 var parent = selectionStart.element.parent();
230 this.canvas.wrapText({
232 _with: {tag: params.wlxmlTag, klass: params.wlxmlClass},
233 offsetStart: selectionStart.offset,
234 offsetEnd: selectionEnd.offset,
235 textNodeIdx: [parent.childIndex(selectionStart.element), parent.childIndex(selectionEnd.element)]