| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 | <!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-button-Cycle'>/**</span> * A specialized SplitButton that contains a menu of {@link Ext.menu.CheckItem} elements. The button automatically * cycles through each menu item on click, raising the button's {@link #change} event (or calling the button's * {@link #changeHandler} function, if supplied) for the active menu item. Clicking on the arrow section of the * button displays the dropdown menu just like a normal SplitButton.  Example usage: * *     @example *     Ext.create('Ext.button.Cycle', { *         showText: true, *         prependText: 'View as ', *         renderTo: Ext.getBody(), *         menu: { *             id: 'view-type-menu', *             items: [{ *                 text: 'text only', *                 iconCls: 'view-text', *                 checked: true *             },{ *                 text: 'HTML', *                 iconCls: 'view-html' *             }] *         }, *         changeHandler: function(cycleBtn, activeItem) { *             Ext.Msg.alert('Change View', activeItem.text); *         } *     }); */Ext.define('Ext.button.Cycle', {    /* Begin Definitions */    alias: 'widget.cycle',    extend: 'Ext.button.Split',    alternateClassName: 'Ext.CycleButton',    /* End Definitions */<span id='Ext-button-Cycle-cfg-items'>    /**</span>     * @cfg {Object[]} items     * An array of {@link Ext.menu.CheckItem} **config** objects to be used when creating the button's menu items (e.g.,     * `{text:'Foo', iconCls:'foo-icon'}`)     *      * @deprecated 4.0 Use the {@link #cfg-menu} config instead. All menu items will be created as     * {@link Ext.menu.CheckItem CheckItems}.     */<span id='Ext-button-Cycle-cfg-showText'>    /**</span>     * @cfg {Boolean} [showText=false]     * True to display the active item's text as the button text. The Button will show its     * configured {@link #text} if this config is omitted.     */<span id='Ext-button-Cycle-cfg-prependText'>    /**</span>     * @cfg {String} [prependText='']     * A static string to prepend before the active item's text when displayed as the button's text (only applies when     * showText = true).     */<span id='Ext-button-Cycle-cfg-changeHandler'>    /**</span>     * @cfg {Function} changeHandler     * A callback function that will be invoked each time the active menu item in the button's menu has changed. If this     * callback is not supplied, the SplitButton will instead fire the {@link #change} event on active item change. The     * changeHandler function will be called with the following argument list: (SplitButton this, Ext.menu.CheckItem     * item)     */<span id='Ext-button-Cycle-cfg-forceIcon'>    /**</span>     * @cfg {String} forceIcon     * A css class which sets an image to be used as the static icon for this button. This icon will always be displayed     * regardless of which item is selected in the dropdown list. This overrides the default behavior of changing the     * button's icon to match the selected item's icon on change.     */<span id='Ext-button-Cycle-property-menu'>    /**</span>     * @property {Ext.menu.Menu} menu     * The {@link Ext.menu.Menu Menu} object used to display the {@link Ext.menu.CheckItem CheckItems} representing the     * available choices.     */    // private    getButtonText: function(item) {        var me = this,            text = '';        if (item && me.showText === true) {            if (me.prependText) {                text += me.prependText;            }            text += item.text;            return text;        }        return me.text;    },<span id='Ext-button-Cycle-method-setActiveItem'>    /**</span>     * Sets the button's active menu item.     * @param {Ext.menu.CheckItem} item The item to activate     * @param {Boolean} [suppressEvent=false] True to prevent the button's change event from firing.     */    setActiveItem: function(item, suppressEvent) {        var me = this;        if (!Ext.isObject(item)) {            item = me.menu.getComponent(item);        }        if (item) {            if (!me.rendered) {                me.text = me.getButtonText(item);                me.iconCls = item.iconCls;            } else {                me.setText(me.getButtonText(item));                me.setIconCls(item.iconCls);            }            me.activeItem = item;            if (!item.checked) {                item.setChecked(true, false);            }            if (me.forceIcon) {                me.setIconCls(me.forceIcon);            }            if (!suppressEvent) {                me.fireEvent('change', me, item);            }        }    },<span id='Ext-button-Cycle-method-getActiveItem'>    /**</span>     * Gets the currently active menu item.     * @return {Ext.menu.CheckItem} The active item     */    getActiveItem: function() {        return this.activeItem;    },    // private    initComponent: function() {        var me      = this,            checked = 0,            items,            i, iLen, item;        me.addEvents(<span id='Ext-button-Cycle-event-change'>            /**</span>             * @event change             * Fires after the button's active menu item has changed. Note that if a {@link #changeHandler} function is             * set on this CycleButton, it will be called instead on active item change and this change event will not             * be fired.             * @param {Ext.button.Cycle} this             * @param {Ext.menu.CheckItem} item The menu item that was selected             */            "change"        );        if (me.changeHandler) {            me.on('change', me.changeHandler, me.scope || me);            delete me.changeHandler;        }        // Allow them to specify a menu config which is a standard Button config.        // Remove direct use of "items" in 5.0.        items = (me.menu.items || []).concat(me.items || []);        me.menu = Ext.applyIf({            cls: Ext.baseCSSPrefix + 'cycle-menu',            items: []        }, me.menu);        iLen = items.length;        // Convert all items to CheckItems        for (i = 0; i < iLen; i++) {            item = items[i];            item = Ext.applyIf({                group        : me.id,                itemIndex    : i,                checkHandler : me.checkHandler,                scope        : me,                checked      : item.checked || false            }, item);            me.menu.items.push(item);            if (item.checked) {                checked = i;            }        }        me.itemCount = me.menu.items.length;        me.callParent(arguments);        me.on('click', me.toggleSelected, me);        me.setActiveItem(checked, me);        // If configured with a fixed width, the cycling will center a different child item's text each click. Prevent this.        if (me.width && me.showText) {            me.addCls(Ext.baseCSSPrefix + 'cycle-fixed-width');        }    },    // private    checkHandler: function(item, pressed) {        if (pressed) {            this.setActiveItem(item);        }    },<span id='Ext-button-Cycle-method-toggleSelected'>    /**</span>     * This is normally called internally on button click, but can be called externally to advance the button's active     * item programmatically to the next one in the menu. If the current item is the last one in the menu the active     * item will be set to the first item in the menu.     */    toggleSelected: function() {        var me = this,            m = me.menu,            checkItem;        checkItem = me.activeItem.next(':not([disabled])') || m.items.getAt(0);        checkItem.setChecked(true);    }});</pre></body></html>
 |