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

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.namespace('Ext.ux.menu');
  2. /** 
  3.  * @class Ext.ux.menu.ListMenu
  4.  * @extends Ext.menu.Menu
  5.  * This is a supporting class for {@link Ext.ux.grid.filter.ListFilter}.
  6.  * Although not listed as configuration options for this class, this class
  7.  * also accepts all configuration options from {@link Ext.ux.grid.filter.ListFilter}.
  8.  */
  9. Ext.ux.menu.ListMenu = Ext.extend(Ext.menu.Menu, {
  10.     /**
  11.      * @cfg {String} labelField
  12.      * Defaults to 'text'.
  13.      */
  14.     labelField :  'text',
  15.     /**
  16.      * @cfg {String} paramPrefix
  17.      * Defaults to 'Loading...'.
  18.      */
  19.     loadingText : 'Loading...',
  20.     /**
  21.      * @cfg {Boolean} loadOnShow
  22.      * Defaults to true.
  23.      */
  24.     loadOnShow : true,
  25.     /**
  26.      * @cfg {Boolean} single
  27.      * Specify true to group all items in this list into a single-select
  28.      * radio button group. Defaults to false.
  29.      */
  30.     single : false,
  31.     constructor : function (cfg) {
  32.         this.selected = [];
  33.         this.addEvents(
  34.             /**
  35.              * @event checkchange
  36.              * Fires when there is a change in checked items from this list
  37.              * @param {Object} item Ext.menu.CheckItem
  38.              * @param {Object} checked The checked value that was set
  39.              */
  40.             'checkchange'
  41.         );
  42.       
  43.         Ext.ux.menu.ListMenu.superclass.constructor.call(this, cfg = cfg || {});
  44.     
  45.         if(!cfg.store && cfg.options){
  46.             var options = [];
  47.             for(var i=0, len=cfg.options.length; i<len; i++){
  48.                 var value = cfg.options[i];
  49.                 switch(Ext.type(value)){
  50.                     case 'array':  options.push(value); break;
  51.                     case 'object': options.push([value.id, value[this.labelField]]); break;
  52.                     case 'string': options.push([value, value]); break;
  53.                 }
  54.             }
  55.             
  56.             this.store = new Ext.data.Store({
  57.                 reader: new Ext.data.ArrayReader({id: 0}, ['id', this.labelField]),
  58.                 data:   options,
  59.                 listeners: {
  60.                     'load': this.onLoad,
  61.                     scope:  this
  62.                 }
  63.             });
  64.             this.loaded = true;
  65.         } else {
  66.             this.add({text: this.loadingText, iconCls: 'loading-indicator'});
  67.             this.store.on('load', this.onLoad, this);
  68.         }
  69.     },
  70.     destroy : function () {
  71.         if (this.store) {
  72.             this.store.destroy();    
  73.         }
  74.         Ext.ux.menu.ListMenu.superclass.destroy.call(this);
  75.     },
  76.     /**
  77.      * Lists will initially show a 'loading' item while the data is retrieved from the store.
  78.      * In some cases the loaded data will result in a list that goes off the screen to the
  79.      * right (as placement calculations were done with the loading item). This adapter will
  80.      * allow show to be called with no arguments to show with the previous arguments and
  81.      * thus recalculate the width and potentially hang the menu from the left.
  82.      */
  83.     show : function () {
  84.         var lastArgs = null;
  85.         return function(){
  86.             if(arguments.length === 0){
  87.                 Ext.ux.menu.ListMenu.superclass.show.apply(this, lastArgs);
  88.             } else {
  89.                 lastArgs = arguments;
  90.                 if (this.loadOnShow && !this.loaded) {
  91.                     this.store.load();
  92.                 }
  93.                 Ext.ux.menu.ListMenu.superclass.show.apply(this, arguments);
  94.             }
  95.         };
  96.     }(),
  97.     
  98.     /** @private */
  99.     onLoad : function (store, records) {
  100.         var visible = this.isVisible();
  101.         this.hide(false);
  102.         
  103.         this.removeAll(true);
  104.         
  105.         var gid = this.single ? Ext.id() : null;
  106.         for(var i=0, len=records.length; i<len; i++){
  107.             var item = new Ext.menu.CheckItem({
  108.                 text:    records[i].get(this.labelField), 
  109.                 group:   gid,
  110.                 checked: this.selected.indexOf(records[i].id) > -1,
  111.                 hideOnClick: false});
  112.             
  113.             item.itemId = records[i].id;
  114.             item.on('checkchange', this.checkChange, this);
  115.                         
  116.             this.add(item);
  117.         }
  118.         
  119.         this.loaded = true;
  120.         
  121.         if (visible) {
  122.             this.show();
  123.         }
  124.         this.fireEvent('load', this, records);
  125.     },
  126.     /**
  127.      * Get the selected items.
  128.      * @return {Array} selected
  129.      */
  130.     getSelected : function () {
  131.         return this.selected;
  132.     },
  133.     
  134.     /** @private */
  135.     setSelected : function (value) {
  136.         value = this.selected = [].concat(value);
  137.         if (this.loaded) {
  138.             this.items.each(function(item){
  139.                 item.setChecked(false, true);
  140.                 for (var i = 0, len = value.length; i < len; i++) {
  141.                     if (item.itemId == value[i]) {
  142.                         item.setChecked(true, true);
  143.                     }
  144.                 }
  145.             }, this);
  146.         }
  147.     },
  148.     
  149.     /**
  150.      * Handler for the 'checkchange' event from an check item in this menu
  151.      * @param {Object} item Ext.menu.CheckItem
  152.      * @param {Object} checked The checked value that was set
  153.      */
  154.     checkChange : function (item, checked) {
  155.         var value = [];
  156.         this.items.each(function(item){
  157.             if (item.checked) {
  158.                 value.push(item.itemId);
  159.             }
  160.         },this);
  161.         this.selected = value;
  162.         
  163.         this.fireEvent('checkchange', item, checked);
  164.     }    
  165. });