3 This file is part of Ext JS 4
5 Copyright (c) 2011 Sencha Inc
7 Contact: http://www.sencha.com/contact
9 GNU General Public License Usage
10 This file may be used under the terms of the GNU General Public License version 3.0 as published by the Free Software Foundation and appearing in the file LICENSE included in the packaging of this file. Please review the following information to ensure the GNU General Public License version 3.0 requirements will be met: http://www.gnu.org/copyleft/gpl.html.
12 If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact.
17 * @class Ext.ux.TabScrollerMenu
19 * Plugin (ptype = 'tabscrollermenu') for adding a tab menu to a TabBar is the Tabs overflow.
21 * @param {Object} config Configuration options
22 * @ptype tabscrollermenu
24 Ext.define('Ext.ux.TabScrollerMenu', {
25 alias: 'plugin.tabscrollermenu',
27 uses: ['Ext.menu.Menu'],
30 * @cfg {Number} pageSize How many items to allow per submenu.
34 * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.
38 * @cfg {String} menuPrefixText Text to prefix the submenus.
40 menuPrefixText: 'Items',
41 constructor: function(config) {
42 config = config || {};
43 Ext.apply(this, config);
46 init: function(tabPanel) {
49 Ext.apply(tabPanel, me.parentOverrides);
50 me.tabPanel = tabPanel;
54 me.tabBar = tabPanel.tabBar;
55 me.layout = me.tabBar.layout;
56 me.layout.overflowHandler.handleOverflow = Ext.Function.bind(me.showButton, me);
57 me.layout.overflowHandler.clearOverflow = Ext.Function.createSequence(me.layout.overflowHandler.clearOverflow, me.hideButton, me);
63 showButton: function() {
65 result = Ext.getClass(me.layout.overflowHandler).prototype.handleOverflow.apply(me.layout.overflowHandler, arguments);
68 me.menuButton = me.tabBar.body.createChild({
69 cls: Ext.baseCSSPrefix + 'tab-tabmenu-right'
70 }, me.tabBar.body.child('.' + Ext.baseCSSPrefix + 'box-scroller-right'));
71 me.menuButton.addClsOnOver(Ext.baseCSSPrefix + 'tab-tabmenu-over');
72 me.menuButton.on('click', me.showTabsMenu, me);
75 result.targetSize.width -= me.menuButton.getWidth();
79 hideButton: function() {
87 * Returns an the current page size (this.pageSize);
88 * @return {Number} this.pageSize The current page size.
90 getPageSize: function() {
94 * Sets the number of menu items per submenu "page size".
95 * @param {Number} pageSize The page size
97 setPageSize: function(pageSize) {
98 this.pageSize = pageSize;
101 * Returns the current maxText length;
102 * @return {Number} this.maxText The current max text length.
104 getMaxText: function() {
108 * Sets the maximum text size for each menu item.
109 * @param {Number} t The max text per each menu item.
111 setMaxText: function(t) {
115 * Returns the current menu prefix text String.;
116 * @return {String} this.menuPrefixText The current menu prefix text.
118 getMenuPrefixText: function() {
119 return this.menuPrefixText;
122 * Sets the menu prefix text String.
123 * @param {String} t The menu prefix text.
125 setMenuPrefixText: function(t) {
126 this.menuPrefixText = t;
129 showTabsMenu: function(e) {
133 me.tabsMenu.removeAll();
135 me.tabsMenu = Ext.create('Ext.menu.Menu');
136 me.tabPanel.on('destroy', me.tabsMenu.destroy, me.tabsMenu);
139 me.generateTabMenuItems();
141 var target = Ext.get(e.getTarget());
142 var xy = target.getXY();
144 //Y param + 24 pixels
147 me.tabsMenu.showAt(xy);
151 generateTabMenuItems: function() {
153 tabPanel = me.tabPanel,
154 curActive = tabPanel.getActiveTab(),
155 totalItems = tabPanel.items.getCount(),
156 pageSize = me.getPageSize(),
157 numSubMenus = Math.floor(totalItems / pageSize),
158 remainder = totalItems % pageSize,
159 i, curPage, menuItems, x, item, start, index;
161 if (totalItems > pageSize) {
163 // Loop through all of the items and create submenus in chunks of 10
164 for (i = 0; i < numSubMenus; i++) {
165 curPage = (i + 1) * pageSize;
168 for (x = 0; x < pageSize; x++) {
169 index = x + curPage - pageSize;
170 item = tabPanel.items.get(index);
171 menuItems.push(me.autoGenMenuItem(item));
175 text: me.getMenuPrefixText() + ' ' + (curPage - pageSize + 1) + ' - ' + curPage,
181 start = numSubMenus * pageSize;
183 for (i = start; i < totalItems; i++) {
184 item = tabPanel.items.get(i);
185 menuItems.push(me.autoGenMenuItem(item));
189 text: me.menuPrefixText + ' ' + (start + 1) + ' - ' + (start + menuItems.length),
196 tabPanel.items.each(function(item) {
197 if (item.id != curActive.id && !item.hidden) {
198 me.tabsMenu.add(me.autoGenMenuItem(item));
205 autoGenMenuItem: function(item) {
206 var maxText = this.getMaxText(),
207 text = Ext.util.Format.ellipsis(item.title, maxText);
211 handler: this.showTabFromMenu,
213 disabled: item.disabled,
215 iconCls: item.iconCls
220 showTabFromMenu: function(menuItem) {
221 this.tabPanel.setActiveTab(menuItem.tabToShow);