| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 | <!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-selection-CheckboxModel'>/**</span> * A selection model that renders a column of checkboxes that can be toggled to * select or deselect rows. The default mode for this selection model is MULTI. * * The selection model will inject a header for the checkboxes in the first view * and according to the 'injectCheckbox' configuration. */Ext.define('Ext.selection.CheckboxModel', {    alias: 'selection.checkboxmodel',    extend: 'Ext.selection.RowModel',<span id='Ext-selection-CheckboxModel-cfg-mode'>    /**</span>     * @cfg {String} mode     * Modes of selection.     * Valid values are SINGLE, SIMPLE, and MULTI.     */    mode: 'MULTI',<span id='Ext-selection-CheckboxModel-cfg-injectCheckbox'>    /**</span>     * @cfg {Number/String} [injectCheckbox=0]     * The index at which to insert the checkbox column.     * Supported values are a numeric index, and the strings 'first' and 'last'.     */    injectCheckbox: 0,<span id='Ext-selection-CheckboxModel-cfg-checkOnly'>    /**</span>     * @cfg {Boolean} checkOnly     * True if rows can only be selected by clicking on the checkbox column.     */    checkOnly: false,    <span id='Ext-selection-CheckboxModel-cfg-showHeaderCheckbox'>    /**</span>     * @cfg {Boolean} showHeaderCheckbox     * Configure as `false` to not display the header checkbox at the top of the column.     */    showHeaderCheckbox: true,    headerWidth: 24,    // private    checkerOnCls: Ext.baseCSSPrefix + 'grid-hd-checker-on',    // private    refreshOnRemove: true,    beforeViewRender: function(view) {        var me = this;        me.callParent(arguments);        // if we have a locked header, only hook up to the first        if (!me.hasLockedHeader() || view.headerCt.lockedCt) {            if (me.showHeaderCheckbox !== false) {                view.headerCt.on('headerclick', me.onHeaderClick, me);            }            me.addCheckbox(view, true);            me.mon(view.ownerCt, 'reconfigure', me.onReconfigure, me);        }    },    bindComponent: function(view) {        var me = this;        me.sortable = false;        me.callParent(arguments);    },    hasLockedHeader: function(){        var views     = this.views,            vLen      = views.length,            v;        for (v = 0; v < vLen; v++) {            if (views[v].headerCt.lockedCt) {                return true;            }        }        return false;    },<span id='Ext-selection-CheckboxModel-method-addCheckbox'>    /**</span>     * Add the header checkbox to the header row     * @private     * @param {Boolean} initial True if we're binding for the first time.     */    addCheckbox: function(view, initial){        var me = this,            checkbox = me.injectCheckbox,            headerCt = view.headerCt;        // Preserve behaviour of false, but not clear why that would ever be done.        if (checkbox !== false) {            if (checkbox == 'first') {                checkbox = 0;            } else if (checkbox == 'last') {                checkbox = headerCt.getColumnCount();            }            Ext.suspendLayouts();            headerCt.add(checkbox,  me.getHeaderConfig());            Ext.resumeLayouts();        }        if (initial !== true) {            view.refresh();        }    },<span id='Ext-selection-CheckboxModel-method-onReconfigure'>    /**</span>     * Handles the grid's reconfigure event.  Adds the checkbox header if the columns have been reconfigured.     * @private     * @param {Ext.panel.Table} grid     * @param {Ext.data.Store} store     * @param {Object[]} columns     */    onReconfigure: function(grid, store, columns) {        if(columns) {            this.addCheckbox(this.views[0]);        }    },<span id='Ext-selection-CheckboxModel-method-toggleUiHeader'>    /**</span>     * Toggle the ui header between checked and unchecked state.     * @param {Boolean} isChecked     * @private     */    toggleUiHeader: function(isChecked) {        var view     = this.views[0],            headerCt = view.headerCt,            checkHd  = headerCt.child('gridcolumn[isCheckerHd]');        if (checkHd) {            if (isChecked) {                checkHd.el.addCls(this.checkerOnCls);            } else {                checkHd.el.removeCls(this.checkerOnCls);            }        }    },<span id='Ext-selection-CheckboxModel-method-onHeaderClick'>    /**</span>     * Toggle between selecting all and deselecting all when clicking on     * a checkbox header.     */    onHeaderClick: function(headerCt, header, e) {        if (header.isCheckerHd) {            e.stopEvent();            var me = this,                isChecked = header.el.hasCls(Ext.baseCSSPrefix + 'grid-hd-checker-on');                            // Prevent focus changes on the view, since we're selecting/deselecting all records            me.preventFocus = true;            if (isChecked) {                me.deselectAll();            } else {                me.selectAll();            }            delete me.preventFocus;        }    },<span id='Ext-selection-CheckboxModel-method-getHeaderConfig'>    /**</span>     * Retrieve a configuration to be used in a HeaderContainer.     * This should be used when injectCheckbox is set to false.     */    getHeaderConfig: function() {        var me = this,            showCheck = me.showHeaderCheckbox !== false;        return {            isCheckerHd: showCheck,            text : '&#160;',            width: me.headerWidth,            sortable: false,            draggable: false,            resizable: false,            hideable: false,            menuDisabled: true,            dataIndex: '',            cls: showCheck ? Ext.baseCSSPrefix + 'column-header-checkbox ' : '',            renderer: Ext.Function.bind(me.renderer, me),            editRenderer: me.editRenderer || me.renderEmpty,            locked: me.hasLockedHeader()        };    },        renderEmpty: function(){        return '&#160;';        },<span id='Ext-selection-CheckboxModel-method-renderer'>    /**</span>     * Generates the HTML to be rendered in the injected checkbox column for each row.     * Creates the standard checkbox markup by default; can be overridden to provide custom rendering.     * See {@link Ext.grid.column.Column#renderer} for description of allowed parameters.     */    renderer: function(value, metaData, record, rowIndex, colIndex, store, view) {        var baseCSSPrefix = Ext.baseCSSPrefix;        metaData.tdCls = baseCSSPrefix + 'grid-cell-special ' + baseCSSPrefix + 'grid-cell-row-checker';        return '<div class="' + baseCSSPrefix + 'grid-row-checker">&#160;</div>';    },    // override    onRowMouseDown: function(view, record, item, index, e) {        view.el.focus();        var me = this,            checker = e.getTarget('.' + Ext.baseCSSPrefix + 'grid-row-checker'),            mode;                    if (!me.allowRightMouseSelection(e)) {            return;        }        // checkOnly set, but we didn't click on a checker.        if (me.checkOnly && !checker) {            return;        }        if (checker) {            mode = me.getSelectionMode();            // dont change the mode if its single otherwise            // we would get multiple selection            if (mode !== 'SINGLE') {                me.setSelectionMode('SIMPLE');            }            me.selectWithEvent(record, e);            me.setSelectionMode(mode);        } else {            me.selectWithEvent(record, e);        }    },<span id='Ext-selection-CheckboxModel-method-onSelectChange'>    /**</span>     * Synchronize header checker value as selection changes.     * @private     */    onSelectChange: function() {        var me = this;        me.callParent(arguments);        me.updateHeaderState();    },<span id='Ext-selection-CheckboxModel-method-onStoreLoad'>    /**</span>     * @private     */    onStoreLoad: function() {        var me = this;        me.callParent(arguments);        me.updateHeaderState();    },<span id='Ext-selection-CheckboxModel-method-updateHeaderState'>    /**</span>     * @private     */    updateHeaderState: function() {        // check to see if all records are selected        var hdSelectStatus = this.selected.getCount() === this.store.getCount();        this.toggleUiHeader(hdSelectStatus);    }});</pre></body></html>
 |