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

中间件编程

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.0.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.grid.GridPanel
  3.  * @extends Ext.Panel
  4.  * <p>This class represents the primary interface of a component based grid control to represent data
  5.  * in a tabular format of rows and columns. The GridPanel is composed of the following:</p>
  6.  * <div class="mdetail-params"><ul>
  7.  * <li><b>{@link Ext.data.Store Store}</b> : The Model holding the data records (rows)
  8.  * <div class="sub-desc"></div></li>
  9.  * <li><b>{@link Ext.grid.ColumnModel Column model}</b> : Column makeup
  10.  * <div class="sub-desc"></div></li>
  11.  * <li><b>{@link Ext.grid.GridView View}</b> : Encapsulates the user interface 
  12.  * <div class="sub-desc"></div></li>
  13.  * <li><b>{@link Ext.grid.AbstractSelectionModel selection model}</b> : Selection behavior 
  14.  * <div class="sub-desc"></div></li>
  15.  * </ul></div>
  16.  * <p>Example usage:</p>
  17.  * <pre><code>
  18. var grid = new Ext.grid.GridPanel({
  19.     {@link #store}: new (@link Ext.data.Store}({
  20.         {@link Ext.data.Store#autoDestroy autoDestroy}: true,
  21.         {@link Ext.data.Store#reader reader}: reader,
  22.         {@link Ext.data.Store#data data}: xg.dummyData
  23.     }),
  24.     {@link #columns}: [
  25.         {id: 'company', header: 'Company', width: 200, sortable: true, dataIndex: 'company'},
  26.         {header: 'Price', width: 120, sortable: true, renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
  27.         {header: 'Change', width: 120, sortable: true, dataIndex: 'change'},
  28.         {header: '% Change', width: 120, sortable: true, dataIndex: 'pctChange'},
  29.         // instead of specifying renderer: Ext.util.Format.dateRenderer('m/d/Y') use xtype
  30.         {header: 'Last Updated', width: 135, sortable: true, dataIndex: 'lastChange', xtype: 'datecolumn', format: 'M d, Y'}
  31.     ],
  32.     {@link #viewConfig}: {
  33.         {@link Ext.grid.GridView#forceFit forceFit}: true,
  34. //      Return CSS class to apply to rows depending upon data values
  35.         {@link Ext.grid.GridView#getRowClass getRowClass}: function(record, index) {
  36.             var c = record.{@link Ext.data.Record#get get}('change');
  37.             if (c < 0) {
  38.                 return 'price-fall';
  39.             } else if (c > 0) {
  40.                 return 'price-rise';
  41.             }
  42.         }
  43.     },
  44.     {@link #sm}: new Ext.grid.RowSelectionModel({singleSelect:true}),
  45.     width: 600,
  46.     height: 300,
  47.     frame: true,
  48.     title: 'Framed with Row Selection and Horizontal Scrolling',
  49.     iconCls: 'icon-grid'
  50. });
  51.  * </code></pre>
  52.  * <p><b><u>Notes:</u></b></p>
  53.  * <div class="mdetail-params"><ul>
  54.  * <li>Although this class inherits many configuration options from base classes, some of them
  55.  * (such as autoScroll, autoWidth, layout, items, etc) are not used by this class, and will
  56.  * have no effect.</li>
  57.  * <li>A grid <b>requires</b> a width in which to scroll its columns, and a height in which to
  58.  * scroll its rows. These dimensions can either be set explicitly through the
  59.  * <tt>{@link Ext.BoxComponent#height height}</tt> and <tt>{@link Ext.BoxComponent#width width}</tt>
  60.  * configuration options or implicitly set by using the grid as a child item of a
  61.  * {@link Ext.Container Container} which will have a {@link Ext.Container#layout layout manager}
  62.  * provide the sizing of its child items (for example the Container of the Grid may specify
  63.  * <tt>{@link Ext.Container#layout layout}:'fit'</tt>).</li>
  64.  * <li>To access the data in a Grid, it is necessary to use the data model encapsulated
  65.  * by the {@link #store Store}. See the {@link #cellclick} event for more details.</li>
  66.  * </ul></div>
  67.  * @constructor
  68.  * @param {Object} config The config object
  69.  * @xtype grid
  70.  */
  71. Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
  72.     /**
  73.      * @cfg {String} autoExpandColumn
  74.      * <p>The <tt>{@link Ext.grid.Column#id id}</tt> of a {@link Ext.grid.Column column} in
  75.      * this grid that should expand to fill unused space. This value specified here can not
  76.      * be <tt>0</tt>.</p>
  77.      * <br><p><b>Note</b>: If the Grid's {@link Ext.grid.GridView view} is configured with
  78.      * <tt>{@link Ext.grid.GridView#forceFit forceFit}=true</tt> the <tt>autoExpandColumn</tt>
  79.      * is ignored. See {@link Ext.grid.Column}.<tt>{@link Ext.grid.Column#width width}</tt>
  80.      * for additional details.</p>
  81.      * <p>See <tt>{@link #autoExpandMax}</tt> and <tt>{@link #autoExpandMin}</tt> also.</p>
  82.      */
  83.     autoExpandColumn : false,
  84.     /**
  85.      * @cfg {Number} autoExpandMax The maximum width the <tt>{@link #autoExpandColumn}</tt>
  86.      * can have (if enabled). Defaults to <tt>1000</tt>.
  87.      */
  88.     autoExpandMax : 1000,
  89.     /**
  90.      * @cfg {Number} autoExpandMin The minimum width the <tt>{@link #autoExpandColumn}</tt>
  91.      * can have (if enabled). Defaults to <tt>50</tt>.
  92.      */
  93.     autoExpandMin : 50,
  94.     /**
  95.      * @cfg {Boolean} columnLines <tt>true</tt> to add css for column separation lines.
  96.      * Default is <tt>false</tt>.
  97.      */
  98.     columnLines : false,
  99.     /**
  100.      * @cfg {Object} cm Shorthand for <tt>{@link #colModel}</tt>.
  101.      */
  102.     /**
  103.      * @cfg {Object} colModel The {@link Ext.grid.ColumnModel} to use when rendering the grid (required).
  104.      */
  105.     /**
  106.      * @cfg {Array} columns An array of {@link Ext.grid.Column columns} to auto create a
  107.      * {@link Ext.grid.ColumnModel}.  The ColumnModel may be explicitly created via the
  108.      * <tt>{@link #colModel}</tt> configuration property.
  109.      */
  110.     /**
  111.      * @cfg {String} ddGroup The DD group this GridPanel belongs to. Defaults to <tt>'GridDD'</tt> if not specified.
  112.      */
  113.     /**
  114.      * @cfg {String} ddText
  115.      * Configures the text in the drag proxy.  Defaults to:
  116.      * <pre><code>
  117.      * ddText : '{0} selected row{1}'
  118.      * </code></pre>
  119.      * <tt>{0}</tt> is replaced with the number of selected rows.
  120.      */
  121.     ddText : '{0} selected row{1}',
  122.     /**
  123.      * @cfg {Boolean} deferRowRender <P>Defaults to <tt>true</tt> to enable deferred row rendering.</p>
  124.      * <p>This allows the GridPanel to be initially rendered empty, with the expensive update of the row
  125.      * structure deferred so that layouts with GridPanels appear more quickly.</p>
  126.      */
  127.     deferRowRender : true,
  128.     /**
  129.      * @cfg {Boolean} disableSelection <p><tt>true</tt> to disable selections in the grid. Defaults to <tt>false</tt>.</p>
  130.      * <p>Ignored if a {@link #selModel SelectionModel} is specified.</p>
  131.      */
  132.     /**
  133.      * @cfg {Boolean} enableColumnResize <tt>false</tt> to turn off column resizing for the whole grid. Defaults to <tt>true</tt>.
  134.      */
  135.     /**
  136.      * @cfg {Boolean} enableColumnHide Defaults to <tt>true</tt> to enable hiding of columns with the header context menu.
  137.      */
  138.     enableColumnHide : true,
  139.     /**
  140.      * @cfg {Boolean} enableColumnMove Defaults to <tt>true</tt> to enable drag and drop reorder of columns. <tt>false</tt>
  141.      * to turn off column reordering via drag drop.
  142.      */
  143.     enableColumnMove : true,
  144.     /**
  145.      * @cfg {Boolean} enableDragDrop <p>Enables dragging of the selected rows of the GridPanel. Defaults to <tt>false</tt>.</p>
  146.      * <p>Setting this to <b><tt>true</tt></b> causes this GridPanel's {@link #getView GridView} to
  147.      * create an instance of {@link Ext.grid.GridDragZone}. <b>Note</b>: this is available only <b>after</b>
  148.      * the Grid has been rendered as the GridView's <tt>{@link Ext.grid.GridView#dragZone dragZone}</tt>
  149.      * property.</p>
  150.      * <p>A cooperating {@link Ext.dd.DropZone DropZone} must be created who's implementations of
  151.      * {@link Ext.dd.DropZone#onNodeEnter onNodeEnter}, {@link Ext.dd.DropZone#onNodeOver onNodeOver},
  152.      * {@link Ext.dd.DropZone#onNodeOut onNodeOut} and {@link Ext.dd.DropZone#onNodeDrop onNodeDrop} are able
  153.      * to process the {@link Ext.grid.GridDragZone#getDragData data} which is provided.</p>
  154.      */
  155.     enableDragDrop : false,
  156.     /**
  157.      * @cfg {Boolean} enableHdMenu Defaults to <tt>true</tt> to enable the drop down button for menu in the headers.
  158.      */
  159.     enableHdMenu : true,
  160.     /**
  161.      * @cfg {Boolean} hideHeaders True to hide the grid's header. Defaults to <code>false</code>.
  162.      */
  163.     /**
  164.      * @cfg {Object} loadMask An {@link Ext.LoadMask} config or true to mask the grid while
  165.      * loading. Defaults to <code>false</code>.
  166.      */
  167.     loadMask : false,
  168.     /**
  169.      * @cfg {Number} maxHeight Sets the maximum height of the grid - ignored if <tt>autoHeight</tt> is not on.
  170.      */
  171.     /**
  172.      * @cfg {Number} minColumnWidth The minimum width a column can be resized to. Defaults to <tt>25</tt>.
  173.      */
  174.     minColumnWidth : 25,
  175.     /**
  176.      * @cfg {Object} sm Shorthand for <tt>{@link #selModel}</tt>.
  177.      */
  178.     /**
  179.      * @cfg {Object} selModel Any subclass of {@link Ext.grid.AbstractSelectionModel} that will provide
  180.      * the selection model for the grid (defaults to {@link Ext.grid.RowSelectionModel} if not specified).
  181.      */
  182.     /**
  183.      * @cfg {Ext.data.Store} store The {@link Ext.data.Store} the grid should use as its data source (required).
  184.      */
  185.     /**
  186.      * @cfg {Boolean} stripeRows <tt>true</tt> to stripe the rows. Default is <tt>false</tt>.
  187.      * <p>This causes the CSS class <tt><b>x-grid3-row-alt</b></tt> to be added to alternate rows of
  188.      * the grid. A default CSS rule is provided which sets a background colour, but you can override this
  189.      * with a rule which either overrides the <b>background-color</b> style using the '!important'
  190.      * modifier, or which uses a CSS selector of higher specificity.</p>
  191.      */
  192.     stripeRows : false,
  193.     /**
  194.      * @cfg {Boolean} trackMouseOver True to highlight rows when the mouse is over. Default is <tt>true</tt>
  195.      * for GridPanel, but <tt>false</tt> for EditorGridPanel.
  196.      */
  197.     trackMouseOver : true,
  198.     /**
  199.      * @cfg {Array} stateEvents
  200.      * An array of events that, when fired, should trigger this component to save its state.
  201.      * Defaults to:<pre><code>
  202.      * stateEvents: ['columnmove', 'columnresize', 'sortchange']
  203.      * </code></pre>
  204.      * <p>These can be any types of events supported by this component, including browser or
  205.      * custom events (e.g., <tt>['click', 'customerchange']</tt>).</p>
  206.      * <p>See {@link Ext.Component#stateful} for an explanation of saving and restoring
  207.      * Component state.</p>
  208.      */
  209.     stateEvents : ['columnmove', 'columnresize', 'sortchange'],
  210.     /**
  211.      * @cfg {Object} view The {@link Ext.grid.GridView} used by the grid. This can be set
  212.      * before a call to {@link Ext.Component#render render()}.
  213.      */
  214.     view : null,
  215.     /**
  216.      * @cfg {Object} viewConfig A config object that will be applied to the grid's UI view.  Any of
  217.      * the config options available for {@link Ext.grid.GridView} can be specified here. This option
  218.      * is ignored if <tt>{@link #view}</tt> is specified.
  219.      */
  220.     // private
  221.     rendered : false,
  222.     // private
  223.     viewReady : false,
  224.     // private
  225.     initComponent : function(){
  226.         Ext.grid.GridPanel.superclass.initComponent.call(this);
  227.         if(this.columnLines){
  228.             this.cls = (this.cls || '') + ' x-grid-with-col-lines';
  229.         }
  230.         // override any provided value since it isn't valid
  231.         // and is causing too many bug reports ;)
  232.         this.autoScroll = false;
  233.         this.autoWidth = false;
  234.         if(Ext.isArray(this.columns)){
  235.             this.colModel = new Ext.grid.ColumnModel(this.columns);
  236.             delete this.columns;
  237.         }
  238.         // check and correct shorthanded configs
  239.         if(this.ds){
  240.             this.store = this.ds;
  241.             delete this.ds;
  242.         }
  243.         if(this.cm){
  244.             this.colModel = this.cm;
  245.             delete this.cm;
  246.         }
  247.         if(this.sm){
  248.             this.selModel = this.sm;
  249.             delete this.sm;
  250.         }
  251.         this.store = Ext.StoreMgr.lookup(this.store);
  252.         this.addEvents(
  253.             // raw events
  254.             /**
  255.              * @event click
  256.              * The raw click event for the entire grid.
  257.              * @param {Ext.EventObject} e
  258.              */
  259.             'click',
  260.             /**
  261.              * @event dblclick
  262.              * The raw dblclick event for the entire grid.
  263.              * @param {Ext.EventObject} e
  264.              */
  265.             'dblclick',
  266.             /**
  267.              * @event contextmenu
  268.              * The raw contextmenu event for the entire grid.
  269.              * @param {Ext.EventObject} e
  270.              */
  271.             'contextmenu',
  272.             /**
  273.              * @event mousedown
  274.              * The raw mousedown event for the entire grid.
  275.              * @param {Ext.EventObject} e
  276.              */
  277.             'mousedown',
  278.             /**
  279.              * @event mouseup
  280.              * The raw mouseup event for the entire grid.
  281.              * @param {Ext.EventObject} e
  282.              */
  283.             'mouseup',
  284.             /**
  285.              * @event mouseover
  286.              * The raw mouseover event for the entire grid.
  287.              * @param {Ext.EventObject} e
  288.              */
  289.             'mouseover',
  290.             /**
  291.              * @event mouseout
  292.              * The raw mouseout event for the entire grid.
  293.              * @param {Ext.EventObject} e
  294.              */
  295.             'mouseout',
  296.             /**
  297.              * @event keypress
  298.              * The raw keypress event for the entire grid.
  299.              * @param {Ext.EventObject} e
  300.              */
  301.             'keypress',
  302.             /**
  303.              * @event keydown
  304.              * The raw keydown event for the entire grid.
  305.              * @param {Ext.EventObject} e
  306.              */
  307.             'keydown',
  308.             // custom events
  309.             /**
  310.              * @event cellmousedown
  311.              * Fires before a cell is clicked
  312.              * @param {Grid} this
  313.              * @param {Number} rowIndex
  314.              * @param {Number} columnIndex
  315.              * @param {Ext.EventObject} e
  316.              */
  317.             'cellmousedown',
  318.             /**
  319.              * @event rowmousedown
  320.              * Fires before a row is clicked
  321.              * @param {Grid} this
  322.              * @param {Number} rowIndex
  323.              * @param {Ext.EventObject} e
  324.              */
  325.             'rowmousedown',
  326.             /**
  327.              * @event headermousedown
  328.              * Fires before a header is clicked
  329.              * @param {Grid} this
  330.              * @param {Number} columnIndex
  331.              * @param {Ext.EventObject} e
  332.              */
  333.             'headermousedown',
  334.             /**
  335.              * @event cellclick
  336.              * Fires when a cell is clicked.
  337.              * The data for the cell is drawn from the {@link Ext.data.Record Record}
  338.              * for this row. To access the data in the listener function use the
  339.              * following technique:
  340.              * <pre><code>
  341. function(grid, rowIndex, columnIndex, e) {
  342.     var record = grid.getStore().getAt(rowIndex);  // Get the Record
  343.     var fieldName = grid.getColumnModel().getDataIndex(columnIndex); // Get field name
  344.     var data = record.get(fieldName);
  345. }
  346. </code></pre>
  347.              * @param {Grid} this
  348.              * @param {Number} rowIndex
  349.              * @param {Number} columnIndex
  350.              * @param {Ext.EventObject} e
  351.              */
  352.             'cellclick',
  353.             /**
  354.              * @event celldblclick
  355.              * Fires when a cell is double clicked
  356.              * @param {Grid} this
  357.              * @param {Number} rowIndex
  358.              * @param {Number} columnIndex
  359.              * @param {Ext.EventObject} e
  360.              */
  361.             'celldblclick',
  362.             /**
  363.              * @event rowclick
  364.              * Fires when a row is clicked
  365.              * @param {Grid} this
  366.              * @param {Number} rowIndex
  367.              * @param {Ext.EventObject} e
  368.              */
  369.             'rowclick',
  370.             /**
  371.              * @event rowdblclick
  372.              * Fires when a row is double clicked
  373.              * @param {Grid} this
  374.              * @param {Number} rowIndex
  375.              * @param {Ext.EventObject} e
  376.              */
  377.             'rowdblclick',
  378.             /**
  379.              * @event headerclick
  380.              * Fires when a header is clicked
  381.              * @param {Grid} this
  382.              * @param {Number} columnIndex
  383.              * @param {Ext.EventObject} e
  384.              */
  385.             'headerclick',
  386.             /**
  387.              * @event headerdblclick
  388.              * Fires when a header cell is double clicked
  389.              * @param {Grid} this
  390.              * @param {Number} columnIndex
  391.              * @param {Ext.EventObject} e
  392.              */
  393.             'headerdblclick',
  394.             /**
  395.              * @event rowcontextmenu
  396.              * Fires when a row is right clicked
  397.              * @param {Grid} this
  398.              * @param {Number} rowIndex
  399.              * @param {Ext.EventObject} e
  400.              */
  401.             'rowcontextmenu',
  402.             /**
  403.              * @event cellcontextmenu
  404.              * Fires when a cell is right clicked
  405.              * @param {Grid} this
  406.              * @param {Number} rowIndex
  407.              * @param {Number} cellIndex
  408.              * @param {Ext.EventObject} e
  409.              */
  410.             'cellcontextmenu',
  411.             /**
  412.              * @event headercontextmenu
  413.              * Fires when a header is right clicked
  414.              * @param {Grid} this
  415.              * @param {Number} columnIndex
  416.              * @param {Ext.EventObject} e
  417.              */
  418.             'headercontextmenu',
  419.             /**
  420.              * @event bodyscroll
  421.              * Fires when the body element is scrolled
  422.              * @param {Number} scrollLeft
  423.              * @param {Number} scrollTop
  424.              */
  425.             'bodyscroll',
  426.             /**
  427.              * @event columnresize
  428.              * Fires when the user resizes a column
  429.              * @param {Number} columnIndex
  430.              * @param {Number} newSize
  431.              */
  432.             'columnresize',
  433.             /**
  434.              * @event columnmove
  435.              * Fires when the user moves a column
  436.              * @param {Number} oldIndex
  437.              * @param {Number} newIndex
  438.              */
  439.             'columnmove',
  440.             /**
  441.              * @event sortchange
  442.              * Fires when the grid's store sort changes
  443.              * @param {Grid} this
  444.              * @param {Object} sortInfo An object with the keys field and direction
  445.              */
  446.             'sortchange',
  447.             /**
  448.              * @event reconfigure
  449.              * Fires when the grid is reconfigured with a new store and/or column model.
  450.              * @param {Grid} this
  451.              * @param {Ext.data.Store} store The new store
  452.              * @param {Ext.grid.ColumnModel} colModel The new column model
  453.              */
  454.             'reconfigure'
  455.         );
  456.     },
  457.     // private
  458.     onRender : function(ct, position){
  459.         Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
  460.         var c = this.body;
  461.         this.el.addClass('x-grid-panel');
  462.         var view = this.getView();
  463.         view.init(this);
  464.         this.mon(c, {
  465.             mousedown: this.onMouseDown,
  466.             click: this.onClick,
  467.             dblclick: this.onDblClick,
  468.             contextmenu: this.onContextMenu,
  469.             keydown: this.onKeyDown,
  470.             scope: this
  471.         });
  472.         this.relayEvents(c, ['mousedown','mouseup','mouseover','mouseout','keypress']);
  473.         this.getSelectionModel().init(this);
  474.         this.view.render();
  475.     },
  476.     // private
  477.     initEvents : function(){
  478.         Ext.grid.GridPanel.superclass.initEvents.call(this);
  479.         if(this.loadMask){
  480.             this.loadMask = new Ext.LoadMask(this.bwrap,
  481.                     Ext.apply({store:this.store}, this.loadMask));
  482.         }
  483.     },
  484.     initStateEvents : function(){
  485.         Ext.grid.GridPanel.superclass.initStateEvents.call(this);
  486.         this.mon(this.colModel, 'hiddenchange', this.saveState, this, {delay: 100});
  487.     },
  488.     applyState : function(state){
  489.         var cm = this.colModel;
  490.         var cs = state.columns;
  491.         if(cs){
  492.             for(var i = 0, len = cs.length; i < len; i++){
  493.                 var s = cs[i];
  494.                 var c = cm.getColumnById(s.id);
  495.                 if(c){
  496.                     c.hidden = s.hidden;
  497.                     c.width = s.width;
  498.                     var oldIndex = cm.getIndexById(s.id);
  499.                     if(oldIndex != i){
  500.                         cm.moveColumn(oldIndex, i);
  501.                     }
  502.                 }
  503.             }
  504.         }
  505.         if(state.sort && this.store){
  506.             this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);
  507.         }
  508.         delete state.columns;
  509.         delete state.sort;
  510.         Ext.grid.GridPanel.superclass.applyState.call(this, state);
  511.     },
  512.     getState : function(){
  513.         var o = {columns: []};
  514.         for(var i = 0, c; (c = this.colModel.config[i]); i++){
  515.             o.columns[i] = {
  516.                 id: c.id,
  517.                 width: c.width
  518.             };
  519.             if(c.hidden){
  520.                 o.columns[i].hidden = true;
  521.             }
  522.         }
  523.         if(this.store){
  524.             var ss = this.store.getSortState();
  525.             if(ss){
  526.                 o.sort = ss;
  527.             }
  528.         }
  529.         return o;
  530.     },
  531.     // private
  532.     afterRender : function(){
  533.         Ext.grid.GridPanel.superclass.afterRender.call(this);
  534.         this.view.layout();
  535.         if(this.deferRowRender){
  536.             this.view.afterRender.defer(10, this.view);
  537.         }else{
  538.             this.view.afterRender();
  539.         }
  540.         this.viewReady = true;
  541.     },
  542.     /**
  543.      * <p>Reconfigures the grid to use a different Store and Column Model
  544.      * and fires the 'reconfigure' event. The View will be bound to the new
  545.      * objects and refreshed.</p>
  546.      * <p>Be aware that upon reconfiguring a GridPanel, certain existing settings <i>may</i> become
  547.      * invalidated. For example the configured {@link #autoExpandColumn} may no longer exist in the
  548.      * new ColumnModel. Also, an existing {@link Ext.PagingToolbar PagingToolbar} will still be bound
  549.      * to the old Store, and will need rebinding. Any {@link #plugins} might also need reconfiguring
  550.      * with the new data.</p>
  551.      * @param {Ext.data.Store} store The new {@link Ext.data.Store} object
  552.      * @param {Ext.grid.ColumnModel} colModel The new {@link Ext.grid.ColumnModel} object
  553.      */
  554.     reconfigure : function(store, colModel){
  555.         if(this.loadMask){
  556.             this.loadMask.destroy();
  557.             this.loadMask = new Ext.LoadMask(this.bwrap,
  558.                     Ext.apply({}, {store:store}, this.initialConfig.loadMask));
  559.         }
  560.         this.view.initData(store, colModel);
  561.         this.store = store;
  562.         this.colModel = colModel;
  563.         if(this.rendered){
  564.             this.view.refresh(true);
  565.         }
  566.         this.fireEvent('reconfigure', this, store, colModel);
  567.     },
  568.     // private
  569.     onKeyDown : function(e){
  570.         this.fireEvent('keydown', e);
  571.     },
  572.     // private
  573.     onDestroy : function(){
  574.         if(this.rendered){
  575.             var c = this.body;
  576.             c.removeAllListeners();
  577.             c.update('');
  578.             Ext.destroy(this.view, this.loadMask);
  579.         }else if(this.store && this.store.autoDestroy){
  580.             this.store.destroy();
  581.         }
  582.         Ext.destroy(this.colModel, this.selModel);
  583.         this.store = this.selModel = this.colModel = this.view = this.loadMask = null;
  584.         Ext.grid.GridPanel.superclass.onDestroy.call(this);
  585.     },
  586.     // private
  587.     processEvent : function(name, e){
  588.         this.fireEvent(name, e);
  589.         var t = e.getTarget();
  590.         var v = this.view;
  591.         var header = v.findHeaderIndex(t);
  592.         if(header !== false){
  593.             this.fireEvent('header' + name, this, header, e);
  594.         }else{
  595.             var row = v.findRowIndex(t);
  596.             var cell = v.findCellIndex(t);
  597.             if(row !== false){
  598.                 this.fireEvent('row' + name, this, row, e);
  599.                 if(cell !== false){
  600.                     this.fireEvent('cell' + name, this, row, cell, e);
  601.                 }
  602.             }
  603.         }
  604.     },
  605.     // private
  606.     onClick : function(e){
  607.         this.processEvent('click', e);
  608.     },
  609.     // private
  610.     onMouseDown : function(e){
  611.         this.processEvent('mousedown', e);
  612.     },
  613.     // private
  614.     onContextMenu : function(e, t){
  615.         this.processEvent('contextmenu', e);
  616.     },
  617.     // private
  618.     onDblClick : function(e){
  619.         this.processEvent('dblclick', e);
  620.     },
  621.     // private
  622.     walkCells : function(row, col, step, fn, scope){
  623.         var cm = this.colModel, clen = cm.getColumnCount();
  624.         var ds = this.store, rlen = ds.getCount(), first = true;
  625.         if(step < 0){
  626.             if(col < 0){
  627.                 row--;
  628.                 first = false;
  629.             }
  630.             while(row >= 0){
  631.                 if(!first){
  632.                     col = clen-1;
  633.                 }
  634.                 first = false;
  635.                 while(col >= 0){
  636.                     if(fn.call(scope || this, row, col, cm) === true){
  637.                         return [row, col];
  638.                     }
  639.                     col--;
  640.                 }
  641.                 row--;
  642.             }
  643.         } else {
  644.             if(col >= clen){
  645.                 row++;
  646.                 first = false;
  647.             }
  648.             while(row < rlen){
  649.                 if(!first){
  650.                     col = 0;
  651.                 }
  652.                 first = false;
  653.                 while(col < clen){
  654.                     if(fn.call(scope || this, row, col, cm) === true){
  655.                         return [row, col];
  656.                     }
  657.                     col++;
  658.                 }
  659.                 row++;
  660.             }
  661.         }
  662.         return null;
  663.     },
  664.     // private
  665.     onResize : function(){
  666.         Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
  667.         if(this.viewReady){
  668.             this.view.layout();
  669.         }
  670.     },
  671.     /**
  672.      * Returns the grid's underlying element.
  673.      * @return {Element} The element
  674.      */
  675.     getGridEl : function(){
  676.         return this.body;
  677.     },
  678.     // private for compatibility, overridden by editor grid
  679.     stopEditing : Ext.emptyFn,
  680.     /**
  681.      * Returns the grid's selection model configured by the <code>{@link #selModel}</code>
  682.      * configuration option. If no selection model was configured, this will create
  683.      * and return a {@link Ext.grid.RowSelectionModel RowSelectionModel}.
  684.      * @return {SelectionModel}
  685.      */
  686.     getSelectionModel : function(){
  687.         if(!this.selModel){
  688.             this.selModel = new Ext.grid.RowSelectionModel(
  689.                     this.disableSelection ? {selectRow: Ext.emptyFn} : null);
  690.         }
  691.         return this.selModel;
  692.     },
  693.     /**
  694.      * Returns the grid's data store.
  695.      * @return {Ext.data.Store} The store
  696.      */
  697.     getStore : function(){
  698.         return this.store;
  699.     },
  700.     /**
  701.      * Returns the grid's ColumnModel.
  702.      * @return {Ext.grid.ColumnModel} The column model
  703.      */
  704.     getColumnModel : function(){
  705.         return this.colModel;
  706.     },
  707.     /**
  708.      * Returns the grid's GridView object.
  709.      * @return {Ext.grid.GridView} The grid view
  710.      */
  711.     getView : function(){
  712.         if(!this.view){
  713.             this.view = new Ext.grid.GridView(this.viewConfig);
  714.         }
  715.         return this.view;
  716.     },
  717.     /**
  718.      * Called to get grid's drag proxy text, by default returns this.ddText.
  719.      * @return {String} The text
  720.      */
  721.     getDragDropText : function(){
  722.         var count = this.selModel.getCount();
  723.         return String.format(this.ddText, count, count == 1 ? '' : 's');
  724.     }
  725.     /** 
  726.      * @cfg {String/Number} activeItem 
  727.      * @hide 
  728.      */
  729.     /** 
  730.      * @cfg {Boolean} autoDestroy 
  731.      * @hide 
  732.      */
  733.     /** 
  734.      * @cfg {Object/String/Function} autoLoad 
  735.      * @hide 
  736.      */
  737.     /** 
  738.      * @cfg {Boolean} autoWidth 
  739.      * @hide 
  740.      */
  741.     /** 
  742.      * @cfg {Boolean/Number} bufferResize 
  743.      * @hide 
  744.      */
  745.     /** 
  746.      * @cfg {String} defaultType 
  747.      * @hide 
  748.      */
  749.     /** 
  750.      * @cfg {Object} defaults 
  751.      * @hide 
  752.      */
  753.     /** 
  754.      * @cfg {Boolean} hideBorders 
  755.      * @hide 
  756.      */
  757.     /** 
  758.      * @cfg {Mixed} items 
  759.      * @hide 
  760.      */
  761.     /** 
  762.      * @cfg {String} layout 
  763.      * @hide 
  764.      */
  765.     /** 
  766.      * @cfg {Object} layoutConfig 
  767.      * @hide 
  768.      */
  769.     /** 
  770.      * @cfg {Boolean} monitorResize 
  771.      * @hide 
  772.      */
  773.     /** 
  774.      * @property items 
  775.      * @hide 
  776.      */
  777.     /** 
  778.      * @method add 
  779.      * @hide 
  780.      */
  781.     /** 
  782.      * @method cascade 
  783.      * @hide 
  784.      */
  785.     /** 
  786.      * @method doLayout 
  787.      * @hide 
  788.      */
  789.     /** 
  790.      * @method find 
  791.      * @hide 
  792.      */
  793.     /** 
  794.      * @method findBy 
  795.      * @hide 
  796.      */
  797.     /** 
  798.      * @method findById 
  799.      * @hide 
  800.      */
  801.     /** 
  802.      * @method findByType 
  803.      * @hide