sync
authorAlan <alan@roojs.com>
Fri, 24 Dec 2021 07:18:25 +0000 (15:18 +0800)
committerAlan <alan@roojs.com>
Fri, 24 Dec 2021 07:18:25 +0000 (15:18 +0800)
17 files changed:
Roo/DomHelper.js
Roo/UndoManager.js
Roo/htmleditor/Block.js
Roo/htmleditor/BlockTable.js
Roo/htmleditor/BlockTd.js
Roo/htmleditor/KeyEnter.js
buildSDK/dependancy_core.txt
docs/json/roodata.json
docs/src/Roo_DomHelper.js.html
docs/src/Roo_HtmlEditorCore.js.html
docs/src/Roo_form_BasicForm.js.html
docs/src/Roo_form_HtmlEditor_ToolbarContext.js.html
docs/src/Roo_htmleditor_Block.js.html
docs/src/Roo_htmleditor_KeyEnter.js.html
docs/symbols/Roo.form.BasicForm.json
docs/symbols/Roo.form.Form.json
docs/tree.json

index 6e5dd33..c9796fc 100644 (file)
@@ -280,8 +280,12 @@ Roo.DomHelper = function(){
                 continue;
             }
             if (ar[i].name == 'id') { // always keep ids?
-                continue;
+               continue;
+            }
+            if (ar[i].name == 'style') {
+               throw "style removed?";
             }
+            Roo.log("removeAttribute" + ar[i].name);
             from.removeAttribute(ar[i].name);
         }
         ar = to.attributes;
@@ -289,6 +293,7 @@ Roo.DomHelper = function(){
             if (from.getAttribute(ar[i].name) == to.getAttribute(ar[i].name)) {
                 continue;
             }
+            Roo.log("updateAttribute " + from.getAttribute(ar[i].name) + '=>' + to.getAttribute(ar[i].name));
             from.setAttribute(ar[i].name, to.getAttribute(ar[i].name));
         }
         // children
index e18b2bf..e69de29 100644 (file)
@@ -1,94 +0,0 @@
-/**
- * Originally based of this code... - refactored for Roo...
- * https://github.com/aaalsaleh/undo-manager
- * undo-manager.js
- * @author  Abdulrahman Alsaleh 
- * @copyright 2015 Abdulrahman Alsaleh 
- * @license  MIT License (c) 
- *
- * Hackily modifyed by alan@roojs.com
- *
- *
- * usage:
- * document.undoManager = new UndoManager(limit, document)
- *  
- *
- *  TOTALLY UNTESTED...
- *
- *  Documentation to be done....
- */
-
-function UndoManager(limit, undoScopeHost) {
-               var stack = [];
-               var fireEvent = typeof CustomEvent != 'undefined' && undoScopeHost && undoScopeHost.dispatchEvent;
-
-               this.position = 0;
-               this.length = 0;
-
-}
-        
-Roo.UndoManager.prototype = {
-    transact : function (transaction, merge)
-    {
-        if (arguments.length < 2)
-            throw new TypeError('Not enough arguments to UndoManager.transact.');
-
-        transaction.execute();
-
-        stack.splice(0, this.position);
-        if (merge && this.length)
-            stack[0].push(transaction);
-        else
-            stack.unshift([transaction]);
-        this.position = 0;
-
-        if (limit && stack.length > limit)
-            this.length = stack.length = limit;
-        else
-            this.length = stack.length;
-
-        if (fireEvent)
-            undoScopeHost.dispatchEvent(new CustomEvent('DOMTransaction', {detail: {transactions: stack[0].slice()}, bubbles: true, cancelable: false}));
-    },
-
-    undo : function ()
-    {
-        if (this.position < this.length) {
-            for (var i = stack[this.position].length - 1; i >= 0; i--)
-                stack[this.position][i].undo();
-            this.position++;
-
-            if (fireEvent)
-                undoScopeHost.dispatchEvent(new CustomEvent('undo', {detail: {transactions: stack[this.position - 1].slice()}, bubbles: true, cancelable: false}));
-        }
-    },
-
-    redo : function () {
-        if (this.position > 0) {
-            for (var i = 0, n = stack[this.position - 1].length; i < n; i++)
-                stack[this.position - 1][i].redo();
-            this.position--;
-
-            if (fireEvent)
-                undoScopeHost.dispatchEvent(new CustomEvent('redo', {detail: {transactions: stack[this.position].slice()}, bubbles: true, cancelable: false}));
-        }
-    },
-
-    item : function (index)
-    {
-        if (index >= 0 && index < this.length)
-            return stack[index].slice();
-        return null;
-    },
-
-    clearUndo : function () {
-        stack.length = this.length = this.position;
-    },
-
-    clearRedo : function () {
-        stack.splice(0, this.position);
-        this.position = 0;
-        this.length = stack.length;
-    }
-}
\ No newline at end of file
index ce9f601..03278d6 100644 (file)
@@ -25,9 +25,9 @@ Roo.htmleditor.Block.factory = function(node)
         return Roo.htmleditor.Block.cache[id];
     }
     
-    var cls = Roo.htmleditor['Block' + Roo.get(node).attr('data-block')];
+    var cls = Roo.htmleditor['Block' + node.getAttribute('data-block')];
     if (typeof(cls) == 'undefined') {
-        Roo.log("OOps missing block : " + 'Block' + Roo.get(node).attr('data-block'));
+        Roo.log("OOps missing block : " + 'Block' + node.getAttribute('data-block'));
         return false;
     }
     Roo.htmleditor.Block.cache[id] = new cls({ node: node });
@@ -81,7 +81,7 @@ Roo.htmleditor.Block.prototype = {
             return n.innerHTML;
         }
         if (attr == 'style') {
-            return Roo.get(n).getStyle(style);
+            return n.style[style]
         }
         
         return Roo.get(n).attr(attr);
index d917734..74d0837 100644 (file)
@@ -217,7 +217,8 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
                     tag : 'td',
                     contenteditable :  'true',
                     'data-block' : 'Td',
