Upgrade to ExtJS 3.0.0 - Released 07/06/2009
[extjs.git] / docs / source / TabScrollerMenu.html
diff --git a/docs/source/TabScrollerMenu.html b/docs/source/TabScrollerMenu.html
new file mode 100644 (file)
index 0000000..ee70bf8
--- /dev/null
@@ -0,0 +1,189 @@
+<html>\r
+<head>\r
+  <title>The source code</title>\r
+    <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />\r
+    <script type="text/javascript" src="../resources/prettify/prettify.js"></script>\r
+</head>\r
+<body  onload="prettyPrint();">\r
+    <pre class="prettyprint lang-js">
+
+Ext.ux.TabScrollerMenu =  Ext.extend(Object, {
+       pageSize       : 10,
+       maxText        : 15,
+       menuPrefixText : 'Items',
+       constructor    : function(config) {
+               config = config || {};
+               Ext.apply(this, config);
+       },
+       init : function(tabPanel) {
+               Ext.apply(tabPanel, this.tabPanelMethods);
+               
+               tabPanel.tabScrollerMenu = this;
+               var thisRef = this;
+               
+               tabPanel.on({
+                       render : {
+                               scope  : tabPanel,
+                               single : true,
+                               fn     : function() { 
+                                       var newFn = tabPanel.createScrollers.createSequence(thisRef.createPanelsMenu, this);
+                                       tabPanel.createScrollers = newFn;
+                               }
+                       }
+               });
+       },
+       // private && sequeneced
+       createPanelsMenu : function() {
+               var h = this.stripWrap.dom.offsetHeight;
+               
+               //move the right menu item to the left 18px
+               var rtScrBtn = this.header.dom.firstChild;
+               Ext.fly(rtScrBtn).applyStyles({
+                       right : '18px'
+               });
+               
+               var stripWrap = Ext.get(this.strip.dom.parentNode);
+               stripWrap.applyStyles({
+                        'margin-right' : '36px'
+               });
+               
+               // Add the new righthand menu
+               var scrollMenu = this.header.insertFirst({
+                       cls:'x-tab-tabmenu-right'
+               });
+               scrollMenu.setHeight(h);
+               scrollMenu.addClassOnOver('x-tab-tabmenu-over');
+               scrollMenu.on('click', this.showTabsMenu, this);        
+               
+               this.scrollLeft.show = this.scrollLeft.show.createSequence(function() {
+                       scrollMenu.show();                                                                                                                                               
+               });
+               
+               this.scrollLeft.hide = this.scrollLeft.hide.createSequence(function() {
+                       scrollMenu.hide();                                                              
+               });
+               
+       },
+       // public
+       getPageSize : function() {
+               return this.pageSize;
+       },
+       // public
+       setPageSize : function(pageSize) {
+               this.pageSize = pageSize;
+       },
+       // public
+       getMaxText : function() {
+               return this.maxText;
+       },
+       // public
+       setMaxText : function(t) {
+               this.maxText = t;
+       },
+       getMenuPrefixText : function() {
+               return this.menuPrefixText;
+       },
+       setMenuPrefixText : function(t) {
+               this.menuPrefixText = t;
+       },
+       // private && applied to the tab panel itself.
+       tabPanelMethods : {
+               // all execute within the scope of the tab panel
+               // private      
+               showTabsMenu : function(e) {            
+                       if (! this.tabsMenu) {
+                               this.tabsMenu =  new Ext.menu.Menu();
+                               this.on('beforedestroy', this.tabsMenu.destroy, this.tabsMenu);
+                       }
+                       
+                       this.tabsMenu.removeAll();
+                       
+                       this.generateTabMenuItems();
+                       
+                       var target = Ext.get(e.getTarget());
+                       var xy     = target.getXY();
+                       
+                       //Y param + 24 pixels
+                       xy[1] += 24;
+                       
+                       this.tabsMenu.showAt(xy);
+               },
+               // private      
+               generateTabMenuItems : function() {
+                       var curActive  = this.getActiveTab();
+                       var totalItems = this.items.getCount();
+                       var pageSize   = this.tabScrollerMenu.getPageSize();
+                       
+                       
+                       if (totalItems > pageSize)  {
+                               var numSubMenus = Math.floor(totalItems / pageSize);
+                               var remainder   = totalItems % pageSize;
+                               
+                               // Loop through all of the items and create submenus in chunks of 10
+                               for (var i = 0 ; i < numSubMenus; i++) {
+                                       var curPage = (i + 1) * pageSize;
+                                       var menuItems = [];
+                                       
+                                       
+                                       for (var x = 0; x < pageSize; x++) {                            
+                                               index = x + curPage - pageSize;
+                                               var item = this.items.get(index);
+                                               menuItems.push(this.autoGenMenuItem(item));
+                                       }
+                                       
+                                       this.tabsMenu.add({
+                                               text : this.tabScrollerMenu.getMenuPrefixText() + ' '  + (curPage - pageSize + 1) + ' - ' + curPage,
+                                               menu : menuItems
+                                       });
+                                       
+                               }
+                               // remaining items
+                               if (remainder > 0) {
+                                       var start = numSubMenus * pageSize;
+                                       menuItems = [];
+                                       for (var i = start ; i < totalItems; i ++ ) {                                   
+                                               var item = this.items.get(i);
+                                               menuItems.push(this.autoGenMenuItem(item));
+                                       }
+                                       
+                                       
+                                       this.tabsMenu.add({
+                                               text : this.tabScrollerMenu.menuPrefixText  + ' ' + (start + 1) + ' - ' + (start + menuItems.length),
+                                               menu : menuItems
+                                       });
+                                       
+
+                               }
+                       }
+                       else {
+                               this.items.each(function(item) {
+                                       if (item.id != curActive.id && ! item.hidden) {
+                                               menuItems.push(this.autoGenMenuItem(item));
+                                       }
+                               }, this);
+                       }       
+               },
+               // private
+               autoGenMenuItem : function(item) {
+                       var maxText = this.tabScrollerMenu.getMaxText();
+                       var 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.setActiveTab(menuItem.tabToShow);
+               }       
+       }       
+});
+</pre>    \r
+</body>\r
+</html>
\ No newline at end of file