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

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.Action
  3.  * <p>An Action is a piece of reusable functionality that can be abstracted out of any particular component so that it
  4.  * can be usefully shared among multiple components.  Actions let you share handlers, configuration options and UI
  5.  * updates across any components that support the Action interface (primarily {@link Ext.Toolbar}, {@link Ext.Button}
  6.  * and {@link Ext.menu.Menu} components).</p>
  7.  * <p>Aside from supporting the config object interface, any component that needs to use Actions must also support
  8.  * the following method list, as these will be called as needed by the Action class: setText(string), setIconCls(string),
  9.  * setDisabled(boolean), setVisible(boolean) and setHandler(function).</p>
  10.  * Example usage:<br>
  11.  * <pre><code>
  12. // Define the shared action.  Each component below will have the same
  13. // display text and icon, and will display the same message on click.
  14. var action = new Ext.Action({
  15.     {@link #text}: 'Do something',
  16.     {@link #handler}: function(){
  17.         Ext.Msg.alert('Click', 'You did something.');
  18.     },
  19.     {@link #iconCls}: 'do-something',
  20.     {@link #itemId}: 'myAction'
  21. });
  22. var panel = new Ext.Panel({
  23.     title: 'Actions',
  24.     width: 500,
  25.     height: 300,
  26.     tbar: [
  27.         // Add the action directly to a toolbar as a menu button
  28.         action,
  29.         {
  30.             text: 'Action Menu',
  31.             // Add the action to a menu as a text item
  32.             menu: [action]
  33.         }
  34.     ],
  35.     items: [
  36.         // Add the action to the panel body as a standard button
  37.         new Ext.Button(action)
  38.     ],
  39.     renderTo: Ext.getBody()
  40. });
  41. // Change the text for all components using the action
  42. action.setText('Something else');
  43. // Reference an action through a container using the itemId
  44. var btn = panel.getComponent('myAction');
  45. var aRef = btn.baseAction;
  46. aRef.setText('New text');
  47. </code></pre>
  48.  * @constructor
  49.  * @param {Object} config The configuration options
  50.  */
  51. Ext.Action = Ext.extend(Object, {
  52.     /**
  53.      * @cfg {String} text The text to set for all components using this action (defaults to '').
  54.      */
  55.     /**
  56.      * @cfg {String} iconCls
  57.      * The CSS class selector that specifies a background image to be used as the header icon for
  58.      * all components using this action (defaults to '').
  59.      * <p>An example of specifying a custom icon class would be something like:
  60.      * </p><pre><code>
  61. // specify the property in the config for the class:
  62.      ...
  63.      iconCls: 'do-something'
  64. // css class that specifies background image to be used as the icon image:
  65. .do-something { background-image: url(../images/my-icon.gif) 0 6px no-repeat !important; }
  66. </code></pre>
  67.      */
  68.     /**
  69.      * @cfg {Boolean} disabled True to disable all components using this action, false to enable them (defaults to false).
  70.      */
  71.     /**
  72.      * @cfg {Boolean} hidden True to hide all components using this action, false to show them (defaults to false).
  73.      */
  74.     /**
  75.      * @cfg {Function} handler The function that will be invoked by each component tied to this action
  76.      * when the component's primary event is triggered (defaults to undefined).
  77.      */
  78.     /**
  79.      * @cfg {String} itemId
  80.      * See {@link Ext.Component}.{@link Ext.Component#itemId itemId}.
  81.      */
  82.     /**
  83.      * @cfg {Object} scope The scope (<tt><b>this</b></tt> reference) in which the
  84.      * <code>{@link #handler}</code> is executed. Defaults to this Button.
  85.      */
  86.     constructor : function(config){
  87.         this.initialConfig = config;
  88.         this.itemId = config.itemId = (config.itemId || config.id || Ext.id());
  89.         this.items = [];
  90.     },
  91.     
  92.     // private
  93.     isAction : true,
  94.     /**
  95.      * Sets the text to be displayed by all components using this action.
  96.      * @param {String} text The text to display
  97.      */
  98.     setText : function(text){
  99.         this.initialConfig.text = text;
  100.         this.callEach('setText', [text]);
  101.     },
  102.     /**
  103.      * Gets the text currently displayed by all components using this action.
  104.      */
  105.     getText : function(){
  106.         return this.initialConfig.text;
  107.     },
  108.     /**
  109.      * Sets the icon CSS class for all components using this action.  The class should supply
  110.      * a background image that will be used as the icon image.
  111.      * @param {String} cls The CSS class supplying the icon image
  112.      */
  113.     setIconClass : function(cls){
  114.         this.initialConfig.iconCls = cls;
  115.         this.callEach('setIconClass', [cls]);
  116.     },
  117.     /**
  118.      * Gets the icon CSS class currently used by all components using this action.
  119.      */
  120.     getIconClass : function(){
  121.         return this.initialConfig.iconCls;
  122.     },
  123.     /**
  124.      * Sets the disabled state of all components using this action.  Shortcut method
  125.      * for {@link #enable} and {@link #disable}.
  126.      * @param {Boolean} disabled True to disable the component, false to enable it
  127.      */
  128.     setDisabled : function(v){
  129.         this.initialConfig.disabled = v;
  130.         this.callEach('setDisabled', [v]);
  131.     },
  132.     /**
  133.      * Enables all components using this action.
  134.      */
  135.     enable : function(){
  136.         this.setDisabled(false);
  137.     },
  138.     /**
  139.      * Disables all components using this action.
  140.      */
  141.     disable : function(){
  142.         this.setDisabled(true);
  143.     },
  144.     /**
  145.      * Returns true if the components using this action are currently disabled, else returns false.  
  146.      */
  147.     isDisabled : function(){
  148.         return this.initialConfig.disabled;
  149.     },
  150.     /**
  151.      * Sets the hidden state of all components using this action.  Shortcut method
  152.      * for <code>{@link #hide}</code> and <code>{@link #show}</code>.
  153.      * @param {Boolean} hidden True to hide the component, false to show it
  154.      */
  155.     setHidden : function(v){
  156.         this.initialConfig.hidden = v;
  157.         this.callEach('setVisible', [!v]);
  158.     },
  159.     /**
  160.      * Shows all components using this action.
  161.      */
  162.     show : function(){
  163.         this.setHidden(false);
  164.     },
  165.     /**
  166.      * Hides all components using this action.
  167.      */
  168.     hide : function(){
  169.         this.setHidden(true);
  170.     },
  171.     /**
  172.      * Returns true if the components using this action are currently hidden, else returns false.  
  173.      */
  174.     isHidden : function(){
  175.         return this.initialConfig.hidden;
  176.     },
  177.     /**
  178.      * Sets the function that will be called by each Component using this action when its primary event is triggered.
  179.      * @param {Function} fn The function that will be invoked by the action's components.  The function
  180.      * will be called with no arguments.
  181.      * @param {Object} scope The scope (<code>this</code> reference) in which the function is executed. Defaults to the Component firing the event.
  182.      */
  183.     setHandler : function(fn, scope){
  184.         this.initialConfig.handler = fn;
  185.         this.initialConfig.scope = scope;
  186.         this.callEach('setHandler', [fn, scope]);
  187.     },
  188.     /**
  189.      * Executes the specified function once for each Component currently tied to this action.  The function passed
  190.      * in should accept a single argument that will be an object that supports the basic Action config/method interface.
  191.      * @param {Function} fn The function to execute for each component
  192.      * @param {Object} scope The scope (<code>this</code> reference) in which the function is executed.  Defaults to the Component.
  193.      */
  194.     each : function(fn, scope){
  195.         Ext.each(this.items, fn, scope);
  196.     },
  197.     // private
  198.     callEach : function(fnName, args){
  199.         var cs = this.items;
  200.         for(var i = 0, len = cs.length; i < len; i++){
  201.             cs[i][fnName].apply(cs[i], args);
  202.         }
  203.     },
  204.     // private
  205.     addComponent : function(comp){
  206.         this.items.push(comp);
  207.         comp.on('destroy', this.removeComponent, this);
  208.     },
  209.     // private
  210.     removeComponent : function(comp){
  211.         this.items.remove(comp);
  212.     },
  213.     /**
  214.      * Executes this action manually using the handler function specified in the original config object
  215.      * or the handler function set with <code>{@link #setHandler}</code>.  Any arguments passed to this
  216.      * function will be passed on to the handler function.
  217.      * @param {Mixed} arg1 (optional) Variable number of arguments passed to the handler function
  218.      * @param {Mixed} arg2 (optional)
  219.      * @param {Mixed} etc... (optional)
  220.      */
  221.     execute : function(){
  222.         this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);
  223.     }
  224. });