-                    html : cell.html
+                    html : cell.html,
+                    style : cell.style
                 };
                 if (cell.colspan > 1) {
                     td.colspan = cell.colspan ;
@@ -229,12 +230,7 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
                     td.rowspan = cell.rowspan ;
                 }
                 
-                if (cell.textAlign != '') {
-                    td.style = {
-                        'text-align' :  cell.textAlign,
-                        border : '1px solid #000'
-                    };
-                }
+                
                 // widths ?
                 tr.cn.push(td);
                     
@@ -273,10 +269,10 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
                 if (Roo.get(td).hasClass('roo-html-editor-el')) { // ??? this is for our 'row' selection'
                     return;
                 }
-                var add ={
+                var add = {
                     colspan : td.hasAttribute('colspan') ? td.getAttribute('colspan') : 1,
                     rowspan : td.hasAttribute('rowspan') ? td.getAttribute('rowspan') : 1,
-                    textAlign : this.getVal(node, true, 'style', 'text-align'),
+                    style : td.hasAttribute('style') ? td.getAttribute('style') : '',
                     html : td.innerHTML
                 }
                 no_column += add.colspan;
@@ -451,212 +447,11 @@ Roo.extend(Roo.htmleditor.BlockTable, Roo.htmleditor.Block, {
         this.updateElement();
         
     },
-    
-    joinCells: function(sels)
-    {
-        
-        
-        if (sels.length < 0 ) {
-            Roo.MessageBox.alert("Select something to join");
-            return;
-        }
-        if (sels.length < 1 ) {
-            if (sels[i].type == 'cell') {
-                Roo.MessageBox.alert("You must select more than 1 cell to join");
-                return;
-            }
-            if (sels[i].type == 'row' ) {
-                this.joinRow(sels[i].row);
-                return;
-            }
-            
-            this.joinCol(sels[i].col, 0, -1);
-            return;
-            
-        }
-        // how to tell if we are joining a row of cells or colums.
-        var r = sels[0].row , c = sels[0].col ;
-        for (var i = 1 ; i < sels.length; i++) {
-            
-            if (sels[i].type != 'cell') {
-                Roo.MessageBox.alert("you can only join cells to join");
-                return;
-            }
-            
-            if (sels[i].colspan > 1 || sels[i].rowspan > 1  ) {
-                Roo.MessageBox.alert("you can only join un-joined cells (unjoin them first)");
-                return;
-            }
-            if (typeof(r) != 'object' && r == sels[i].row ) {
-                if (typeof(c) === 'object') {
-                    c.push(sels[i].col);
-                    continue;
-                }
-                c = [ c ];
-                c.push(sels[i].col);
-                continue;
-            }
-            if (typeof(c) != 'object' && c == sels[i].col) {
-                if (typeof(r) === 'object') {
-                    r.push(sels[i].row);
-                    continue;
-                }
-                r = [ r ];
-                r.push(sels[i].row);
-                continue;
-            }
-            Roo.MessageBox.alert("you can only join a row or column, not both");
-            return;
-            
-        }
-        
-        
-        // at this point either r or c is an array
-        if (typeof(r) === 'object') {
-            // c contins column
-            // r is a list of arrays.
-            r.sort();
-            var html = grid[r[0]][c].html;
-            for (var i = 1; i < r.length; i++) {
-                if (r[i] != r[0]+1) {
-                    Roo.MessageBox.alert("Cells have to be next to each other");
-                    return;
-                }
-                
-            }
-            this.joinCol(c, r[0], r[r.length-1]);
-            
-        }
-        if (typeof(rc) === 'object') {
-            // c contins column
-            // r is a list of arrays.
-            c.sort();
-             for (var i = 1; i < r.length; i++) {
-                if (c[i] != c[0]+1) {
-                    Roo.MessageBox.alert("Cells have to be next to each other");
-                    return;
-                }
-                
-            }
-            this.joinRow(r, c[0], c[r.length-1]);
-            
-        }
-        
-        
-    },
-    
-    joinCol : function(col, s, e)
-    {
-        var grid = this.normalizeRows();
-        if (s === -1) {
-            s = 0;
-            e = grid.length;
-        }
-        var tg = grid[s][col].html;
-        for (var i = s+1; i < e+1; i++) {
-            html += '<br/>' + grid[i][col].html;
-            
-            this.rows[i].remove(grid[i][col]);
-        }
-        grid[s][col].html = html;
-        grid[s][col].colspan = (e-s)+1; //???
-        
-        this.updateElement();
-        
-    },
-    joinRow: function(row, s, e)
-    {
-        var grid = this.normalizeRows();
-        if (s === -1) {
-            s = 0;
-            e = grid[row].length;
-        }
-        var html = grid[row][s].html;
-        for (var i = s+1; i < e+1; i++) {
-            html += ' ' + grid[row][i].html;
-            this.rows[row].remove(grid[row][i]);
-        }
-        grid[r[0]][c].html = html;
-        grid[r[0]][c].rowspan = (e-s)+1; //???
-        this.updateElement();
-    },
-    
-    
-    splitCells : function(sel)
-    {
-        if (sels.type != 'cell') {
-            Roo.MessageBox.alert("you can only join cells to join");
-            return;
-        }
-        if (cell.colspan > 1 && cell.rowspan > 1) {
-            Roo.MessageBox.alert("splitting a merged row+cel is not supported yet.");
-            return;
-        }   
-        var grid = this.normalizeRows();
-        var cell = grid[sel.row][sel.col];
-        if (cell.colspan ==1 && cell.rowspan == 1) {
-            Roo.MessageBox.alert("select a merged cell to join");
-            return;
-        }
-        var ix = this.rows[sel.row].indexOf(cell);
-        if (cell.rowspan > 1) {
-            this.splitCellsRow(sel.row, sel.col, cell.rowspan);
-        } else {
-            this.splitCellsCol(sel.row, sel.col, cell.colspan);
-        }
-        
-    },
-    splitCellsRow : function(row, col, num)
-    {
-        /// this means we have to look at each row below, and insert a cell  after the first cell 
-        var grid = this.normalizeRows();
-        grid[row][col].rowspan = 1;
-        for(var r = row+1; r < num+1;r++) {
-            var nrow = [];
-            var added = false;
-            for(c = 0; c < this.rows[r].length;c++) {
-                if (!added && this.rows[r][c].col > col) {
-                    nrow.push(this.emptyCell());
-                    added = true;
-                }
-                nrow.push(this.rows[r][c])
-            }
-            if (!added) {
-                nrow.push(this.emptyCell());
-            }
-            this.row[r] = nrow;
-              
-        }
-        this.updateElement();
-        
-    },
-  
-    splitCellsCol: function(row, col, num)
-    {
-        /// this means we have to look at each row below, and insert a cell  after the first cell 
-        var grid = this.normalizeRows();
-        grid[row][col].colspan = 1;
-        
-        var pos = this.rows[row].indexOf(grid[row][col]);
-        var nrow =  this.rows[row].slice(0, pos);
-        var right =  this.rows[row].slice(pos);
-    
-        for (var i = 1; i < num; i++) {
-            nrow.push(this.emptyCell());
-        }
-        
-        this.row[row] = nrow.concat(right);
-        this.updateElement();
-        
-    },
+     
     // the default cell object... at present...
     emptyCell : function() {
-        return {
-            colspan :  1,
-            rowspan :  1,
-            textAlign : 'left',
-            html : "&nbsp;" // is this going to be editable now?
-        };
+        return (new Roo.htmleditor.BlockTd({})).toObject();
+        
      
     },
     
index 9cdba70..8aabbd8 100644 (file)
@@ -61,7 +61,7 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
         };
         
         var table = function() {
-            return Roo.htmleditor.Block.factory(Roo.get(toolbar.tb.selectedNode).findParent('table'));
+            return Roo.htmleditor.Block.factory(toolbar.tb.selectedNode.closest('table'));
         };
         
         var lr = false;
@@ -96,7 +96,7 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
                 text : 'Edit Table',
                 listeners : {
                     click : function() {
-                        var t = Roo.get(toolbar.tb.selectedNode).findParent('table');
+                        var t = toolbar.tb.selectedNode.closest('table');
                         toolbar.editorcore.selectNode(t);
                         toolbar.editorcore.onEditorEvent();                        
                     }
@@ -119,7 +119,7 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
                     click : function (_self, e)
                     {
                         saveSel();
-                        block().shrinkColumn();
+                        cell().shrinkColumn();
                         syncValue();
                         restoreSel();
                     }
@@ -133,7 +133,7 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
                     click : function (_self, e)
                     {
                         saveSel();
-                        block().growColumn();
+                        cell().growColumn();
                         syncValue();
                         restoreSel();
                     }
@@ -224,10 +224,11 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
             tag : 'td',
             contenteditable : 'true', // this stops cell selection from picking the table.
             'data-block' : 'Td',
-            style : {
+            width:  this.width,
+            style : {  
                 width:  this.width,
                 'text-align' :  this.textAlign,
-                border : 'solid 1px #000', // ??? hard coded?
+                border : 'solid 1px rgb(0, 0, 0)', // ??? hard coded?
                 'border-collapse' : 'collapse',
             },
             html : this.html
@@ -249,7 +250,8 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
     readElement : function(node)
     {
         node  = node ? node : this.node ;
-        this.width = this.getVal(node, true, 'style', 'width');
+        this.width = node.style.width;
+        
         this.html = node.innerHTML;
         
         
@@ -268,13 +270,15 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
     
     removeNode : function()
     {
-        return Roo.get(this.node).findParent('table');
+        return this.node.closest('table');
         
         
     },
     
     cellData : false,
     
+    colWidths : false,
+    
     toTableArray  : function()
     {
         var ret = [];
@@ -283,7 +287,8 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
             ret[ri] = [];
         });
         var rn = 0;
-        
+        this.colWidths = [];
+        var all_auto = true;
         Array.from(tab.rows).forEach(function(r, ri){
             
             var cn = 0;
@@ -305,7 +310,14 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
                     }
                     c.col = cn;
                 }
-                 
+                
+                if (typeof(this.colWidths[cn]) == 'undefined') {
+                    this.colWidths[cn] =   ce.style.width;
+                    if (this.colWidths[cn] != '') {
+                        all_auto = false;
+                    }
+                }
+                
                 
                 if (c.colspan < 2 && c.rowspan < 2 ) {
                     ret[rn][cn] = c;
@@ -326,10 +338,21 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
             }, this);
             rn++;
         }, this);
