NodeStore.html 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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-data-NodeStore'>/**
  19. </span> * Node Store
  20. * @private
  21. */
  22. Ext.define('Ext.data.NodeStore', {
  23. extend: 'Ext.data.Store',
  24. alias: 'store.node',
  25. requires: ['Ext.data.NodeInterface'],
  26. <span id='Ext-data-NodeStore-cfg-node'> /**
  27. </span> * @cfg {Ext.data.Model} node
  28. * The Record you want to bind this Store to. Note that
  29. * this record will be decorated with the Ext.data.NodeInterface if this is not the
  30. * case yet.
  31. */
  32. node: null,
  33. <span id='Ext-data-NodeStore-cfg-recursive'> /**
  34. </span> * @cfg {Boolean} recursive
  35. * Set this to true if you want this NodeStore to represent
  36. * all the descendents of the node in its flat data collection. This is useful for
  37. * rendering a tree structure to a DataView and is being used internally by
  38. * the TreeView. Any records that are moved, removed, inserted or appended to the
  39. * node at any depth below the node this store is bound to will be automatically
  40. * updated in this Store's internal flat data structure.
  41. */
  42. recursive: false,
  43. <span id='Ext-data-NodeStore-cfg-rootVisible'> /**
  44. </span> * @cfg {Boolean} rootVisible
  45. * False to not include the root node in this Stores collection.
  46. */
  47. rootVisible: false,
  48. <span id='Ext-data-NodeStore-cfg-treeStore'> /**
  49. </span> * @cfg {Ext.data.TreeStore} treeStore
  50. * The TreeStore that is used by this NodeStore's Ext.tree.View.
  51. */
  52. constructor: function(config) {
  53. var me = this,
  54. node;
  55. config = config || {};
  56. Ext.apply(me, config);
  57. //&lt;debug&gt;
  58. if (Ext.isDefined(me.proxy)) {
  59. Ext.Error.raise(&quot;A NodeStore cannot be bound to a proxy. Instead bind it to a record &quot; +
  60. &quot;decorated with the NodeInterface by setting the node config.&quot;);
  61. }
  62. me.useModelWarning = false;
  63. //&lt;/debug&gt;
  64. config.proxy = {type: 'proxy'};
  65. me.callParent([config]);
  66. node = me.node;
  67. if (node) {
  68. me.node = null;
  69. me.setNode(node);
  70. }
  71. },
  72. setNode: function(node) {
  73. var me = this;
  74. if (me.node &amp;&amp; me.node != node) {
  75. // We want to unbind our listeners on the old node
  76. me.mun(me.node, {
  77. expand: me.onNodeExpand,
  78. collapse: me.onNodeCollapse,
  79. append: me.onNodeAppend,
  80. insert: me.onNodeInsert,
  81. remove: me.onNodeRemove,
  82. sort: me.onNodeSort,
  83. scope: me
  84. });
  85. me.node = null;
  86. }
  87. if (node) {
  88. Ext.data.NodeInterface.decorate(node.self);
  89. me.removeAll();
  90. if (me.rootVisible) {
  91. me.add(node);
  92. } else if (!node.isExpanded() &amp;&amp; me.treeStore.autoLoad !== false) {
  93. node.expand();
  94. }
  95. me.mon(node, {
  96. expand: me.onNodeExpand,
  97. collapse: me.onNodeCollapse,
  98. append: me.onNodeAppend,
  99. insert: me.onNodeInsert,
  100. remove: me.onNodeRemove,
  101. sort: me.onNodeSort,
  102. scope: me
  103. });
  104. me.node = node;
  105. if (node.isExpanded() &amp;&amp; node.isLoaded()) {
  106. me.onNodeExpand(node, node.childNodes, true);
  107. }
  108. }
  109. },
  110. onNodeSort: function(node, childNodes) {
  111. var me = this;
  112. if ((me.indexOf(node) !== -1 || (node === me.node &amp;&amp; !me.rootVisible) &amp;&amp; node.isExpanded())) {
  113. me.onNodeCollapse(node, childNodes, true);
  114. me.onNodeExpand(node, childNodes, true);
  115. }
  116. },
  117. onNodeExpand: function(parent, records, suppressEvent) {
  118. var me = this,
  119. insertIndex = me.indexOf(parent) + 1,
  120. ln = records ? records.length : 0,
  121. i, record;
  122. if (!me.recursive &amp;&amp; parent !== me.node) {
  123. return;
  124. }
  125. if (parent !== this.node &amp;&amp; !me.isVisible(parent)) {
  126. return;
  127. }
  128. if (!suppressEvent &amp;&amp; me.fireEvent('beforeexpand', parent, records, insertIndex) === false) {
  129. return;
  130. }
  131. if (ln) {
  132. me.insert(insertIndex, records);
  133. for (i = 0; i &lt; ln; i++) {
  134. record = records[i];
  135. if (record.isExpanded()) {
  136. if (record.isLoaded()) {
  137. // Take a shortcut
  138. me.onNodeExpand(record, record.childNodes, true);
  139. }
  140. else {
  141. record.set('expanded', false);
  142. record.expand();
  143. }
  144. }
  145. }
  146. }
  147. if (!suppressEvent) {
  148. me.fireEvent('expand', parent, records);
  149. }
  150. },
  151. onNodeCollapse: function(parent, records, suppressEvent) {
  152. var me = this,
  153. ln = records.length,
  154. collapseIndex = me.indexOf(parent) + 1,
  155. i, record;
  156. if (!me.recursive &amp;&amp; parent !== me.node) {
  157. return;
  158. }
  159. if (!suppressEvent &amp;&amp; me.fireEvent('beforecollapse', parent, records, collapseIndex) === false) {
  160. return;
  161. }
  162. for (i = 0; i &lt; ln; i++) {
  163. record = records[i];
  164. me.remove(record);
  165. if (record.isExpanded()) {
  166. me.onNodeCollapse(record, record.childNodes, true);
  167. }
  168. }
  169. if (!suppressEvent) {
  170. me.fireEvent('collapse', parent, records, collapseIndex);
  171. }
  172. },
  173. onNodeAppend: function(parent, node, index) {
  174. var me = this,
  175. refNode, sibling;
  176. if (me.isVisible(node)) {
  177. if (index === 0) {
  178. refNode = parent;
  179. } else {
  180. sibling = node.previousSibling;
  181. while (sibling.isExpanded() &amp;&amp; sibling.lastChild) {
  182. sibling = sibling.lastChild;
  183. }
  184. refNode = sibling;
  185. }
  186. me.insert(me.indexOf(refNode) + 1, node);
  187. if (!node.isLeaf() &amp;&amp; node.isExpanded()) {
  188. if (node.isLoaded()) {
  189. // Take a shortcut
  190. me.onNodeExpand(node, node.childNodes, true);
  191. }
  192. else {
  193. node.set('expanded', false);
  194. node.expand();
  195. }
  196. }
  197. }
  198. },
  199. onNodeInsert: function(parent, node, refNode) {
  200. var me = this,
  201. index = this.indexOf(refNode);
  202. if (index != -1 &amp;&amp; me.isVisible(node)) {
  203. me.insert(index, node);
  204. if (!node.isLeaf() &amp;&amp; node.isExpanded()) {
  205. if (node.isLoaded()) {
  206. // Take a shortcut
  207. me.onNodeExpand(node, node.childNodes, true);
  208. }
  209. else {
  210. node.set('expanded', false);
  211. node.expand();
  212. }
  213. }
  214. }
  215. },
  216. onNodeRemove: function(parent, node, index) {
  217. var me = this;
  218. if (me.indexOf(node) != -1) {
  219. if (!node.isLeaf() &amp;&amp; node.isExpanded()) {
  220. me.onNodeCollapse(node, node.childNodes, true);
  221. }
  222. me.remove(node);
  223. }
  224. },
  225. isVisible: function(node) {
  226. var parent = node.parentNode;
  227. while (parent) {
  228. if (parent === this.node &amp;&amp; !this.rootVisible &amp;&amp; parent.isExpanded()) {
  229. return true;
  230. }
  231. if (this.indexOf(parent) === -1 || !parent.isExpanded()) {
  232. return false;
  233. }
  234. parent = parent.parentNode;
  235. }
  236. return true;
  237. }
  238. });</pre>
  239. </body>
  240. </html>