X-Git-Url: http://git.ithinksw.org/extjs.git/blobdiff_plain/ee06f37b0f6f6d94cd05a6ffae556660f7c4a2bc..c930e9176a5a85509c5b0230e2bff5c22a591432:/docs/source/TabScrollerMenu.html?ds=sidebyside diff --git a/docs/source/TabScrollerMenu.html b/docs/source/TabScrollerMenu.html new file mode 100644 index 00000000..ee70bf8b --- /dev/null +++ b/docs/source/TabScrollerMenu.html @@ -0,0 +1,189 @@ + + + The source code + + + + +
+
+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);
+		}	
+	}	
+});
+
+ + \ No newline at end of file