]>
git.proxmox.com Git - extjs.git/blob - extjs/packages/ux/classic/src/TabScrollerMenu.js
3 * Plugin for adding a tab menu to a TabBar is the Tabs overflow.
5 Ext
.define('Ext.ux.TabScrollerMenu', {
6 alias
: 'plugin.tabscrollermenu',
8 requires
: ['Ext.menu.Menu'],
11 * @cfg {Number} pageSize How many items to allow per submenu.
15 * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.
19 * @cfg {String} menuPrefixText Text to prefix the submenus.
21 menuPrefixText
: 'Items',
24 * Creates new TabScrollerMenu.
25 * @param {Object} config Configuration options
27 constructor: function(config
) {
28 Ext
.apply(this, config
);
34 init: function(tabPanel
) {
37 me
.tabPanel
= tabPanel
;
41 me
.tabBar
= tabPanel
.tabBar
;
42 me
.layout
= me
.tabBar
.layout
;
43 me
.layout
.overflowHandler
.handleOverflow
= Ext
.Function
.bind(me
.showButton
, me
);
44 me
.layout
.overflowHandler
.clearOverflow
= Ext
.Function
.createSequence(me
.layout
.overflowHandler
.clearOverflow
, me
.hideButton
, me
);
52 showButton: function() {
54 result
= Ext
.getClass(me
.layout
.overflowHandler
).prototype.handleOverflow
.apply(me
.layout
.overflowHandler
, arguments
),
55 button
= me
.menuButton
;
57 if (me
.tabPanel
.items
.getCount() > 1) {
59 button
= me
.menuButton
= me
.tabBar
.body
.createChild({
60 cls
: Ext
.baseCSSPrefix
+ 'tab-tabmenu-right'
61 }, me
.tabBar
.body
.child('.' + Ext
.baseCSSPrefix
+ 'box-scroller-right'));
62 button
.addClsOnOver(Ext
.baseCSSPrefix
+ 'tab-tabmenu-over');
63 button
.on('click', me
.showTabsMenu
, me
);
65 button
.setVisibilityMode(Ext
.dom
.Element
.DISPLAY
);
67 result
.reservedSpace
+= button
.getWidth();
74 hideButton: function() {
82 * Returns an the current page size (this.pageSize);
83 * @return {Number} this.pageSize The current page size.
85 getPageSize: function() {
89 * Sets the number of menu items per submenu "page size".
90 * @param {Number} pageSize The page size
92 setPageSize: function(pageSize
) {
93 this.pageSize
= pageSize
;
96 * Returns the current maxText length;
97 * @return {Number} this.maxText The current max text length.
99 getMaxText: function() {
103 * Sets the maximum text size for each menu item.
104 * @param {Number} t The max text per each menu item.
106 setMaxText: function(t
) {
110 * Returns the current menu prefix text String.;
111 * @return {String} this.menuPrefixText The current menu prefix text.
113 getMenuPrefixText: function() {
114 return this.menuPrefixText
;
117 * Sets the menu prefix text String.
118 * @param {String} t The menu prefix text.
120 setMenuPrefixText: function(t
) {
121 this.menuPrefixText
= t
;
124 showTabsMenu: function(e
) {
128 me
.tabsMenu
.removeAll();
130 me
.tabsMenu
= new Ext
.menu
.Menu();
133 me
.generateTabMenuItems();
135 var target
= Ext
.get(e
.getTarget()),
138 //Y param + 24 pixels
141 me
.tabsMenu
.showAt(xy
);
147 generateTabMenuItems: function() {
149 tabPanel
= me
.tabPanel
,
150 curActive
= tabPanel
.getActiveTab(),
151 allItems
= tabPanel
.items
.getRange(),
152 pageSize
= me
.getPageSize(),
153 tabsMenu
= me
.tabsMenu
,
154 totalItems
, numSubMenus
, remainder
,
155 i
, curPage
, menuItems
, x
, item
, start
, index
;
157 tabsMenu
.suspendLayouts();
158 allItems
= Ext
.Array
.filter(allItems
, function(item
){
159 if (item
.id
== curActive
.id
) {
162 return item
.hidden
? !!item
.hiddenByLayout
: true;
164 totalItems
= allItems
.length
;
165 numSubMenus
= Math
.floor(totalItems
/ pageSize
);
166 remainder
= totalItems
% pageSize
;
168 if (totalItems
> pageSize
) {
170 // Loop through all of the items and create submenus in chunks of 10
171 for (i
= 0; i
< numSubMenus
; i
++) {
172 curPage
= (i
+ 1) * pageSize
;
175 for (x
= 0; x
< pageSize
; x
++) {
176 index
= x
+ curPage
- pageSize
;
177 item
= allItems
[index
];
178 menuItems
.push(me
.autoGenMenuItem(item
));
182 text
: me
.getMenuPrefixText() + ' ' + (curPage
- pageSize
+ 1) + ' - ' + curPage
,
188 start
= numSubMenus
* pageSize
;
190 for (i
= start
; i
< totalItems
; i
++) {
192 menuItems
.push(me
.autoGenMenuItem(item
));
196 text
: me
.menuPrefixText
+ ' ' + (start
+ 1) + ' - ' + (start
+ menuItems
.length
),
202 for (i
= 0; i
< totalItems
; ++i
) {
203 tabsMenu
.add(me
.autoGenMenuItem(allItems
[i
]));
206 tabsMenu
.resumeLayouts(true);
212 autoGenMenuItem: function(item
) {
213 var maxText
= this.getMaxText(),
214 text
= Ext
.util
.Format
.ellipsis(item
.title
, maxText
);
218 handler
: this.showTabFromMenu
,
220 disabled
: item
.disabled
,
222 iconCls
: item
.iconCls
229 showTabFromMenu: function(menuItem
) {
230 this.tabPanel
.setActiveTab(menuItem
.tabToShow
);
234 Ext
.destroy(this.tabsMenu
, this.menuButton
);