+        
+        // initalize widths.?
+        // either all widths or no widths..
+        if (all_auto) {
+            this.colWidths[0] = false; // no widths flag.
+        }
+        
+        
         return ret;
         
     },
     
+    
+    
+    
     mergeRight: function()
     {
          
@@ -389,36 +412,162 @@ Roo.extend(Roo.htmleditor.BlockTd, Roo.htmleditor.Block, {
         var cd = this.cellData;
         this.rowspan = 1;
         this.colspan = 1;
+        
         for(var r = cd.row; r < cd.row + cd.rowspan; r++) {
-            for(var c = cd.col; r < cd.col+ cd.colspan; c++) {
+            
+            
+            
+            for(var c = cd.col; c < cd.col + cd.colspan; c++) {
                 if (r == cd.row && c == cd.col) {
-                    this.node.setAttribute('rowspan',this.rowspan);
-                    this.node.setAttribute('colspan',this.colspan);
+                    this.node.removeAttribute('rowspan');
+                    this.node.removeAttribute('colspan');
+                    continue;
+                }
+                 
+                var ntd = this.node.cloneNode(); // which col/row should be 0..
+                ntd.removeAttribute('id'); //
+                //ntd.style.width  = '';
+                ntd.innerHTML = '';
+                table[r][c] = { cell : ntd, col : c, row: r , colspan : 1 , rowspan : 1   };
+            }
+            
+        }
+        this.redrawAllCells(table);
+        
+         
+        
+    },
+    
+    
+    
+    redrawAllCells: function(table)
+    {
+        
+         
+        var tab = this.node.closest('tr').closest('table');
+        Array.from(tab.rows).forEach(function(r, ri){
+            Array.from(r.cells).forEach(function(ce, ci){
+                ce.parentNode.removeChild(ce);
+            });
+        });
+        for(var r = 0 ; r < table.length; r++) {
+            var re = tab.rows[r];
+            for(var c = 0 ; c < table[r].length; c++) {
+                if (table[r][c].cell === false) {
                     continue;
                 }
                 
-                // create a cell. = need the left most cell.
-                
-                var l = { r: r , c: c - 1 };
-                while(table[l.r][l.c].row != r && l.c > -1) {
-                    l.c--;
+                re.appendChild(table[r][c].cell);
+                 
+                table[r][c].cell = false;
+            }
+        }
+        
+    },
+    updateWidths : function(table)
+    {
+        for(var r = 0 ; r < table.length; r++) {
+           
+            for(var c = 0 ; c < table[r].length; c++) {
+                if (table[r][c].cell === false) {
+                    continue;
                 }
-                if (l.c < 0) { //?? will this happen?
-                    throw "cant find left cell?";
+                
+                if (this.colWidths[0] != false && table[r][c].colspan < 2) {
+                    var el = Roo.htmleditor.Block.factory(table[r][c].cell);
+                    el.width = Math.floor(this.colWidths[c])  +'%';
+                    el.updateElement(el.node);
                 }
-                var ntd = this.node.ownerDocument.createElement('td');
-                table[l.r][l.c].cell.parentNode.insertBefore(ntd, table[l.r][l.c].cell.nextSibling);
-                table[r][c] = { cell : ntd, col : c, row: r , colspan : 1 , rowspan : 1 };
+                table[r][c].cell = false; // done
             }
+        }
+    },
+    normalizeWidths : function(table)
+    {
+    
+        if (this.colWidths[0] === false) {
+            var nw = 100.0 / this.colWidths.length;
+            this.colWidths.forEach(function(w,i) {
+                this.colWidths[i] = nw;
+            },this);
+            return;
+        }
+    
+        var t = 0, missing = [];
+        
+        this.colWidths.forEach(function(w,i) {
+            //if you mix % and
+            this.colWidths[i] = this.colWidths[i] == '' ? 0 : (this.colWidths[i]+'').replace(/[^0-9]+/g,'')*1;
+            var add =  this.colWidths[i];
+            if (add > 0) {
+                t+=add;
+                return;
+            }
+            missing.push(i);
             
             
+        },this);
+        var nc = this.colWidths.length;
+        if (missing.length) {
+            var mult = (nc - missing.length) / (1.0 * nc);
+            var t = mult * t;
+            var ew = (100 -t) / (1.0 * missing.length);
+            this.colWidths.forEach(function(w,i) {
+                if (w > 0) {
+                    this.colWidths[i] = w * mult;
+                    return;
+                }
+                
+                this.colWidths[i] = ew;
+            }, this);
+            // have to make up numbers..
+             
         }
+        // now we should have all the widths..
         
-        
-        
-        
-    }
     
+    },
+    
+    shrinkColumn : function()
+    {
+        var table = this.toTableArray();
+        this.normalizeWidths(table);
+        var col = this.cellData.col;
+        var nw = this.colWidths[col] * 0.8;
+        if (nw < 5) {
+            return;
+        }
+        var otherAdd = (this.colWidths[col]  * 0.2) / (this.colWidths.length -1);
+        this.colWidths.forEach(function(w,i) {
+            if (i == col) {
+                 this.colWidths[i] = nw;
+                return;
+            }
+            this.colWidths[i] += otherAdd
+        }, this);
+        this.updateWidths(table);
+         
+    },
+    growColumn : function()
+    {
+        var table = this.toTableArray();
+        this.normalizeWidths(table);
+        var col = this.cellData.col;
+        var nw = this.colWidths[col] * 1.2;
+        if (nw > 90) {
+            return;
+        }
+        var otherSub = (this.colWidths[col]  * 0.2) / (this.colWidths.length -1);
+        this.colWidths.forEach(function(w,i) {
+            if (i == col) {
+                this.colWidths[i] = nw;
+                return;
+            }
+            this.colWidths[i] -= otherSub
+        }, this);
+        this.updateWidths(table);
+         
+    }
     
     
 })
index bf61792..cde3a0d 100644 (file)
@@ -67,6 +67,7 @@ Roo.htmleditor.KeyEnter.prototype = {
             var sel = this.core.win.getSelection();
             sel.removeAllRanges();
             sel.addRange(range);
+            this.core.undoManager.addEvent();
             return false;
             
             
@@ -74,19 +75,29 @@ Roo.htmleditor.KeyEnter.prototype = {
         //add the br, or p, or something else
         newEle = doc.createElement('br');
         docFragment.appendChild(newEle);
-    
-        //make the br replace selection
-        
         range.deleteContents();
-        
         range.insertNode(docFragment);
-        range = range.cloneRange();
-        range.collapse(true);
+        
+        var ns = newEle.nextSibling
+        while (ns && ns.nodeType == 3) { 
+            ns = ns.nextSibling;
+        }
+        
+        if (!ns) {
+            ns = doc.createElement('br');
+            newEle.parentNode.appendChild(ns);
+        }
+        
+        
+        range = doc.createRange();
+        range.setStart(ns, 0);
+        range.setEnd(ns, 0);
+        range.collapse(false);
+        
         var sel = this.core.win.getSelection();
         sel.removeAllRanges();
         sel.addRange(range);
-        sel.collapseToEnd();
-    
+        this.core.undoManager.addEvent();
         return false;
          
     }
index 3ec724a..cbb299a 100644 (file)
@@ -28,6 +28,7 @@ Roo.lib.ColorAnim
 Roo.lib.Easing
 Roo.lib.Motion
 Roo.lib.Scroll
+Roo.lib.UndoManager
 
 // --- end if base ---
 
index 3fed2a9..d40f738 100644 (file)
       {
         "name" : "getFieldValues",
         "type" : "function",
-        "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.",
-        "sig" : "()\n{\n\n}",
+        "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.\nNormally this will not return readOnly data",
+        "sig" : "(with_readonly)",
         "static" : false,
         "memberOf" : "",
         "isStatic" : false,
         "see" : "",
         "exceptions" : "",
         "requires" : "",
-        "params" : [],
+        "params" : [
+          {
+            "name" : "with_readonly",
+            "type" : "Boolean",
+            "desc" : "return readonly field data.",
+            "isOptional" : false
+          }
+        ],
         "returns" : [
           {
             "name" : "",
       {
         "name" : "getFieldValues",
         "type" : "function",
-        "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.",
-        "sig" : "()\n{\n\n}",
+        "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.\nNormally this will not return readOnly data",
+        "sig" : "(with_readonly)",
         "static" : false,
         "memberOf" : "Roo.form.BasicForm",
         "isStatic" : false,
         "see" : "",
         "exceptions" : "",
         "requires" : "",
-        "params" : [],
+        "params" : [
+          {
+            "name" : "with_readonly",
+            "type" : "Boolean",
+            "desc" : "return readonly field data.",
+            "isOptional" : false
+          }
+        ],
         "returns" : [
           {
             "name" : "",
     "tree_children" : [],
     "tree_parent" : []
   },
+  "Roo.lib.UndoManager" : {
+    "props" : [],
+    "events" : [],
+    "methods" : [
+      {
+        "name" : "addEvent",
+        "type" : "function",
+        "desc" : "Manually add an event.\nNormall called without arguements - and it will just get added to the stack.",
+        "sig" : "()\n{\n\n}",
+        "static" : false,
+        "memberOf" : "",
+        "isStatic" : false,
+        "isConstructor" : false,
+        "isPrivate" : false,
+        "example" : "",
+        "deprecated" : "",
+        "since" : "",
+        "see" : "",
+        "exceptions" : "",
+        "requires" : "",
+        "params" : [],
+        "returns" : []
+      },
+      {
+        "name" : "reset",
+        "type" : "function",
+        "desc" : "Reset the undo - probaly done on load to clear all history.",
+        "sig" : "()\n{\n\n}",
+        "static" : false,
+        "memberOf" : "",
+        "isStatic" : false,
+        "isConstructor" : false,
+        "isPrivate" : false,
+        "example" : "",
+        "deprecated" : "",
+        "since" : "",
+        "see" : "",
+        "exceptions" : "",
+        "requires" : "",
+        "params" : [],
+        "returns" : []
+      },
+      {
+        "name" : "transact",
+        "type" : "function",
+        "desc" : "To push and execute a transaction, the method undoManager.transact\nmust be called by passing a transaction object as the first argument, and a merge\nflag as the second argument. A transaction object has the following properties:\n\nUsage:\n<pre><code>\nundoManager.transact({\n    label: 'Typing',\n    execute: function() { ... },\n    undo: function() { ... },\n    // redo same as execute\n    redo: function() { this.execute(); }\n}, false);\n\n// merge transaction\nundoManager.transact({\n    label: 'Typing',\n    execute: function() { ... },  // this will be run...\n    undo: function() { ... }, // what to do when undo is run.\n    // redo same as execute\n    redo: function() { this.execute(); }\n}, true); \n</code></pre>",
+        "sig" : "(transaction)",
+        "static" : false,
+        "memberOf" : "",
+        "isStatic" : false,
+        "isConstructor" : false,
+        "isPrivate" : false,
+        "example" : "",
+        "deprecated" : "",
+        "since" : "",
+        "see" : "",
+        "exceptions" : "",
+        "requires" : "",
+        "params" : [
+          {
+            "name" : "transaction",
+            "type" : "Object",
+            "desc" : "The transaction to add to the stack.",
+            "isOptional" : false
+          }
+        ],
+        "returns" : [
+          {
+            "name" : "",
+            "type" : "String",
+            "desc" : "The HTML fragment"
+          }
+        ]
+      }
+    ],
+    "isAbstract" : false,
+    "isBuilderTop" : false,
+    "implementations" : [],
+    "tree_children" : [],
+    "tree_parent" : []
+  },
   "Roo.menu" : {
     "props" : [],
     "events" : [],
index 5cda087..1a27d77 100644 (file)
                 </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
             }
             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'id'</span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// always keep ids?
-                </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+               </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
+            }
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) {
+               </span><span class="jsdoc-keyword">throw </span><span class="jsdoc-string">&quot;style removed?&quot;</span><span class="jsdoc-syntax">;
             }
+            </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;removeAttribute&quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-var">from.removeAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">);
         }
         </span><span class="jsdoc-var">ar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">to.attributes</span><span class="jsdoc-syntax">;
             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">from.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-var">to.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">)) {
                 </span><span class="jsdoc-keyword">continue</span><span class="jsdoc-syntax">;
             }
+            </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;updateAttribute &quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">from.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">) + </span><span class="jsdoc-string">'=&gt;' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">to.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">));
             </span><span class="jsdoc-var">from.setAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">to.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ar</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">i</span><span class="jsdoc-syntax">]</span><span class="jsdoc-var">.name</span><span class="jsdoc-syntax">));
         }
         </span><span class="jsdoc-comment">// children
