| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999 | 
							- <!DOCTYPE html>
 
- <html>
 
- <head>
 
-   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
-   <title>The source code</title>
 
-   <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
 
-   <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
 
-   <style type="text/css">
 
-     .highlight { display: block; background-color: #ddd; }
 
-   </style>
 
-   <script type="text/javascript">
 
-     function highlight() {
 
-       document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
 
-     }
 
-   </script>
 
- </head>
 
- <body onload="prettyPrint(); highlight();">
 
-   <pre class="prettyprint lang-js"><span id='Ext-grid-header-Container'>/**
 
- </span> * Container which holds headers and is docked at the top or bottom of a TablePanel.
 
-  * The HeaderContainer drives resizing/moving/hiding of columns within the TableView.
 
-  * As headers are hidden, moved or resized the headercontainer is responsible for
 
-  * triggering changes within the view.
 
-  */
 
- Ext.define('Ext.grid.header.Container', {
 
-     extend: 'Ext.container.Container',
 
-     requires: [
 
-         'Ext.grid.ColumnLayout',
 
-         'Ext.grid.plugin.HeaderResizer',
 
-         'Ext.grid.plugin.HeaderReorderer'
 
-     ],
 
-     uses: [
 
-         'Ext.grid.column.Column',
 
-         'Ext.menu.Menu',
 
-         'Ext.menu.CheckItem',
 
-         'Ext.menu.Separator'
 
-     ],
 
-     border: true,
 
-     alias: 'widget.headercontainer',
 
-     baseCls: Ext.baseCSSPrefix + 'grid-header-ct',
 
-     dock: 'top',
 
- <span id='Ext-grid-header-Container-cfg-weight'>    /**
 
- </span>     * @cfg {Number} weight
 
-      * HeaderContainer overrides the default weight of 0 for all docked items to 100.
 
-      * This is so that it has more priority over things like toolbars.
 
-      */
 
-     weight: 100,
 
-     defaultType: 'gridcolumn',
 
-     
 
-     detachOnRemove: false,
 
- <span id='Ext-grid-header-Container-cfg-defaultWidth'>    /**
 
- </span>     * @cfg {Number} defaultWidth
 
-      * Width of the header if no width or flex is specified.
 
-      */
 
-     defaultWidth: 100,
 
-     
 
- <span id='Ext-grid-header-Container-cfg-sealed'>    /**
 
- </span>     * @cfg {Boolean} [sealed=false]
 
-      * Specify as `true` to constrain column dragging so that a column cannot be dragged into or out of this column.
 
-      *
 
-      * **Note that this config is only valid for column headers which contain child column headers, eg:**
 
-      *     {
 
-      *         sealed: true
 
-      *         text: 'ExtJS',
 
-      *         columns: [{
 
-      *             text: '3.0.4',
 
-      *             dataIndex: 'ext304'
 
-      *         }, {
 
-      *             text: '4.1.0',
 
-      *             dataIndex: 'ext410'
 
-      *         }
 
-      *     }
 
-      *
 
-      */
 
-     //<locale>
 
-     sortAscText: 'Sort Ascending',
 
-     //</locale>
 
-     //<locale>
 
-     sortDescText: 'Sort Descending',
 
-     //</locale>
 
-     //<locale>
 
-     sortClearText: 'Clear Sort',
 
-     //</locale>
 
-     //<locale>
 
-     columnsText: 'Columns',
 
-     //</locale>
 
-     headerOpenCls: Ext.baseCSSPrefix + 'column-header-open',
 
-     // private; will probably be removed by 4.0
 
-     triStateSort: false,
 
-     ddLock: false,
 
-     dragging: false,
 
- <span id='Ext-grid-header-Container-property-isGroupHeader'>    /**
 
- </span>     * @property {Boolean} isGroupHeader
 
-      * True if this HeaderContainer is in fact a group header which contains sub headers.
 
-      */
 
- <span id='Ext-grid-header-Container-cfg-sortable'>    /**
 
- </span>     * @cfg {Boolean} sortable
 
-      * Provides the default sortable state for all Headers within this HeaderContainer.
 
-      * Also turns on or off the menus in the HeaderContainer. Note that the menu is
 
-      * shared across every header and therefore turning it off will remove the menu
 
-      * items for every header.
 
-      */
 
-     sortable: true,
 
-     initComponent: function() {
 
-         var me = this;
 
-         me.headerCounter = 0;
 
-         me.plugins = me.plugins || [];
 
-         // TODO: Pass in configurations to turn on/off dynamic
 
-         //       resizing and disable resizing all together
 
-         // Only set up a Resizer and Reorderer for the topmost HeaderContainer.
 
-         // Nested Group Headers are themselves HeaderContainers
 
-         if (!me.isHeader) {
 
-             if (me.enableColumnResize) {
 
-                 me.resizer = new Ext.grid.plugin.HeaderResizer();
 
-                 me.plugins.push(me.resizer);
 
-             }
 
-             if (me.enableColumnMove) {
 
-                 me.reorderer = new Ext.grid.plugin.HeaderReorderer();
 
-                 me.plugins.push(me.reorderer);
 
-             }
 
-         }
 
-         // Base headers do not need a box layout
 
-         if (me.isHeader && !me.items) {
 
-             me.layout = me.layout || 'auto';
 
-         }
 
-         // HeaderContainer and Group header needs a gridcolumn layout.
 
-         else {
 
-             me.layout = Ext.apply({
 
-                 type: 'gridcolumn',
 
-                 align: 'stretchmax'
 
-             }, me.initialConfig.layout);
 
-         }
 
-         me.defaults = me.defaults || {};
 
-         Ext.applyIf(me.defaults, {
 
-             triStateSort: me.triStateSort,
 
-             sortable: me.sortable
 
-         });
 
-         
 
-         me.menuTask = new Ext.util.DelayedTask(me.updateMenuDisabledState, me);
 
-         me.callParent();
 
-         me.addEvents(
 
- <span id='Ext-grid-header-Container-event-columnresize'>            /**
 
- </span>             * @event columnresize
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              * @param {Number} width
 
-              */
 
-             'columnresize',
 
- <span id='Ext-grid-header-Container-event-headerclick'>            /**
 
- </span>             * @event headerclick
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              * @param {Ext.EventObject} e
 
-              * @param {HTMLElement} t
 
-              */
 
-             'headerclick',
 
- <span id='Ext-grid-header-Container-event-headertriggerclick'>            /**
 
- </span>             * @event headertriggerclick
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              * @param {Ext.EventObject} e
 
-              * @param {HTMLElement} t
 
-              */
 
-             'headertriggerclick',
 
- <span id='Ext-grid-header-Container-event-columnmove'>            /**
 
- </span>             * @event columnmove
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              * @param {Number} fromIdx
 
-              * @param {Number} toIdx
 
-              */
 
-             'columnmove',
 
- <span id='Ext-grid-header-Container-event-columnhide'>            /**
 
- </span>             * @event columnhide
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              */
 
-             'columnhide',
 
- <span id='Ext-grid-header-Container-event-columnshow'>            /**
 
- </span>             * @event columnshow
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              */
 
-             'columnshow',
 
- <span id='Ext-grid-header-Container-event-sortchange'>            /**
 
- </span>             * @event sortchange
 
-              * @param {Ext.grid.header.Container} ct The grid's header Container which encapsulates all column headers.
 
-              * @param {Ext.grid.column.Column} column The Column header Component which provides the column definition
 
-              * @param {String} direction
 
-              */
 
-             'sortchange',
 
- <span id='Ext-grid-header-Container-event-menucreate'>            /**
 
- </span>             * @event menucreate
 
-              * Fired immediately after the column header menu is created.
 
-              * @param {Ext.grid.header.Container} ct This instance
 
-              * @param {Ext.menu.Menu} menu The Menu that was created
 
-              */
 
-             'menucreate'
 
-         );
 
-     },
 
-     onDestroy: function() {
 
-         var me = this;
 
-         
 
-         me.menuTask.cancel();
 
-         Ext.destroy(me.resizer, me.reorderer);
 
-         me.callParent();
 
-     },
 
-     applyColumnsState: function(columns) {
 
-         if (!columns || !columns.length) {
 
-             return;
 
-         }
 
-         var me     = this,
 
-             items  = me.items.items,
 
-             count  = items.length,
 
-             i      = 0,
 
-             length = columns.length,
 
-             c, col, columnState, index;
 
-         for (c = 0; c < length; c++) {
 
-             columnState = columns[c];
 
-             for (index = count; index--; ) {
 
-                 col = items[index];
 
-                 if (col.getStateId && col.getStateId() == columnState.id) {
 
-                     // If a column in the new grid matches up with a saved state...
 
-                     // Ensure that the column is restored to the state order.
 
-                     // i is incremented upon every column match, so all persistent
 
-                     // columns are ordered before any new columns.
 
-                     if (i !== index) {
 
-                         me.moveHeader(index, i);
 
-                     }
 
-                     if (col.applyColumnState) {
 
-                         col.applyColumnState(columnState);
 
-                     }
 
-                     ++i;
 
-                     break;
 
-                 }
 
-             }
 
-         }
 
-     },
 
-     getColumnsState: function () {
 
-         var me = this,
 
-             columns = [],
 
-             state;
 
-         me.items.each(function (col) {
 
-             state = col.getColumnState && col.getColumnState();
 
-             if (state) {
 
-                 columns.push(state);
 
-             }
 
-         });
 
-         return columns;
 
-     },
 
-     // Invalidate column cache on add
 
-     // We cannot refresh the View on every add because this method is called
 
-     // when the HeaderDropZone moves Headers around, that will also refresh the view
 
-     onAdd: function(c) {
 
-         var me = this,
 
-             headerCt = me.isHeader ? me.getOwnerHeaderCt() : me;
 
-         if (!c.headerId) {
 
-             c.headerId = c.initialConfig.id || Ext.id(null, 'header-');
 
-         }
 
-         if (!c.stateId) {
 
-             // This was the headerId generated in 4.0, so to preserve saved state, we now
 
-             // assign a default stateId in that same manner. The stateId's of a column are
 
-             // not global at the stateProvider, but are local to the grid state data. The
 
-             // headerId should still follow our standard naming convention.
 
-             c.stateId = c.initialConfig.id || ('h' + (++me.headerCounter));
 
-         }
 
-         //<debug warn>
 
-         if (Ext.global.console && Ext.global.console.warn) {
 
-             if (!me._usedIDs) {
 
-                 me._usedIDs = {};
 
-             }
 
-             if (me._usedIDs[c.headerId]) {
 
-                 Ext.global.console.warn(this.$className, 'attempted to reuse an existing id', c.headerId);
 
-             }
 
-             me._usedIDs[c.headerId] = true;
 
-         }
 
-         //</debug>
 
-         me.callParent(arguments);
 
-         // Upon add of any column we need to purge the *HeaderContainer's* cache of leaf view columns.
 
-         if (headerCt) {
 
-             headerCt.purgeCache();
 
-         }
 
-     },
 
-     // Invalidate column cache on remove
 
-     // We cannot refresh the View on every remove because this method is called
 
-     // when the HeaderDropZone moves Headers around, that will also refresh the view
 
-     onRemove: function(c) {
 
-         var me = this,
 
-             headerCt = me.isHeader ? me.getOwnerHeaderCt() : me;
 
-         me.callParent(arguments);
 
-         
 
-         //<debug warn>
 
-         if (!me._usedIDs) {
 
-             me._usedIDs = {};
 
-         }
 
-         delete me._usedIDs[c.headerId];
 
-         //</debug>
 
-         // Upon removal of any column we need to purge the *HeaderContainer's* cache of leaf view columns.
 
-         if (headerCt) {
 
-             me.purgeCache();
 
-         }
 
-     },
 
-     // @private
 
-     applyDefaults: function(config) {
 
-         var ret; 
 
-         /*
 
-          * Ensure header.Container defaults don't get applied to a RowNumberer 
 
-          * if an xtype is supplied. This isn't an ideal solution however it's 
 
-          * much more likely that a RowNumberer with no options will be created, 
 
-          * wanting to use the defaults specified on the class as opposed to 
 
-          * those setup on the Container.
 
-          */
 
-         if (config && !config.isComponent && config.xtype == 'rownumberer') {
 
-             ret = config;
 
-         } else {
 
-             ret = this.callParent(arguments);
 
-             
 
-             // Apply default width unless it's a group header (in which case it must be left to shrinkwrap), or it's flexed
 
-             if (!config.isGroupHeader && !('width' in ret) && !ret.flex) {
 
-                 ret.width = this.defaultWidth;
 
-             }
 
-         }
 
-         return ret;
 
-     },
 
-     afterRender: function() {
 
-         this.callParent();
 
-         this.setSortState();
 
-         
 
-     },
 
-     
 
-     setSortState: function(){
 
-         var store   = this.up('[store]').store,
 
-             // grab the first sorter, since there may also be groupers
 
-             // in this collection
 
-             first = store.getFirstSorter(),
 
-             hd;
 
-         if (first) {
 
-             hd = this.down('gridcolumn[dataIndex=' + first.property  +']');
 
-             if (hd) {
 
-                 hd.setSortState(first.direction, false, true);
 
-             }
 
-         } else {
 
-             this.clearOtherSortStates(null);
 
-         }
 
-     },
 
-     
 
-     getHeaderMenu: function(){
 
-         var menu = this.getMenu(),
 
-             item;
 
-             
 
-         if (menu) {
 
-             item = menu.child('#columnItem');
 
-             if (item) {
 
-                 return item.menu;
 
-             }
 
-         }   
 
-         return null; 
 
-     },
 
-     
 
-     onHeaderVisibilityChange: function(header, visible){
 
-         var me = this,
 
-             menu = me.getHeaderMenu(),
 
-             item;
 
-         
 
-         if (menu) {
 
-             // If the header was hidden programmatically, sync the Menu state
 
-             item = me.getMenuItemForHeader(menu, header);
 
-             if (item) {
 
-                 item.setChecked(visible, true);
 
-             }
 
-             // delay this since the headers may fire a number of times if we're hiding/showing groups
 
-             me.menuTask.delay(50);
 
-         }
 
-     },
 
-     
 
- <span id='Ext-grid-header-Container-method-getLeafMenuItems'>    /**
 
- </span>     * @private
 
-      * Gets all "leaf" menu nodes and returns the checked count for those leaves.
 
-      * Only includes columns that are hideable via the menu
 
-      */
 
-     getLeafMenuItems: function() {
 
-         var me = this,
 
-             columns = me.getGridColumns(),
 
-             items = [],
 
-             i = 0,
 
-             count = 0,
 
-             len = columns.length,
 
-             menu = me.getMenu(),
 
-             item;
 
-         for (; i < len; ++i) {
 
-             item = columns[i];
 
-             if (item.hideable) {
 
-                 item = me.getMenuItemForHeader(menu, item);
 
-                 if (item) {
 
-                     items.push(item);
 
-                     if (item.checked) {
 
-                         ++count;
 
-                     }
 
-                 }
 
-             } else if (!item.hidden && !item.menuDisabled) {
 
-                 ++count;
 
-             }
 
-         }
 
-         return {
 
-             items: items,
 
-             checkedCount: count    
 
-         };
 
-     },
 
-     
 
-     updateMenuDisabledState: function(){
 
-         var me = this,
 
-             result = me.getLeafMenuItems(),
 
-             total = result.checkedCount,
 
-             items = result.items,
 
-             len = items.length,
 
-             i = 0,
 
-             rootItem = me.getMenu().child('#columnItem');
 
-             
 
-         if (total <= 1) {
 
-             // only one column visible, prevent hiding of the remaining item
 
-             me.disableMenuItems(rootItem, Ext.ComponentQuery.query('[checked=true]', items)[0]);
 
-         } else {
 
-             // at least 2 visible, set the state appropriately
 
-             for (; i < len; ++i) {
 
-                 me.setMenuItemState(total, rootItem, items[i]);
 
-             }
 
-         }
 
-     },
 
-     
 
-     disableMenuItems: function(rootItem, item){
 
-         while (item && item != rootItem) {
 
-             item.disableCheckChange();
 
-             item = item.parentMenu.ownerItem;
 
-         }
 
-     },
 
-     
 
-     setMenuItemState: function(total, rootItem, item){
 
-         var parentMenu,
 
-             checkedChildren;
 
-             
 
-         while (item && item != rootItem) {
 
-             parentMenu = item.parentMenu;
 
-             checkedChildren = item.parentMenu.query('[checked=true]:not([menu])').length;
 
-             item.enableCheckChange();
 
-             item = parentMenu.ownerItem;
 
-             if (checkedChildren === total) {
 
-                 // contains all the checked children, jump out the item and all parents
 
-                 break;
 
-             }
 
-         }
 
-         
 
-         // while we're not at the top, disable from the current item up
 
-         this.disableMenuItems(rootItem, item);
 
-     },
 
-     
 
-     getMenuItemForHeader: function(menu, header){
 
-         return header ? menu.down('menucheckitem[headerId=' + header.id + ']') : null;
 
-     },
 
-     onHeaderShow: function(header) {
 
-         // Pass up to the GridSection
 
-         var me = this,
 
-             gridSection = me.ownerCt;
 
-         me.onHeaderVisibilityChange(header, true);
 
-         // Only update the grid UI when we are notified about base level Header shows;
 
-         // Group header shows just cause a layout of the HeaderContainer
 
-         if (!header.isGroupHeader) {
 
-             if (gridSection) {
 
-                 gridSection.onHeaderShow(me, header);
 
-             }
 
-         }
 
-         me.fireEvent('columnshow', me, header);
 
-     },
 
-     onHeaderHide: function(header) {
 
-         // Pass up to the GridSection
 
-         var me = this,
 
-             gridSection = me.ownerCt;
 
-         me.onHeaderVisibilityChange(header, false);
 
-         // Only update the UI when we are notified about base level Header hides;
 
-         if (!header.isGroupHeader) {
 
-             if (gridSection) {
 
-                 gridSection.onHeaderHide(me, header);
 
-             }
 
-         }
 
-         me.fireEvent('columnhide', me, header);
 
-     },
 
- <span id='Ext-grid-header-Container-method-tempLock'>    /**
 
- </span>     * Temporarily lock the headerCt. This makes it so that clicking on headers
 
-      * don't trigger actions like sorting or opening of the header menu. This is
 
-      * done because extraneous events may be fired on the headers after interacting
 
-      * with a drag drop operation.
 
-      * @private
 
-      */
 
-     tempLock: function() {
 
-         this.ddLock = true;
 
-         Ext.Function.defer(function() {
 
-             this.ddLock = false;
 
-         }, 200, this);
 
-     },
 
-     onHeaderResize: function(header, w, suppressFocus) {
 
-         var me = this,
 
-             view = me.view,
 
-             gridSection = me.ownerCt;
 
-         // Do not react to header sizing during initial Panel layout when there is no view content to size.
 
-         if (view && view.table.dom) {
 
-             me.tempLock();
 
-             if (gridSection) {
 
-                 gridSection.onHeaderResize(me, header, w);
 
-             }
 
-         }
 
-         me.fireEvent('columnresize', this, header, w);
 
-     },
 
-     onHeaderClick: function(header, e, t) {
 
-         header.fireEvent('headerclick', this, header, e, t);
 
-         this.fireEvent("headerclick", this, header, e, t);
 
-     },
 
-     onHeaderTriggerClick: function(header, e, t) {
 
-         // generate and cache menu, provide ability to cancel/etc
 
-         var me = this;
 
-         if (header.fireEvent('headertriggerclick', me, header, e, t) !== false && me.fireEvent("headertriggerclick", me, header, e, t) !== false) {
 
-             me.showMenuBy(t, header);
 
-         }
 
-     },
 
-     showMenuBy: function(t, header) {
 
-         var menu = this.getMenu(),
 
-             ascItem  = menu.down('#ascItem'),
 
-             descItem = menu.down('#descItem'),
 
-             sortableMth;
 
-         menu.activeHeader = menu.ownerCt = header;
 
-         menu.setFloatParent(header);
 
-         // TODO: remove coupling to Header's titleContainer el
 
-         header.titleEl.addCls(this.headerOpenCls);
 
-         // enable or disable asc & desc menu items based on header being sortable
 
-         sortableMth = header.sortable ? 'enable' : 'disable';
 
-         if (ascItem) {
 
-             ascItem[sortableMth]();
 
-         }
 
-         if (descItem) {
 
-             descItem[sortableMth]();
 
-         }
 
-         menu.showBy(t);
 
-     },
 
-     // remove the trigger open class when the menu is hidden
 
-     onMenuDeactivate: function() {
 
-         var menu = this.getMenu();
 
-         // TODO: remove coupling to Header's titleContainer el
 
-         menu.activeHeader.titleEl.removeCls(this.headerOpenCls);
 
-     },
 
-     moveHeader: function(fromIdx, toIdx) {
 
-         // An automatically expiring lock
 
-         this.tempLock();
 
-         this.onHeaderMoved(this.move(fromIdx, toIdx), 1, fromIdx, toIdx);
 
-     },
 
-     purgeCache: function() {
 
-         var me = this;
 
-         // Delete column cache - column order has changed.
 
-         delete me.gridDataColumns;
 
-         delete me.hideableColumns;
 
-         // Menu changes when columns are moved. It will be recreated.
 
-         if (me.menu) {
 
-             // Must hide before destroy so that trigger el is deactivated
 
-             me.menu.hide();
 
-             me.menu.destroy();
 
-             delete me.menu;
 
-         }
 
-     },
 
-     onHeaderMoved: function(header, colsToMove, fromIdx, toIdx) {
 
-         var me = this,
 
-             gridSection = me.ownerCt;
 
-         if (gridSection && gridSection.onHeaderMove) {
 
-             gridSection.onHeaderMove(me, header, colsToMove, fromIdx, toIdx);
 
-         }
 
-         me.fireEvent("columnmove", me, header, fromIdx, toIdx);
 
-     },
 
- <span id='Ext-grid-header-Container-method-getMenu'>    /**
 
- </span>     * Gets the menu (and will create it if it doesn't already exist)
 
-      * @private
 
-      */
 
-     getMenu: function() {
 
-         var me = this;
 
-         if (!me.menu) {
 
-             me.menu = new Ext.menu.Menu({
 
-                 hideOnParentHide: false,  // Persists when owning ColumnHeader is hidden
 
-                 items: me.getMenuItems(),
 
-                 listeners: {
 
-                     deactivate: me.onMenuDeactivate,
 
-                     scope: me
 
-                 }
 
-             });
 
-             me.updateMenuDisabledState();
 
-             me.fireEvent('menucreate', me, me.menu);
 
-         }
 
-         return me.menu;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getMenuItems'>    /**
 
- </span>     * Returns an array of menu items to be placed into the shared menu
 
-      * across all headers in this header container.
 
-      * @returns {Array} menuItems
 
-      */
 
-     getMenuItems: function() {
 
-         var me = this,
 
-             menuItems = [],
 
-             hideableColumns = me.enableColumnHide ? me.getColumnMenu(me) : null;
 
-         if (me.sortable) {
 
-             menuItems = [{
 
-                 itemId: 'ascItem',
 
-                 text: me.sortAscText,
 
-                 cls: Ext.baseCSSPrefix + 'hmenu-sort-asc',
 
-                 handler: me.onSortAscClick,
 
-                 scope: me
 
-             },{
 
-                 itemId: 'descItem',
 
-                 text: me.sortDescText,
 
-                 cls: Ext.baseCSSPrefix + 'hmenu-sort-desc',
 
-                 handler: me.onSortDescClick,
 
-                 scope: me
 
-             }];
 
-         }
 
-         if (hideableColumns && hideableColumns.length) {
 
-             menuItems.push('-', {
 
-                 itemId: 'columnItem',
 
-                 text: me.columnsText,
 
-                 cls: Ext.baseCSSPrefix + 'cols-icon',
 
-                 menu: hideableColumns
 
-             });
 
-         }
 
-         return menuItems;
 
-     },
 
-     // sort asc when clicking on item in menu
 
-     onSortAscClick: function() {
 
-         var menu = this.getMenu(),
 
-             activeHeader = menu.activeHeader;
 
-         activeHeader.setSortState('ASC');
 
-     },
 
-     // sort desc when clicking on item in menu
 
-     onSortDescClick: function() {
 
-         var menu = this.getMenu(),
 
-             activeHeader = menu.activeHeader;
 
-         activeHeader.setSortState('DESC');
 
-     },
 
- <span id='Ext-grid-header-Container-method-getColumnMenu'>    /**
 
- </span>     * Returns an array of menu CheckItems corresponding to all immediate children
 
-      * of the passed Container which have been configured as hideable.
 
-      */
 
-     getColumnMenu: function(headerContainer) {
 
-         var menuItems = [],
 
-             i = 0,
 
-             item,
 
-             items = headerContainer.query('>gridcolumn[hideable]'),
 
-             itemsLn = items.length,
 
-             menuItem;
 
-         for (; i < itemsLn; i++) {
 
-             item = items[i];
 
-             menuItem = new Ext.menu.CheckItem({
 
-                 text: item.menuText || item.text,
 
-                 checked: !item.hidden,
 
-                 hideOnClick: false,
 
-                 headerId: item.id,
 
-                 menu: item.isGroupHeader ? this.getColumnMenu(item) : undefined,
 
-                 checkHandler: this.onColumnCheckChange,
 
-                 scope: this
 
-             });
 
-             menuItems.push(menuItem);
 
-             // If the header is ever destroyed - for instance by dragging out the last remaining sub header,
 
-             // then the associated menu item must also be destroyed.
 
-             item.on({
 
-                 destroy: Ext.Function.bind(menuItem.destroy, menuItem)
 
-             });
 
-         }
 
-         return menuItems;
 
-     },
 
-     onColumnCheckChange: function(checkItem, checked) {
 
-         var header = Ext.getCmp(checkItem.headerId);
 
-         header[checked ? 'show' : 'hide']();
 
-     },
 
- <span id='Ext-grid-header-Container-method-getColumnsForTpl'>    /**
 
- </span>     * Get the columns used for generating a template via TableChunker.
 
-      * Returns an array of all columns and their
 
-      *
 
-      *  - dataIndex
 
-      *  - align
 
-      *  - width
 
-      *  - id
 
-      *  - columnId - used to create an identifying CSS class
 
-      *  - cls The tdCls configuration from the Column object
 
-      *
 
-      * @private
 
-      */
 
-     getColumnsForTpl: function(flushCache) {
 
-         var cols    = [],
 
-             headers   = this.getGridColumns(flushCache),
 
-             headersLn = headers.length,
 
-             i = 0,
 
-             header,
 
-             width;
 
-         for (; i < headersLn; i++) {
 
-             header = headers[i];
 
-             if (header.hidden || header.up('headercontainer[hidden=true]')) {
 
-                 width = 0;
 
-             } else {
 
-                 width = header.getDesiredWidth();
 
-             }
 
-             cols.push({
 
-                 dataIndex: header.dataIndex,
 
-                 align: header.align,
 
-                 width: width,
 
-                 id: header.id,
 
-                 cls: header.tdCls,
 
-                 columnId: header.getItemId()
 
-             });
 
-         }
 
-         return cols;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getColumnCount'>    /**
 
- </span>     * Returns the number of <b>grid columns</b> descended from this HeaderContainer.
 
-      * Group Columns are HeaderContainers. All grid columns are returned, including hidden ones.
 
-      */
 
-     getColumnCount: function() {
 
-         return this.getGridColumns().length;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getFullWidth'>    /**
 
- </span>     * Gets the full width of all columns that are visible.
 
-      */
 
-     getFullWidth: function(flushCache) {
 
-         var fullWidth = 0,
 
-             headers = this.getVisibleGridColumns(flushCache),
 
-             headersLn = headers.length,
 
-             i = 0,
 
-             header;
 
-            
 
-         for (; i < headersLn; i++) {
 
-             header = headers[i];
 
-             // use headers getDesiredWidth if its there
 
-             if (header.getDesiredWidth) {
 
-                 fullWidth += header.getDesiredWidth() || 0;
 
-             // if injected a diff cmp use getWidth
 
-             } else {
 
-                 fullWidth += header.getWidth();
 
-             }
 
-         }
 
-         return fullWidth;
 
-     },
 
-     // invoked internally by a header when not using triStateSorting
 
-     clearOtherSortStates: function(activeHeader) {
 
-         var headers   = this.getGridColumns(),
 
-             headersLn = headers.length,
 
-             i         = 0;
 
-         for (; i < headersLn; i++) {
 
-             if (headers[i] !== activeHeader) {
 
-                 // unset the sortstate and dont recurse
 
-                 headers[i].setSortState(null, true);
 
-             }
 
-         }
 
-     },
 
- <span id='Ext-grid-header-Container-method-getVisibleGridColumns'>    /**
 
- </span>     * Returns an array of the **visible** columns in the grid. This goes down to the lowest column header
 
-      * level, and does not return **grouped** headers which contain sub headers.
 
-      * @param {Boolean} refreshCache If omitted, the cached set of columns will be returned. Pass true to refresh the cache.
 
-      * @returns {Array}
 
-      */
 
-     getVisibleGridColumns: function(refreshCache) {
 
-         return Ext.ComponentQuery.query(':not([hidden])', this.getGridColumns(refreshCache));
 
-     }, 
 
- <span id='Ext-grid-header-Container-method-getGridColumns'>    /**
 
- </span>     * Returns an array of all columns which map to Store fields. This goes down to the lowest column header
 
-      * level, and does not return **grouped** headers which contain sub headers.
 
-      * @param {Boolean} refreshCache If omitted, the cached set of columns will be returned. Pass true to refresh the cache.
 
-      * @returns {Array}
 
-      */
 
-     getGridColumns: function(refreshCache) {
 
-         var me = this,
 
-             result = refreshCache ? null : me.gridDataColumns;
 
-         // Not already got the column cache, so collect the base columns
 
-         if (!result) {
 
-             me.gridDataColumns = result = [];
 
-             me.cascade(function(c) {
 
-                 if ((c !== me) && !c.isGroupHeader) {
 
-                     result.push(c);
 
-                 }
 
-             });
 
-         }
 
-         return result;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getHideableColumns'>    /**
 
- </span>     * @private
 
-      * For use by column headers in determining whether there are any hideable columns when deciding whether or not
 
-      * the header menu should be disabled.
 
-      */
 
-     getHideableColumns: function(refreshCache) {
 
-         var me = this,
 
-             result = refreshCache ? null : me.hideableColumns;
 
-         if (!result) {
 
-             result = me.hideableColumns = me.query('[hideable]');
 
-         }
 
-         return result;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getHeaderIndex'>    /**
 
- </span>     * Returns the index of a leaf level header regardless of what the nesting
 
-      * structure is.
 
-      *
 
-      * If a group header is passed, the index of the first leaf level heder within it is returned.
 
-      *
 
-      * @param {Ext.grid.column.Column} header The header to find the index of
 
-      * @return {Number} The index of the specified column header
 
-      */
 
-     getHeaderIndex: function(header) {
 
-         // If we are being asked the index of a group header, find the first leaf header node, and return the index of that
 
-         if (header.isGroupHeader) {
 
-             header = header.down(':not([isgroupHeader])');
 
-         }
 
-         return Ext.Array.indexOf(this.getGridColumns(), header);
 
-     },
 
- <span id='Ext-grid-header-Container-method-getHeaderAtIndex'>    /**
 
- </span>     * Get a leaf level header by index regardless of what the nesting
 
-      * structure is.
 
-      * @param {Number} The column index for which to retrieve the column.
 
-      */
 
-     getHeaderAtIndex: function(index) {
 
-         var columns = this.getGridColumns();
 
-         return columns.length ? columns[index] : null;
 
-     },
 
- <span id='Ext-grid-header-Container-method-getVisibleHeaderClosestToIndex'>    /**
 
- </span>     * When passed a column index, returns the closet *visible* column to that. If the column at the passed index is visible,
 
-      * that is returned. If it is hidden, either the next visible, or the previous visible column is returned.
 
-      * @param {Number} index Position at which to find the closest visible column.
 
-      */
 
-     getVisibleHeaderClosestToIndex: function(index) {
 
-         var result = this.getHeaderAtIndex(index);
 
-         if (result && result.hidden) {
 
-             result = result.next(':not([hidden])') || result.prev(':not([hidden])');
 
-         }
 
-         return result;
 
-     },
 
- <span id='Ext-grid-header-Container-method-prepareData'>    /**
 
- </span>     * Maps the record data to base it on the header id's.
 
-      * This correlates to the markup/template generated by
 
-      * TableChunker.
 
-      */
 
-     prepareData: function(data, rowIdx, record, view, panel) {
 
-         var me        = this,
 
-             obj       = {},
 
-             headers   = me.gridDataColumns || me.getGridColumns(),
 
-             headersLn = headers.length,
 
-             colIdx    = 0,
 
-             header,
 
-             headerId,
 
-             renderer,
 
-             value,
 
-             metaData,
 
-             store = panel.store;
 
-         for (; colIdx < headersLn; colIdx++) {
 
-             metaData = {
 
-                 tdCls: '',
 
-                 style: ''
 
-             };
 
-             header = headers[colIdx];
 
-             headerId = header.id;
 
-             renderer = header.renderer;
 
-             value = data[header.dataIndex];
 
-             if (typeof renderer == "function") {
 
-                 value = renderer.call(
 
-                     header.scope || me.ownerCt,
 
-                     value,
 
-                     // metadata per cell passing an obj by reference so that
 
-                     // it can be manipulated inside the renderer
 
-                     metaData,
 
-                     record,
 
-                     rowIdx,
 
-                     colIdx,
 
-                     store,
 
-                     view
 
-                 );
 
-             }
 
-             // <debug>
 
-             if (metaData.css) {
 
-                 // This warning attribute is used by the compat layer
 
-                 obj.cssWarning = true;
 
-                 metaData.tdCls = metaData.css;
 
-                 delete metaData.css;
 
-             }
 
-             // </debug>
 
-             if (me.markDirty) {
 
-                 obj[headerId + '-modified'] = record.isModified(header.dataIndex) ? Ext.baseCSSPrefix + 'grid-dirty-cell' : '';
 
-             }
 
-             obj[headerId+'-tdCls'] = metaData.tdCls;
 
-             obj[headerId+'-tdAttr'] = metaData.tdAttr;
 
-             obj[headerId+'-style'] = metaData.style;
 
-             if (typeof value === 'undefined' || value === null || value === '') {
 
-                 value = header.emptyCellText;
 
-             }
 
-             obj[headerId] = value;
 
-         }
 
-         return obj;
 
-     },
 
-     expandToFit: function(header) {
 
-         var view = this.view;
 
-         if (view) {
 
-             view.expandToFit(header);
 
-         }
 
-     }
 
- });
 
- </pre>
 
- </body>
 
- </html>
 
 
  |