KeyNav2.html 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  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"><span id='Ext-menu-KeyNav'>/**
  19. </span> * @private
  20. */
  21. Ext.define('Ext.menu.KeyNav', {
  22. extend: 'Ext.util.KeyNav',
  23. requires: ['Ext.FocusManager'],
  24. constructor: function(menu) {
  25. var me = this;
  26. me.menu = menu;
  27. me.callParent([menu.el, {
  28. down: me.down,
  29. enter: me.enter,
  30. esc: me.escape,
  31. left: me.left,
  32. right: me.right,
  33. space: me.enter,
  34. tab: me.tab,
  35. up: me.up
  36. }]);
  37. },
  38. down: function(e) {
  39. var me = this,
  40. fi = me.menu.focusedItem;
  41. if (fi &amp;&amp; e.getKey() == Ext.EventObject.DOWN &amp;&amp; me.isWhitelisted(fi)) {
  42. return true;
  43. }
  44. me.focusNextItem(1);
  45. },
  46. enter: function(e) {
  47. var menu = this.menu,
  48. focused = menu.focusedItem;
  49. if (menu.activeItem) {
  50. menu.onClick(e);
  51. } else if (focused &amp;&amp; focused.isFormField) {
  52. // prevent stopEvent being called
  53. return true;
  54. }
  55. },
  56. escape: function(e) {
  57. Ext.menu.Manager.hideAll();
  58. },
  59. focusNextItem: function(step) {
  60. var menu = this.menu,
  61. items = menu.items,
  62. focusedItem = menu.focusedItem,
  63. startIdx = focusedItem ? items.indexOf(focusedItem) : -1,
  64. idx = startIdx + step,
  65. item;
  66. while (idx != startIdx) {
  67. if (idx &lt; 0) {
  68. idx = items.length - 1;
  69. } else if (idx &gt;= items.length) {
  70. idx = 0;
  71. }
  72. item = items.getAt(idx);
  73. if (menu.canActivateItem(item)) {
  74. menu.setActiveItem(item);
  75. break;
  76. }
  77. idx += step;
  78. }
  79. },
  80. isWhitelisted: function(item) {
  81. return Ext.FocusManager.isWhitelisted(item);
  82. },
  83. left: function(e) {
  84. var menu = this.menu,
  85. fi = menu.focusedItem,
  86. ai = menu.activeItem;
  87. if (fi &amp;&amp; this.isWhitelisted(fi)) {
  88. return true;
  89. }
  90. menu.hide();
  91. if (menu.parentMenu) {
  92. menu.parentMenu.focus();
  93. }
  94. },
  95. right: function(e) {
  96. var menu = this.menu,
  97. fi = menu.focusedItem,
  98. ai = menu.activeItem,
  99. am;
  100. if (fi &amp;&amp; this.isWhitelisted(fi)) {
  101. return true;
  102. }
  103. if (ai) {
  104. am = menu.activeItem.menu;
  105. if (am) {
  106. ai.expandMenu(0);
  107. Ext.defer(function() {
  108. am.setActiveItem(am.items.getAt(0));
  109. }, 25);
  110. }
  111. }
  112. },
  113. tab: function(e) {
  114. var me = this;
  115. if (e.shiftKey) {
  116. me.up(e);
  117. } else {
  118. me.down(e);
  119. }
  120. },
  121. up: function(e) {
  122. var me = this,
  123. fi = me.menu.focusedItem;
  124. if (fi &amp;&amp; e.getKey() == Ext.EventObject.UP &amp;&amp; me.isWhitelisted(fi)) {
  125. return true;
  126. }
  127. me.focusNextItem(-1);
  128. }
  129. });</pre>
  130. </body>
  131. </html>