index f6c82da..98ab969 100644 (file)
 
     </span><span class="jsdoc-var">bodyCls </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">''</span><span class="jsdoc-syntax">,
 
+
+    </span><span class="jsdoc-var">undoManager </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
     </span><span class="jsdoc-comment">/**
      * Protected method that will not generally be called directly. It
      * is called when the editor initializes the iframe with HTML contents. Override this method if you
                 </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.doc.body </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.doc.readyState </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'complete'</span><span class="jsdoc-syntax">){
                     </span><span class="jsdoc-keyword">try </span><span class="jsdoc-syntax">{
                         </span><span class="jsdoc-var">this.doc.designMode</span><span class="jsdoc-syntax">=</span><span class="jsdoc-string">&quot;on&quot;</span><span class="jsdoc-syntax">;
+
                     } </span><span class="jsdoc-keyword">catch </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
                         </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
                     }
     {
         </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;HtmlEditorCore:syncValue (EDITOR-&gt;TEXT)&quot;</span><span class="jsdoc-syntax">);
         </span><span class="jsdoc-keyword">if</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.initialized</span><span class="jsdoc-syntax">){
+
+            </span><span class="jsdoc-var">this.undoManager.addEvent</span><span class="jsdoc-syntax">();
+
+
             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">bd </span><span class="jsdoc-syntax">= (</span><span class="jsdoc-var">this.doc.body </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.doc.documentElement</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-comment">//this.cleanUpPaste(); -- this is done else where and causes havoc..
 
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">html </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">cd.getData</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'text/html'</span><span class="jsdoc-syntax">); </span><span class="jsdoc-comment">// clipboard event
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">parser </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.rtf.Parser</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cd.getData</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'text/rtf'</span><span class="jsdoc-syntax">));
-        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">images </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">parser.doc.getElementsByType</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'pict'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">images </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">parser.doc </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">parser.doc.getElementsByType</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'pict'</span><span class="jsdoc-syntax">) : [];
         </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">images</span><span class="jsdoc-syntax">);
         </span><span class="jsdoc-comment">//Roo.log(imgs);
         // fixme..
     </span><span class="jsdoc-var">onFirstFocus </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(){
 
         </span><span class="jsdoc-var">this.assignDocWin</span><span class="jsdoc-syntax">();
-
+        </span><span class="jsdoc-var">this.undoManager </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.lib.UndoManager</span><span class="jsdoc-syntax">(100,(</span><span class="jsdoc-var">this.doc.body </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">this.doc.documentElement</span><span class="jsdoc-syntax">));
 
         </span><span class="jsdoc-var">this.activated </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">;
 
 
         }
         </span><span class="jsdoc-var">this.execCmd</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;formatblock&quot;</span><span class="jsdoc-syntax">,   </span><span class="jsdoc-var">tg</span><span class="jsdoc-syntax">);
-
+        </span><span class="jsdoc-var">this.undoManager.addEvent</span><span class="jsdoc-syntax">();
     },
 
     </span><span class="jsdoc-var">insertText </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">txt</span><span class="jsdoc-syntax">)
                </span><span class="jsdoc-comment">//alert(Sender.getAttribute('label'));
 
         </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.doc.createTextNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">txt</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-var">this.undoManager.addEvent</span><span class="jsdoc-syntax">();
     } ,
 
 
                 </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">win.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.getRangeAt</span><span class="jsdoc-syntax">(0);
                 </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">range.createContextualFragment</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) : </span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">;
                 </span><span class="jsdoc-var">range.insertNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+                </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">range.cloneRange</span><span class="jsdoc-syntax">();
+                </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">win.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.removeAllRanges</span><span class="jsdoc-syntax">();
+                </span><span class="jsdoc-var">win.getSelection</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">);
+
+
+
             } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">win.document.selection </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">win.document.selection.createRange</span><span class="jsdoc-syntax">) {
                 </span><span class="jsdoc-comment">// no firefox support
                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">txt </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">text.outerHTML</span><span class="jsdoc-syntax">;
                 </span><span class="jsdoc-var">win.document.selection.createRange</span><span class="jsdoc-syntax">()</span><span class="jsdoc-var">.pasteHTML</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">txt</span><span class="jsdoc-syntax">);
+
             } </span><span class="jsdoc-keyword">else </span><span class="jsdoc-syntax">{
                 </span><span class="jsdoc-comment">// no firefox support
                 </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">txt </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">text</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'string' </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">text </span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">text.outerHTML</span><span class="jsdoc-syntax">;
                 </span><span class="jsdoc-var">this.execCmd</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'InsertHTML'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">txt</span><span class="jsdoc-syntax">);
             }
-
             </span><span class="jsdoc-var">this.syncValue</span><span class="jsdoc-syntax">();
 
             </span><span class="jsdoc-var">this.deferFocus</span><span class="jsdoc-syntax">();
      */
     </span><span class="jsdoc-var">selectNode </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)
     {
-
-            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nodeRange </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.ownerDocument.createRange</span><span class="jsdoc-syntax">();
-            </span><span class="jsdoc-keyword">try </span><span class="jsdoc-syntax">{
-                </span><span class="jsdoc-var">nodeRange.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
-            } </span><span class="jsdoc-keyword">catch </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
-                </span><span class="jsdoc-var">nodeRange.selectNodeContents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
-            }
-            </span><span class="jsdoc-comment">//nodeRange.collapse(true);
-            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">s </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.win.getSelection</span><span class="jsdoc-syntax">();
-            </span><span class="jsdoc-var">s.removeAllRanges</span><span class="jsdoc-syntax">();
-            </span><span class="jsdoc-var">s.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nodeRange</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">nodeRange </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">node.ownerDocument.createRange</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-keyword">try </span><span class="jsdoc-syntax">{
+            </span><span class="jsdoc-var">nodeRange.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        } </span><span class="jsdoc-keyword">catch </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">e</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-var">nodeRange.selectNodeContents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">);
+        }
+        </span><span class="jsdoc-comment">//nodeRange.collapse(true);
+        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">s </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.win.getSelection</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">s.removeAllRanges</span><span class="jsdoc-syntax">();
+        </span><span class="jsdoc-var">s.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">nodeRange</span><span class="jsdoc-syntax">);
     },
 
     </span><span class="jsdoc-var">getSelectedNode</span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">()
