123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>The source code</title>
- <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
- <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
- <style type="text/css">
- .highlight { display: block; background-color: #ddd; }
- </style>
- <script type="text/javascript">
- function highlight() {
- document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
- }
- </script>
- </head>
- <body onload="prettyPrint(); highlight();">
- <pre class="prettyprint lang-js"><span id='Ext-data-NodeStore'>/**
- </span> * Node Store
- * @private
- */
- Ext.define('Ext.data.NodeStore', {
- extend: 'Ext.data.Store',
- alias: 'store.node',
- requires: ['Ext.data.NodeInterface'],
- <span id='Ext-data-NodeStore-cfg-node'> /**
- </span> * @cfg {Ext.data.Model} node
- * The Record you want to bind this Store to. Note that
- * this record will be decorated with the Ext.data.NodeInterface if this is not the
- * case yet.
- */
- node: null,
- <span id='Ext-data-NodeStore-cfg-recursive'> /**
- </span> * @cfg {Boolean} recursive
- * Set this to true if you want this NodeStore to represent
- * all the descendents of the node in its flat data collection. This is useful for
- * rendering a tree structure to a DataView and is being used internally by
- * the TreeView. Any records that are moved, removed, inserted or appended to the
- * node at any depth below the node this store is bound to will be automatically
- * updated in this Store's internal flat data structure.
- */
- recursive: false,
-
- <span id='Ext-data-NodeStore-cfg-rootVisible'> /**
- </span> * @cfg {Boolean} rootVisible
- * False to not include the root node in this Stores collection.
- */
- rootVisible: false,
- <span id='Ext-data-NodeStore-cfg-treeStore'> /**
- </span> * @cfg {Ext.data.TreeStore} treeStore
- * The TreeStore that is used by this NodeStore's Ext.tree.View.
- */
- constructor: function(config) {
- var me = this,
- node;
- config = config || {};
- Ext.apply(me, config);
- //<debug>
- if (Ext.isDefined(me.proxy)) {
- Ext.Error.raise("A NodeStore cannot be bound to a proxy. Instead bind it to a record " +
- "decorated with the NodeInterface by setting the node config.");
- }
- me.useModelWarning = false;
- //</debug>
- config.proxy = {type: 'proxy'};
- me.callParent([config]);
- node = me.node;
- if (node) {
- me.node = null;
- me.setNode(node);
- }
- },
- setNode: function(node) {
- var me = this;
- if (me.node && me.node != node) {
- // We want to unbind our listeners on the old node
- me.mun(me.node, {
- expand: me.onNodeExpand,
- collapse: me.onNodeCollapse,
- append: me.onNodeAppend,
- insert: me.onNodeInsert,
- remove: me.onNodeRemove,
- sort: me.onNodeSort,
- scope: me
- });
- me.node = null;
- }
- if (node) {
- Ext.data.NodeInterface.decorate(node.self);
- me.removeAll();
- if (me.rootVisible) {
- me.add(node);
- } else if (!node.isExpanded() && me.treeStore.autoLoad !== false) {
- node.expand();
- }
- me.mon(node, {
- expand: me.onNodeExpand,
- collapse: me.onNodeCollapse,
- append: me.onNodeAppend,
- insert: me.onNodeInsert,
- remove: me.onNodeRemove,
- sort: me.onNodeSort,
- scope: me
- });
- me.node = node;
- if (node.isExpanded() && node.isLoaded()) {
- me.onNodeExpand(node, node.childNodes, true);
- }
- }
- },
- onNodeSort: function(node, childNodes) {
- var me = this;
- if ((me.indexOf(node) !== -1 || (node === me.node && !me.rootVisible) && node.isExpanded())) {
- me.onNodeCollapse(node, childNodes, true);
- me.onNodeExpand(node, childNodes, true);
- }
- },
- onNodeExpand: function(parent, records, suppressEvent) {
- var me = this,
- insertIndex = me.indexOf(parent) + 1,
- ln = records ? records.length : 0,
- i, record;
- if (!me.recursive && parent !== me.node) {
- return;
- }
- if (parent !== this.node && !me.isVisible(parent)) {
- return;
- }
- if (!suppressEvent && me.fireEvent('beforeexpand', parent, records, insertIndex) === false) {
- return;
- }
- if (ln) {
- me.insert(insertIndex, records);
- for (i = 0; i < ln; i++) {
- record = records[i];
- if (record.isExpanded()) {
- if (record.isLoaded()) {
- // Take a shortcut
- me.onNodeExpand(record, record.childNodes, true);
- }
- else {
- record.set('expanded', false);
- record.expand();
- }
- }
- }
- }
- if (!suppressEvent) {
- me.fireEvent('expand', parent, records);
- }
- },
- onNodeCollapse: function(parent, records, suppressEvent) {
- var me = this,
- ln = records.length,
- collapseIndex = me.indexOf(parent) + 1,
- i, record;
- if (!me.recursive && parent !== me.node) {
- return;
- }
- if (!suppressEvent && me.fireEvent('beforecollapse', parent, records, collapseIndex) === false) {
- return;
- }
- for (i = 0; i < ln; i++) {
- record = records[i];
- me.remove(record);
- if (record.isExpanded()) {
- me.onNodeCollapse(record, record.childNodes, true);
- }
- }
- if (!suppressEvent) {
- me.fireEvent('collapse', parent, records, collapseIndex);
- }
- },
- onNodeAppend: function(parent, node, index) {
- var me = this,
- refNode, sibling;
- if (me.isVisible(node)) {
- if (index === 0) {
- refNode = parent;
- } else {
- sibling = node.previousSibling;
- while (sibling.isExpanded() && sibling.lastChild) {
- sibling = sibling.lastChild;
- }
- refNode = sibling;
- }
- me.insert(me.indexOf(refNode) + 1, node);
- if (!node.isLeaf() && node.isExpanded()) {
- if (node.isLoaded()) {
- // Take a shortcut
- me.onNodeExpand(node, node.childNodes, true);
- }
- else {
- node.set('expanded', false);
- node.expand();
- }
- }
- }
- },
- onNodeInsert: function(parent, node, refNode) {
- var me = this,
- index = this.indexOf(refNode);
- if (index != -1 && me.isVisible(node)) {
- me.insert(index, node);
- if (!node.isLeaf() && node.isExpanded()) {
- if (node.isLoaded()) {
- // Take a shortcut
- me.onNodeExpand(node, node.childNodes, true);
- }
- else {
- node.set('expanded', false);
- node.expand();
- }
- }
- }
- },
- onNodeRemove: function(parent, node, index) {
- var me = this;
- if (me.indexOf(node) != -1) {
- if (!node.isLeaf() && node.isExpanded()) {
- me.onNodeCollapse(node, node.childNodes, true);
- }
- me.remove(node);
- }
- },
- isVisible: function(node) {
- var parent = node.parentNode;
- while (parent) {
- if (parent === this.node && !this.rootVisible && parent.isExpanded()) {
- return true;
- }
- if (this.indexOf(parent) === -1 || !parent.isExpanded()) {
- return false;
- }
- parent = parent.parentNode;
- }
- return true;
- }
- });</pre>
- </body>
- </html>
|