3 * @class Ext.ux.TabScrollerMenu
5 * Plugin (ptype = 'tabscrollermenu') for adding a tab menu to a TabBar is the Tabs overflow.
7 * @param {Object} config Configuration options
8 * @ptype tabscrollermenu
10 Ext.define('Ext.ux.TabScrollerMenu', {
11 alias: 'plugin.tabscrollermenu',
13 uses: ['Ext.menu.Menu'],
16 * @cfg {Number} pageSize How many items to allow per submenu.
20 * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.
24 * @cfg {String} menuPrefixText Text to prefix the submenus.
26 menuPrefixText: 'Items',
27 constructor: function(config) {
28 config = config || {};
29 Ext.apply(this, config);
32 init: function(tabPanel) {
35 Ext.apply(tabPanel, me.parentOverrides);
36 me.tabPanel = tabPanel;
40 me.tabBar = tabPanel.tabBar;
41 me.layout = me.tabBar.layout;
42 me.layout.overflowHandler.handleOverflow = Ext.Function.bind(me.showButton, me);
43 me.layout.overflowHandler.clearOverflow = Ext.Function.createSequence(me.layout.overflowHandler.clearOverflow, me.hideButton, me);
49 showButton: function() {
51 result = Ext.getClass(me.layout.overflowHandler).prototype.handleOverflow.apply(me.layout.overflowHandler, arguments);
54 me.menuButton = me.tabBar.body.createChild({
55 cls: Ext.baseCSSPrefix + 'tab-tabmenu-right'
56 }, me.tabBar.body.child('.' + Ext.baseCSSPrefix + 'box-scroller-right'));
57 me.menuButton.addClsOnOver(Ext.baseCSSPrefix + 'tab-tabmenu-over');
58 me.menuButton.on('click', me.showTabsMenu, me);
61 result.targetSize.width -= me.menuButton.getWidth();
65 hideButton: function() {
73 * Returns an the current page size (this.pageSize);
74 * @return {Number} this.pageSize The current page size.
76 getPageSize: function() {
80 * Sets the number of menu items per submenu "page size".
81 * @param {Number} pageSize The page size
83 setPageSize: function(pageSize) {
84 this.pageSize = pageSize;
87 * Returns the current maxText length;
88 * @return {Number} this.maxText The current max text length.
90 getMaxText: function() {
94 * Sets the maximum text size for each menu item.
95 * @param {Number} t The max text per each menu item.
97 setMaxText: function(t) {
101 * Returns the current menu prefix text String.;
102 * @return {String} this.menuPrefixText The current menu prefix text.
104 getMenuPrefixText: function() {
105 return this.menuPrefixText;
108 * Sets the menu prefix text String.
109 * @param {String} t The menu prefix text.
111 setMenuPrefixText: function(t) {
112 this.menuPrefixText = t;
115 showTabsMenu: function(e) {
119 me.tabsMenu.removeAll();
121 me.tabsMenu = Ext.create('Ext.menu.Menu');
122 me.tabPanel.on('destroy', me.tabsMenu.destroy, me.tabsMenu);
125 me.generateTabMenuItems();
127 var target = Ext.get(e.getTarget());
128 var xy = target.getXY();
130 //Y param + 24 pixels
133 me.tabsMenu.showAt(xy);
137 generateTabMenuItems: function() {
139 tabPanel = me.tabPanel,
140 curActive = tabPanel.getActiveTab(),
141 totalItems = tabPanel.items.getCount(),
142 pageSize = me.getPageSize(),
143 numSubMenus = Math.floor(totalItems / pageSize),
144 remainder = totalItems % pageSize,
145 i, curPage, menuItems, x, item, start, index;
147 if (totalItems > pageSize) {
149 // Loop through all of the items and create submenus in chunks of 10
150 for (i = 0; i < numSubMenus; i++) {
151 curPage = (i + 1) * pageSize;
154 for (x = 0; x < pageSize; x++) {
155 index = x + curPage - pageSize;
156 item = tabPanel.items.get(index);
157 menuItems.push(me.autoGenMenuItem(item));
161 text: me.getMenuPrefixText() + ' ' + (curPage - pageSize + 1) + ' - ' + curPage,
167 start = numSubMenus * pageSize;
169 for (i = start; i < totalItems; i++) {
170 item = tabPanel.items.get(i);
171 menuItems.push(me.autoGenMenuItem(item));
175 text: me.menuPrefixText + ' ' + (start + 1) + ' - ' + (start + menuItems.length),
182 tabPanel.items.each(function(item) {
183 if (item.id != curActive.id && !item.hidden) {
184 me.tabsMenu.add(me.autoGenMenuItem(item));
191 autoGenMenuItem: function(item) {
192 var maxText = this.getMaxText(),
193 text = Ext.util.Format.ellipsis(item.title, maxText);
197 handler: this.showTabFromMenu,
199 disabled: item.disabled,
201 iconCls: item.iconCls
206 showTabFromMenu: function(menuItem) {
207 this.tabPanel.setActiveTab(menuItem.tabToShow);