index 04080e8..1210410 100644 (file)
@@ -587,9 +587,11 @@ clientValidation  Boolean          Applies to submit only.  Pass true to call fo
     </span><span class="jsdoc-comment">/**
      * Returns the fields in this form as an object with key/value pairs. 
      * This differs from getValues as it calls getValue on each child item, rather than using dom data.
+     * Normally this will not return readOnly data 
+     * @param {Boolean} with_readonly return readonly field data.
      * @return {Object}
      */
-    </span><span class="jsdoc-var">getFieldValues </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">with_hidden</span><span class="jsdoc-syntax">)
+    </span><span class="jsdoc-var">getFieldValues </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">with_readonly</span><span class="jsdoc-syntax">)
     {
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this.childForms</span><span class="jsdoc-syntax">) {
             </span><span class="jsdoc-comment">// copy values from the child forms
@@ -603,7 +605,7 @@ clientValidation  Boolean          Applies to submit only.  Pass true to call fo
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ret </span><span class="jsdoc-syntax">= {};
         </span><span class="jsdoc-var">this.items.each</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">function</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">f</span><span class="jsdoc-syntax">){
 
-            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">f.readOnly</span><span class="jsdoc-syntax">) {
+            </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">f.readOnly </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">with_readonly </span><span class="jsdoc-syntax">!== </span><span class="jsdoc-keyword">true</span><span class="jsdoc-syntax">) {
                 </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// skip read only values. - this is in theory to stop 'old' values being copied over new ones
                         // if a subform contains a copy of them.
                         // if you have subforms with the same editable data, you will need to copy the data back
index 8d1f5d0..adc13bb 100644 (file)
              </span><span class="jsdoc-var">this.editor.onFirstFocus</span><span class="jsdoc-syntax">();
             </span><span class="jsdoc-keyword">return</span><span class="jsdoc-syntax">;
         }
