| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 | <!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-Tree'>/**</span> * @class Ext.data.Tree * * This class is used as a container for a series of nodes. The nodes themselves maintain * the relationship between parent/child. The tree itself acts as a manager. It gives functionality * to retrieve a node by its identifier: {@link #getNodeById}. * * The tree also relays events from any of it's child nodes, allowing them to be handled in a * centralized fashion. In general this class is not used directly, rather used internally * by other parts of the framework. * */Ext.define('Ext.data.Tree', {    alias: 'data.tree',    mixins: {        observable: "Ext.util.Observable"    },<span id='Ext-data-Tree-property-root'>    /**</span>     * @property {Ext.data.NodeInterface}     * The root node for this tree     */    root: null,<span id='Ext-data-Tree-method-constructor'>    /**</span>     * Creates new Tree object.     * @param {Ext.data.NodeInterface} root (optional) The root node     */    constructor: function(root) {        var me = this;        me.mixins.observable.constructor.call(me);        if (root) {            me.setRootNode(root);        }    },<span id='Ext-data-Tree-method-getRootNode'>    /**</span>     * Returns the root node for this tree.     * @return {Ext.data.NodeInterface}     */    getRootNode : function() {        return this.root;    },<span id='Ext-data-Tree-method-setRootNode'>    /**</span>     * Sets the root node for this tree.     * @param {Ext.data.NodeInterface} node     * @return {Ext.data.NodeInterface} The root node     */    setRootNode : function(node) {        var me = this;        me.root = node;        if (me.fireEvent('beforeappend', null, node) !== false) {            node.set('root', true);            node.updateInfo();            // root node should never be phantom or dirty, so commit it            node.commit();            node.on({                scope: me,                insert: me.onNodeInsert,                append: me.onNodeAppend,                remove: me.onNodeRemove            });            me.relayEvents(node, [<span id='Ext-data-Tree-event-append'>                /**</span>                 * @event append                 * @inheritdoc Ext.data.NodeInterface#append                 */                "append",<span id='Ext-data-Tree-event-remove'>                /**</span>                 * @event remove                 * @inheritdoc Ext.data.NodeInterface#remove                 */                "remove",<span id='Ext-data-Tree-event-move'>                /**</span>                 * @event move                 * @inheritdoc Ext.data.NodeInterface#move                 */                "move",<span id='Ext-data-Tree-event-insert'>                /**</span>                 * @event insert                 * @inheritdoc Ext.data.NodeInterface#insert                 */                "insert",<span id='Ext-data-Tree-event-beforeappend'>                /**</span>                 * @event beforeappend                 * @inheritdoc Ext.data.NodeInterface#beforeappend                 */                "beforeappend",<span id='Ext-data-Tree-event-beforeremove'>                /**</span>                 * @event beforeremove                 * @inheritdoc Ext.data.NodeInterface#beforeremove                 */                "beforeremove",<span id='Ext-data-Tree-event-beforemove'>                /**</span>                 * @event beforemove                 * @inheritdoc Ext.data.NodeInterface#beforemove                 */                "beforemove",<span id='Ext-data-Tree-event-beforeinsert'>                /**</span>                 * @event beforeinsert                 * @inheritdoc Ext.data.NodeInterface#beforeinsert                 */                "beforeinsert",<span id='Ext-data-Tree-event-expand'>                /**</span>                 * @event expand                 * @inheritdoc Ext.data.NodeInterface#expand                 */                "expand",<span id='Ext-data-Tree-event-collapse'>                /**</span>                 * @event collapse                 * @inheritdoc Ext.data.NodeInterface#collapse                 */                "collapse",<span id='Ext-data-Tree-event-beforeexpand'>                /**</span>                 * @event beforeexpand                 * @inheritdoc Ext.data.NodeInterface#beforeexpand                 */                "beforeexpand",<span id='Ext-data-Tree-event-beforecollapse'>                /**</span>                 * @event beforecollapse                 * @inheritdoc Ext.data.NodeInterface#beforecollapse                 */                "beforecollapse" ,<span id='Ext-data-Tree-event-sort'>                /**</span>                 * @event sort                 * @inheritdoc Ext.data.NodeInterface#event-sort                 */                "sort",<span id='Ext-data-Tree-event-rootchange'>                /**</span>                 * @event rootchange                 * Fires whenever the root node is changed in the tree.                 * @param {Ext.data.Model} root The new root                 */                "rootchange"            ]);            me.nodeHash = {};            me.registerNode(node);            me.fireEvent('append', null, node);            me.fireEvent('rootchange', node);        }        return node;    },<span id='Ext-data-Tree-method-flatten'>    /**</span>     * Flattens all the nodes in the tree into an array.     * @private     * @return {Ext.data.NodeInterface[]} The flattened nodes.     */    flatten: function(){        return Ext.Object.getValues(this.nodeHash);    },<span id='Ext-data-Tree-method-onNodeInsert'>    /**</span>     * Fired when a node is inserted into the root or one of it's children     * @private     * @param {Ext.data.NodeInterface} parent The parent node     * @param {Ext.data.NodeInterface} node The inserted node     */    onNodeInsert: function(parent, node) {        this.registerNode(node, true);    },<span id='Ext-data-Tree-method-onNodeAppend'>    /**</span>     * Fired when a node is appended into the root or one of it's children     * @private     * @param {Ext.data.NodeInterface} parent The parent node     * @param {Ext.data.NodeInterface} node The appended node     */    onNodeAppend: function(parent, node) {        this.registerNode(node, true);    },<span id='Ext-data-Tree-method-onNodeRemove'>    /**</span>     * Fired when a node is removed from the root or one of it's children     * @private     * @param {Ext.data.NodeInterface} parent The parent node     * @param {Ext.data.NodeInterface} node The removed node     */    onNodeRemove: function(parent, node) {        this.unregisterNode(node, true);    },<span id='Ext-data-Tree-method-onNodeIdChanged'>    /**</span>     * Fired when a node's id changes.  Updates the node's id in the node hash.     * @private     * @param {Ext.data.NodeInterface} node      * @param {Number} oldId The old id     * @param {Number} newId The new id     */    onNodeIdChanged: function(node, oldId, newId) {        var nodeHash = this.nodeHash;            nodeHash[newId] = node;        delete nodeHash[oldId || node.internalId];    },<span id='Ext-data-Tree-method-getNodeById'>    /**</span>     * Gets a node in this tree by its id.     * @param {String} id     * @return {Ext.data.NodeInterface} The match node.     */    getNodeById : function(id) {        return this.nodeHash[id];    },<span id='Ext-data-Tree-method-registerNode'>    /**</span>     * Registers a node with the tree     * @private     * @param {Ext.data.NodeInterface} The node to register     * @param {Boolean} [includeChildren] True to unregister any child nodes     */    registerNode : function(node, includeChildren) {        var me = this;        me.nodeHash[node.getId() || node.internalId] = node;        node.on('idchanged', me.onNodeIdChanged, me);        if (includeChildren === true) {            node.eachChild(function(child){                me.registerNode(child, true);            });        }    },<span id='Ext-data-Tree-method-unregisterNode'>    /**</span>     * Unregisters a node with the tree     * @private     * @param {Ext.data.NodeInterface} The node to unregister     * @param {Boolean} [includeChildren] True to unregister any child nodes     */    unregisterNode : function(node, includeChildren) {        delete this.nodeHash[node.getId() || node.internalId];        if (includeChildren === true) {            node.eachChild(function(child){                this.unregisterNode(child, true);            }, this);        }    },<span id='Ext-data-Tree-method-sort'>    /**</span>     * Sorts this tree     * @private     * @param {Function} sorterFn The function to use for sorting     * @param {Boolean} recursive True to perform recursive sorting     */    sort: function(sorterFn, recursive) {        this.getRootNode().sort(sorterFn, recursive);    },<span id='Ext-data-Tree-method-filter'>     /**</span>     * Filters this tree     * @private     * @param {Function} sorterFn The function to use for filtering     * @param {Boolean} recursive True to perform recursive filtering     */    filter: function(filters, recursive) {        this.getRootNode().filter(filters, recursive);    }});</pre></body></html>
 |