GridPanel.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:36k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.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 #colModel}: new {@link Ext.grid.ColumnModel}({
  25.         {@link Ext.grid.ColumnModel#defaults defaults}: {
  26.             width: 120,
  27.             sortable: true
  28.         },
  29.         {@link Ext.grid.ColumnModel#columns columns}: [
  30.             {id: 'company', header: 'Company', width: 200, sortable: true, dataIndex: 'company'},
  31.             {header: 'Price', renderer: Ext.util.Format.usMoney, dataIndex: 'price'},
  32.             {header: 'Change', dataIndex: 'change'},
  33.             {header: '% Change', dataIndex: 'pctChange'},
  34.             // instead of specifying renderer: Ext.util.Format.dateRenderer('m/d/Y') use xtype
  35.             {
  36.                 header: 'Last Updated', width: 135, dataIndex: 'lastChange',
  37.                 xtype: 'datecolumn', format: 'M d, Y'
  38.             }
  39.         ],
  40.     }),
  41.     {@link #viewConfig}: {
  42.         {@link Ext.grid.GridView#forceFit forceFit}: true,
  43. //      Return CSS class to apply to rows depending upon data values
  44.         {@link Ext.grid.GridView#getRowClass getRowClass}: function(record, index) {
  45.             var c = record.{@link Ext.data.Record#get get}('change');
  46.             if (c < 0) {
  47.                 return 'price-fall';
  48.             } else if (c > 0) {
  49.                 return 'price-rise';
  50.             }
  51.         }
  52.     },
  53.     {@link #sm}: new Ext.grid.RowSelectionModel({singleSelect:true}),
  54.     width: 600,
  55.     height: 300,
  56.     frame: true,
  57.     title: 'Framed with Row Selection and Horizontal Scrolling',
  58.     iconCls: 'icon-grid'
  59. });
  60.  * </code></pre>
  61.  * <p><b><u>Notes:</u></b></p>
  62.  * <div class="mdetail-params"><ul>
  63.  * <li>Although this class inherits many configuration options from base classes, some of them
  64.  * (such as autoScroll, autoWidth, layout, items, etc) are not used by this class, and will
  65.  * have no effect.</li>
  66.  * <li>A grid <b>requires</b> a width in which to scroll its columns, and a height in which to
  67.  * scroll its rows. These dimensions can either be set explicitly through the
  68.  * <tt>{@link Ext.BoxComponent#height height}</tt> and <tt>{@link Ext.BoxComponent#width width}</tt>
  69.  * configuration options or implicitly set by using the grid as a child item of a
  70.  * {@link Ext.Container Container} which will have a {@link Ext.Container#layout layout manager}
  71.  * provide the sizing of its child items (for example the Container of the Grid may specify
  72.  * <tt>{@link Ext.Container#layout layout}:'fit'</tt>).</li>
  73.  * <li>To access the data in a Grid, it is necessary to use the data model encapsulated
  74.  * by the {@link #store Store}. See the {@link #cellclick} event for more details.</li>
  75.  * </ul></div>
  76.  * @constructor
  77.  * @param {Object} config The config object
  78.  * @xtype grid
  79.  */
  80. Ext.grid.GridPanel = Ext.extend(Ext.Panel, {
  81.     /**
  82.      * @cfg {String} autoExpandColumn
  83.      * <p>The <tt>{@link Ext.grid.Column#id id}</tt> of a {@link Ext.grid.Column column} in
  84.      * this grid that should expand to fill unused space. This value specified here can not
  85.      * be <tt>0</tt>.</p>
  86.      * <br><p><b>Note</b>: If the Grid's {@link Ext.grid.GridView view} is configured with
  87.      * <tt>{@link Ext.grid.GridView#forceFit forceFit}=true</tt> the <tt>autoExpandColumn</tt>
  88.      * is ignored. See {@link Ext.grid.Column}.<tt>{@link Ext.grid.Column#width width}</tt>
  89.      * for additional details.</p>
  90.      * <p>See <tt>{@link #autoExpandMax}</tt> and <tt>{@link #autoExpandMin}</tt> also.</p>
  91.      */
  92.     autoExpandColumn : false,
  93.     /**
  94.      * @cfg {Number} autoExpandMax The maximum width the <tt>{@link #autoExpandColumn}</tt>
  95.      * can have (if enabled). Defaults to <tt>1000</tt>.
  96.      */
  97.     autoExpandMax : 1000,
  98.     /**
  99.      * @cfg {Number} autoExpandMin The minimum width the <tt>{@link #autoExpandColumn}</tt>
  100.      * can have (if enabled). Defaults to <tt>50</tt>.
  101.      */
  102.     autoExpandMin : 50,
  103.     /**
  104.      * @cfg {Boolean} columnLines <tt>true</tt> to add css for column separation lines.
  105.      * Default is <tt>false</tt>.
  106.      */
  107.     columnLines : false,
  108.     /**
  109.      * @cfg {Object} cm Shorthand for <tt>{@link #colModel}</tt>.
  110.      */
  111.     /**
  112.      * @cfg {Object} colModel The {@link Ext.grid.ColumnModel} to use when rendering the grid (required).
  113.      */
  114.     /**
  115.      * @cfg {Array} columns An array of {@link Ext.grid.Column columns} to auto create a
  116.      * {@link Ext.grid.ColumnModel}.  The ColumnModel may be explicitly created via the
  117.      * <tt>{@link #colModel}</tt> configuration property.
  118.      */
  119.     /**
  120.      * @cfg {String} ddGroup The DD group this GridPanel belongs to. Defaults to <tt>'GridDD'</tt> if not specified.
  121.      */
  122.     /**
  123.      * @cfg {String} ddText
  124.      * Configures the text in the drag proxy.  Defaults to:
  125.      * <pre><code>
  126.      * ddText : '{0} selected row{1}'
  127.      * </code></pre>
  128.      * <tt>{0}</tt> is replaced with the number of selected rows.
  129.      */
  130.     ddText : '{0} selected row{1}',
  131.     /**
  132.      * @cfg {Boolean} deferRowRender <P>Defaults to <tt>true</tt> to enable deferred row rendering.</p>
  133.      * <p>This allows the GridPanel to be initially rendered empty, with the expensive update of the row
  134.      * structure deferred so that layouts with GridPanels appear more quickly.</p>
  135.      */
  136.     deferRowRender : true,
  137.     /**
  138.      * @cfg {Boolean} disableSelection <p><tt>true</tt> to disable selections in the grid. Defaults to <tt>false</tt>.</p>
  139.      * <p>Ignored if a {@link #selModel SelectionModel} is specified.</p>
  140.      */
  141.     /**
  142.      * @cfg {Boolean} enableColumnResize <tt>false</tt> to turn off column resizing for the whole grid. Defaults to <tt>true</tt>.
  143.      */
  144.     /**
  145.      * @cfg {Boolean} enableColumnHide
  146.      * Defaults to <tt>true</tt> to enable {@link Ext.grid.Column#hidden hiding of columns}
  147.      * with the {@link #enableHdMenu header menu}.
  148.      */
  149.     enableColumnHide : true,
  150.     /**
  151.      * @cfg {Boolean} enableColumnMove Defaults to <tt>true</tt> to enable drag and drop reorder of columns. <tt>false</tt>
  152.      * to turn off column reordering via drag drop.
  153.      */
  154.     enableColumnMove : true,
  155.     /**
  156.      * @cfg {Boolean} enableDragDrop <p>Enables dragging of the selected rows of the GridPanel. Defaults to <tt>false</tt>.</p>
  157.      * <p>Setting this to <b><tt>true</tt></b> causes this GridPanel's {@link #getView GridView} to
  158.      * create an instance of {@link Ext.grid.GridDragZone}. <b>Note</b>: this is available only <b>after</b>
  159.      * the Grid has been rendered as the GridView's <tt>{@link Ext.grid.GridView#dragZone dragZone}</tt>
  160.      * property.</p>
  161.      * <p>A cooperating {@link Ext.dd.DropZone DropZone} must be created who's implementations of
  162.      * {@link Ext.dd.DropZone#onNodeEnter onNodeEnter}, {@link Ext.dd.DropZone#onNodeOver onNodeOver},
  163.      * {@link Ext.dd.DropZone#onNodeOut onNodeOut} and {@link Ext.dd.DropZone#onNodeDrop onNodeDrop} are able
  164.      * to process the {@link Ext.grid.GridDragZone#getDragData data} which is provided.</p>
  165.      */
  166.     enableDragDrop : false,
  167.     /**
  168.      * @cfg {Boolean} enableHdMenu Defaults to <tt>true</tt> to enable the drop down button for menu in the headers.
  169.      */
  170.     enableHdMenu : true,
  171.     /**
  172.      * @cfg {Boolean} hideHeaders True to hide the grid's header. Defaults to <code>false</code>.
  173.      */
  174.     /**
  175.      * @cfg {Object} loadMask An {@link Ext.LoadMask} config or true to mask the grid while
  176.      * loading. Defaults to <code>false</code>.
  177.      */
  178.     loadMask : false,
  179.     /**
  180.      * @cfg {Number} maxHeight Sets the maximum height of the grid - ignored if <tt>autoHeight</tt> is not on.
  181.      */
  182.     /**
  183.      * @cfg {Number} minColumnWidth The minimum width a column can be resized to. Defaults to <tt>25</tt>.
  184.      */
  185.     minColumnWidth : 25,
  186.     /**
  187.      * @cfg {Object} sm Shorthand for <tt>{@link #selModel}</tt>.
  188.      */
  189.     /**
  190.      * @cfg {Object} selModel Any subclass of {@link Ext.grid.AbstractSelectionModel} that will provide
  191.      * the selection model for the grid (defaults to {@link Ext.grid.RowSelectionModel} if not specified).
  192.      */
  193.     /**
  194.      * @cfg {Ext.data.Store} store The {@link Ext.data.Store} the grid should use as its data source (required).
  195.      */
  196.     /**
  197.      * @cfg {Boolean} stripeRows <tt>true</tt> to stripe the rows. Default is <tt>false</tt>.
  198.      * <p>This causes the CSS class <tt><b>x-grid3-row-alt</b></tt> to be added to alternate rows of
  199.      * the grid. A default CSS rule is provided which sets a background colour, but you can override this
  200.      * with a rule which either overrides the <b>background-color</b> style using the '!important'
  201.      * modifier, or which uses a CSS selector of higher specificity.</p>
  202.      */
  203.     stripeRows : false,
  204.     /**
  205.      * @cfg {Boolean} trackMouseOver True to highlight rows when the mouse is over. Default is <tt>true</tt>
  206.      * for GridPanel, but <tt>false</tt> for EditorGridPanel.
  207.      */
  208.     trackMouseOver : true,
  209.     /**
  210.      * @cfg {Array} stateEvents
  211.      * An array of events that, when fired, should trigger this component to save its state.
  212.      * Defaults to:<pre><code>
  213.      * stateEvents: ['columnmove', 'columnresize', 'sortchange']
  214.      * </code></pre>
  215.      * <p>These can be any types of events supported by this component, including browser or
  216.      * custom events (e.g., <tt>['click', 'customerchange']</tt>).</p>
  217.      * <p>See {@link Ext.Component#stateful} for an explanation of saving and restoring
  218.      * Component state.</p>
  219.      */
  220.     stateEvents : ['columnmove', 'columnresize', 'sortchange'],
  221.     /**
  222.      * @cfg {Object} view The {@link Ext.grid.GridView} used by the grid. This can be set
  223.      * before a call to {@link Ext.Component#render render()}.
  224.      */
  225.     view : null,
  226.     
  227.     /**
  228.      * @cfg {Array} bubbleEvents
  229.      * <p>An array of events that, when fired, should be bubbled to any parent container.
  230.      * See {@link Ext.util.Observable#enableBubble}. 
  231.      * Defaults to <tt>[]</tt>.
  232.      */
  233.     bubbleEvents: [],
  234.     
  235.     /**
  236.      * @cfg {Object} viewConfig A config object that will be applied to the grid's UI view.  Any of
  237.      * the config options available for {@link Ext.grid.GridView} can be specified here. This option
  238.      * is ignored if <tt>{@link #view}</tt> is specified.
  239.      */
  240.     // private
  241.     rendered : false,
  242.     // private
  243.     viewReady : false,
  244.     // private
  245.     initComponent : function(){
  246.         Ext.grid.GridPanel.superclass.initComponent.call(this);
  247.         if(this.columnLines){
  248.             this.cls = (this.cls || '') + ' x-grid-with-col-lines';
  249.         }
  250.         // override any provided value since it isn't valid
  251.         // and is causing too many bug reports ;)
  252.         this.autoScroll = false;
  253.         this.autoWidth = false;
  254.         if(Ext.isArray(this.columns)){
  255.             this.colModel = new Ext.grid.ColumnModel(this.columns);
  256.             delete this.columns;
  257.         }
  258.         // check and correct shorthanded configs
  259.         if(this.ds){
  260.             this.store = this.ds;
  261.             delete this.ds;
  262.         }
  263.         if(this.cm){
  264.             this.colModel = this.cm;
  265.             delete this.cm;
  266.         }
  267.         if(this.sm){
  268.             this.selModel = this.sm;
  269.             delete this.sm;
  270.         }
  271.         this.store = Ext.StoreMgr.lookup(this.store);
  272.         this.addEvents(
  273.             // raw events
  274.             /**
  275.              * @event click
  276.              * The raw click event for the entire grid.
  277.              * @param {Ext.EventObject} e
  278.              */
  279.             'click',
  280.             /**
  281.              * @event dblclick
  282.              * The raw dblclick event for the entire grid.
  283.              * @param {Ext.EventObject} e
  284.              */
  285.             'dblclick',
  286.             /**
  287.              * @event contextmenu
  288.              * The raw contextmenu event for the entire grid.
  289.              * @param {Ext.EventObject} e
  290.              */
  291.             'contextmenu',
  292.             /**
  293.              * @event mousedown
  294.              * The raw mousedown event for the entire grid.
  295.              * @param {Ext.EventObject} e
  296.              */
  297.             'mousedown',
  298.             /**
  299.              * @event mouseup
  300.              * The raw mouseup event for the entire grid.
  301.              * @param {Ext.EventObject} e
  302.              */
  303.             'mouseup',
  304.             /**
  305.              * @event mouseover
  306.              * The raw mouseover event for the entire grid.
  307.              * @param {Ext.EventObject} e
  308.              */
  309.             'mouseover',
  310.             /**
  311.              * @event mouseout
  312.              * The raw mouseout event for the entire grid.
  313.              * @param {Ext.EventObject} e
  314.              */
  315.             'mouseout',
  316.             /**
  317.              * @event keypress
  318.              * The raw keypress event for the entire grid.
  319.              * @param {Ext.EventObject} e
  320.              */
  321.             'keypress',
  322.             /**
  323.              * @event keydown
  324.              * The raw keydown event for the entire grid.
  325.              * @param {Ext.EventObject} e
  326.              */
  327.             'keydown',
  328.             // custom events
  329.             /**
  330.              * @event cellmousedown
  331.              * Fires before a cell is clicked
  332.              * @param {Grid} this
  333.              * @param {Number} rowIndex
  334.              * @param {Number} columnIndex
  335.              * @param {Ext.EventObject} e
  336.              */
  337.             'cellmousedown',
  338.             /**
  339.              * @event rowmousedown
  340.              * Fires before a row is clicked
  341.              * @param {Grid} this
  342.              * @param {Number} rowIndex
  343.              * @param {Ext.EventObject} e
  344.              */
  345.             'rowmousedown',
  346.             /**
  347.              * @event headermousedown
  348.              * Fires before a header is clicked
  349.              * @param {Grid} this
  350.              * @param {Number} columnIndex
  351.              * @param {Ext.EventObject} e
  352.              */
  353.             'headermousedown',
  354.             
  355.             /**
  356.              * @event groupmousedown
  357.              * Fires before a group header is clicked. <b>Only applies for grids with a {@link Ext.grid.GroupingView GroupingView}</b>.
  358.              * @param {Grid} this
  359.              * @param {String} groupField
  360.              * @param {String} groupValue
  361.              * @param {Ext.EventObject} e
  362.              */
  363.             'groupmousedown',
  364.             
  365.             /**
  366.              * @event rowbodymousedown
  367.              * Fires before the row body is clicked. <b>Only applies for grids with {@link Ext.grid.GridView#enableRowBody enableRowBody} configured.</b>
  368.              * @param {Grid} this
  369.              * @param {Number} rowIndex
  370.              * @param {Ext.EventObject} e
  371.              */
  372.             'rowbodymousedown',
  373.             
  374.             /**
  375.              * @event containermousedown
  376.              * Fires before the container is clicked. The container consists of any part of the grid body that is not covered by a row.
  377.              * @param {Grid} this
  378.              * @param {Ext.EventObject} e
  379.              */
  380.             'containermousedown',
  381.             /**
  382.              * @event cellclick
  383.              * Fires when a cell is clicked.
  384.              * The data for the cell is drawn from the {@link Ext.data.Record Record}
  385.              * for this row. To access the data in the listener function use the
  386.              * following technique:
  387.              * <pre><code>
  388. function(grid, rowIndex, columnIndex, e) {
  389.     var record = grid.getStore().getAt(rowIndex);  // Get the Record
  390.     var fieldName = grid.getColumnModel().getDataIndex(columnIndex); // Get field name
  391.     var data = record.get(fieldName);
  392. }
  393. </code></pre>
  394.              * @param {Grid} this
  395.              * @param {Number} rowIndex
  396.              * @param {Number} columnIndex
  397.              * @param {Ext.EventObject} e
  398.              */
  399.             'cellclick',
  400.             /**
  401.              * @event celldblclick
  402.              * Fires when a cell is double clicked
  403.              * @param {Grid} this
  404.              * @param {Number} rowIndex
  405.              * @param {Number} columnIndex
  406.              * @param {Ext.EventObject} e
  407.              */
  408.             'celldblclick',
  409.             /**
  410.              * @event rowclick
  411.              * Fires when a row is clicked
  412.              * @param {Grid} this
  413.              * @param {Number} rowIndex
  414.              * @param {Ext.EventObject} e
  415.              */
  416.             'rowclick',
  417.             /**
  418.              * @event rowdblclick
  419.              * Fires when a row is double clicked
  420.              * @param {Grid} this
  421.              * @param {Number} rowIndex
  422.              * @param {Ext.EventObject} e
  423.              */
  424.             'rowdblclick',
  425.             /**
  426.              * @event headerclick
  427.              * Fires when a header is clicked
  428.              * @param {Grid} this
  429.              * @param {Number} columnIndex
  430.              * @param {Ext.EventObject} e
  431.              */
  432.             'headerclick',
  433.             /**
  434.              * @event headerdblclick
  435.              * Fires when a header cell is double clicked
  436.              * @param {Grid} this
  437.              * @param {Number} columnIndex
  438.              * @param {Ext.EventObject} e
  439.              */
  440.             'headerdblclick',
  441.             /**
  442.              * @event groupclick
  443.              * Fires when group header is clicked. <b>Only applies for grids with a {@link Ext.grid.GroupingView GroupingView}</b>.
  444.              * @param {Grid} this
  445.              * @param {String} groupField
  446.              * @param {String} groupValue
  447.              * @param {Ext.EventObject} e
  448.              */
  449.             'groupclick',
  450.             /**
  451.              * @event groupdblclick
  452.              * Fires when group header is double clicked. <b>Only applies for grids with a {@link Ext.grid.GroupingView GroupingView}</b>.
  453.              * @param {Grid} this
  454.              * @param {String} groupField
  455.              * @param {String} groupValue
  456.              * @param {Ext.EventObject} e
  457.              */
  458.             'groupdblclick',
  459.             /**
  460.              * @event containerclick
  461.              * Fires when the container is clicked. The container consists of any part of the grid body that is not covered by a row.
  462.              * @param {Grid} this
  463.              * @param {Ext.EventObject} e
  464.              */
  465.             'containerclick',
  466.             /**
  467.              * @event containerdblclick
  468.              * Fires when the container is double clicked. The container consists of any part of the grid body that is not covered by a row.
  469.              * @param {Grid} this
  470.              * @param {Ext.EventObject} e
  471.              */
  472.             'containerdblclick',
  473.             
  474.             /**
  475.              * @event rowbodyclick
  476.              * Fires when the row body is clicked. <b>Only applies for grids with {@link Ext.grid.GridView#enableRowBody enableRowBody} configured.</b>
  477.              * @param {Grid} this
  478.              * @param {Number} rowIndex
  479.              * @param {Ext.EventObject} e
  480.              */
  481.             'rowbodyclick',
  482.             /**
  483.              * @event rowbodydblclick
  484.              * Fires when the row body is double clicked. <b>Only applies for grids with {@link Ext.grid.GridView#enableRowBody enableRowBody} configured.</b>
  485.              * @param {Grid} this
  486.              * @param {Number} rowIndex
  487.              * @param {Ext.EventObject} e
  488.              */
  489.             'rowbodydblclick',
  490.             
  491.             /**
  492.              * @event rowcontextmenu
  493.              * Fires when a row is right clicked
  494.              * @param {Grid} this
  495.              * @param {Number} rowIndex
  496.              * @param {Ext.EventObject} e
  497.              */
  498.             'rowcontextmenu',
  499.             /**
  500.              * @event cellcontextmenu
  501.              * Fires when a cell is right clicked
  502.              * @param {Grid} this
  503.              * @param {Number} rowIndex
  504.              * @param {Number} cellIndex
  505.              * @param {Ext.EventObject} e
  506.              */
  507.             'cellcontextmenu',
  508.             /**
  509.              * @event headercontextmenu
  510.              * Fires when a header is right clicked
  511.              * @param {Grid} this
  512.              * @param {Number} columnIndex
  513.              * @param {Ext.EventObject} e
  514.              */
  515.             'headercontextmenu',
  516.             /**
  517.              * @event groupcontextmenu
  518.              * Fires when group header is right clicked. <b>Only applies for grids with a {@link Ext.grid.GroupingView GroupingView}</b>.
  519.              * @param {Grid} this
  520.              * @param {String} groupField
  521.              * @param {String} groupValue
  522.              * @param {Ext.EventObject} e
  523.              */
  524.             'groupcontextmenu',
  525.             /**
  526.              * @event containercontextmenu
  527.              * Fires when the container is right clicked. The container consists of any part of the grid body that is not covered by a row.
  528.              * @param {Grid} this
  529.              * @param {Ext.EventObject} e
  530.              */
  531.             'containercontextmenu',
  532.             /**
  533.              * @event rowbodycontextmenu
  534.              * Fires when the row body is right clicked. <b>Only applies for grids with {@link Ext.grid.GridView#enableRowBody enableRowBody} configured.</b>
  535.              * @param {Grid} this
  536.              * @param {Number} rowIndex
  537.              * @param {Ext.EventObject} e
  538.              */
  539.             'rowbodycontextmenu',
  540.             /**
  541.              * @event bodyscroll
  542.              * Fires when the body element is scrolled
  543.              * @param {Number} scrollLeft
  544.              * @param {Number} scrollTop
  545.              */
  546.             'bodyscroll',
  547.             /**
  548.              * @event columnresize
  549.              * Fires when the user resizes a column
  550.              * @param {Number} columnIndex
  551.              * @param {Number} newSize
  552.              */
  553.             'columnresize',
  554.             /**
  555.              * @event columnmove
  556.              * Fires when the user moves a column
  557.              * @param {Number} oldIndex
  558.              * @param {Number} newIndex
  559.              */
  560.             'columnmove',
  561.             /**
  562.              * @event sortchange
  563.              * Fires when the grid's store sort changes
  564.              * @param {Grid} this
  565.              * @param {Object} sortInfo An object with the keys field and direction
  566.              */
  567.             'sortchange',
  568.             /**
  569.              * @event reconfigure
  570.              * Fires when the grid is reconfigured with a new store and/or column model.
  571.              * @param {Grid} this
  572.              * @param {Ext.data.Store} store The new store
  573.              * @param {Ext.grid.ColumnModel} colModel The new column model
  574.              */
  575.             'reconfigure',
  576.             /**
  577.              * @event viewready
  578.              * Fires when the grid view is available (use this for selecting a default row). 
  579.              * @param {Grid} this
  580.              */
  581.             'viewready'
  582.         );
  583.     },
  584.     // private
  585.     onRender : function(ct, position){
  586.         Ext.grid.GridPanel.superclass.onRender.apply(this, arguments);
  587.         var c = this.getGridEl();
  588.         this.el.addClass('x-grid-panel');
  589.         this.mon(c, {
  590.             scope: this,
  591.             mousedown: this.onMouseDown,
  592.             click: this.onClick,
  593.             dblclick: this.onDblClick,
  594.             contextmenu: this.onContextMenu
  595.         });
  596.         this.relayEvents(c, ['mousedown','mouseup','mouseover','mouseout','keypress', 'keydown']);
  597.         var view = this.getView();
  598.         view.init(this);
  599.         view.render();
  600.         this.getSelectionModel().init(this);
  601.     },
  602.     // private
  603.     initEvents : function(){
  604.         Ext.grid.GridPanel.superclass.initEvents.call(this);
  605.         if(this.loadMask){
  606.             this.loadMask = new Ext.LoadMask(this.bwrap,
  607.                     Ext.apply({store:this.store}, this.loadMask));
  608.         }
  609.     },
  610.     initStateEvents : function(){
  611.         Ext.grid.GridPanel.superclass.initStateEvents.call(this);
  612.         this.mon(this.colModel, 'hiddenchange', this.saveState, this, {delay: 100});
  613.     },
  614.     applyState : function(state){
  615.         var cm = this.colModel,
  616.             cs = state.columns;
  617.         if(cs){
  618.             for(var i = 0, len = cs.length; i < len; i++){
  619.                 var s = cs[i],
  620.                     c = cm.getColumnById(s.id);
  621.                 if(c){
  622.                     c.hidden = s.hidden;
  623.                     c.width = s.width;
  624.                     var oldIndex = cm.getIndexById(s.id);
  625.                     if(oldIndex != i){
  626.                         cm.moveColumn(oldIndex, i);
  627.                     }
  628.                 }
  629.             }
  630.         }
  631.         if(state.sort && this.store){
  632.             this.store[this.store.remoteSort ? 'setDefaultSort' : 'sort'](state.sort.field, state.sort.direction);
  633.         }
  634.         var o = Ext.apply({}, state);
  635.         delete o.columns;
  636.         delete o.sort;
  637.         Ext.grid.GridPanel.superclass.applyState.call(this, o);
  638.     },
  639.     getState : function(){
  640.         var o = {columns: []};
  641.         for(var i = 0, c; (c = this.colModel.config[i]); i++){
  642.             o.columns[i] = {
  643.                 id: c.id,
  644.                 width: c.width
  645.             };
  646.             if(c.hidden){
  647.                 o.columns[i].hidden = true;
  648.             }
  649.         }
  650.         if(this.store){
  651.             var ss = this.store.getSortState();
  652.             if(ss){
  653.                 o.sort = ss;
  654.             }
  655.         }
  656.         return o;
  657.     },
  658.     // private
  659.     afterRender : function(){
  660.         Ext.grid.GridPanel.superclass.afterRender.call(this);
  661.         var v = this.view;
  662.         this.on('bodyresize', v.layout, v);
  663.         v.layout();
  664.         if(this.deferRowRender){
  665.             v.afterRender.defer(10, this.view);
  666.         }else{
  667.             v.afterRender();
  668.         }
  669.         this.viewReady = true;
  670.     },
  671.     /**
  672.      * <p>Reconfigures the grid to use a different Store and Column Model
  673.      * and fires the 'reconfigure' event. The View will be bound to the new
  674.      * objects and refreshed.</p>
  675.      * <p>Be aware that upon reconfiguring a GridPanel, certain existing settings <i>may</i> become
  676.      * invalidated. For example the configured {@link #autoExpandColumn} may no longer exist in the
  677.      * new ColumnModel. Also, an existing {@link Ext.PagingToolbar PagingToolbar} will still be bound
  678.      * to the old Store, and will need rebinding. Any {@link #plugins} might also need reconfiguring
  679.      * with the new data.</p>
  680.      * @param {Ext.data.Store} store The new {@link Ext.data.Store} object
  681.      * @param {Ext.grid.ColumnModel} colModel The new {@link Ext.grid.ColumnModel} object
  682.      */
  683.     reconfigure : function(store, colModel){
  684.         var rendered = this.rendered;
  685.         if(rendered){
  686.             if(this.loadMask){
  687.                 this.loadMask.destroy();
  688.                 this.loadMask = new Ext.LoadMask(this.bwrap,
  689.                         Ext.apply({}, {store:store}, this.initialConfig.loadMask));
  690.             }
  691.         }
  692.         if(this.view){
  693.             this.view.initData(store, colModel);
  694.         }
  695.         this.store = store;
  696.         this.colModel = colModel;
  697.         if(rendered){
  698.             this.view.refresh(true);
  699.         }
  700.         this.fireEvent('reconfigure', this, store, colModel);
  701.     },
  702.     // private
  703.     onDestroy : function(){
  704.         if(this.rendered){
  705.             Ext.destroy(this.view, this.loadMask);
  706.         }else if(this.store && this.store.autoDestroy){
  707.             this.store.destroy();
  708.         }
  709.         Ext.destroy(this.colModel, this.selModel);
  710.         this.store = this.selModel = this.colModel = this.view = this.loadMask = null;
  711.         Ext.grid.GridPanel.superclass.onDestroy.call(this);
  712.     },
  713.     // private
  714.     processEvent : function(name, e){
  715.         this.fireEvent(name, e);
  716.         var t = e.getTarget(),
  717.             v = this.view,
  718.             header = v.findHeaderIndex(t);
  719.             
  720.         if(header !== false){
  721.             this.fireEvent('header' + name, this, header, e);
  722.         }else{
  723.             var row = v.findRowIndex(t),
  724.                 cell,
  725.                 body;
  726.             if(row !== false){
  727.                 this.fireEvent('row' + name, this, row, e);
  728.                 cell = v.findCellIndex(t);
  729.                 body = v.findRowBody(t);
  730.                 if(cell !== false){
  731.                     this.fireEvent('cell' + name, this, row, cell, e);
  732.                 }
  733.                 if(body){
  734.                     this.fireEvent('rowbody' + name, this, row, e);
  735.                 }
  736.             }else{
  737.                 this.fireEvent('container' + name, this, e);
  738.             }
  739.         }
  740.         this.view.processEvent(name, e);
  741.     },
  742.     // private
  743.     onClick : function(e){
  744.         this.processEvent('click', e);
  745.     },
  746.     // private
  747.     onMouseDown : function(e){
  748.         this.processEvent('mousedown', e);
  749.     },
  750.     // private
  751.     onContextMenu : function(e, t){
  752.         this.processEvent('contextmenu', e);
  753.     },
  754.     // private
  755.     onDblClick : function(e){
  756.         this.processEvent('dblclick', e);
  757.     },
  758.     // private
  759.     walkCells : function(row, col, step, fn, scope){
  760.         var cm = this.colModel, 
  761.             clen = cm.getColumnCount(),
  762.             ds = this.store, 
  763.             rlen = ds.getCount(), 
  764.             first = true;
  765.         if(step < 0){
  766.             if(col < 0){
  767.                 row--;
  768.                 first = false;
  769.             }
  770.             while(row >= 0){
  771.                 if(!first){
  772.                     col = clen-1;
  773.                 }
  774.                 first = false;
  775.                 while(col >= 0){
  776.                     if(fn.call(scope || this, row, col, cm) === true){
  777.                         return [row, col];
  778.                     }
  779.                     col--;
  780.                 }
  781.                 row--;
  782.             }
  783.         } else {
  784.             if(col >= clen){
  785.                 row++;
  786.                 first = false;
  787.             }
  788.             while(row < rlen){
  789.                 if(!first){
  790.                     col = 0;
  791.                 }
  792.                 first = false;
  793.                 while(col < clen){
  794.                     if(fn.call(scope || this, row, col, cm) === true){
  795.                         return [row, col];
  796.                     }
  797.                     col++;
  798.                 }
  799.                 row++;
  800.             }
  801.         }
  802.         return null;
  803.     },
  804.     // private
  805.     onResize : function(){
  806.         Ext.grid.GridPanel.superclass.onResize.apply(this, arguments);
  807.         if(this.viewReady){
  808.             this.view.layout();
  809.         }
  810.     },
  811.     /**
  812.      * Returns the grid's underlying element.
  813.      * @return {Element} The element
  814.      */
  815.     getGridEl : function(){
  816.         return this.body;
  817.     },
  818.     // private for compatibility, overridden by editor grid
  819.     stopEditing : Ext.emptyFn,
  820.     /**
  821.      * Returns the grid's selection model configured by the <code>{@link #selModel}</code>
  822.      * configuration option. If no selection model was configured, this will create
  823.      * and return a {@link Ext.grid.RowSelectionModel RowSelectionModel}.
  824.      * @return {SelectionModel}
  825.      */
  826.     getSelectionModel : function(){
  827.         if(!this.selModel){
  828.             this.selModel = new Ext.grid.RowSelectionModel(
  829.                     this.disableSelection ? {selectRow: Ext.emptyFn} : null);
  830.         }
  831.         return this.selModel;
  832.     },
  833.     /**
  834.      * Returns the grid's data store.
  835.      * @return {Ext.data.Store} The store
  836.      */
  837.     getStore : function(){
  838.         return this.store;
  839.     },
  840.     /**
  841.      * Returns the grid's ColumnModel.
  842.      * @return {Ext.grid.ColumnModel} The column model
  843.      */
  844.     getColumnModel : function(){
  845.         return this.colModel;
  846.     },
  847.     /**
  848.      * Returns the grid's GridView object.
  849.      * @return {Ext.grid.GridView} The grid view
  850.      */
  851.     getView : function(){
  852.         if(!this.view){
  853.             this.view = new Ext.grid.GridView(this.viewConfig);
  854.         }
  855.         return this.view;
  856.     },
  857.     /**
  858.      * Called to get grid's drag proxy text, by default returns this.ddText.
  859.      * @return {String} The text
  860.      */
  861.     getDragDropText : function(){
  862.         var count = this.selModel.getCount();
  863.         return String.format(this.ddText, count, count == 1 ? '' : 's');
  864.     }
  865.     /** 
  866.      * @cfg {String/Number} activeItem 
  867.      * @hide 
  868.      */
  869.     /** 
  870.      * @cfg {Boolean} autoDestroy 
  871.      * @hide 
  872.      */
  873.     /** 
  874.      * @cfg {Object/String/Function} autoLoad 
  875.      * @hide 
  876.      */
  877.     /** 
  878.      * @cfg {Boolean} autoWidth 
  879.      * @hide 
  880.      */
  881.     /** 
  882.      * @cfg {Boolean/Number} bufferResize 
  883.      * @hide 
  884.      */
  885.     /** 
  886.      * @cfg {String} defaultType 
  887.      * @hide 
  888.      */
  889.     /** 
  890.      * @cfg {Object} defaults 
  891.      * @hide 
  892.      */
  893.     /** 
  894.      * @cfg {Boolean} hideBorders 
  895.      * @hide 
  896.      */
  897.     /** 
  898.      * @cfg {Mixed} items 
  899.      * @hide 
  900.      */
  901.     /** 
  902.      * @cfg {String} layout 
  903.      * @hide 
  904.      */
  905.     /** 
  906.      * @cfg {Object} layoutConfig 
  907.      * @hide 
  908.      */
  909.     /** 
  910.      * @cfg {Boolean} monitorResize 
  911.      * @hide 
  912.      */
  913.     /** 
  914.      * @property items 
  915.      * @hide 
  916.      */
  917.     /** 
  918.      * @method add 
  919.      * @hide 
  920.      */
  921.     /** 
  922.      * @method cascade 
  923.      * @hide 
  924.      */
  925.     /** 
  926.      * @method doLayout 
  927.      * @hide 
  928.      */
  929.     /** 
  930.      * @method find 
  931.      * @hide 
  932.      */
  933.     /** 
  934.      * @method findBy 
  935.      * @hide 
  936.      */
  937.     /** 
  938.      * @method findById 
  939.      * @hide 
  940.      */
  941.     /** 
  942.      * @method findByType 
  943.      * @hide 
  944.      */
  945.     /** 
  946.      * @method getComponent 
  947.      * @hide 
  948.      */
  949.     /** 
  950.      * @method getLayout 
  951.      * @hide 
  952.      */
  953.     /** 
  954.      * @method getUpdater 
  955.      * @hide 
  956.      */
  957.     /** 
  958.      * @method insert 
  959.      * @hide 
  960.      */
  961.     /** 
  962.      * @method load 
  963.      * @hide 
  964.      */
  965.     /** 
  966.      * @method remove 
  967.      * @hide 
  968.      */
  969.     /** 
  970.      * @event add 
  971.      * @hide 
  972.      */
  973.     /** 
  974.      * @event afterlayout 
  975.      * @hide 
  976.      */
  977.     /** 
  978.      * @event beforeadd 
  979.      * @hide 
  980.      */
  981.     /** 
  982.      * @event beforeremove 
  983.      * @hide 
  984.      */
  985.     /** 
  986.      * @event remove 
  987.      * @hide 
  988.      */
  989.     /**
  990.      * @cfg {String} allowDomMove  @hide
  991.      */
  992.     /**
  993.      * @cfg {String} autoEl @hide
  994.      */
  995.     /**
  996.      * @cfg {String} applyTo  @hide
  997.      */
  998.     /**
  999.      * @cfg {String} autoScroll  @hide
  1000.      */
  1001.     /**
  1002.      * @cfg {String} bodyBorder  @hide
  1003.      */
  1004.     /**
  1005.      * @cfg {String} bodyStyle  @hide
  1006.      */
  1007.     /**
  1008.      * @cfg {String} contentEl  @hide
  1009.      */
  1010.     /**
  1011.      * @cfg {String} disabledClass  @hide
  1012.      */
  1013.     /**
  1014.      * @cfg {String} elements  @hide
  1015.      */
  1016.     /**
  1017.      * @cfg {String} html  @hide
  1018.      */
  1019.     /**
  1020.      * @cfg {Boolean} preventBodyReset
  1021.      * @hide
  1022.      */
  1023.     /**
  1024.      * @property disabled
  1025.      * @hide
  1026.      */
  1027.     /**
  1028.      * @method applyToMarkup
  1029.      * @hide
  1030.      */
  1031.     /**
  1032.      * @method enable
  1033.      * @hide
  1034.      */
  1035.     /**
  1036.      * @method disable
  1037.      * @hide
  1038.      */
  1039.     /**
  1040.      * @method setDisabled
  1041.      * @hide
  1042.      */
  1043. });
  1044. Ext.reg('grid', Ext.grid.GridPanel);