X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/b37ceabb82336ee82757cd32efe353cfab8ec267..f5240829880f87e0cf581c6a296e436fdef0ef80:/src/widgets/grid/ColumnModel.js diff --git a/src/widgets/grid/ColumnModel.js b/src/widgets/grid/ColumnModel.js index 0f6bafb0..4c5baabc 100644 --- a/src/widgets/grid/ColumnModel.js +++ b/src/widgets/grid/ColumnModel.js @@ -1,5 +1,5 @@ /*! - * Ext JS Library 3.2.2 + * Ext JS Library 3.3.0 * Copyright(c) 2006-2010 Ext JS, Inc. * licensing@extjs.com * http://www.extjs.com/license @@ -95,24 +95,27 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * {@link #defaults} config property. */ defaultWidth: 100, + /** * @cfg {Boolean} defaultSortable (optional) Default sortable of columns which have no * sortable specified (defaults to false). This property shall preferably be configured * through the {@link #defaults} config property. */ defaultSortable: false, + /** * @cfg {Array} columns An Array of object literals. The config options defined by * {@link Ext.grid.Column} are the options which may appear in the object literal for each * individual column definition. */ + /** * @cfg {Object} defaults Object literal which will be used to apply {@link Ext.grid.Column} * configuration options to all {@link #columns}. Configuration options specified with * individual {@link Ext.grid.Column column} configs will supersede these {@link #defaults}. */ - constructor : function(config){ + constructor : function(config) { /** * An Array of {@link Ext.grid.Column Column definition} objects representing the configuration * of this ColumnModel. See {@link Ext.grid.Column} for the configuration properties that may @@ -120,12 +123,13 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @property config * @type Array */ - if(config.columns){ + if (config.columns) { Ext.apply(this, config); this.setConfig(config.columns, true); - }else{ + } else { this.setConfig(config, true); } + this.addEvents( /** * @event widthchange @@ -138,6 +142,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Number} newWidth The new width */ "widthchange", + /** * @event headerchange * Fires when the text of a header changes. @@ -146,6 +151,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {String} newText The new header text */ "headerchange", + /** * @event hiddenchange * Fires when a column is hidden or "unhidden". @@ -154,6 +160,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Boolean} hidden true if hidden, false otherwise */ "hiddenchange", + /** * @event columnmoved * Fires when a column is moved. @@ -162,6 +169,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Number} newIndex */ "columnmoved", + /** * @event configchange * Fires when the configuration is changed @@ -169,6 +177,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { */ "configchange" ); + Ext.grid.ColumnModel.superclass.constructor.call(this); }, @@ -177,11 +186,11 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Number} index The column index * @return {String} the id */ - getColumnId : function(index){ + getColumnId : function(index) { return this.config[index].id; }, - getColumnAt : function(index){ + getColumnAt : function(index) { return this.config[index]; }, @@ -195,13 +204,16 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Boolean} initial Specify true to bypass cleanup which deletes the totalWidth * and destroys existing editors. */ - setConfig : function(config, initial){ + setConfig : function(config, initial) { var i, c, len; - if(!initial){ // cleanup + + if (!initial) { // cleanup delete this.totalWidth; - for(i = 0, len = this.config.length; i < len; i++){ + + for (i = 0, len = this.config.length; i < len; i++) { c = this.config[i]; - if(c.setEditor){ + + if (c.setEditor) { //check here, in case we have a special column like a CheckboxSelectionModel c.setEditor(null); } @@ -217,20 +229,24 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { this.config = config; this.lookup = {}; - for(i = 0, len = config.length; i < len; i++){ + for (i = 0, len = config.length; i < len; i++) { c = Ext.applyIf(config[i], this.defaults); + // if no id, create one using column's ordinal position - if(Ext.isEmpty(c.id)){ + if (Ext.isEmpty(c.id)) { c.id = i; } - if(!c.isColumn){ + + if (!c.isColumn) { var Cls = Ext.grid.Column.types[c.xtype || 'gridcolumn']; c = new Cls(c); config[i] = c; } + this.lookup[c.id] = c; } - if(!initial){ + + if (!initial) { this.fireEvent('configchange', this); } }, @@ -240,7 +256,7 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {String} id The column id * @return {Object} the column */ - getColumnById : function(id){ + getColumnById : function(id) { return this.lookup[id]; }, @@ -249,9 +265,9 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {String} id The column id * @return {Number} the index, or -1 if not found */ - getIndexById : function(id){ - for(var i = 0, len = this.config.length; i < len; i++){ - if(this.config[i].id == id){ + getIndexById : function(id) { + for (var i = 0, len = this.config.length; i < len; i++) { + if (this.config[i].id == id) { return i; } } @@ -263,10 +279,12 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Number} oldIndex The index of the column to move. * @param {Number} newIndex The position at which to reinsert the coolumn. */ - moveColumn : function(oldIndex, newIndex){ - var c = this.config[oldIndex]; - this.config.splice(oldIndex, 1); - this.config.splice(newIndex, 0, c); + moveColumn : function(oldIndex, newIndex) { + var config = this.config, + c = config[oldIndex]; + + config.splice(oldIndex, 1); + config.splice(newIndex, 0, c); this.dataMap = null; this.fireEvent("columnmoved", this, oldIndex, newIndex); }, @@ -276,17 +294,22 @@ Ext.grid.ColumnModel = Ext.extend(Ext.util.Observable, { * @param {Boolean} visibleOnly Optional. Pass as true to only include visible columns. * @return {Number} */ - getColumnCount : function(visibleOnly){ - if(visibleOnly === true){ - var c = 0; - for(var i = 0, len = this.config.length; i < len; i++){ - if(!this.isHidden(i)){ + getColumnCount : function(visibleOnly) { + var length = this.config.length, + c = 0, + i; + + if (visibleOnly === true) { + for (i = 0; i < length; i++) { + if (!this.isHidden(i)) { c++; } } + return c; } - return this.config.length; + + return length; }, /** @@ -304,15 +327,21 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * is executed. Defaults to this ColumnModel. * @return {Array} result */ - getColumnsBy : function(fn, scope){ - var r = []; - for(var i = 0, len = this.config.length; i < len; i++){ - var c = this.config[i]; - if(fn.call(scope||this, c, i) === true){ - r[r.length] = c; + getColumnsBy : function(fn, scope) { + var config = this.config, + length = config.length, + result = [], + i, c; + + for (i = 0; i < length; i++){ + c = config[i]; + + if (fn.call(scope || this, c, i) === true) { + result[result.length] = c; } } - return r; + + return result; }, /** @@ -320,7 +349,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @return {Boolean} */ - isSortable : function(col){ + isSortable : function(col) { return !!this.config[col].sortable; }, @@ -329,7 +358,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @return {Boolean} */ - isMenuDisabled : function(col){ + isMenuDisabled : function(col) { return !!this.config[col].menuDisabled; }, @@ -338,14 +367,11 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index. * @return {Function} The function used to render the cell. See {@link #setRenderer}. */ - getRenderer : function(col){ - if(!this.config[col].renderer){ - return Ext.grid.ColumnModel.defaultRenderer; - } - return this.config[col].renderer; + getRenderer : function(col) { + return this.config[col].renderer || Ext.grid.ColumnModel.defaultRenderer; }, - getRendererScope : function(col){ + getRendererScope : function(col) { return this.config[col].scope; }, @@ -366,7 +392,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ *
  • colIndex : Number

    Column index

  • *
  • store : Ext.data.Store

    The {@link Ext.data.Store} object from which the Record was extracted.

  • */ - setRenderer : function(col, fn){ + setRenderer : function(col, fn) { this.config[col].renderer = fn; }, @@ -375,8 +401,12 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @return {Number} */ - getColumnWidth : function(col){ - return this.config[col].width; + getColumnWidth : function(col) { + var width = this.config[col].width; + if(typeof width != 'number'){ + width = this.defaultWidth; + } + return width; }, /** @@ -386,10 +416,11 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Boolean} suppressEvent True to suppress firing the {@link #widthchange} * event. Defaults to false. */ - setColumnWidth : function(col, width, suppressEvent){ + setColumnWidth : function(col, width, suppressEvent) { this.config[col].width = width; this.totalWidth = null; - if(!suppressEvent){ + + if (!suppressEvent) { this.fireEvent("widthchange", this, col, width); } }, @@ -399,11 +430,11 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Boolean} includeHidden True to include hidden column widths * @return {Number} */ - getTotalWidth : function(includeHidden){ - if(!this.totalWidth){ + getTotalWidth : function(includeHidden) { + if (!this.totalWidth) { this.totalWidth = 0; - for(var i = 0, len = this.config.length; i < len; i++){ - if(includeHidden || !this.isHidden(i)){ + for (var i = 0, len = this.config.length; i < len; i++) { + if (includeHidden || !this.isHidden(i)) { this.totalWidth += this.getColumnWidth(i); } } @@ -416,7 +447,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @return {String} */ - getColumnHeader : function(col){ + getColumnHeader : function(col) { return this.config[col].header; }, @@ -425,7 +456,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @param {String} header The new header */ - setColumnHeader : function(col, header){ + setColumnHeader : function(col, header) { this.config[col].header = header; this.fireEvent("headerchange", this, col, header); }, @@ -435,7 +466,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @return {String} */ - getColumnTooltip : function(col){ + getColumnTooltip : function(col) { return this.config[col].tooltip; }, /** @@ -443,7 +474,7 @@ var columns = grid.getColumnModel().getColumnsBy(function(c){ * @param {Number} col The column index * @param {String} tooltip The new tooltip */ - setColumnTooltip : function(col, tooltip){ + setColumnTooltip : function(col, tooltip) { this.config[col].tooltip = tooltip; }, @@ -456,7 +487,7 @@ var fieldName = grid.getColumnModel().getDataIndex(columnIndex); * @param {Number} col The column index * @return {String} The column's dataIndex */ - getDataIndex : function(col){ + getDataIndex : function(col) { return this.config[col].dataIndex; }, @@ -465,7 +496,7 @@ var fieldName = grid.getColumnModel().getDataIndex(columnIndex); * @param {Number} col The column index * @param {String} dataIndex The new dataIndex */ - setDataIndex : function(col, dataIndex){ + setDataIndex : function(col, dataIndex) { this.config[col].dataIndex = dataIndex; }, @@ -474,7 +505,7 @@ var fieldName = grid.getColumnModel().getDataIndex(columnIndex); * @param {String} col The dataIndex to find * @return {Number} The column index, or -1 if no match was found */ - findColumnIndex : function(dataIndex){ + findColumnIndex : function(dataIndex) { var c = this.config; for(var i = 0, len = c.length; i < len; i++){ if(c[i].dataIndex == dataIndex){ @@ -508,7 +539,7 @@ var grid = new Ext.grid.GridPanel({ * @param {Number} rowIndex The row index * @return {Boolean} */ - isCellEditable : function(colIndex, rowIndex){ + isCellEditable : function(colIndex, rowIndex) { var c = this.config[colIndex], ed = c.editable; @@ -523,7 +554,7 @@ var grid = new Ext.grid.GridPanel({ * @return {Ext.Editor} The {@link Ext.Editor Editor} that was created to wrap * the {@link Ext.form.Field Field} used to edit the cell. */ - getCellEditor : function(colIndex, rowIndex){ + getCellEditor : function(colIndex, rowIndex) { return this.config[colIndex].getCellEditor(rowIndex); }, @@ -532,7 +563,7 @@ var grid = new Ext.grid.GridPanel({ * @param {Number} col The column index * @param {Boolean} editable True if the column is editable */ - setEditable : function(col, editable){ + setEditable : function(col, editable) { this.config[col].editable = editable; }, @@ -542,7 +573,7 @@ var grid = new Ext.grid.GridPanel({ * @param {Number} colIndex The column index * @return {Boolean} */ - isHidden : function(colIndex){ + isHidden : function(colIndex) { return !!this.config[colIndex].hidden; // ensure returns boolean }, @@ -552,7 +583,7 @@ var grid = new Ext.grid.GridPanel({ * @param {Number} colIndex The column index * @return {Boolean} */ - isFixed : function(colIndex){ + isFixed : function(colIndex) { return !!this.config[colIndex].fixed; }, @@ -560,9 +591,10 @@ var grid = new Ext.grid.GridPanel({ * Returns true if the column can be resized * @return {Boolean} */ - isResizable : function(colIndex){ + isResizable : function(colIndex) { return colIndex >= 0 && this.config[colIndex].resizable !== false && this.config[colIndex].fixed !== true; }, + /** * Sets if a column is hidden.
    
    @@ -571,7 +603,7 @@ myGrid.getColumnModel().setHidden(0, true); // hide column 0 (0 = the first colu
          * @param {Number} colIndex The column index
          * @param {Boolean} hidden True if the column is hidden
          */
    -    setHidden : function(colIndex, hidden){
    +    setHidden : function(colIndex, hidden) {
             var c = this.config[colIndex];
             if(c.hidden !== hidden){
                 c.hidden = hidden;
    @@ -585,36 +617,38 @@ myGrid.getColumnModel().setHidden(0, true); // hide column 0 (0 = the first colu
          * @param {Number} col The column index
          * @param {Object} editor The editor object
          */
    -    setEditor : function(col, editor){
    +    setEditor : function(col, editor) {
             this.config[col].setEditor(editor);
         },
     
         /**
    -     * Destroys this column model by purging any event listeners, and removing any editors.
    +     * Destroys this column model by purging any event listeners. Destroys and dereferences all Columns.
          */
    -    destroy : function(){
    -        var c;
    -        for(var i = 0, len = this.config.length; i < len; i++){
    -            c = this.config[i];
    -            if(c.setEditor){
    -                c.setEditor(null);
    -            }
    +    destroy : function() {
    +        var length = this.config.length,
    +            i = 0;
    +
    +        for (; i < length; i++){
    +            this.config[i].destroy(); // Column's destroy encapsulates all cleanup.
             }
    +        delete this.config;
    +        delete this.lookup;
             this.purgeListeners();
         },
    -    
    +
         /**
          * @private
          * Setup any saved state for the column, ensures that defaults are applied.
          */
    -    setState : function(col, state){
    -        Ext.applyIf(this.config[col], state);
    +    setState : function(col, state) {
    +        state = Ext.applyIf(state, this.defaults);
    +        Ext.apply(this.config[col], state);
         }
     });
     
     // private
    -Ext.grid.ColumnModel.defaultRenderer = function(value){
    -    if(typeof value == "string" && value.length < 1){
    +Ext.grid.ColumnModel.defaultRenderer = function(value) {
    +    if (typeof value == "string" && value.length < 1) {
             return " ";
         }
         return value;