debug.js
上传用户:shuoshiled
上传日期:2018-01-28
资源大小:10124k
文件大小:27k
源码类别:

中间件编程

开发平台:

JavaScript

  1. /*!
  2.  * Ext JS Library 3.0.0
  3.  * Copyright(c) 2006-2009 Ext JS, LLC
  4.  * licensing@extjs.com
  5.  * http://www.extjs.com/license
  6.  */
  7. Ext.debug = {};
  8. (function(){
  9. var cp;
  10. function createConsole(){
  11.     var scriptPanel = new Ext.debug.ScriptsPanel();
  12.     var logView = new Ext.debug.LogPanel();
  13.     var tree = new Ext.debug.DomTree();
  14.     var compInspector = new Ext.debug.ComponentInspector();
  15.     var compInfoPanel = new Ext.debug.ComponentInfoPanel();
  16.     var storeInspector = new Ext.debug.StoreInspector();
  17.     var objInspector = new Ext.debug.ObjectInspector();
  18.     var tabs = new Ext.TabPanel({
  19.         activeTab: 0,
  20.         border: false,
  21.         tabPosition: 'bottom',
  22.         items: [{
  23.             title: 'Debug Console',
  24.             layout:'border',
  25.             items: [logView, scriptPanel]
  26.         },{
  27.             title: 'HTML Inspector',
  28.             layout:'border',
  29.             items: [tree]
  30.         },{
  31.             title: 'Component Inspector',
  32.             layout: 'border',
  33.             items: [compInspector,compInfoPanel]
  34.         },{
  35.             title: 'Object Inspector',
  36.             layout: 'border',
  37.             items: [objInspector]
  38.         },{
  39.             title: 'Data Stores',
  40.             layout: 'border',
  41.             items: [storeInspector]
  42.         }]
  43.     });
  44.     cp = new Ext.Panel({
  45.         id: 'x-debug-browser',
  46.         title: 'Console',
  47.         collapsible: true,
  48.         animCollapse: false,
  49.         style: 'position:absolute;left:0;bottom:0;z-index:101',
  50.         height:200,
  51.         logView: logView,
  52.         layout: 'fit',
  53.         tools:[{
  54.             id: 'close',
  55.             handler: function(){
  56.                 cp.destroy();
  57.                 cp = null;
  58.                 Ext.EventManager.removeResizeListener(handleResize);
  59.             }
  60.         }],
  61.         items: tabs
  62.     });
  63.     cp.render(Ext.getBody());
  64.     cp.resizer = new Ext.Resizable(cp.el, {
  65.         minHeight:50,
  66.         handles: "n",
  67.         pinned: true,
  68.         transparent:true,
  69.         resizeElement : function(){
  70.             var box = this.proxy.getBox();
  71.             this.proxy.hide();
  72.             cp.setHeight(box.height);
  73.             return box;
  74.         }
  75.     });
  76. //     function handleResize(){
  77. //         cp.setWidth(Ext.getBody().getViewSize().width);
  78. //     }
  79. //     Ext.EventManager.onWindowResize(handleResize);
  80. //
  81. //     handleResize();
  82.     function handleResize(){
  83.         var b = Ext.getBody()
  84.         var size = b.getViewSize();
  85.         if(size.height < b.dom.scrollHeight) {
  86.             size.width -= 18;
  87.         }
  88.         cp.setWidth(size.width);
  89.     }
  90.     Ext.EventManager.onWindowResize(handleResize);
  91.     handleResize();
  92. }
  93. Ext.apply(Ext, {
  94.     log : function(){
  95.         if(!cp){
  96.             createConsole();
  97.         }
  98.         cp.logView.log.apply(cp.logView, arguments);
  99.     },
  100.     logf : function(format, arg1, arg2, etc){
  101.         Ext.log(String.format.apply(String, arguments));
  102.     },
  103.     dump : function(o){
  104.         if(typeof o == 'string' || typeof o == 'number' || typeof o == 'undefined' || Ext.isDate(o)){
  105.             Ext.log(o);
  106.         }else if(!o){
  107.             Ext.log("null");
  108.         }else if(typeof o != "object"){
  109.             Ext.log('Unknown return type');
  110.         }else if(Ext.isArray(o)){
  111.             Ext.log('['+o.join(',')+']');
  112.         }else{
  113.             var b = ["{n"];
  114.             for(var key in o){
  115.                 var to = typeof o[key];
  116.                 if(to != "function" && to != "object"){
  117.                     b.push(String.format("  {0}: {1},n", key, o[key]));
  118.                 }
  119.             }
  120.             var s = b.join("");
  121.             if(s.length > 3){
  122.                 s = s.substr(0, s.length-2);
  123.             }
  124.             Ext.log(s + "n}");
  125.         }
  126.     },
  127.     _timers : {},
  128.     time : function(name){
  129.         name = name || "def";
  130.         Ext._timers[name] = new Date().getTime();
  131.     },
  132.     timeEnd : function(name, printResults){
  133.         var t = new Date().getTime();
  134.         name = name || "def";
  135.         var v = String.format("{0} ms", t-Ext._timers[name]);
  136.         Ext._timers[name] = new Date().getTime();
  137.         if(printResults !== false){
  138.             Ext.log('Timer ' + (name == "def" ? v : name + ": " + v));
  139.         }
  140.         return v;
  141.     }
  142. });
  143. })();
  144. Ext.debug.ScriptsPanel = Ext.extend(Ext.Panel, {
  145.     id:'x-debug-scripts',
  146.     region: 'east',
  147.     minWidth: 200,
  148.     split: true,
  149.     width: 350,
  150.     border: false,
  151.     layout:'anchor',
  152.     style:'border-width:0 0 0 1px;',
  153.     initComponent : function(){
  154.         this.scriptField = new Ext.form.TextArea({
  155.             anchor: '100% -26',
  156.             style:'border-width:0;'
  157.         });
  158.         this.trapBox = new Ext.form.Checkbox({
  159.             id: 'console-trap',
  160.             boxLabel: 'Trap Errors',
  161.             checked: true
  162.         });
  163.         this.toolbar = new Ext.Toolbar([{
  164.                 text: 'Run',
  165.                 scope: this,
  166.                 handler: this.evalScript
  167.             },{
  168.                 text: 'Clear',
  169.                 scope: this,
  170.                 handler: this.clear
  171.             },
  172.             '->',
  173.             this.trapBox,
  174.             ' ', ' '
  175.         ]);
  176.         this.items = [this.toolbar, this.scriptField];
  177.         Ext.debug.ScriptsPanel.superclass.initComponent.call(this);
  178.     },
  179.     evalScript : function(){
  180.         var s = this.scriptField.getValue();
  181.         if(this.trapBox.getValue()){
  182.             try{
  183.                 var rt = eval(s);
  184.                 Ext.dump(rt === undefined? '(no return)' : rt);
  185.             }catch(e){
  186.                 Ext.log(e.message || e.descript);
  187.             }
  188.         }else{
  189.             var rt = eval(s);
  190.             Ext.dump(rt === undefined? '(no return)' : rt);
  191.         }
  192.     },
  193.     clear : function(){
  194.         this.scriptField.setValue('');
  195.         this.scriptField.focus();
  196.     }
  197. });
  198. Ext.debug.LogPanel = Ext.extend(Ext.Panel, {
  199.     autoScroll: true,
  200.     region: 'center',
  201.     border: false,
  202.     style:'border-width:0 1px 0 0',
  203.     log : function(){
  204.         var markup = [  '<div style="padding:5px !important;border-bottom:1px solid #ccc;">',
  205.                     Ext.util.Format.htmlEncode(Array.prototype.join.call(arguments, ', ')).replace(/n/g, '<br/>').replace(/s/g, '&#160;'),
  206.                     '</div>'].join('');
  207.         this.body.insertHtml('beforeend', markup);
  208.         this.body.scrollTo('top', 100000);
  209.     },
  210.     clear : function(){
  211.         this.body.update('');
  212.         this.body.dom.scrollTop = 0;
  213.     }
  214. });
  215. Ext.debug.DomTree = Ext.extend(Ext.tree.TreePanel, {
  216.     enableDD:false ,
  217.     lines:false,
  218.     rootVisible:false,
  219.     animate:false,
  220.     hlColor:'ffff9c',
  221.     autoScroll: true,
  222.     region:'center',
  223.     border:false,
  224.     initComponent : function(){
  225.         Ext.debug.DomTree.superclass.initComponent.call(this);
  226.         // tree related stuff
  227.         var styles = false, hnode;
  228.         var nonSpace = /^s*$/;
  229.         var html = Ext.util.Format.htmlEncode;
  230.         var ellipsis = Ext.util.Format.ellipsis;
  231.         var styleRe = /s?([a-z-]*):([^;]*)(?:[;snr]*)/gi;
  232.         function findNode(n){
  233.             if(!n || n.nodeType != 1 || n == document.body || n == document){
  234.                 return false;
  235.             }
  236.             var pn = [n], p = n;
  237.             while((p = p.parentNode) && p.nodeType == 1 && p.tagName.toUpperCase() != 'HTML'){
  238.                 pn.unshift(p);
  239.             }
  240.             var cn = hnode;
  241.             for(var i = 0, len = pn.length; i < len; i++){
  242.                 cn.expand();
  243.                 cn = cn.findChild('htmlNode', pn[i]);
  244.                 if(!cn){ // in this dialog?
  245.                     return false;
  246.                 }
  247.             }
  248.             cn.select();
  249.             var a = cn.ui.anchor;
  250.             this.getTreeEl().dom.scrollTop = Math.max(0 ,a.offsetTop-10);
  251.             //treeEl.dom.scrollLeft = Math.max(0 ,a.offsetLeft-10); no likey
  252.             cn.highlight();
  253.             return true;
  254.         }
  255.         function nodeTitle(n){
  256.             var s = n.tagName;
  257.             if(n.id){
  258.                 s += '#'+n.id;
  259.             }else if(n.className){
  260.                 s += '.'+n.className;
  261.             }
  262.             return s;
  263.         }
  264.         /*
  265.         function onNodeSelect(t, n, last){
  266.             return;
  267.             if(last && last.unframe){
  268.                 last.unframe();
  269.             }
  270.             var props = {};
  271.             if(n && n.htmlNode){
  272.                 if(frameEl.pressed){
  273.                     n.frame();
  274.                 }
  275.                 if(inspecting){
  276.                     return;
  277.                 }
  278.                 addStyle.enable();
  279.                 reload.setDisabled(n.leaf);
  280.                 var dom = n.htmlNode;
  281.                 stylePanel.setTitle(nodeTitle(dom));
  282.                 if(styles && !showAll.pressed){
  283.                     var s = dom.style ? dom.style.cssText : '';
  284.                     if(s){
  285.                         var m;
  286.                         while ((m = styleRe.exec(s)) != null){
  287.                             props[m[1].toLowerCase()] = m[2];
  288.                         }
  289.                     }
  290.                 }else if(styles){
  291.                     var cl = Ext.debug.cssList;
  292.                     var s = dom.style, fly = Ext.fly(dom);
  293.                     if(s){
  294.                         for(var i = 0, len = cl.length; i<len; i++){
  295.                             var st = cl[i];
  296.                             var v = s[st] || fly.getStyle(st);
  297.                             if(v != undefined && v !== null && v !== ''){
  298.                                 props[st] = v;
  299.                             }
  300.                         }
  301.                     }
  302.                 }else{
  303.                     for(var a in dom){
  304.                         var v = dom[a];
  305.                         if((isNaN(a+10)) && v != undefined && v !== null && v !== '' && !(Ext.isGecko && a[0] == a[0].toUpperCase())){
  306.                             props[a] = v;
  307.                         }
  308.                     }
  309.                 }
  310.             }else{
  311.                 if(inspecting){
  312.                     return;
  313.                 }
  314.                 addStyle.disable();
  315.                 reload.disabled();
  316.             }
  317.             stylesGrid.setSource(props);
  318.             stylesGrid.treeNode = n;
  319.             stylesGrid.view.fitColumns();
  320.         }
  321.         */
  322.         this.loader = new Ext.tree.TreeLoader();
  323.         this.loader.load = function(n, cb){
  324.             var isBody = n.htmlNode == document.body;
  325.             var cn = n.htmlNode.childNodes;
  326.             for(var i = 0, c; c = cn[i]; i++){
  327.                 if(isBody && c.id == 'x-debug-browser'){
  328.                     continue;
  329.                 }
  330.                 if(c.nodeType == 1){
  331.                     n.appendChild(new Ext.debug.HtmlNode(c));
  332.                 }else if(c.nodeType == 3 && !nonSpace.test(c.nodeValue)){
  333.                     n.appendChild(new Ext.tree.TreeNode({
  334.                         text:'<em>' + ellipsis(html(String(c.nodeValue)), 35) + '</em>',
  335.                         cls: 'x-tree-noicon'
  336.                     }));
  337.                 }
  338.             }
  339.             cb();
  340.         };
  341.         //tree.getSelectionModel().on('selectionchange', onNodeSelect, null, {buffer:250});
  342.         this.root = this.setRootNode(new Ext.tree.TreeNode('Ext'));
  343.         hnode = this.root.appendChild(new Ext.debug.HtmlNode(
  344.                 document.getElementsByTagName('html')[0]
  345.         ));
  346.     }
  347. });
  348. Ext.debug.ComponentNodeUI = Ext.extend(Ext.tree.TreeNodeUI,{
  349.     onOver : function(e){
  350.         Ext.debug.ComponentNodeUI.superclass.onOver.call(this);
  351.         var cmp = this.node.attributes.component;
  352.         if (cmp.el && cmp.el.mask && cmp.id !='x-debug-browser') {
  353.             try { // Oddly bombs on some elements in IE, gets any we care about though
  354.                 cmp.el.mask();
  355.             } catch(e) {}
  356.         }
  357.     },
  358.     onOut : function(e){
  359.         Ext.debug.ComponentNodeUI.superclass.onOut.call(this);
  360.         var cmp = this.node.attributes.component;
  361.         if (cmp.el && cmp.el.unmask && cmp.id !='x-debug-browser') {
  362.             try {
  363.                 cmp.el.unmask();
  364.             } catch(e) {}
  365.         }
  366.     }
  367. });
  368. Ext.debug.ComponentInspector = Ext.extend(Ext.tree.TreePanel, {
  369.     enableDD:false ,
  370.     lines:false,
  371.     rootVisible:false,
  372.     animate:false,
  373.     hlColor:'ffff9c',
  374.     autoScroll: true,
  375.     region:'center',
  376.     border:false,
  377.     initComponent : function(){
  378.         this.loader = new Ext.tree.TreeLoader();
  379.         this.bbar = new Ext.Toolbar([{
  380.             text: 'Refresh',
  381.             handler: this.refresh,
  382.             scope: this
  383.         }]);
  384.         Ext.debug.ComponentInspector.superclass.initComponent.call(this);
  385.         this.root = this.setRootNode(new Ext.tree.TreeNode({
  386.             text: 'Ext Components',
  387.             component: Ext.ComponentMgr.all,
  388.             leaf: false
  389.         }));
  390.         this.parseRootNode();
  391.         this.on('click', this.onClick, this);
  392.     },
  393.     createNode: function(n,c) {
  394.         var leaf = (c.items && c.items.length > 0);
  395.         return n.appendChild(new Ext.tree.TreeNode({
  396.             text: c.id + (c.getXType() ? ' [ ' + c.getXType() + ' ]': '' ),
  397.             component: c,
  398.             uiProvider:Ext.debug.ComponentNodeUI,
  399.             leaf: !leaf
  400.         }));
  401.     },
  402.     parseChildItems: function(n) {
  403.         var cn = n.attributes.component.items;
  404.         if (cn) {
  405.             for (var i = 0;i < cn.length; i++) {
  406.                 var c = cn.get(i);
  407.                 if (c.id != this.id && c.id != this.bottomToolbar.id) {
  408.                     var newNode = this.createNode(n,c);
  409.                     if (!newNode.leaf) {
  410.                         this.parseChildItems(newNode)
  411.                     }
  412.                 }
  413.             }
  414.         }
  415.     },
  416.     parseRootNode: function() {
  417.         var n = this.root;
  418.         var cn = n.attributes.component.items;
  419.         for (var i = 0,c;c = cn[i];i++) {
  420.             if (c.id != this.id && c.id != this.bottomToolbar.id) {
  421.                 if (!c.ownerCt) {
  422.                     var newNode = this.createNode(n,c);
  423.                     if (!newNode.leaf) {
  424.                         this.parseChildItems(newNode);
  425.                     }
  426.                 }
  427.             }
  428.         }
  429.     },
  430.     onClick: function(node, e) {
  431.         var oi = Ext.getCmp('x-debug-objinspector');
  432.         oi.refreshNodes(node.attributes.component);
  433.         oi.ownerCt.show();
  434.     },
  435.     refresh: function() {
  436.         while (this.root.firstChild) {
  437.             this.root.removeChild(this.root.firstChild);
  438.         }
  439.         this.parseRootNode();
  440.         var ci = Ext.getCmp('x-debug-compinfo');
  441.         if (ci) {
  442.             ci.message('refreshed component tree - '+Ext.ComponentMgr.all.length)
  443.         }
  444.     }
  445. });
  446. Ext.debug.ComponentInfoPanel = Ext.extend(Ext.Panel,{
  447.     id:'x-debug-compinfo',
  448.     region: 'east',
  449.     minWidth: 200,
  450.     split: true,
  451.     width: 350,
  452.     border: false,
  453.     autoScroll: true,
  454.     layout:'anchor',
  455.     style:'border-width:0 0 0 1px;',
  456.     initComponent: function() {
  457.         this.watchBox = new Ext.form.Checkbox({
  458.             id: 'x-debug-watchcomp',
  459.             boxLabel: 'Watch ComponentMgr',
  460.             listeners: {
  461.                 check: function(cb, val) {
  462.                     if (val) {
  463.                         Ext.ComponentMgr.all.on('add', this.onAdd, this);
  464.                         Ext.ComponentMgr.all.on('remove', this.onRemove, this);
  465.                     } else {
  466.                         Ext.ComponentMgr.all.un('add', this.onAdd, this);
  467.                         Ext.ComponentMgr.all.un('remove', this.onRemove, this);
  468.                     }
  469.                 },
  470.                 scope: this
  471.             }
  472.         });
  473.         this.tbar = new Ext.Toolbar([{
  474.             text: 'Clear',
  475.             handler: this.clear,
  476.             scope: this
  477.         },'->',this.watchBox
  478.         ]);
  479.         Ext.debug.ComponentInfoPanel.superclass.initComponent.call(this);
  480.     },
  481.     onAdd: function(i, o, key) {
  482.         var markup = ['<div style="padding:5px !important;border-bottom:1px solid #ccc;">',
  483.                     'Added: '+o.id,
  484.                     '</div>'].join('');
  485.         this.insertMarkup(markup);
  486.     },
  487.     onRemove: function(o, key) {
  488.         var markup = ['<div style="padding:5px !important;border-bottom:1px solid #ccc;">',
  489.                     'Removed: '+o.id,
  490.                     '</div>'].join('');
  491.         this.insertMarkup(markup);
  492.     },
  493.     message: function(msg) {
  494.         var markup = ['<div style="padding:5px !important;border-bottom:1px solid #ccc;">',
  495.                     msg,
  496.                     '</div>'].join('');
  497.         this.insertMarkup(markup);
  498.     },
  499.     insertMarkup: function(markup) {
  500.         this.body.insertHtml('beforeend', markup);
  501.         this.body.scrollTo('top', 100000);
  502.     },
  503.     clear : function(){
  504.         this.body.update('');
  505.         this.body.dom.scrollTop = 0;
  506.     }
  507. });
  508. Ext.debug.ColumnNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {
  509.     focus: Ext.emptyFn, // prevent odd scrolling behavior
  510.     renderElements : function(n, a, targetNode, bulkRender){
  511.         this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';
  512.         var t = n.getOwnerTree();
  513.         var cols = t.columns;
  514.         var bw = t.borderWidth;
  515.         var c = cols[0];
  516.         var buf = [
  517.              '<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf ', a.cls,'">',
  518.                 '<div class="x-tree-col" style="width:',c.width-bw,'px;">',
  519.                     '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",
  520.                     '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow"/>',
  521.                     '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on"/>',
  522.                     '<a hidefocus="on" class="x-tree-node-anchor" href="',a.href ? a.href : "#",'" tabIndex="1" ',
  523.                     a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '>',
  524.                     '<span unselectable="on">', n.text || (c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]),"</span></a>",
  525.                 "</div>"];
  526.          for(var i = 1, len = cols.length; i < len; i++){
  527.              c = cols[i];
  528.              buf.push('<div class="x-tree-col ',(c.cls?c.cls:''),'" style="width:',c.width-bw,'px;">',
  529.                         '<div class="x-tree-col-text">',(c.renderer ? c.renderer(a[c.dataIndex], n, a) : a[c.dataIndex]),"</div>",
  530.                       "</div>");
  531.          }
  532.          buf.push(
  533.             '<div class="x-clear"></div></div>',
  534.             '<ul class="x-tree-node-ct" style="display:none;"></ul>',
  535.             "</li>");
  536.         if(bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()){
  537.             this.wrap = Ext.DomHelper.insertHtml("beforeBegin",
  538.                                 n.nextSibling.ui.getEl(), buf.join(""));
  539.         }else{
  540.             this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf.join(""));
  541.         }
  542.         this.elNode = this.wrap.childNodes[0];
  543.         this.ctNode = this.wrap.childNodes[1];
  544.         var cs = this.elNode.firstChild.childNodes;
  545.         this.indentNode = cs[0];
  546.         this.ecNode = cs[1];
  547.         this.iconNode = cs[2];
  548.         this.anchor = cs[3];
  549.         this.textNode = cs[3].firstChild;
  550.     }
  551. });
  552. Ext.debug.ObjectInspector = Ext.extend(Ext.tree.TreePanel, {
  553.     id: 'x-debug-objinspector',
  554.     enableDD:false ,
  555.     lines:false,
  556.     rootVisible:false,
  557.     animate:false,
  558.     hlColor:'ffff9c',
  559.     autoScroll: true,
  560.     region:'center',
  561.     border:false,
  562.     lines:false,
  563.     borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell
  564.     cls:'x-column-tree',
  565.     initComponent : function(){
  566.         this.showFunc = false;
  567.         this.toggleFunc = function() {
  568.             this.showFunc = !this.showFunc;
  569.             this.refreshNodes(this.currentObject);
  570.         }
  571.         this.bbar = new Ext.Toolbar([{
  572.             text: 'Show Functions',
  573.             enableToggle: true,
  574.             pressed: false,
  575.             handler: this.toggleFunc,
  576.             scope: this
  577.         }]);
  578.         Ext.apply(this,{
  579.             title: ' ',
  580.             loader: new Ext.tree.TreeLoader(),
  581.             columns:[{
  582.                 header:'Property',
  583.                 width: 300,
  584.                 dataIndex:'name'
  585.             },{
  586.                 header:'Value',
  587.                 width: 900,
  588.                 dataIndex:'value'
  589.             }]
  590.         });
  591.         Ext.debug.ObjectInspector.superclass.initComponent.call(this);
  592.         this.root = this.setRootNode(new Ext.tree.TreeNode({
  593.             text: 'Dummy Node',
  594.             leaf: false
  595.         }));
  596.         if (this.currentObject) {
  597.             this.parseNodes();
  598.         }
  599.     },
  600.     refreshNodes: function(newObj) {
  601.         this.currentObject = newObj;
  602.         var node = this.root;
  603.         while(node.firstChild){
  604.             node.removeChild(node.firstChild);
  605.         }
  606.         this.parseNodes();
  607.     },
  608.     parseNodes: function() {
  609.         for (var o in this.currentObject) {
  610.             if (!this.showFunc) {
  611.                 if (Ext.isFunction(this.currentObject[o])) {
  612.                     continue;
  613.                 }
  614.             }
  615.             this.createNode(o);
  616.         }
  617.     },
  618.     createNode: function(o) {
  619.         return this.root.appendChild(new Ext.tree.TreeNode({
  620.             name: o,
  621.             value: this.currentObject[o],
  622.             uiProvider:Ext.debug.ColumnNodeUI,
  623.             iconCls: 'x-debug-node',
  624.             leaf: true
  625.         }));
  626.     },
  627.     onRender : function(){
  628.         Ext.debug.ObjectInspector.superclass.onRender.apply(this, arguments);
  629.         this.headers = this.header.createChild({cls:'x-tree-headers'});
  630.         var cols = this.columns, c;
  631.         var totalWidth = 0;
  632.         for(var i = 0, len = cols.length; i < len; i++){
  633.              c = cols[i];
  634.              totalWidth += c.width;
  635.              this.headers.createChild({
  636.                  cls:'x-tree-hd ' + (c.cls?c.cls+'-hd':''),
  637.                  cn: {
  638.                      cls:'x-tree-hd-text',
  639.                      html: c.header
  640.                  },
  641.                  style:'width:'+(c.width-this.borderWidth)+'px;'
  642.              });
  643.         }
  644.         this.headers.createChild({cls:'x-clear'});
  645.         // prevent floats from wrapping when clipped
  646.         this.headers.setWidth(totalWidth);
  647.         this.innerCt.setWidth(totalWidth);
  648.     }
  649. });
  650. Ext.debug.StoreInspector = Ext.extend(Ext.tree.TreePanel, {
  651.     enableDD:false ,
  652.     lines:false,
  653.     rootVisible:false,
  654.     animate:false,
  655.     hlColor:'ffff9c',
  656.     autoScroll: true,
  657.     region:'center',
  658.     border:false,
  659.     initComponent: function() {
  660.         this.bbar = new Ext.Toolbar([{
  661.             text: 'Refresh',
  662.             handler: this.refresh,
  663.             scope: this
  664.         }]);
  665.         Ext.debug.StoreInspector.superclass.initComponent.call(this);
  666.         this.root = this.setRootNode(new Ext.tree.TreeNode({
  667.             text: 'Data Stores',
  668.             leaf: false
  669.         }));
  670.         this.on('click', this.onClick, this);
  671.         this.parseStores();
  672.     },
  673.     parseStores: function() {
  674.         var cn = Ext.StoreMgr.items;
  675.         for (var i = 0,c;c = cn[i];i++) {
  676.             this.root.appendChild({
  677.                 text: c.storeId + ' - ' + c.totalLength + ' records',
  678.                 component: c,
  679.                 leaf: true
  680.             });
  681.         }
  682.     },
  683.     onClick: function(node, e) {
  684.         var oi = Ext.getCmp('x-debug-objinspector');
  685.         oi.refreshNodes(node.attributes.component);
  686.         oi.ownerCt.show();
  687.     },
  688.     refresh: function() {
  689.         while (this.root.firstChild) {
  690.             this.root.removeChild(this.root.firstChild);
  691.         }
  692.         this.parseStores();
  693.     }
  694. });
  695. // highly unusual class declaration
  696. Ext.debug.HtmlNode = function(){
  697.     var html = Ext.util.Format.htmlEncode;
  698.     var ellipsis = Ext.util.Format.ellipsis;
  699.     var nonSpace = /^s*$/;
  700.     var attrs = [
  701.         {n: 'id', v: 'id'},
  702.         {n: 'className', v: 'class'},
  703.         {n: 'name', v: 'name'},
  704.         {n: 'type', v: 'type'},
  705.         {n: 'src', v: 'src'},
  706.         {n: 'href', v: 'href'}
  707.     ];
  708.     function hasChild(n){
  709.         for(var i = 0, c; c = n.childNodes[i]; i++){
  710.             if(c.nodeType == 1){
  711.                 return true;
  712.             }
  713.         }
  714.         return false;
  715.     }
  716.     function renderNode(n, leaf){
  717.         var tag = n.tagName.toLowerCase();
  718.         var s = '&lt;' + tag;
  719.         for(var i = 0, len = attrs.length; i < len; i++){
  720.             var a = attrs[i];
  721.             var v = n[a.n];
  722.             if(v && !nonSpace.test(v)){
  723.                 s += ' ' + a.v + '=&quot;<i>' + html(v) +'</i>&quot;';
  724.             }
  725.         }
  726.         var style = n.style ? n.style.cssText : '';
  727.         if(style){
  728.             s += ' style=&quot;<i>' + html(style.toLowerCase()) +'</i>&quot;';
  729.         }
  730.         if(leaf && n.childNodes.length > 0){
  731.             s+='&gt;<em>' + ellipsis(html(String(n.innerHTML)), 35) + '</em>&lt;/'+tag+'&gt;';
  732.         }else if(leaf){
  733.             s += ' /&gt;';
  734.         }else{
  735.             s += '&gt;';
  736.         }
  737.         return s;
  738.     }
  739.     var HtmlNode = function(n){
  740.         var leaf = !hasChild(n);
  741.         this.htmlNode = n;
  742.         this.tagName = n.tagName.toLowerCase();
  743.         var attr = {
  744.             text : renderNode(n, leaf),
  745.             leaf : leaf,
  746.             cls: 'x-tree-noicon'
  747.         };
  748.         HtmlNode.superclass.constructor.call(this, attr);
  749.         this.attributes.htmlNode = n; // for searching
  750.         if(!leaf){
  751.             this.on('expand', this.onExpand,  this);
  752.             this.on('collapse', this.onCollapse,  this);
  753.         }
  754.     };
  755.     Ext.extend(HtmlNode, Ext.tree.AsyncTreeNode, {
  756.         cls: 'x-tree-noicon',
  757.         preventHScroll: true,
  758.         refresh : function(highlight){
  759.             var leaf = !hasChild(this.htmlNode);
  760.             this.setText(renderNode(this.htmlNode, leaf));
  761.             if(highlight){
  762.                 Ext.fly(this.ui.textNode).highlight();
  763.             }
  764.         },
  765.         onExpand : function(){
  766.             if(!this.closeNode && this.parentNode){
  767.                 this.closeNode = this.parentNode.insertBefore(new Ext.tree.TreeNode({
  768.                     text:'&lt;/' + this.tagName + '&gt;',
  769.                     cls: 'x-tree-noicon'
  770.                 }), this.nextSibling);
  771.             }else if(this.closeNode){
  772.                 this.closeNode.ui.show();
  773.             }
  774.         },
  775.         onCollapse : function(){
  776.             if(this.closeNode){
  777.                 this.closeNode.ui.hide();
  778.             }
  779.         },
  780.         render : function(bulkRender){
  781.             HtmlNode.superclass.render.call(this, bulkRender);
  782.         },
  783.         highlightNode : function(){
  784.             //Ext.fly(this.htmlNode).highlight();
  785.         },
  786.         highlight : function(){
  787.             //Ext.fly(this.ui.textNode).highlight();
  788.         },
  789.         frame : function(){
  790.             this.htmlNode.style.border = '1px solid #0000ff';
  791.             //this.highlightNode();
  792.         },
  793.         unframe : function(){
  794.             //Ext.fly(this.htmlNode).removeClass('x-debug-frame');
  795.             this.htmlNode.style.border = '';
  796.         }
  797.     });
  798.     return HtmlNode;
  799. }();