Uncommited changes synced
authorAlan <alan@roojs.com>
Tue, 28 Dec 2021 06:35:29 +0000 (14:35 +0800)
committerAlan <alan@roojs.com>
Tue, 28 Dec 2021 06:35:29 +0000 (14:35 +0800)
Roo/DomHelper.js
Roo/HtmlEditorCore.js
Roo/form/HtmlEditor/ToolbarStandard.js
Roo/htmleditor/Block.js
Roo/htmleditor/BlockTable.js
Roo/htmleditor/KeyEnter.js
Roo/lib/UndoManager.js
docs/src/Roo_HtmlEditorCore.js.html
docs/src/Roo_htmleditor_KeyEnter.js.html

index c9796fc..b56d92f 100644 (file)
@@ -282,18 +282,19 @@ Roo.DomHelper = function(){
             if (ar[i].name == 'id') { // always keep ids?
                continue;
             }
-            if (ar[i].name == 'style') {
-               throw "style removed?";
-            }
+            //if (ar[i].name == 'style') {
+            //   throw "style removed?";
+            //}
             Roo.log("removeAttribute" + ar[i].name);
             from.removeAttribute(ar[i].name);
         }
         ar = to.attributes;
         for(var i = 0; i< ar.length;i++) {
             if (from.getAttribute(ar[i].name) == to.getAttribute(ar[i].name)) {
+                Roo.log("skipAttribute " + ar[i].name  + '=' + to.getAttribute(ar[i].name));
                 continue;
             }
-            Roo.log("updateAttribute " + from.getAttribute(ar[i].name) + '=>' + to.getAttribute(ar[i].name));
+            Roo.log("updateAttribute " + ar[i].name + '=>' + to.getAttribute(ar[i].name));
             from.setAttribute(ar[i].name, to.getAttribute(ar[i].name));
         }
         // children