-        </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ev </span><span class="jsdoc-syntax">? </span><span class="jsdoc-var">ev.target </span><span class="jsdoc-syntax">: </span><span class="jsdoc-string">'NOTARGET'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">//Roo.log(ev ? ev.target : 'NOTARGET');
 
 
-        </span><span class="jsdoc-comment">// http://developer.yahoo.com/yui/docs/simple-editor.js.html
+        // http://developer.yahoo.com/yui/docs/simple-editor.js.html
         // selectNode - might want to handle IE?
 
 
 
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">ev </span><span class="jsdoc-syntax">&amp;&amp;
             (</span><span class="jsdoc-var">ev.type </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'mouseup' </span><span class="jsdoc-syntax">|| </span><span class="jsdoc-var">ev.type </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'click' </span><span class="jsdoc-syntax">) &amp;&amp;
-            </span><span class="jsdoc-var">ev.target </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">ev.target </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'BODY' </span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// &amp;&amp; ev.target.tagName == 'IMG') {
+            </span><span class="jsdoc-var">ev.target </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">ev.target.tagName </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'BODY' </span><span class="jsdoc-syntax">) { </span><span class="jsdoc-comment">// &amp;&amp; ev.target.tagName == 'IMG') {
             // they have click on an image...
             // let's see if we can change the selection...
             </span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">ev.target</span><span class="jsdoc-syntax">;
             //this.editorcore.selectNode(sel);
 
         </span><span class="jsdoc-syntax">}
