| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | Ext.ns('Ext.ux');/** * @class Ext.ux.TabScrollerMenu * @extends Object * Plugin (ptype = 'tabscrollermenu') for adding a tab menu to a TabBar is the Tabs overflow. * @constructor * @param {Object} config Configuration options * @ptype tabscrollermenu */Ext.define('Ext.ux.TabScrollerMenu', {    alias: 'plugin.tabscrollermenu',    requires: ['Ext.menu.Menu'],    /**     * @cfg {Number} pageSize How many items to allow per submenu.     */    pageSize: 10,    /**     * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.     */    maxText: 15,    /**     * @cfg {String} menuPrefixText Text to prefix the submenus.     */    menuPrefixText: 'Items',    constructor: function(config) {        Ext.apply(this, config);    },        //private    init: function(tabPanel) {        var me = this;        me.tabPanel = tabPanel;        tabPanel.on({            render: function() {                me.tabBar = tabPanel.tabBar;                me.layout = me.tabBar.layout;                me.layout.overflowHandler.handleOverflow = Ext.Function.bind(me.showButton, me);                me.layout.overflowHandler.clearOverflow = Ext.Function.createSequence(me.layout.overflowHandler.clearOverflow, me.hideButton, me);            },            single: true        });    },    showButton: function() {        var me = this,            result = Ext.getClass(me.layout.overflowHandler).prototype.handleOverflow.apply(me.layout.overflowHandler, arguments);        if (!me.menuButton) {            me.menuButton = me.tabBar.body.createChild({                cls: Ext.baseCSSPrefix + 'tab-tabmenu-right'            }, me.tabBar.body.child('.' + Ext.baseCSSPrefix + 'box-scroller-right'));            me.menuButton.addClsOnOver(Ext.baseCSSPrefix + 'tab-tabmenu-over');            me.menuButton.on('click', me.showTabsMenu, me);        }        me.menuButton.show();        result.reservedSpace += me.menuButton.getWidth();        return result;    },    hideButton: function() {        var me = this;        if (me.menuButton) {            me.menuButton.hide();        }    },    /**     * Returns an the current page size (this.pageSize);     * @return {Number} this.pageSize The current page size.     */    getPageSize: function() {        return this.pageSize;    },    /**     * Sets the number of menu items per submenu "page size".     * @param {Number} pageSize The page size     */    setPageSize: function(pageSize) {        this.pageSize = pageSize;    },    /**     * Returns the current maxText length;     * @return {Number} this.maxText The current max text length.     */    getMaxText: function() {        return this.maxText;    },    /**     * Sets the maximum text size for each menu item.     * @param {Number} t The max text per each menu item.     */    setMaxText: function(t) {        this.maxText = t;    },    /**     * Returns the current menu prefix text String.;     * @return {String} this.menuPrefixText The current menu prefix text.     */    getMenuPrefixText: function() {        return this.menuPrefixText;    },    /**     * Sets the menu prefix text String.     * @param {String} t The menu prefix text.     */    setMenuPrefixText: function(t) {        this.menuPrefixText = t;    },    showTabsMenu: function(e) {        var me = this;        if (me.tabsMenu) {            me.tabsMenu.removeAll();        } else {            me.tabsMenu = new Ext.menu.Menu();            me.tabPanel.on('destroy', me.tabsMenu.destroy, me.tabsMenu);        }        me.generateTabMenuItems();        var target = Ext.get(e.getTarget()),            xy = target.getXY();        //Y param + 24 pixels        xy[1] += 24;        me.tabsMenu.showAt(xy);    },    // private    generateTabMenuItems: function() {        var me = this,            tabPanel = me.tabPanel,            curActive = tabPanel.getActiveTab(),            allItems = tabPanel.items.getRange(),            pageSize = me.getPageSize(),            tabsMenu = me.tabsMenu,            totalItems, numSubMenus, remainder,            i, curPage, menuItems, x, item, start, index;                    tabsMenu.suspendLayouts();        allItems = Ext.Array.filter(allItems, function(item){            if (item.id == curActive.id) {                return false;            }            return item.hidden ? !!item.hiddenByLayout : true;        });        totalItems = allItems.length;        numSubMenus = Math.floor(totalItems / pageSize);        remainder = totalItems % pageSize;        if (totalItems > pageSize) {            // Loop through all of the items and create submenus in chunks of 10            for (i = 0; i < numSubMenus; i++) {                curPage = (i + 1) * pageSize;                menuItems = [];                for (x = 0; x < pageSize; x++) {                    index = x + curPage - pageSize;                    item = allItems[index];                    menuItems.push(me.autoGenMenuItem(item));                }                tabsMenu.add({                    text: me.getMenuPrefixText() + ' ' + (curPage - pageSize + 1) + ' - ' + curPage,                    menu: menuItems                });            }            // remaining items            if (remainder > 0) {                start = numSubMenus * pageSize;                menuItems = [];                for (i = start; i < totalItems; i++) {                    item = allItems[i];                    menuItems.push(me.autoGenMenuItem(item));                }                me.tabsMenu.add({                    text: me.menuPrefixText + ' ' + (start + 1) + ' - ' + (start + menuItems.length),                    menu: menuItems                });            }        } else {            for (i = 0; i < totalItems; ++i) {                tabsMenu.add(me.autoGenMenuItem(allItems[i]));            }        }        tabsMenu.resumeLayouts(true);    },    // private    autoGenMenuItem: function(item) {        var maxText = this.getMaxText(),            text = Ext.util.Format.ellipsis(item.title, maxText);        return {            text: text,            handler: this.showTabFromMenu,            scope: this,            disabled: item.disabled,            tabToShow: item,            iconCls: item.iconCls        };    },    // private    showTabFromMenu: function(menuItem) {        this.tabPanel.setActiveTab(menuItem.tabToShow);    }});
 |