index 7750c3f..01acff6 100644 (file)
@@ -333,7 +333,7 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component,  {
      */
     syncValue : function()
     {
-        Roo.log("HtmlEditorCore:syncValue (EDITOR->TEXT)");
+        //Roo.log("HtmlEditorCore:syncValue (EDITOR->TEXT)");
         if(this.initialized){
             
             this.undoManager.addEvent();
@@ -410,7 +410,7 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component,  {
      */
     pushValue : function()
     {
-        Roo.log("HtmlEditorCore:pushValue (TEXT->EDITOR)");
+        //Roo.log("HtmlEditorCore:pushValue (TEXT->EDITOR)");
         if(this.initialized){
             var v = this.el.dom.value.trim();
             
@@ -662,6 +662,33 @@ Roo.extend(Roo.HtmlEditorCore, Roo.Component,  {
         if (e && (e.ctrlKey || e.metaKey) && e.keyCode === 90) {
             return; // we do not handle this.. (undo manager does..)
         }
+        // in theory this detects if the last element is not a br, then we try and do that.
+        // its so clicking in space at bottom triggers adding a br and moving the cursor.
+        if (e &&
+            e.target.nodeName == 'BODY' &&
+            e.type == "mouseup" &&
+            this.doc.body.lastChild
+           ) {
+            var lc = this.doc.body.lastChild;
+            while (lc.nodeType == 3 && lc.nodeValue == '') {
+                lc = lc.previousSibling;
+            }
+            if (lc.nodeType == 1 && lc.nodeName != 'BR') {
+            // if last element is <BR> - then dont do anything.
+            
+                var ns = this.doc.createElement('br');
+                this.doc.body.appendChild(ns);
+                range = this.doc.createRange();
+                range.setStartAfter(ns);
+                range.collapse(true);
+                var sel = this.win.getSelection();
+                sel.removeAllRanges();
+                sel.addRange(range);
+            }
+        }
+        
+        
+        
         this.owner.fireEvent('editorevent', this, e);
       //  this.updateToolbar();
         this.syncValue(); //we can not sync so often.. sync cleans, so this breaks stuff
index 3aa47e9..28bb0b5 100644 (file)
@@ -642,6 +642,11 @@ Roo.apply(Roo.form.HtmlEditor.ToolbarStandard.prototype,  {
                 this.tb.items.each(function(item){
                     item.enable();
                 });
+                // initialize 'blocks'
+                Roo.each(Roo.get(this.editorcore.doc.body).query('*[data-block]'), function(e) {
+                    Roo.htmleditor.Block.factory(e).updateElement(e);
+                },this);
+            
             }
             
         }
index 03278d6..d6ab711 100644 (file)
@@ -18,9 +18,9 @@ Roo.htmleditor.Block  = function(cfg)
 
 Roo.htmleditor.Block.factory = function(node)
 {
-    
+    var cc = Roo.htmleditor.Block.cache;
     var id = Roo.get(node).id;
-    if (typeof(Roo.htmleditor.Block.cache[id]) != 'undefined') {
+    if (typeof(cc[id]) != 'undefined' && (!cc[id].node || cc[id].node.closest('body'))) {
         Roo.htmleditor.Block.cache[id].readElement();
         return Roo.htmleditor.Block.cache[id];
     }
index 74d0837..3f1bbaa 100644 (file)
@@ -161,6 +161,7 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
                     click : function (_self, e)
                     {
                         block().resetWidths();
+                        syncValue();
                     }
                 },
                 xns : rooui.Toolbar
@@ -458,6 +459,17 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
     remove : function()
     {
         Roo.log(this.cfg.node);
+    },
+    
+    
+    
+    resetWidths : function()
+    {
+        Array.from(this.node.getElementsByTagName('td')).forEach(function(n) {
+            var nn = Roo.htmleditor.Block.factory(n);
+            nn.width = '';
+            nn.updateElement(n);
+        });
     }
     
     
index b4c84eb..3b9896d 100644 (file)
@@ -17,6 +17,8 @@ Roo.htmleditor.KeyEnter = function(cfg) {
     Roo.get(this.core.doc.body).on('keypress', this.keypress, this);
 }
 
+//Roo.htmleditor.KeyEnter.i = 0;
+
 
 Roo.htmleditor.KeyEnter.prototype = {
     
@@ -34,8 +36,7 @@ Roo.htmleditor.KeyEnter.prototype = {
         var docFragment = doc.createDocumentFragment();
     
         //add a new line
-        var newEle = doc.createTextNode('\n');
-        docFragment.appendChild(newEle);
+       
     
     
         var range = this.core.win.getSelection().getRangeAt(0);
@@ -72,32 +73,41 @@ Roo.htmleditor.KeyEnter.prototype = {
             
             
         }
+        var newEle = doc.createTextNode('\n');
+        docFragment.appendChild(newEle);
+        
         //add the br, or p, or something else
         newEle = doc.createElement('br');
+        //newEle.setAttribute('data-id', Roo.htmleditor.KeyEnter.i++);
+        docFragment.appendChild(newEle);
+        doc.createTextNode('\n');
         docFragment.appendChild(newEle);
-        range.deleteContents();
-        range.insertNode(docFragment);
         
+        range.deleteContents();
+        range.insertNode(docFragment);  //<< inseting here...
+         
         var ns = newEle.nextSibling
         while (ns && ns.nodeType == 3) { 
             ns = ns.nextSibling;
         }
         
         if (!ns) {
+            //Roo.log('add extra');
             ns = doc.createElement('br');
+            //ns.setAttribute('data-id', 'x' +  Roo.htmleditor.KeyEnter.i++);
             newEle.parentNode.appendChild(ns);
         }
         
         
+        
         range = doc.createRange();
-        range.setStart(ns, 0);
-        range.setEnd(ns, 0);
+        range.setStartAfter(newEle);
         range.collapse(true);
         
         var sel = this.core.win.getSelection();
         sel.removeAllRanges();
         sel.addRange(range);
-        this.core.undoManager.addEvent();
+        //this.core.undoManager.addEvent();
         return false;
          
     }
index 82438fe..03e091e 100644 (file)
@@ -128,14 +128,14 @@ undoManager.transact({
             );
         }
         
-        Roo.log("transaction: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+        //Roo.log("transaction: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
       
         
     },
 
     undo : function ()
     {
-        Roo.log("undo: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
+        //Roo.log("undo: pos:" + this.position + " len: " + this.length + " slen:" + this.stack.length);
         
         if (this.position < this.length) {
             for (var i = this.stack[this.position].length - 1; i >= 0; i--) {
@@ -270,7 +270,7 @@ undoManager.transact({
     
     addEvent : function(merge)
     {
-        Roo.log("undomanager +" + (merge ? 'Y':'n'));
+        //Roo.log("undomanager +" + (merge ? 'Y':'n'));
         // not sure if this should clear the timer 
         merge = typeof(merge) == 'undefined' ? false : merge; 
         
index 98ab969..5a0e0bc 100644 (file)
 
     </span><span class="jsdoc-var">onEditorEvent </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">)
     {
+
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e </span><span class="jsdoc-syntax">&amp;&amp; (</span><span class="jsdoc-var">e.ctrlKey </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">e.metaKey</span><span class="jsdoc-syntax">) &amp;&amp; </span><span class="jsdoc-var">e.keyCode </span><span class="jsdoc-syntax">=== 90) {
+            </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// we do not handle this.. (undo manager does..)
+        </span><span class="jsdoc-syntax">}
         </span><span class="jsdoc-var">this.owner.fireEvent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'editorevent'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">);
       </span><span class="jsdoc-comment">//  this.updateToolbar();
         </span><span class="jsdoc-var">this.syncValue</span><span class="jsdoc-syntax">(); </span><span class="jsdoc-comment">//we can not sync so often.. sync cleans, so this breaks stuff
index 0beb5d0..744d353 100644 (file)
@@ -17,7 +17,7 @@
     </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.core.doc.body</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.on</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'keypress'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.keypress</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
 }
 
-
+</span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i </span><span class="jsdoc-syntax">= 0;
 </span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.prototype </span><span class="jsdoc-syntax">= {
 
     </span><span class="jsdoc-var">core </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
@@ -34,8 +34,7 @@
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">docFragment </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createDocumentFragment</span><span class="jsdoc-syntax">();
 
         </span><span class="jsdoc-comment">//add a new line
-        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
-        </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
 
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.win.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getRangeAt</span><span class="jsdoc-syntax">(0);
 
 
         }
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
         </span><span class="jsdoc-comment">//add the br, or p, or something else
         </span><span class="jsdoc-var">newEle </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'br'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">newEle.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-id'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i</span><span class="jsdoc-syntax">++);
+        </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'\n'</span><span class="jsdoc-syntax">);
         </span><span class="jsdoc-var">docFragment.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+
         </span><span class="jsdoc-var">range.deleteContents</span><span class="jsdoc-syntax">();
-        </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">docFragment</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">docFragment</span><span class="jsdoc-syntax">);  </span><span class="jsdoc-comment">//&lt;&lt; inseting here...
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">newEle.nextSibling
         </span><span class="jsdoc-keyword">while </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">ns.nodeType </span><span class="jsdoc-syntax">== 3) {
         }
 
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'add extra'</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-var">ns </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createElement</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'br'</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-var">ns.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-id'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-string">'x' </span><span class="jsdoc-syntax">+  </span><span class="jsdoc-var">Roo.htmleditor.KeyEnter.i</span><span class="jsdoc-syntax">++);
             </span><span class="jsdoc-var">newEle.parentNode.appendChild</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">);
         }
 
 
+
         </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">doc.createRange</span><span class="jsdoc-syntax">();
-        </span><span class="jsdoc-var">range.setStart</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">, 0);
-        </span><span class="jsdoc-var">range.setEnd</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ns</span><span class="jsdoc-syntax">, 0);
-        </span><span class="jsdoc-var">range.collapse</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range.setStartAfter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range.collapse</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">);
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.core.win.getSelection</span><span class="jsdoc-syntax">();
         </span><span class="jsdoc-var">sel.removeAllRanges</span><span class="jsdoc-syntax">();
         </span><span class="jsdoc-var">sel.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">);
-        </span><span class="jsdoc-var">this.core.undoManager.addEvent</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-comment">//this.core.undoManager.addEvent();
         </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
 
     }