TabScrollerMenu.html 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>The source code</title>
  6. <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
  7. <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
  8. <style type="text/css">
  9. .highlight { display: block; background-color: #ddd; }
  10. </style>
  11. <script type="text/javascript">
  12. function highlight() {
  13. document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
  14. }
  15. </script>
  16. </head>
  17. <body onload="prettyPrint(); highlight();">
  18. <pre class="prettyprint lang-js">Ext.ns('Ext.ux');
  19. <span id='Ext-ux-TabScrollerMenu-method-constructor'><span id='Ext-ux-TabScrollerMenu'>/**
  20. </span></span> * @class Ext.ux.TabScrollerMenu
  21. * @extends Object
  22. * Plugin (ptype = 'tabscrollermenu') for adding a tab menu to a TabBar is the Tabs overflow.
  23. * @constructor
  24. * @param {Object} config Configuration options
  25. * @ptype tabscrollermenu
  26. */
  27. Ext.define('Ext.ux.TabScrollerMenu', {
  28. alias: 'plugin.tabscrollermenu',
  29. requires: ['Ext.menu.Menu'],
  30. <span id='Ext-ux-TabScrollerMenu-cfg-pageSize'> /**
  31. </span> * @cfg {Number} pageSize How many items to allow per submenu.
  32. */
  33. pageSize: 10,
  34. <span id='Ext-ux-TabScrollerMenu-cfg-maxText'> /**
  35. </span> * @cfg {Number} maxText How long should the title of each {@link Ext.menu.Item} be.
  36. */
  37. maxText: 15,
  38. <span id='Ext-ux-TabScrollerMenu-cfg-menuPrefixText'> /**
  39. </span> * @cfg {String} menuPrefixText Text to prefix the submenus.
  40. */
  41. menuPrefixText: 'Items',
  42. constructor: function(config) {
  43. Ext.apply(this, config);
  44. },
  45. //private
  46. init: function(tabPanel) {
  47. var me = this;
  48. me.tabPanel = tabPanel;
  49. tabPanel.on({
  50. render: function() {
  51. me.tabBar = tabPanel.tabBar;
  52. me.layout = me.tabBar.layout;
  53. me.layout.overflowHandler.handleOverflow = Ext.Function.bind(me.showButton, me);
  54. me.layout.overflowHandler.clearOverflow = Ext.Function.createSequence(me.layout.overflowHandler.clearOverflow, me.hideButton, me);
  55. },
  56. single: true
  57. });
  58. },
  59. showButton: function() {
  60. var me = this,
  61. result = Ext.getClass(me.layout.overflowHandler).prototype.handleOverflow.apply(me.layout.overflowHandler, arguments);
  62. if (!me.menuButton) {
  63. me.menuButton = me.tabBar.body.createChild({
  64. cls: Ext.baseCSSPrefix + 'tab-tabmenu-right'
  65. }, me.tabBar.body.child('.' + Ext.baseCSSPrefix + 'box-scroller-right'));
  66. me.menuButton.addClsOnOver(Ext.baseCSSPrefix + 'tab-tabmenu-over');
  67. me.menuButton.on('click', me.showTabsMenu, me);
  68. }
  69. me.menuButton.show();
  70. result.reservedSpace += me.menuButton.getWidth();
  71. return result;
  72. },
  73. hideButton: function() {
  74. var me = this;
  75. if (me.menuButton) {
  76. me.menuButton.hide();
  77. }
  78. },
  79. <span id='Ext-ux-TabScrollerMenu-method-getPageSize'> /**
  80. </span> * Returns an the current page size (this.pageSize);
  81. * @return {Number} this.pageSize The current page size.
  82. */
  83. getPageSize: function() {
  84. return this.pageSize;
  85. },
  86. <span id='Ext-ux-TabScrollerMenu-method-setPageSize'> /**
  87. </span> * Sets the number of menu items per submenu &quot;page size&quot;.
  88. * @param {Number} pageSize The page size
  89. */
  90. setPageSize: function(pageSize) {
  91. this.pageSize = pageSize;
  92. },
  93. <span id='Ext-ux-TabScrollerMenu-method-getMaxText'> /**
  94. </span> * Returns the current maxText length;
  95. * @return {Number} this.maxText The current max text length.
  96. */
  97. getMaxText: function() {
  98. return this.maxText;
  99. },
  100. <span id='Ext-ux-TabScrollerMenu-method-setMaxText'> /**
  101. </span> * Sets the maximum text size for each menu item.
  102. * @param {Number} t The max text per each menu item.
  103. */
  104. setMaxText: function(t) {
  105. this.maxText = t;
  106. },
  107. <span id='Ext-ux-TabScrollerMenu-method-getMenuPrefixText'> /**
  108. </span> * Returns the current menu prefix text String.;
  109. * @return {String} this.menuPrefixText The current menu prefix text.
  110. */
  111. getMenuPrefixText: function() {
  112. return this.menuPrefixText;
  113. },
  114. <span id='Ext-ux-TabScrollerMenu-method-setMenuPrefixText'> /**
  115. </span> * Sets the menu prefix text String.
  116. * @param {String} t The menu prefix text.
  117. */
  118. setMenuPrefixText: function(t) {
  119. this.menuPrefixText = t;
  120. },
  121. showTabsMenu: function(e) {
  122. var me = this;
  123. if (me.tabsMenu) {
  124. me.tabsMenu.removeAll();
  125. } else {
  126. me.tabsMenu = new Ext.menu.Menu();
  127. me.tabPanel.on('destroy', me.tabsMenu.destroy, me.tabsMenu);
  128. }
  129. me.generateTabMenuItems();
  130. var target = Ext.get(e.getTarget()),
  131. xy = target.getXY();
  132. //Y param + 24 pixels
  133. xy[1] += 24;
  134. me.tabsMenu.showAt(xy);
  135. },
  136. // private
  137. generateTabMenuItems: function() {
  138. var me = this,
  139. tabPanel = me.tabPanel,
  140. curActive = tabPanel.getActiveTab(),
  141. allItems = tabPanel.items.getRange(),
  142. pageSize = me.getPageSize(),
  143. tabsMenu = me.tabsMenu,
  144. totalItems, numSubMenus, remainder,
  145. i, curPage, menuItems, x, item, start, index;
  146. tabsMenu.suspendLayouts();
  147. allItems = Ext.Array.filter(allItems, function(item){
  148. if (item.id == curActive.id) {
  149. return false;
  150. }
  151. return item.hidden ? !!item.hiddenByLayout : true;
  152. });
  153. totalItems = allItems.length;
  154. numSubMenus = Math.floor(totalItems / pageSize);
  155. remainder = totalItems % pageSize;
  156. if (totalItems &gt; pageSize) {
  157. // Loop through all of the items and create submenus in chunks of 10
  158. for (i = 0; i &lt; numSubMenus; i++) {
  159. curPage = (i + 1) * pageSize;
  160. menuItems = [];
  161. for (x = 0; x &lt; pageSize; x++) {
  162. index = x + curPage - pageSize;
  163. item = allItems[index];
  164. menuItems.push(me.autoGenMenuItem(item));
  165. }
  166. tabsMenu.add({
  167. text: me.getMenuPrefixText() + ' ' + (curPage - pageSize + 1) + ' - ' + curPage,
  168. menu: menuItems
  169. });
  170. }
  171. // remaining items
  172. if (remainder &gt; 0) {
  173. start = numSubMenus * pageSize;
  174. menuItems = [];
  175. for (i = start; i &lt; totalItems; i++) {
  176. item = allItems[i];
  177. menuItems.push(me.autoGenMenuItem(item));
  178. }
  179. me.tabsMenu.add({
  180. text: me.menuPrefixText + ' ' + (start + 1) + ' - ' + (start + menuItems.length),
  181. menu: menuItems
  182. });
  183. }
  184. } else {
  185. for (i = 0; i &lt; totalItems; ++i) {
  186. tabsMenu.add(me.autoGenMenuItem(allItems[i]));
  187. }
  188. }
  189. tabsMenu.resumeLayouts(true);
  190. },
  191. // private
  192. autoGenMenuItem: function(item) {
  193. var maxText = this.getMaxText(),
  194. text = Ext.util.Format.ellipsis(item.title, maxText);
  195. return {
  196. text: text,
  197. handler: this.showTabFromMenu,
  198. scope: this,
  199. disabled: item.disabled,
  200. tabToShow: item,
  201. iconCls: item.iconCls
  202. };
  203. },
  204. // private
  205. showTabFromMenu: function(menuItem) {
  206. this.tabPanel.setActiveTab(menuItem.tabToShow);
  207. }
  208. });
  209. </pre>
  210. </body>
  211. </html>