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

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.SplitButton
  3.  * @extends Ext.Button
  4.  * A split button that provides a built-in dropdown arrow that can fire an event separately from the default
  5.  * click event of the button.  Typically this would be used to display a dropdown menu that provides additional
  6.  * options to the primary button action, but any custom handler can provide the arrowclick implementation.  Example usage:
  7.  * <pre><code>
  8. // display a dropdown menu:
  9. new Ext.SplitButton({
  10. renderTo: 'button-ct', // the container id
  11.     text: 'Options',
  12.     handler: optionsHandler, // handle a click on the button itself
  13.     menu: new Ext.menu.Menu({
  14.         items: [
  15.          // these items will render as dropdown menu items when the arrow is clicked:
  16.         {text: 'Item 1', handler: item1Handler},
  17.         {text: 'Item 2', handler: item2Handler}
  18.         ]
  19.     })
  20. });
  21. // Instead of showing a menu, you provide any type of custom
  22. // functionality you want when the dropdown arrow is clicked:
  23. new Ext.SplitButton({
  24. renderTo: 'button-ct',
  25.     text: 'Options',
  26.     handler: optionsHandler,
  27.     arrowHandler: myCustomHandler
  28. });
  29. </code></pre>
  30.  * @cfg {Function} arrowHandler A function called when the arrow button is clicked (can be used instead of click event)
  31.  * @cfg {String} arrowTooltip The title attribute of the arrow
  32.  * @constructor
  33.  * Create a new menu button
  34.  * @param {Object} config The config object
  35.  * @xtype splitbutton
  36.  */
  37. Ext.SplitButton = Ext.extend(Ext.Button, {
  38. // private
  39.     arrowSelector : 'em',
  40.     split: true,
  41.     // private
  42.     initComponent : function(){
  43.         Ext.SplitButton.superclass.initComponent.call(this);
  44.         /**
  45.          * @event arrowclick
  46.          * Fires when this button's arrow is clicked
  47.          * @param {MenuButton} this
  48.          * @param {EventObject} e The click event
  49.          */
  50.         this.addEvents("arrowclick");
  51.     },
  52.     // private
  53.     onRender : function(){
  54.         Ext.SplitButton.superclass.onRender.apply(this, arguments);
  55.         if(this.arrowTooltip){
  56.             this.el.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;
  57.         }
  58.     },
  59.     /**
  60.      * Sets this button's arrow click handler.
  61.      * @param {Function} handler The function to call when the arrow is clicked
  62.      * @param {Object} scope (optional) Scope for the function passed above
  63.      */
  64.     setArrowHandler : function(handler, scope){
  65.         this.arrowHandler = handler;
  66.         this.scope = scope;
  67.     },
  68.     getMenuClass : function(){
  69.         return 'x-btn-split' + (this.arrowAlign == 'bottom' ? '-bottom' : '');
  70.     },
  71.     isClickOnArrow : function(e){
  72. if (this.arrowAlign != 'bottom') {
  73.     var visBtn = this.el.child('em.x-btn-split');
  74.     var right = visBtn.getRegion().right - visBtn.getPadding('r');
  75.     return e.getPageX() > right;
  76. } else {
  77.     return e.getPageY() > this.btnEl.getRegion().bottom;
  78. }
  79.     },
  80.     // private
  81.     onClick : function(e, t){
  82.         e.preventDefault();
  83.         if(!this.disabled){
  84.             if(this.isClickOnArrow(e)){
  85.                 if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){
  86.                     this.showMenu();
  87.                 }
  88.                 this.fireEvent("arrowclick", this, e);
  89.                 if(this.arrowHandler){
  90.                     this.arrowHandler.call(this.scope || this, this, e);
  91.                 }
  92.             }else{
  93.                 if(this.enableToggle){
  94.                     this.toggle();
  95.                 }
  96.                 this.fireEvent("click", this, e);
  97.                 if(this.handler){
  98.                     this.handler.call(this.scope || this, this, e);
  99.                 }
  100.             }
  101.         }
  102.     },
  103.     // private
  104.     isMenuTriggerOver : function(e){
  105.         return this.menu && e.target.tagName == this.arrowSelector;
  106.     },
  107.     // private
  108.     isMenuTriggerOut : function(e, internal){
  109.         return this.menu && e.target.tagName != this.arrowSelector;
  110.     }
  111. });
  112. Ext.reg('splitbutton', Ext.SplitButton);