+        </span><span class="jsdoc-var">Roo.select</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'.roo-ed-selection'</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">this.editorcore.doc</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.removeClass</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'roo-ed-selection'</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-comment">//Roo.get(node).addClass('roo-ed-selection');
 
-
-        </span><span class="jsdoc-comment">//var updateFooter = sel ? false : true; 
+        //var updateFooter = sel ? false : true; 
 
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ans </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.editorcore.getAllAncestors</span><span class="jsdoc-syntax">();
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">left_label </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tn</span><span class="jsdoc-syntax">;
 
         </span><span class="jsdoc-comment">// ok see if we are editing a block?
-        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sel_el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">);
+
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">db </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">;
         </span><span class="jsdoc-comment">// you are not actually selecting the block.
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">sel.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">)) {
             </span><span class="jsdoc-var">db </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">;
         } </span><span class="jsdoc-keyword">else if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel </span><span class="jsdoc-syntax">&amp;&amp; !</span><span class="jsdoc-var">sel.hasAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'contenteditable'</span><span class="jsdoc-syntax">)) {
+            </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sel_el </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-var">db </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sel_el.findParent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'[data-block]'</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cepar </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">sel_el.findParent</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'[contenteditable=true]'</span><span class="jsdoc-syntax">);
             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">db </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">cepar </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">cepar.tagName </span><span class="jsdoc-syntax">!= </span><span class="jsdoc-string">'BODY'</span><span class="jsdoc-syntax">) {
         </span><span class="jsdoc-comment">//if (db &amp;&amp; !sel.hasAttribute('contenteditable') &amp;&amp; sel.getAttribute('contenteditable') != 'true' ) {
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">db</span><span class="jsdoc-syntax">) {
             </span><span class="jsdoc-var">block </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">db</span><span class="jsdoc-syntax">);
+
+
             </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">) {
+                </span><span class="jsdoc-var">db.className </span><span class="jsdoc-syntax">+=  </span><span class="jsdoc-string">' roo-ed-selection'</span><span class="jsdoc-syntax">; </span><span class="jsdoc-comment">// since we removed it earlier... its not there..
                 </span><span class="jsdoc-var">tn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-string">'BLOCK.' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">db.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">);
 
                 </span><span class="jsdoc-comment">//this.editorcore.selectNode(db);
 
 
         </span><span class="jsdoc-comment">// update attributes
-        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">) {
+        </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">block </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">this.tb.fields</span><span class="jsdoc-syntax">) {
 
             </span><span class="jsdoc-var">this.tb.fields.each</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-var">e.setValue</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">e.name</span><span class="jsdoc-syntax">]);
 
 
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">tb </span><span class="jsdoc-syntax">= </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">Roo.Toolbar</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">wdiv</span><span class="jsdoc-syntax">);
-        </span><span class="jsdoc-var">this.tb </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tb</span><span class="jsdoc-syntax">;
+        </span><span class="jsdoc-comment">///this.tb = tb; // &lt;&lt; this sets the active toolbar..
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tlist </span><span class="jsdoc-syntax">=== </span><span class="jsdoc-keyword">false </span><span class="jsdoc-syntax">&amp;&amp; </span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">) {
             </span><span class="jsdoc-var">tlist </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">block.contextMenu</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">this</span><span class="jsdoc-syntax">);
         }
                 {
                     </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">sn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">tb.selectedNode</span><span class="jsdoc-syntax">;
                     </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">block</span><span class="jsdoc-syntax">) {
-                        </span><span class="jsdoc-var">sn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tb.selectedNode</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.removalNode</span><span class="jsdoc-syntax">();
+                        </span><span class="jsdoc-var">sn </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor.Block.factory</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">tb.selectedNode</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.removeNode</span><span class="jsdoc-syntax">();
 
                     }
                     </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(!</span><span class="jsdoc-var">sn</span><span class="jsdoc-syntax">) {
         </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">ans </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.footerEls</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">ans</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">];
 
-         </span><span class="jsdoc-comment">// pick
-        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.editorcore.createRange</span><span class="jsdoc-syntax">();
-
-        </span><span class="jsdoc-var">range.selectNodeContents</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">);
-        </span><span class="jsdoc-comment">//range.selectNode(sel);
-
-
-        </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">selection </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">this.editorcore.getSelection</span><span class="jsdoc-syntax">();
-        </span><span class="jsdoc-var">selection.removeAllRanges</span><span class="jsdoc-syntax">();
-        </span><span class="jsdoc-var">selection.addRange</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">range</span><span class="jsdoc-syntax">);
-
+        </span><span class="jsdoc-var">this.editorcore.selectNode</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">);
 
 
         </span><span class="jsdoc-var">this.updateToolbar</span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-keyword">null</span><span class="jsdoc-syntax">, </span><span class="jsdoc-var">sel</span><span class="jsdoc-syntax">);
index 3011085..58daf0f 100644 (file)
@@ -25,9 +25,9 @@
         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">];
     }
 
