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

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.menu.Item
  3.  * @extends Ext.menu.BaseItem
  4.  * A base class for all menu items that require menu-related functionality (like sub-menus) and are not static
  5.  * display items.  Item extends the base functionality of {@link Ext.menu.BaseItem} by adding menu-specific
  6.  * activation and click handling.
  7.  * @constructor
  8.  * Creates a new Item
  9.  * @param {Object} config Configuration options
  10.  * @xtype menuitem
  11.  */
  12. Ext.menu.Item = Ext.extend(Ext.menu.BaseItem, {
  13.     /**
  14.      * @property menu
  15.      * @type Ext.menu.Menu
  16.      * The submenu associated with this Item if one was configured.
  17.      */
  18.     /**
  19.      * @cfg {Mixed} menu (optional) Either an instance of {@link Ext.menu.Menu} or the config object for an
  20.      * {@link Ext.menu.Menu} which acts as the submenu when this item is activated.
  21.      */
  22.     /**
  23.      * @cfg {String} icon The path to an icon to display in this item (defaults to Ext.BLANK_IMAGE_URL).  If
  24.      * icon is specified {@link #iconCls} should not be.
  25.      */
  26.     /**
  27.      * @cfg {String} iconCls A CSS class that specifies a background image that will be used as the icon for
  28.      * this item (defaults to '').  If iconCls is specified {@link #icon} should not be.
  29.      */
  30.     /**
  31.      * @cfg {String} text The text to display in this item (defaults to '').
  32.      */
  33.     /**
  34.      * @cfg {String} href The href attribute to use for the underlying anchor link (defaults to '#').
  35.      */
  36.     /**
  37.      * @cfg {String} hrefTarget The target attribute to use for the underlying anchor link (defaults to '').
  38.      */
  39.     /**
  40.      * @cfg {String} itemCls The default CSS class to use for menu items (defaults to 'x-menu-item')
  41.      */
  42.     itemCls : 'x-menu-item',
  43.     /**
  44.      * @cfg {Boolean} canActivate True if this item can be visually activated (defaults to true)
  45.      */
  46.     canActivate : true,
  47.     /**
  48.      * @cfg {Number} showDelay Length of time in milliseconds to wait before showing this item (defaults to 200)
  49.      */
  50.     showDelay: 200,
  51.     // doc'd in BaseItem
  52.     hideDelay: 200,
  53.     // private
  54.     ctype: 'Ext.menu.Item',
  55.     initComponent : function(){
  56.         Ext.menu.Item.superclass.initComponent.call(this);
  57.         if(this.menu){
  58.             this.menu = Ext.menu.MenuMgr.get(this.menu);
  59.             this.menu.ownerCt = this;
  60.         }
  61.     },
  62.     // private
  63.     onRender : function(container, position){
  64.         if (!this.itemTpl) {
  65.             this.itemTpl = Ext.menu.Item.prototype.itemTpl = new Ext.XTemplate(
  66.                 '<a id="{id}" class="{cls}" hidefocus="true" unselectable="on" href="{href}"',
  67.                     '<tpl if="hrefTarget">',
  68.                         ' target="{hrefTarget}"',
  69.                     '</tpl>',
  70.                  '>',
  71.                      '<img src="{icon}" class="x-menu-item-icon {iconCls}"/>',
  72.                      '<span class="x-menu-item-text">{text}</span>',
  73.                  '</a>'
  74.              );
  75.         }
  76.         var a = this.getTemplateArgs();
  77.         this.el = position ? this.itemTpl.insertBefore(position, a, true) : this.itemTpl.append(container, a, true);
  78.         this.iconEl = this.el.child('img.x-menu-item-icon');
  79.         this.textEl = this.el.child('.x-menu-item-text');
  80.         if(!this.href) { // if no link defined, prevent the default anchor event
  81.             this.mon(this.el, 'click', Ext.emptyFn, null, { preventDefault: true });
  82.         }
  83.         Ext.menu.Item.superclass.onRender.call(this, container, position);
  84.     },
  85.     getTemplateArgs: function() {
  86.         return {
  87.             id: this.id,
  88.             cls: this.itemCls + (this.menu ?  ' x-menu-item-arrow' : '') + (this.cls ?  ' ' + this.cls : ''),
  89.             href: this.href || '#',
  90.             hrefTarget: this.hrefTarget,
  91.             icon: this.icon || Ext.BLANK_IMAGE_URL,
  92.             iconCls: this.iconCls || '',
  93.             text: this.itemText||this.text||'&#160;'
  94.         };
  95.     },
  96.     /**
  97.      * Sets the text to display in this menu item
  98.      * @param {String} text The text to display
  99.      */
  100.     setText : function(text){
  101.         this.text = text||'&#160;';
  102.         if(this.rendered){
  103.             this.textEl.update(this.text);
  104.             this.parentMenu.layout.doAutoSize();
  105.         }
  106.     },
  107.     /**
  108.      * Sets the CSS class to apply to the item's icon element
  109.      * @param {String} cls The CSS class to apply
  110.      */
  111.     setIconClass : function(cls){
  112.         var oldCls = this.iconCls;
  113.         this.iconCls = cls;
  114.         if(this.rendered){
  115.             this.iconEl.replaceClass(oldCls, this.iconCls);
  116.         }
  117.     },
  118.     //private
  119.     beforeDestroy: function(){
  120.         if (this.menu){
  121.             delete this.menu.ownerCt;
  122.             this.menu.destroy();
  123.         }
  124.         Ext.menu.Item.superclass.beforeDestroy.call(this);
  125.     },
  126.     // private
  127.     handleClick : function(e){
  128.         if(!this.href){ // if no link defined, stop the event automatically
  129.             e.stopEvent();
  130.         }
  131.         Ext.menu.Item.superclass.handleClick.apply(this, arguments);
  132.     },
  133.     // private
  134.     activate : function(autoExpand){
  135.         if(Ext.menu.Item.superclass.activate.apply(this, arguments)){
  136.             this.focus();
  137.             if(autoExpand){
  138.                 this.expandMenu();
  139.             }
  140.         }
  141.         return true;
  142.     },
  143.     // private
  144.     shouldDeactivate : function(e){
  145.         if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){
  146.             if(this.menu && this.menu.isVisible()){
  147.                 return !this.menu.getEl().getRegion().contains(e.getPoint());
  148.             }
  149.             return true;
  150.         }
  151.         return false;
  152.     },
  153.     // private
  154.     deactivate : function(){
  155.         Ext.menu.Item.superclass.deactivate.apply(this, arguments);
  156.         this.hideMenu();
  157.     },
  158.     // private
  159.     expandMenu : function(autoActivate){
  160.         if(!this.disabled && this.menu){
  161.             clearTimeout(this.hideTimer);
  162.             delete this.hideTimer;
  163.             if(!this.menu.isVisible() && !this.showTimer){
  164.                 this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);
  165.             }else if (this.menu.isVisible() && autoActivate){
  166.                 this.menu.tryActivate(0, 1);
  167.             }
  168.         }
  169.     },
  170.     // private
  171.     deferExpand : function(autoActivate){
  172.         delete this.showTimer;
  173.         this.menu.show(this.container, this.parentMenu.subMenuAlign || 'tl-tr?', this.parentMenu);
  174.         if(autoActivate){
  175.             this.menu.tryActivate(0, 1);
  176.         }
  177.     },
  178.     // private
  179.     hideMenu : function(){
  180.         clearTimeout(this.showTimer);
  181.         delete this.showTimer;
  182.         if(!this.hideTimer && this.menu && this.menu.isVisible()){
  183.             this.hideTimer = this.deferHide.defer(this.hideDelay, this);
  184.         }
  185.     },
  186.     // private
  187.     deferHide : function(){
  188.         delete this.hideTimer;
  189.         if(this.menu.over){
  190.             this.parentMenu.setActiveItem(this, false);
  191.         }else{
  192.             this.menu.hide();
  193.         }
  194.     }
  195. });
  196. Ext.reg('menuitem', Ext.menu.Item);