View.html 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  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-view-View'>/**
  19. </span> * A mechanism for displaying data using custom layout templates and formatting.
  20. *
  21. * The View uses an {@link Ext.XTemplate} as its internal templating mechanism, and is bound to an
  22. * {@link Ext.data.Store} so that as the data in the store changes the view is automatically updated
  23. * to reflect the changes. The view also provides built-in behavior for many common events that can
  24. * occur for its contained items including click, doubleclick, mouseover, mouseout, etc. as well as a
  25. * built-in selection model. **In order to use these features, an {@link #itemSelector} config must
  26. * be provided for the View to determine what nodes it will be working with.**
  27. *
  28. * The example below binds a View to a {@link Ext.data.Store} and renders it into an {@link Ext.panel.Panel}.
  29. *
  30. * @example
  31. * Ext.define('Image', {
  32. * extend: 'Ext.data.Model',
  33. * fields: [
  34. * { name:'src', type:'string' },
  35. * { name:'caption', type:'string' }
  36. * ]
  37. * });
  38. *
  39. * Ext.create('Ext.data.Store', {
  40. * id:'imagesStore',
  41. * model: 'Image',
  42. * data: [
  43. * { src:'http://www.sencha.com/img/20110215-feat-drawing.png', caption:'Drawing &amp; Charts' },
  44. * { src:'http://www.sencha.com/img/20110215-feat-data.png', caption:'Advanced Data' },
  45. * { src:'http://www.sencha.com/img/20110215-feat-html5.png', caption:'Overhauled Theme' },
  46. * { src:'http://www.sencha.com/img/20110215-feat-perf.png', caption:'Performance Tuned' }
  47. * ]
  48. * });
  49. *
  50. * var imageTpl = new Ext.XTemplate(
  51. * '&lt;tpl for=&quot;.&quot;&gt;',
  52. * '&lt;div style=&quot;margin-bottom: 10px;&quot; class=&quot;thumb-wrap&quot;&gt;',
  53. * '&lt;img src=&quot;{src}&quot; /&gt;',
  54. * '&lt;br/&gt;&lt;span&gt;{caption}&lt;/span&gt;',
  55. * '&lt;/div&gt;',
  56. * '&lt;/tpl&gt;'
  57. * );
  58. *
  59. * Ext.create('Ext.view.View', {
  60. * store: Ext.data.StoreManager.lookup('imagesStore'),
  61. * tpl: imageTpl,
  62. * itemSelector: 'div.thumb-wrap',
  63. * emptyText: 'No images available',
  64. * renderTo: Ext.getBody()
  65. * });
  66. */
  67. Ext.define('Ext.view.View', {
  68. extend: 'Ext.view.AbstractView',
  69. alternateClassName: 'Ext.DataView',
  70. alias: 'widget.dataview',
  71. deferHighlight: (Ext.isIE6 || Ext.isIE7) ? 100 : 0,
  72. inputTagRe: /^textarea$|^input$/i,
  73. inheritableStatics: {
  74. EventMap: {
  75. mousedown: 'MouseDown',
  76. mouseup: 'MouseUp',
  77. click: 'Click',
  78. dblclick: 'DblClick',
  79. contextmenu: 'ContextMenu',
  80. mouseover: 'MouseOver',
  81. mouseout: 'MouseOut',
  82. mouseenter: 'MouseEnter',
  83. mouseleave: 'MouseLeave',
  84. keydown: 'KeyDown',
  85. focus: 'Focus'
  86. }
  87. },
  88. initComponent: function() {
  89. var me = this;
  90. me.callParent();
  91. if (me.deferHighlight){
  92. me.setHighlightedItem =
  93. Ext.Function.createBuffered(me.setHighlightedItem, me.deferHighlight, me);
  94. }
  95. },
  96. addCmpEvents: function() {
  97. this.addEvents(
  98. <span id='Ext-view-View-event-beforeitemmousedown'> /**
  99. </span> * @event beforeitemmousedown
  100. * Fires before the mousedown event on an item is processed. Returns false to cancel the default action.
  101. * @param {Ext.view.View} this
  102. * @param {Ext.data.Model} record The record that belongs to the item
  103. * @param {HTMLElement} item The item's element
  104. * @param {Number} index The item's index
  105. * @param {Ext.EventObject} e The raw event object
  106. */
  107. 'beforeitemmousedown',
  108. <span id='Ext-view-View-event-beforeitemmouseup'> /**
  109. </span> * @event beforeitemmouseup
  110. * Fires before the mouseup event on an item is processed. Returns false to cancel the default action.
  111. * @param {Ext.view.View} this
  112. * @param {Ext.data.Model} record The record that belongs to the item
  113. * @param {HTMLElement} item The item's element
  114. * @param {Number} index The item's index
  115. * @param {Ext.EventObject} e The raw event object
  116. */
  117. 'beforeitemmouseup',
  118. <span id='Ext-view-View-event-beforeitemmouseenter'> /**
  119. </span> * @event beforeitemmouseenter
  120. * Fires before the mouseenter event on an item is processed. Returns false to cancel the default action.
  121. * @param {Ext.view.View} this
  122. * @param {Ext.data.Model} record The record that belongs to the item
  123. * @param {HTMLElement} item The item's element
  124. * @param {Number} index The item's index
  125. * @param {Ext.EventObject} e The raw event object
  126. */
  127. 'beforeitemmouseenter',
  128. <span id='Ext-view-View-event-beforeitemmouseleave'> /**
  129. </span> * @event beforeitemmouseleave
  130. * Fires before the mouseleave event on an item is processed. Returns false to cancel the default action.
  131. * @param {Ext.view.View} this
  132. * @param {Ext.data.Model} record The record that belongs to the item
  133. * @param {HTMLElement} item The item's element
  134. * @param {Number} index The item's index
  135. * @param {Ext.EventObject} e The raw event object
  136. */
  137. 'beforeitemmouseleave',
  138. <span id='Ext-view-View-event-beforeitemclick'> /**
  139. </span> * @event beforeitemclick
  140. * Fires before the click event on an item is processed. Returns false to cancel the default action.
  141. * @param {Ext.view.View} this
  142. * @param {Ext.data.Model} record The record that belongs to the item
  143. * @param {HTMLElement} item The item's element
  144. * @param {Number} index The item's index
  145. * @param {Ext.EventObject} e The raw event object
  146. */
  147. 'beforeitemclick',
  148. <span id='Ext-view-View-event-beforeitemdblclick'> /**
  149. </span> * @event beforeitemdblclick
  150. * Fires before the dblclick event on an item is processed. Returns false to cancel the default action.
  151. * @param {Ext.view.View} this
  152. * @param {Ext.data.Model} record The record that belongs to the item
  153. * @param {HTMLElement} item The item's element
  154. * @param {Number} index The item's index
  155. * @param {Ext.EventObject} e The raw event object
  156. */
  157. 'beforeitemdblclick',
  158. <span id='Ext-view-View-event-beforeitemcontextmenu'> /**
  159. </span> * @event beforeitemcontextmenu
  160. * Fires before the contextmenu event on an item is processed. Returns false to cancel the default action.
  161. * @param {Ext.view.View} this
  162. * @param {Ext.data.Model} record The record that belongs to the item
  163. * @param {HTMLElement} item The item's element
  164. * @param {Number} index The item's index
  165. * @param {Ext.EventObject} e The raw event object
  166. */
  167. 'beforeitemcontextmenu',
  168. <span id='Ext-view-View-event-beforeitemkeydown'> /**
  169. </span> * @event beforeitemkeydown
  170. * Fires before the keydown event on an item is processed. Returns false to cancel the default action.
  171. * @param {Ext.view.View} this
  172. * @param {Ext.data.Model} record The record that belongs to the item
  173. * @param {HTMLElement} item The item's element
  174. * @param {Number} index The item's index
  175. * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.
  176. */
  177. 'beforeitemkeydown',
  178. <span id='Ext-view-View-event-itemmousedown'> /**
  179. </span> * @event itemmousedown
  180. * Fires when there is a mouse down on an item
  181. * @param {Ext.view.View} this
  182. * @param {Ext.data.Model} record The record that belongs to the item
  183. * @param {HTMLElement} item The item's element
  184. * @param {Number} index The item's index
  185. * @param {Ext.EventObject} e The raw event object
  186. */
  187. 'itemmousedown',
  188. <span id='Ext-view-View-event-itemmouseup'> /**
  189. </span> * @event itemmouseup
  190. * Fires when there is a mouse up on an item
  191. * @param {Ext.view.View} this
  192. * @param {Ext.data.Model} record The record that belongs to the item
  193. * @param {HTMLElement} item The item's element
  194. * @param {Number} index The item's index
  195. * @param {Ext.EventObject} e The raw event object
  196. */
  197. 'itemmouseup',
  198. <span id='Ext-view-View-event-itemmouseenter'> /**
  199. </span> * @event itemmouseenter
  200. * Fires when the mouse enters an item.
  201. * @param {Ext.view.View} this
  202. * @param {Ext.data.Model} record The record that belongs to the item
  203. * @param {HTMLElement} item The item's element
  204. * @param {Number} index The item's index
  205. * @param {Ext.EventObject} e The raw event object
  206. */
  207. 'itemmouseenter',
  208. <span id='Ext-view-View-event-itemmouseleave'> /**
  209. </span> * @event itemmouseleave
  210. * Fires when the mouse leaves an item.
  211. * @param {Ext.view.View} this
  212. * @param {Ext.data.Model} record The record that belongs to the item
  213. * @param {HTMLElement} item The item's element
  214. * @param {Number} index The item's index
  215. * @param {Ext.EventObject} e The raw event object
  216. */
  217. 'itemmouseleave',
  218. <span id='Ext-view-View-event-itemclick'> /**
  219. </span> * @event itemclick
  220. * Fires when an item is clicked.
  221. * @param {Ext.view.View} this
  222. * @param {Ext.data.Model} record The record that belongs to the item
  223. * @param {HTMLElement} item The item's element
  224. * @param {Number} index The item's index
  225. * @param {Ext.EventObject} e The raw event object
  226. */
  227. 'itemclick',
  228. <span id='Ext-view-View-event-itemdblclick'> /**
  229. </span> * @event itemdblclick
  230. * Fires when an item is double clicked.
  231. * @param {Ext.view.View} this
  232. * @param {Ext.data.Model} record The record that belongs to the item
  233. * @param {HTMLElement} item The item's element
  234. * @param {Number} index The item's index
  235. * @param {Ext.EventObject} e The raw event object
  236. */
  237. 'itemdblclick',
  238. <span id='Ext-view-View-event-itemcontextmenu'> /**
  239. </span> * @event itemcontextmenu
  240. * Fires when an item is right clicked.
  241. * @param {Ext.view.View} this
  242. * @param {Ext.data.Model} record The record that belongs to the item
  243. * @param {HTMLElement} item The item's element
  244. * @param {Number} index The item's index
  245. * @param {Ext.EventObject} e The raw event object
  246. */
  247. 'itemcontextmenu',
  248. <span id='Ext-view-View-event-itemkeydown'> /**
  249. </span> * @event itemkeydown
  250. * Fires when a key is pressed while an item is currently selected.
  251. * @param {Ext.view.View} this
  252. * @param {Ext.data.Model} record The record that belongs to the item
  253. * @param {HTMLElement} item The item's element
  254. * @param {Number} index The item's index
  255. * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.
  256. */
  257. 'itemkeydown',
  258. <span id='Ext-view-View-event-beforecontainermousedown'> /**
  259. </span> * @event beforecontainermousedown
  260. * Fires before the mousedown event on the container is processed. Returns false to cancel the default action.
  261. * @param {Ext.view.View} this
  262. * @param {Ext.EventObject} e The raw event object
  263. */
  264. 'beforecontainermousedown',
  265. <span id='Ext-view-View-event-beforecontainermouseup'> /**
  266. </span> * @event beforecontainermouseup
  267. * Fires before the mouseup event on the container is processed. Returns false to cancel the default action.
  268. * @param {Ext.view.View} this
  269. * @param {Ext.EventObject} e The raw event object
  270. */
  271. 'beforecontainermouseup',
  272. <span id='Ext-view-View-event-beforecontainermouseover'> /**
  273. </span> * @event beforecontainermouseover
  274. * Fires before the mouseover event on the container is processed. Returns false to cancel the default action.
  275. * @param {Ext.view.View} this
  276. * @param {Ext.EventObject} e The raw event object
  277. */
  278. 'beforecontainermouseover',
  279. <span id='Ext-view-View-event-beforecontainermouseout'> /**
  280. </span> * @event beforecontainermouseout
  281. * Fires before the mouseout event on the container is processed. Returns false to cancel the default action.
  282. * @param {Ext.view.View} this
  283. * @param {Ext.EventObject} e The raw event object
  284. */
  285. 'beforecontainermouseout',
  286. <span id='Ext-view-View-event-beforecontainerclick'> /**
  287. </span> * @event beforecontainerclick
  288. * Fires before the click event on the container is processed. Returns false to cancel the default action.
  289. * @param {Ext.view.View} this
  290. * @param {Ext.EventObject} e The raw event object
  291. */
  292. 'beforecontainerclick',
  293. <span id='Ext-view-View-event-beforecontainerdblclick'> /**
  294. </span> * @event beforecontainerdblclick
  295. * Fires before the dblclick event on the container is processed. Returns false to cancel the default action.
  296. * @param {Ext.view.View} this
  297. * @param {Ext.EventObject} e The raw event object
  298. */
  299. 'beforecontainerdblclick',
  300. <span id='Ext-view-View-event-beforecontainercontextmenu'> /**
  301. </span> * @event beforecontainercontextmenu
  302. * Fires before the contextmenu event on the container is processed. Returns false to cancel the default action.
  303. * @param {Ext.view.View} this
  304. * @param {Ext.EventObject} e The raw event object
  305. */
  306. 'beforecontainercontextmenu',
  307. <span id='Ext-view-View-event-beforecontainerkeydown'> /**
  308. </span> * @event beforecontainerkeydown
  309. * Fires before the keydown event on the container is processed. Returns false to cancel the default action.
  310. * @param {Ext.view.View} this
  311. * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.
  312. */
  313. 'beforecontainerkeydown',
  314. <span id='Ext-view-View-event-containermouseup'> /**
  315. </span> * @event containermouseup
  316. * Fires when there is a mouse up on the container
  317. * @param {Ext.view.View} this
  318. * @param {Ext.EventObject} e The raw event object
  319. */
  320. 'containermouseup',
  321. <span id='Ext-view-View-event-containermouseover'> /**
  322. </span> * @event containermouseover
  323. * Fires when you move the mouse over the container.
  324. * @param {Ext.view.View} this
  325. * @param {Ext.EventObject} e The raw event object
  326. */
  327. 'containermouseover',
  328. <span id='Ext-view-View-event-containermouseout'> /**
  329. </span> * @event containermouseout
  330. * Fires when you move the mouse out of the container.
  331. * @param {Ext.view.View} this
  332. * @param {Ext.EventObject} e The raw event object
  333. */
  334. 'containermouseout',
  335. <span id='Ext-view-View-event-containerclick'> /**
  336. </span> * @event containerclick
  337. * Fires when the container is clicked.
  338. * @param {Ext.view.View} this
  339. * @param {Ext.EventObject} e The raw event object
  340. */
  341. 'containerclick',
  342. <span id='Ext-view-View-event-containerdblclick'> /**
  343. </span> * @event containerdblclick
  344. * Fires when the container is double clicked.
  345. * @param {Ext.view.View} this
  346. * @param {Ext.EventObject} e The raw event object
  347. */
  348. 'containerdblclick',
  349. <span id='Ext-view-View-event-containercontextmenu'> /**
  350. </span> * @event containercontextmenu
  351. * Fires when the container is right clicked.
  352. * @param {Ext.view.View} this
  353. * @param {Ext.EventObject} e The raw event object
  354. */
  355. 'containercontextmenu',
  356. <span id='Ext-view-View-event-containerkeydown'> /**
  357. </span> * @event containerkeydown
  358. * Fires when a key is pressed while the container is focused, and no item is currently selected.
  359. * @param {Ext.view.View} this
  360. * @param {Ext.EventObject} e The raw event object. Use {@link Ext.EventObject#getKey getKey()} to retrieve the key that was pressed.
  361. */
  362. 'containerkeydown',
  363. <span id='Ext-view-View-event-selectionchange'> /**
  364. </span> * @event
  365. * @inheritdoc Ext.selection.DataViewModel#selectionchange
  366. */
  367. 'selectionchange',
  368. <span id='Ext-view-View-event-beforeselect'> /**
  369. </span> * @event
  370. * @inheritdoc Ext.selection.DataViewModel#beforeselect
  371. */
  372. 'beforeselect',
  373. <span id='Ext-view-View-event-beforedeselect'> /**
  374. </span> * @event
  375. * @inheritdoc Ext.selection.DataViewModel#beforedeselect
  376. */
  377. 'beforedeselect',
  378. <span id='Ext-view-View-event-select'> /**
  379. </span> * @event
  380. * @inheritdoc Ext.selection.DataViewModel#select
  381. */
  382. 'select',
  383. <span id='Ext-view-View-event-deselect'> /**
  384. </span> * @event
  385. * @inheritdoc Ext.selection.DataViewModel#deselect
  386. */
  387. 'deselect',
  388. <span id='Ext-view-View-event-focuschange'> /**
  389. </span> * @event
  390. * @inheritdoc Ext.selection.DataViewModel#focuschange
  391. */
  392. 'focuschange',
  393. <span id='Ext-view-View-event-highlightitem'> /**
  394. </span> * @event highlightitem
  395. * Fires when a node is highlighted using keyboard navigation, or mouseover.
  396. * @param {Ext.view.View} view This View Component.
  397. * @param {Ext.Element} node The highlighted node.
  398. */
  399. 'highlightitem',
  400. <span id='Ext-view-View-event-unhighlightitem'> /**
  401. </span> * @event unhighlightitem
  402. * Fires when a node is unhighlighted using keyboard navigation, or mouseout.
  403. * @param {Ext.view.View} view This View Component.
  404. * @param {Ext.Element} node The previously highlighted node.
  405. */
  406. 'unhighlightitem'
  407. );
  408. },
  409. getFocusEl: function() {
  410. return this.getTargetEl();
  411. },
  412. // private
  413. afterRender: function(){
  414. var me = this;
  415. me.callParent();
  416. me.mon(me.getTargetEl(), {
  417. scope: me,
  418. /*
  419. * We need to make copies of this since some of the events fired here will end up triggering
  420. * a new event to be called and the shared event object will be mutated. In future we should
  421. * investigate if there are any issues with creating a new event object for each event that
  422. * is fired.
  423. */
  424. freezeEvent: true,
  425. click: me.handleEvent,
  426. mousedown: me.handleEvent,
  427. mouseup: me.handleEvent,
  428. dblclick: me.handleEvent,
  429. contextmenu: me.handleEvent,
  430. mouseover: me.handleEvent,
  431. mouseout: me.handleEvent,
  432. keydown: me.handleEvent
  433. });
  434. },
  435. handleEvent: function(e) {
  436. var me = this,
  437. key = e.type == 'keydown' &amp;&amp; e.getKey();
  438. if (me.processUIEvent(e) !== false) {
  439. me.processSpecialEvent(e);
  440. }
  441. // After all listeners have processed the event, then unless the user is typing into an input field,
  442. // prevent browser's default action on SPACE which is to focus the event's target element.
  443. // Focusing causes the browser to attempt to scroll the element into view.
  444. if (key === e.SPACE) {
  445. if (!me.inputTagRe.test(e.getTarget().tagName)) {
  446. e.stopEvent();
  447. }
  448. }
  449. },
  450. // Private template method
  451. processItemEvent: Ext.emptyFn,
  452. processContainerEvent: Ext.emptyFn,
  453. processSpecialEvent: Ext.emptyFn,
  454. /*
  455. * Returns true if this mouseover/out event is still over the overItem.
  456. */
  457. stillOverItem: function (event, overItem) {
  458. var nowOver;
  459. // There is this weird bug when you hover over the border of a cell it is saying
  460. // the target is the table.
  461. // BrowserBug: IE6 &amp; 7. If me.mouseOverItem has been removed and is no longer
  462. // in the DOM then accessing .offsetParent will throw an &quot;Unspecified error.&quot; exception.
  463. // typeof'ng and checking to make sure the offsetParent is an object will NOT throw
  464. // this hard exception.
  465. if (overItem &amp;&amp; typeof(overItem.offsetParent) === &quot;object&quot;) {
  466. // mouseout : relatedTarget == nowOver, target == wasOver
  467. // mouseover: relatedTarget == wasOver, target == nowOver
  468. nowOver = (event.type == 'mouseout') ? event.getRelatedTarget() : event.getTarget();
  469. return Ext.fly(overItem).contains(nowOver);
  470. }
  471. return false;
  472. },
  473. processUIEvent: function(e) {
  474. var me = this,
  475. item = e.getTarget(me.getItemSelector(), me.getTargetEl()),
  476. map = this.statics().EventMap,
  477. index, record,
  478. type = e.type,
  479. overItem = me.mouseOverItem,
  480. newType;
  481. if (!item) {
  482. if (type == 'mouseover' &amp;&amp; me.stillOverItem(e, overItem)) {
  483. item = overItem;
  484. }
  485. // Try to get the selected item to handle the keydown event, otherwise we'll just fire a container keydown event
  486. if (type == 'keydown') {
  487. record = me.getSelectionModel().getLastSelected();
  488. if (record) {
  489. item = me.getNode(record);
  490. }
  491. }
  492. }
  493. if (item) {
  494. index = me.indexOf(item);
  495. if (!record) {
  496. record = me.getRecord(item);
  497. }
  498. // It is possible for an event to arrive for which there is no record... this
  499. // can happen with dblclick where the clicks are on removal actions (think a
  500. // grid w/&quot;delete row&quot; action column)
  501. if (!record || me.processItemEvent(record, item, index, e) === false) {
  502. return false;
  503. }
  504. newType = me.isNewItemEvent(item, e);
  505. if (newType === false) {
  506. return false;
  507. }
  508. if (
  509. (me['onBeforeItem' + map[newType]](record, item, index, e) === false) ||
  510. (me.fireEvent('beforeitem' + newType, me, record, item, index, e) === false) ||
  511. (me['onItem' + map[newType]](record, item, index, e) === false)
  512. ) {
  513. return false;
  514. }
  515. me.fireEvent('item' + newType, me, record, item, index, e);
  516. }
  517. else {
  518. if (
  519. (me.processContainerEvent(e) === false) ||
  520. (me['onBeforeContainer' + map[type]](e) === false) ||
  521. (me.fireEvent('beforecontainer' + type, me, e) === false) ||
  522. (me['onContainer' + map[type]](e) === false)
  523. ) {
  524. return false;
  525. }
  526. me.fireEvent('container' + type, me, e);
  527. }
  528. return true;
  529. },
  530. isNewItemEvent: function (item, e) {
  531. var me = this,
  532. overItem = me.mouseOverItem,
  533. type = e.type;
  534. switch (type) {
  535. case 'mouseover':
  536. if (item === overItem) {
  537. return false;
  538. }
  539. me.mouseOverItem = item;
  540. return 'mouseenter';
  541. case 'mouseout':
  542. // If the currently mouseovered item contains the mouseover target, it's *NOT* a mouseleave
  543. if (me.stillOverItem(e, overItem)) {
  544. return false;
  545. }
  546. me.mouseOverItem = null;
  547. return 'mouseleave';
  548. }
  549. return type;
  550. },
  551. // private
  552. onItemMouseEnter: function(record, item, index, e) {
  553. if (this.trackOver) {
  554. this.highlightItem(item);
  555. }
  556. },
  557. // private
  558. onItemMouseLeave : function(record, item, index, e) {
  559. if (this.trackOver) {
  560. this.clearHighlight();
  561. }
  562. },
  563. // @private, template methods
  564. onItemMouseDown: Ext.emptyFn,
  565. onItemMouseUp: Ext.emptyFn,
  566. onItemFocus: Ext.emptyFn,
  567. onItemClick: Ext.emptyFn,
  568. onItemDblClick: Ext.emptyFn,
  569. onItemContextMenu: Ext.emptyFn,
  570. onItemKeyDown: Ext.emptyFn,
  571. onBeforeItemMouseDown: Ext.emptyFn,
  572. onBeforeItemMouseUp: Ext.emptyFn,
  573. onBeforeItemFocus: Ext.emptyFn,
  574. onBeforeItemMouseEnter: Ext.emptyFn,
  575. onBeforeItemMouseLeave: Ext.emptyFn,
  576. onBeforeItemClick: Ext.emptyFn,
  577. onBeforeItemDblClick: Ext.emptyFn,
  578. onBeforeItemContextMenu: Ext.emptyFn,
  579. onBeforeItemKeyDown: Ext.emptyFn,
  580. // @private, template methods
  581. onContainerMouseDown: Ext.emptyFn,
  582. onContainerMouseUp: Ext.emptyFn,
  583. onContainerMouseOver: Ext.emptyFn,
  584. onContainerMouseOut: Ext.emptyFn,
  585. onContainerClick: Ext.emptyFn,
  586. onContainerDblClick: Ext.emptyFn,
  587. onContainerContextMenu: Ext.emptyFn,
  588. onContainerKeyDown: Ext.emptyFn,
  589. onBeforeContainerMouseDown: Ext.emptyFn,
  590. onBeforeContainerMouseUp: Ext.emptyFn,
  591. onBeforeContainerMouseOver: Ext.emptyFn,
  592. onBeforeContainerMouseOut: Ext.emptyFn,
  593. onBeforeContainerClick: Ext.emptyFn,
  594. onBeforeContainerDblClick: Ext.emptyFn,
  595. onBeforeContainerContextMenu: Ext.emptyFn,
  596. onBeforeContainerKeyDown: Ext.emptyFn,
  597. //private
  598. setHighlightedItem: function(item){
  599. var me = this,
  600. highlighted = me.highlightedItem;
  601. if (highlighted != item){
  602. if (highlighted) {
  603. Ext.fly(highlighted).removeCls(me.overItemCls);
  604. me.fireEvent('unhighlightitem', me, highlighted);
  605. }
  606. me.highlightedItem = item;
  607. if (item) {
  608. //console.log(item.viewIndex);
  609. Ext.fly(item).addCls(me.overItemCls);
  610. me.fireEvent('highlightitem', me, item);
  611. }
  612. }
  613. },
  614. <span id='Ext-view-View-method-highlightItem'> /**
  615. </span> * Highlights a given item in the View. This is called by the mouseover handler if {@link #overItemCls}
  616. * and {@link #trackOver} are configured, but can also be called manually by other code, for instance to
  617. * handle stepping through the list via keyboard navigation.
  618. * @param {HTMLElement} item The item to highlight
  619. */
  620. highlightItem: function(item) {
  621. this.setHighlightedItem(item);
  622. },
  623. <span id='Ext-view-View-method-clearHighlight'> /**
  624. </span> * Un-highlights the currently highlighted item, if any.
  625. */
  626. clearHighlight: function() {
  627. this.setHighlightedItem(undefined);
  628. },
  629. onUpdate: function(store, record){
  630. var me = this,
  631. node,
  632. newNode,
  633. highlighted;
  634. if (me.viewReady) {
  635. node = me.getNode(record);
  636. newNode = me.callParent(arguments);
  637. highlighted = me.highlightedItem;
  638. if (highlighted &amp;&amp; highlighted === node) {
  639. delete me.highlightedItem;
  640. if (newNode) {
  641. me.highlightItem(newNode);
  642. }
  643. }
  644. }
  645. },
  646. refresh: function() {
  647. this.clearHighlight();
  648. this.callParent(arguments);
  649. }
  650. });</pre>
  651. </body>
  652. </html>