-    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.attr</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">)];
+    </span><span class="jsdoc-keyword">var </span><span class="jsdoc-var">cls </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">Roo.htmleditor</span><span class="jsdoc-syntax">[</span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">)];
     </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-keyword">typeof</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">) == </span><span class="jsdoc-string">'undefined'</span><span class="jsdoc-syntax">) {
-        </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;OOps missing block : &quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.attr</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">));
+        </span><span class="jsdoc-var">Roo.log</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">&quot;OOps missing block : &quot; </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-string">'Block' </span><span class="jsdoc-syntax">+ </span><span class="jsdoc-var">node.getAttribute</span><span class="jsdoc-syntax">(</span><span class="jsdoc-string">'data-block'</span><span class="jsdoc-syntax">));
         </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
     }
     </span><span class="jsdoc-var">Roo.htmleditor.Block.cache</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">id</span><span class="jsdoc-syntax">] = </span><span class="jsdoc-keyword">new </span><span class="jsdoc-var">cls</span><span class="jsdoc-syntax">({ </span><span class="jsdoc-var">node</span><span class="jsdoc-syntax">: </span><span class="jsdoc-var">node </span><span class="jsdoc-syntax">});
@@ -81,7 +81,7 @@
             </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.innerHTML</span><span class="jsdoc-syntax">;
         }
         </span><span class="jsdoc-keyword">if </span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr </span><span class="jsdoc-syntax">== </span><span class="jsdoc-string">'style'</span><span class="jsdoc-syntax">) {
-            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.getStyle</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">style</span><span class="jsdoc-syntax">);
+            </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">n.style</span><span class="jsdoc-syntax">[</span><span class="jsdoc-var">style</span><span class="jsdoc-syntax">]
         }
 
         </span><span class="jsdoc-keyword">return </span><span class="jsdoc-var">Roo.get</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">n</span><span class="jsdoc-syntax">)</span><span class="jsdoc-var">.attr</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">attr</span><span class="jsdoc-syntax">);
index f6fc8c3..9e3f61c 100644 (file)
@@ -22,7 +22,8 @@
 
     </span><span class="jsdoc-var">core </span><span class="jsdoc-syntax">: </span><span class="jsdoc-keyword">false</span><span class="jsdoc-syntax">,
 
-    </span><span class="jsdoc-var">keypress </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-var">keypress </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.charCode </span><span class="jsdoc-syntax">!= 13) {
             </span><span class="jsdoc-keyword">return true</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-comment">//create a new range
-        </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.setStartAfter</span><span class="jsdoc-syntax">(</span><span class="jsdoc-var">newEle</span><span class="jsdoc-syntax">);
+        </span><span class="jsdoc-var">range </span><span class="jsdoc-syntax">= </span><span class="jsdoc-var">range.cloneRange</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-comment">//make the cursor there
         </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">sel.collapseToEnd</span><span class="jsdoc-syntax">();
 
         </span><span class="jsdoc-keyword">return false</span><span class="jsdoc-syntax">;
 
index 67e71e5..cd9294f 100644 (file)
     {
       "name" : "getFieldValues",
       "type" : "function",
-      "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.",
-      "sig" : "()\n{\n\n}",
+      "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.\nNormally this will not return readOnly data",
+      "sig" : "(with_readonly)",
       "static" : false,
       "memberOf" : "",
       "isStatic" : false,
       "see" : "",
       "exceptions" : "",
       "requires" : "",
-      "params" : [],
+      "params" : [
+        {
+          "name" : "with_readonly",
+          "type" : "Boolean",
+          "desc" : "return readonly field data.",
+          "isOptional" : false
+        }
+      ],
       "returns" : [
         {
           "name" : "",
index c771b57..74f0da3 100644 (file)
     {
       "name" : "getFieldValues",
       "type" : "function",
-      "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.",
-      "sig" : "()\n{\n\n}",
+      "desc" : "Returns the fields in this form as an object with key/value pairs. \nThis differs from getValues as it calls getValue on each child item, rather than using dom data.\nNormally this will not return readOnly data",
+      "sig" : "(with_readonly)",
       "static" : false,
       "memberOf" : "Roo.form.BasicForm",
       "isStatic" : false,
       "see" : "",
       "exceptions" : "",
       "requires" : "",
-      "params" : [],
+      "params" : [
+        {
+          "name" : "with_readonly",
+          "type" : "Boolean",
+          "desc" : "return readonly field data.",
+          "isOptional" : false
+        }
+      ],
       "returns" : [
         {
           "name" : "",
index fdc685f..b5b5a3e 100644 (file)
             "name" : "Roo.lib.RGBColor",
             "cn" : [],
             "is_class" : true
+          },
+          {
+            "name" : "Roo.lib.UndoManager",
+            "cn" : [],
+            "is_class" : true
           }
         ],
         "is_class" : false