X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/ce51fb7e5de8910382af08e299831714e5f0e4e4..c0e11a8f6d0d9a4c030aa90fe91f0fc49cd05e0e:/modules/visualEditor.js

diff --git a/modules/visualEditor.js b/modules/visualEditor.js
index 98923a5..f3c0a5c 100644
--- a/modules/visualEditor.js
+++ b/modules/visualEditor.js
@@ -3,6 +3,7 @@ rng.modules.visualEditor = function(sandbox) {
 
     var view = {
         node: $(sandbox.getTemplate('main')()),
+        currentNode: null,
         setup: function() {
             var view = this;
 
@@ -89,8 +90,31 @@ rng.modules.visualEditor = function(sandbox) {
         _markSelected: function(node) {
             this.node.find('.rng-current').removeClass('rng-current');
             node.addClass('rng-current');
+            this.currentNode = node;
             mediator.nodeSelected(node);
         },
+        selectNode: function(node) {
+            view._markSelected(node);
+            var range = document.createRange();
+            range.selectNodeContents(node[0]);
+            range.collapse(false);
+
+            var selection = document.getSelection();
+            selection.removeAllRanges()
+            selection.addRange(range);
+        },
+        selectFirstNode: function() {
+            var firstNodeWithText = this.node.find('[wlxml-tag]').filter(function() {
+                return $(this).clone().children().remove().end().text().trim() !== '';
+            }).first();
+            var node;
+            if(firstNodeWithText.length)
+                node = $(firstNodeWithText[0])
+            else {
+                node = this.node.find('[wlxml-class|="p"]')
+            }
+            this.selectNode(node);
+        },
         _addMetaRow: function(key, value) {
             var newRow = $(sandbox.getTemplate('metaItem')({key: key || '', value: value || ''}));
             newRow.appendTo(this.metaTable);
@@ -111,6 +135,37 @@ rng.modules.visualEditor = function(sandbox) {
                 view.selectTab(target.attr('data-content-id'));
             });
             view.selectTab('rng-visualEditor-edit');
+            
+            view.node.on('change', '.rng-visualEditor-editPaneNodeForm select', function(e) {
+                var target = $(e.target);
+                var attr = target.attr('id').split('-')[2].split('editPane')[1].substr(0,3) === 'Tag' ? 'tag' : 'class';
+                mediator.getCurrentNode().attr('wlxml-'+attr, target.val());
+                isDirty = true;
+            });
+            
+            view.node.on('change', '.rng-visualEditor-editPaneSelectionForm select', function(e) {
+                var target = $(e.target);
+                var selection = window.getSelection();
+                if(selection.anchorNode === selection.focusNode && selection.anchorNode.nodeType === Node.TEXT_NODE) {
+                    var startOffset = selection.anchorOffset;
+                    var endOffset = selection.focusOffset;
+                    if(startOffset > endOffset) {
+                        var tmp = startOffset;
+                        startOffset = endOffset;
+                        endOffset = tmp;
+                    }
+                    var node = selection.anchorNode;
+                    var prefix = node.data.substr(0, startOffset);
+                    var suffix = node.data.substr(endOffset);
+                    var core = node.data.substr(startOffset, endOffset - startOffset);
+                    var newNode = $('<span wlxml-tag="' + target.val() + '">' + core + '</span>');
+                    $(node).replaceWith(newNode);
+                    newNode.before(prefix);
+                    newNode.after(suffix);
+                    mediator.nodeCreated(newNode);
+                    isDirty = true;
+                }
+            });
         },
         selectTab: function(id) {
            this.node.find('.rng-visualEditor-sidebarContentItem').hide();
@@ -129,13 +184,20 @@ rng.modules.visualEditor = function(sandbox) {
     sideBarView.setup();
     
     var mediator = {
+        getCurrentNode: function() {
+            return view.currentNode;
+        },
+        nodeCreated: function(node) {
+            view.selectNode(node);
+            
+        },
         nodeSelected: function(node) {
             sideBarView.updateEditPane(node);
         }
     }
     
     var isDirty = false;
-    
+    var wasShownAlready = false;
     
     
     return {
@@ -159,6 +221,12 @@ rng.modules.visualEditor = function(sandbox) {
         },
         setDirty: function(dirty) {
             isDirty = dirty;
+        },
+        onShowed: function() {
+            if(!wasShownAlready) {
+                wasShownAlready = true;
+                view.selectFirstNode();
+            }
         }
     
     }