SelectBox.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:6k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ Ext.ns('Ext.ux.form');
  2. /**
  3.  * @class Ext.ux.form.SelectBox
  4.  * @extends Ext.form.ComboBox
  5.  * <p>Makes a ComboBox more closely mimic an HTML SELECT.  Supports clicking and dragging
  6.  * through the list, with item selection occurring when the mouse button is released.
  7.  * When used will automatically set {@link #editable} to false and call {@link Ext.Element#unselectable}
  8.  * on inner elements.  Re-enabling editable after calling this will NOT work.</p>
  9.  * @author Corey Gilmore http://extjs.com/forum/showthread.php?t=6392
  10.  * @history 2007-07-08 jvs
  11.  * Slight mods for Ext 2.0
  12.  * @xtype selectbox
  13.  */
  14. Ext.ux.form.SelectBox = Ext.extend(Ext.form.ComboBox, {
  15. constructor: function(config){
  16. this.searchResetDelay = 1000;
  17. config = config || {};
  18. config = Ext.apply(config || {}, {
  19. editable: false,
  20. forceSelection: true,
  21. rowHeight: false,
  22. lastSearchTerm: false,
  23. triggerAction: 'all',
  24. mode: 'local'
  25. });
  26. Ext.ux.form.SelectBox.superclass.constructor.apply(this, arguments);
  27. this.lastSelectedIndex = this.selectedIndex || 0;
  28. },
  29. initEvents : function(){
  30. Ext.ux.form.SelectBox.superclass.initEvents.apply(this, arguments);
  31. // you need to use keypress to capture upper/lower case and shift+key, but it doesn't work in IE
  32. this.el.on('keydown', this.keySearch, this, true);
  33. this.cshTask = new Ext.util.DelayedTask(this.clearSearchHistory, this);
  34. },
  35. keySearch : function(e, target, options) {
  36. var raw = e.getKey();
  37. var key = String.fromCharCode(raw);
  38. var startIndex = 0;
  39. if( !this.store.getCount() ) {
  40. return;
  41. }
  42. switch(raw) {
  43. case Ext.EventObject.HOME:
  44. e.stopEvent();
  45. this.selectFirst();
  46. return;
  47. case Ext.EventObject.END:
  48. e.stopEvent();
  49. this.selectLast();
  50. return;
  51. case Ext.EventObject.PAGEDOWN:
  52. this.selectNextPage();
  53. e.stopEvent();
  54. return;
  55. case Ext.EventObject.PAGEUP:
  56. this.selectPrevPage();
  57. e.stopEvent();
  58. return;
  59. }
  60. // skip special keys other than the shift key
  61. if( (e.hasModifier() && !e.shiftKey) || e.isNavKeyPress() || e.isSpecialKey() ) {
  62. return;
  63. }
  64. if( this.lastSearchTerm == key ) {
  65. startIndex = this.lastSelectedIndex;
  66. }
  67. this.search(this.displayField, key, startIndex);
  68. this.cshTask.delay(this.searchResetDelay);
  69. },
  70. onRender : function(ct, position) {
  71. this.store.on('load', this.calcRowsPerPage, this);
  72. Ext.ux.form.SelectBox.superclass.onRender.apply(this, arguments);
  73. if( this.mode == 'local' ) {
  74.             this.initList();
  75. this.calcRowsPerPage();
  76. }
  77. },
  78. onSelect : function(record, index, skipCollapse){
  79. if(this.fireEvent('beforeselect', this, record, index) !== false){
  80. this.setValue(record.data[this.valueField || this.displayField]);
  81. if( !skipCollapse ) {
  82. this.collapse();
  83. }
  84. this.lastSelectedIndex = index + 1;
  85. this.fireEvent('select', this, record, index);
  86. }
  87. },
  88. afterRender : function() {
  89. Ext.ux.form.SelectBox.superclass.afterRender.apply(this, arguments);
  90. if(Ext.isWebKit) {
  91. this.el.swallowEvent('mousedown', true);
  92. }
  93. this.el.unselectable();
  94. this.innerList.unselectable();
  95. this.trigger.unselectable();
  96. this.innerList.on('mouseup', function(e, target, options) {
  97. if( target.id && target.id == this.innerList.id ) {
  98. return;
  99. }
  100. this.onViewClick();
  101. }, this);
  102. this.innerList.on('mouseover', function(e, target, options) {
  103. if( target.id && target.id == this.innerList.id ) {
  104. return;
  105. }
  106. this.lastSelectedIndex = this.view.getSelectedIndexes()[0] + 1;
  107. this.cshTask.delay(this.searchResetDelay);
  108. }, this);
  109. this.trigger.un('click', this.onTriggerClick, this);
  110. this.trigger.on('mousedown', function(e, target, options) {
  111. e.preventDefault();
  112. this.onTriggerClick();
  113. }, this);
  114. this.on('collapse', function(e, target, options) {
  115. Ext.getDoc().un('mouseup', this.collapseIf, this);
  116. }, this, true);
  117. this.on('expand', function(e, target, options) {
  118. Ext.getDoc().on('mouseup', this.collapseIf, this);
  119. }, this, true);
  120. },
  121. clearSearchHistory : function() {
  122. this.lastSelectedIndex = 0;
  123. this.lastSearchTerm = false;
  124. },
  125. selectFirst : function() {
  126. this.focusAndSelect(this.store.data.first());
  127. },
  128. selectLast : function() {
  129. this.focusAndSelect(this.store.data.last());
  130. },
  131. selectPrevPage : function() {
  132. if( !this.rowHeight ) {
  133. return;
  134. }
  135. var index = Math.max(this.selectedIndex-this.rowsPerPage, 0);
  136. this.focusAndSelect(this.store.getAt(index));
  137. },
  138. selectNextPage : function() {
  139. if( !this.rowHeight ) {
  140. return;
  141. }
  142. var index = Math.min(this.selectedIndex+this.rowsPerPage, this.store.getCount() - 1);
  143. this.focusAndSelect(this.store.getAt(index));
  144. },
  145. search : function(field, value, startIndex) {
  146. field = field || this.displayField;
  147. this.lastSearchTerm = value;
  148. var index = this.store.find.apply(this.store, arguments);
  149. if( index !== -1 ) {
  150. this.focusAndSelect(index);
  151. }
  152. },
  153. focusAndSelect : function(record) {
  154.         var index = Ext.isNumber(record) ? record : this.store.indexOf(record);
  155.         this.select(index, this.isExpanded());
  156.         this.onSelect(this.store.getAt(index), index, this.isExpanded());
  157. },
  158. calcRowsPerPage : function() {
  159. if( this.store.getCount() ) {
  160. this.rowHeight = Ext.fly(this.view.getNode(0)).getHeight();
  161. this.rowsPerPage = this.maxHeight / this.rowHeight;
  162. } else {
  163. this.rowHeight = false;
  164. }
  165. }
  166. });
  167. Ext.reg('selectbox', Ext.ux.form.SelectBox);
  168. //backwards compat
  169. Ext.ux.SelectBox = Ext.ux.form.SelectBox;