src/cm/media/js/lib/yui/yui3-3.15.0/build/tree/tree.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 602 e16a97fb364a
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('tree', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/*jshint boss:true, expr:true, onevar:false */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
Provides a generic tree data structure and related functionality.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
A tree has a root node, which may contain any number of child nodes, which may
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
themselves contain child nodes, ad infinitum.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
Child nodes are lightweight function instances which delegate to the tree for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
all significant functionality, so trees remain performant and memory-efficient
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
even with thousands and thousands of nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
@module tree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
@main tree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
The `Tree` class represents a generic tree data structure. A tree has a root
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
node, which may contain any number of child nodes, which may themselves contain
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
child nodes, ad infinitum.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
This class doesn't expose any UI, but is intended to be used as a data structure
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
or base class for other components. For example, the SmugMug TreeView gallery
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
module extends Tree and provides a TreeView UI.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
@class Tree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
@param {Object} [config] Config options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    @param {Object[]|Tree.Node[]} [config.nodes] Array of tree node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
        objects or `Tree.Node` instances to add to this tree at initialization
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
        time.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    @param {Object|Tree.Node} [config.rootNode] Node to use as the root node of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
        this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
@extends Base
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
var Lang = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    Fired when a node is added to this Tree. The `src` property will indicate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    how the node was added ("append", "insert", "prepend", etc.).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
    @event add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    @param {Number} index Index at which the node will be added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    @param {Tree.Node} node Node being added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    @param {Tree.Node} parent Parent node to which the node will be added.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    @param {String} src Source of the event ("append", "insert", "prepend",
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
        etc.).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    @preventable _defAddFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    EVT_ADD = 'add',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    Fired when this Tree is cleared.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    @event clear
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    @param {Tree.Node} rootNode New root node of this tree (the old root node is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
        always destroyed when a tree is cleared).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    @param {String} src Source of the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    @preventable _defClearFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    EVT_CLEAR = 'clear',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    Fired when a node is removed from this Tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    @event remove
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    @param {Boolean} destroy Whether or not the node will be destroyed after
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        being removed from this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    @param {Tree.Node} node Node being removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    @param {Tree.Node} parent Parent node from which the node will be removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    @param {String} src Source of the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    @preventable _defRemoveFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    EVT_REMOVE = 'remove';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
var Tree = Y.Base.create('tree', Y.Base, [], {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    Reference to the `children` array of this Tree's `rootNode`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    This is a convenience property to allow you to type `tree.children` instead
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    of `tree.rootNode.children`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
    @property {Tree.Node[]} children
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    The `Tree.Node` class or subclass that should be used for nodes created by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    You may specify an actual class reference or a string that resolves to a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
    class reference at runtime.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    @property {String|Tree.Node} nodeClass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
    @default Y.Tree.Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    nodeClass: Y.Tree.Node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    Optional array containing one or more extension classes that should be mixed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
    into the `nodeClass` when this Tree is instantiated. The resulting composed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    node class will be unique to this Tree instance and will not affect any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    other instances, nor will it modify the defined `nodeClass` itself.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
    This provides a late-binding extension mechanism for nodes that doesn't
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    require them to extend `Y.Base`, which would incur a significant performance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
    hit.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    @property {Array} nodeExtensions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    @default []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    nodeExtensions: [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    Root node of this Tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    @property {Tree.Node} rootNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    Simple way to type-check that this is a Tree instance.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    @property {Boolean} _isYUITree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    _isYUITree: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    Composed node class based on `nodeClass` that mixes in any extensions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    specified in `nodeExtensions`. If there are no extensions, this will just be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    a reference to `nodeClass`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    @property {Tree.Node} _nodeClass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    Mapping of node ids to node instances for nodes in this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
    @property {Object} _nodeMap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    Default config object for the root node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    @property {Object} _rootNodeConfig
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    _rootNodeConfig: {canHaveChildren: true},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    // -- Lifecycle ------------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    initializer: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
        config || (config = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
        if (config.nodeClass) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
            this.nodeClass = config.nodeClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
        if (config.nodeExtensions) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
            this.nodeExtensions = this.nodeExtensions.concat(config.nodeExtensions);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        Hash of published custom events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        @property {Object} _published
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
        @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
        **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
        this._published || (this._published = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        this._nodeMap = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
        // Allow all extensions to initialize, then finish up.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
        this.onceAfter('initializedChange', function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
            this._composeNodeClass();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
            this.clear(config.rootNode, {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
            if (config.nodes) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
                this.insertNode(this.rootNode, config.nodes, {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
        this.destroyNode(this.rootNode, {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
        this.children   = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
        this.rootNode   = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
        this._nodeClass = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
        this._nodeMap   = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
        this._published = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    Appends a node or array of nodes as the last child of the specified parent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
    node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    If a node being appended is from another tree, it and all its children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
    be removed from that tree and moved to this one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
    @method appendNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
    @param {Tree.Node} parent Parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node, node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
        object, array of child nodes, or array of node config objects to append
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
        to the given parent. Node config objects will automatically be converted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
        into node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    @return {Tree.Node|Tree.Node[]} Node or array of nodes that were
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
        appended.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    appendNode: function (parent, node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
        return this.insertNode(parent, node, Y.merge(options, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            index: parent.children.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
            src  : 'append'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
        }));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
    Clears this tree by destroying the root node and all its children. If a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
    `rootNode` argument is provided, that node will become the root node of this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
    tree; otherwise, a new root node will be created.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    @method clear
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    @param {Object|Tree.Node} [rootNode] If specified, this node will be used as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
        the new root node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
        @param {Boolean} [options.silent=false] If `true`, the `clear` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
            will be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
            to the event facade of the resulting event. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
    clear: function (rootNode, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
        return this._fireTreeEvent(EVT_CLEAR, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
            rootNode: this.createNode(rootNode || this._rootNodeConfig),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
            src     : options && options.src
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        }, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
            defaultFn: this._defClearFn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
            silent   : options && options.silent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    Creates and returns a new `Tree.Node` instance associated with (but not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    yet appended to) this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    @method createNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
    @param {Object|Tree.Node} [config] Node configuration. If a `Tree.Node`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
        instance is specified instead of a config object, that node will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        adopted into this tree (if it doesn't already belong to this tree) and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        removed from any other tree to which it belongs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
    @return {Tree.Node|null} New node, or `null` if a node could not be created
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        from the given _config_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
    createNode: function (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
        config || (config = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
        // If `config` is already a node, just ensure it hasn't been destroyed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
        // and is in the node map, then return it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
        if (config._isYUITreeNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
            if (config.state.destroyed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
                Y.error('Cannot insert a node that has already been destroyed.', null, 'tree');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
                return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
            this._adoptNode(config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
            return config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
        // First, create nodes for any children of this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
        if (config.children) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
            var children = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
            for (var i = 0, len = config.children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
                children.push(this.createNode(config.children[i]));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
            config = Y.merge(config, {children: children});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
        var node = new this._nodeClass(this, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
        return this._nodeMap[node.id] = node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
    Removes and destroys a node and all its child nodes. Once destroyed, a node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
    is eligible for garbage collection and cannot be reused or re-added to the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    @method destroyNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    @param {Tree.Node} node Node to destroy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
        @param {Boolean} [options.silent=false] If `true`, `remove` events will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
            to the event facade of the resulting events. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    destroyNode: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
        var child, i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        for (i = 0, len = node.children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
            child = node.children[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
            // Manually remove the child from its parent; this makes destroying
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
            // all children of the parent much faster since there's no splicing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
            // involved.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
            child.parent = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
            // Destroy the child.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
            this.destroyNode(child, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
        if (node.parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
            this.removeNode(node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
        node.children  = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        node.data      = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
        node.state     = {destroyed: true};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
        node.tree      = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
        node._indexMap = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
        delete this._nodeMap[node.id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    Removes all children from the specified node. The removed children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    still be reusable unless the `destroy` option is truthy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
    @method emptyNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    @param {Tree.Node} node Node to empty.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
        @param {Boolean} [options.destroy=false] If `true`, the children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
            also be destroyed, which makes them available for garbage collection
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
            and means they can't be reused.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
        @param {Boolean} [options.silent=false] If `true`, `remove` events will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
            to the event facade of the resulting events. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    @return {Tree.Node[]} Array of removed child nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    emptyNode: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
        var children = node.children,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
            removed  = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
        for (var i = children.length - 1; i > -1; --i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
            removed[i] = this.removeNode(children[i], options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        return removed;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
    Performs a depth-first traversal of _node_, passing it and each of its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    descendants to the specified _callback_, and returning the first node for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
    which the callback returns a truthy value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    Traversal will stop as soon as a truthy value is returned from the callback.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    See `traverseNode()` for more details on how depth-first traversal works.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
    @method findNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    @param {Tree.Node} node Node to traverse.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        @param {Number} [options.depth] Depth limit. If specified, descendants
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
            will only be traversed to this depth before backtracking and moving
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
            on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
    @param {Function} callback Callback function to call with the traversed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        node and each of its descendants. If this function returns a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
        value, traversal will be stopped and the current node will be returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        @param {Tree.Node} callback.node Node being traversed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    @param {Object} [thisObj] `this` object to use when executing _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
    @return {Tree.Node|null} Returns the first node for which the _callback_
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
        returns a truthy value, or `null` if the callback never returns a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
        value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
    findNode: function (node, options, callback, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
        var match = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
        // Allow callback as second argument.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
        if (typeof options === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
            thisObj  = callback;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
            callback = options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
            options  = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
        this.traverseNode(node, options, function (descendant) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
            if (callback.call(thisObj, descendant)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
                match = descendant;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
                return Tree.STOP_TRAVERSAL;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
        return match;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
    Returns the tree node with the specified id, or `undefined` if the node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
    doesn't exist in this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
    @method getNodeById
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
    @param {String} id Node id.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
    @return {Tree.Node} Node, or `undefined` if not found.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
    getNodeById: function (id) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
        return this._nodeMap[id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
    Inserts a node or array of nodes at the specified index under the given
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
    parent node, or appends them to the parent if no index is specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
    If a node being inserted is from another tree, it and all its children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
    be removed from that tree and moved to this one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
    @method insertNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
    @param {Tree.Node} parent Parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node, node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
        object, array of child nodes, or array of node config objects to insert
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
        under the given parent. Node config objects will automatically be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
        converted into node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
        @param {Number} [options.index] Index at which to insert the child node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            If not specified, the node will be appended as the last child of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
            parent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
        @param {String} [options.src='insert'] Source of the change, to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
            passed along to the event facade of the resulting event. This can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
            used to distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
    @return {Tree.Node|Tree.Node[]} Node or array of nodes that were inserted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
    insertNode: function (parent, node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
        parent  || (parent = this.rootNode);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
        // If `node` is an array, recurse to insert each node it contains.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
        // Note: If you're getting an exception here because `node` is null when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
        // you've passed in a reference to some other node's `children` array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
        // that's happening because nodes must be removed from their current
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
        // parent before being added to the new one, and the `children` array is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
        // being modified while the nodes are inserted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
        //
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
        // Solution: pass a copy of the other node's `children` array instead of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
        // the original. Doing the copy operation here would have a negative
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
        // impact on performance, so you're on your own since this is such a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
        // rare edge case.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
        if ('length' in node && Lang.isArray(node)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
            var hasIndex      = 'index' in options,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
                insertedNodes = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
                insertedNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
            for (var i = 0, len = node.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
                insertedNode = this.insertNode(parent, node[i], options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                if (insertedNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
                    insertedNodes.push(insertedNode);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
                    if (hasIndex) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
                        options.index += 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
            return insertedNodes;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
        node = this.createNode(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
        if (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
            var index = options.index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
            if (typeof index === 'undefined') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
                index = this._getDefaultNodeIndex(parent, node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
            this._fireTreeEvent(EVT_ADD, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
                index : index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
                node  : node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
                parent: parent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
                src   : options.src || 'insert'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
            }, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
                defaultFn: this._defAddFn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
                silent   : options.silent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
        return node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
    Prepends a node or array of nodes at the beginning of the specified parent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
    node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
    If a node being prepended is from another tree, it and all its children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
    be removed from that tree and moved to this one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
    @method prependNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
    @param {Tree.Node} parent Parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
        node config object, array of child nodes, or array of node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
        objects to prepend to the given parent. Node config objects will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
        automatically be converted into node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
    @return {Tree.Node|Tree.Node[]} Node or array of nodes that were
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
        prepended.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
    prependNode: function (parent, node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
        return this.insertNode(parent, node, Y.merge(options, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
            index: 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
            src  : 'prepend'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
        }));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
    Removes the specified node from its parent node. The removed node will still
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
    be reusable unless the `destroy` option is truthy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
    @method removeNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    @param {Tree.Node} node Node to remove.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
        @param {Boolean} [options.destroy=false] If `true`, the node and all its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
            children will also be destroyed, which makes them available for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
            garbage collection and means they can't be reused.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
        @param {Boolean} [options.silent=false] If `true`, the `remove` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
            will be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
            to the event facade of the resulting event. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
    @return {Tree.Node} Node that was removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
    removeNode: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
        this._fireTreeEvent(EVT_REMOVE, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
            destroy: !!options.destroy,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
            node   : node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
            parent : node.parent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
            src    : options.src || 'remove'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
        }, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
            defaultFn: this._defRemoveFn,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
            silent   : options.silent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
        return node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
    Returns the total number of nodes in this tree, at all levels.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
    Use `rootNode.children.length` to get only the number of top-level nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
    @method size
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
    @return {Number} Total number of nodes in this tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
    size: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
        return this.rootNode.size() + 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
    Serializes this tree to an object suitable for use in JSON.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
    @method toJSON
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
    @return {Object} Serialized tree object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
    toJSON: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
        return this.rootNode.toJSON();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
    Performs a depth-first traversal of _node_, passing it and each of its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
    descendants to the specified _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
    If the callback function returns `Tree.STOP_TRAVERSAL`, traversal will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
    stopped immediately. Otherwise, it will continue until the deepest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
    descendant of _node_ has been traversed, or until each branch has been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
    traversed to the optional maximum depth limit.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
    Since traversal is depth-first, that means nodes are traversed like this:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
                1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
              / | \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
             2  8  9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
            / \     \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
           3   7    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
         / | \      / \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
        4  5  6    11 12
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
    @method traverseNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
    @param {Tree.Node} node Node to traverse.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
        @param {Number} [options.depth] Depth limit. If specified, descendants
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
            will only be traversed to this depth before backtracking and moving
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
            on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
    @param {Function} callback Callback function to call with the traversed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
        node and each of its descendants.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
        @param {Tree.Node} callback.node Node being traversed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
    @param {Object} [thisObj] `this` object to use when executing _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
    @return {Mixed} Returns `Tree.STOP_TRAVERSAL` if traversal was stopped;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
        otherwise returns `undefined`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
    traverseNode: function (node, options, callback, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
        if (node.state.destroyed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
            Y.error('Cannot traverse a node that has been destroyed.', null, 'tree');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
        // Allow callback as second argument.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
        if (typeof options === 'function') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
            thisObj  = callback;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
            callback = options;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
            options  = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
        options || (options = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
        var stop      = Tree.STOP_TRAVERSAL,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
            unlimited = typeof options.depth === 'undefined';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
        if (callback.call(thisObj, node) === stop) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
            return stop;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
        var children = node.children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
        if (unlimited || options.depth > 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
            var childOptions = unlimited ? options : {depth: options.depth - 1};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
            for (var i = 0, len = children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
                if (this.traverseNode(children[i], childOptions, callback, thisObj) === stop) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
                    return stop;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
    Moves the specified node and all its children from another tree to this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
    tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
    @method _adoptNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
    @param {Tree.Node} node Node to adopt.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
    @param {Object} [options] Options to pass along to `removeNode()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
    _adoptNode: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
        var oldTree = node.tree;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
        if (oldTree === this) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
        for (var i = 0, len = node.children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
            this._adoptNode(node.children[i], {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
        oldTree.removeNode(node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
        delete oldTree._nodeMap[node.id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
        // If this node isn't an instance of this tree's composed _nodeClass,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
        // then we need to recreate it to avoid potentially breaking things in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
        // really weird ways.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
        if (!(node instanceof this._nodeClass)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
                || oldTree._nodeClass !== this._nodeClass) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
            node = this.createNode(node.toJSON());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
        node.tree = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
        this._nodeMap[node.id] = node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
    Composes a custom late-bound tree node class (if necessary) based on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
    classes specified in this Tree's `nodeClass` and `nodeExtensions`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
    properties.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
    The composed class is stored in this Tree's `_nodeClass` property. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
    composition wasn't necessary, then `_nodeClass` will just be a reference to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
    `nodeClass`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
    @method _composeNodeClass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
    _composeNodeClass: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
        var nodeClass      = this.nodeClass,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
            nodeExtensions = this.nodeExtensions,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
            composedClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
        if (typeof nodeClass === 'string') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
            // Look for a namespaced node class on `Y`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
            nodeClass = Y.Object.getValue(Y, nodeClass.split('.'));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
            if (nodeClass) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
                this.nodeClass = nodeClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
                Y.error('Node class not found: ' + nodeClass, null, 'tree');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
        if (!nodeExtensions.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
            this._nodeClass = nodeClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
        // Compose a new class by mixing extensions into nodeClass.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
        composedClass = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
            var extensions = composedClass._nodeExtensions;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
            nodeClass.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
            for (var i = 0, len = extensions.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
                extensions[i].apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
        Y.extend(composedClass, nodeClass);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
        for (var i = 0, len = nodeExtensions.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
            Y.mix(composedClass.prototype, nodeExtensions[i].prototype, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
        composedClass._nodeExtensions = nodeExtensions;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
        this._nodeClass = composedClass;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
    Utility method for lazily publishing and firing events.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
    @method _fireTreeEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
    @param {String} name Event name to fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
    @param {Object} facade Event facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
        @param {Function} [options.defaultFn] Default handler for this event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
        @param {Boolean} [options.silent=false] Whether the default handler
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
            should be executed directly without actually firing the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
    _fireTreeEvent: function (name, facade, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
        if (options && options.silent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
            if (options.defaultFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
                facade.silent = true; // intentionally modifying the facade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
                options.defaultFn.call(this, facade);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
            if (options && options.defaultFn && !this._published[name]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
                this._published[name] = this.publish(name, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
                    defaultFn: options.defaultFn
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
            this.fire(name, facade);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
        return this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
    Returns the default insertion index that should be used when _node_ is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
    inserted as a child of _parent_ without an explicit index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
    The primary purpose of this method is to serve as a hook point for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
    extensions and plugins that need to customize insertion order.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
    @method _getDefaultNodeIndex
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
    @param {Tree.Node} parent Parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
    @param {Tree.Node} node Node being inserted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
    @param {Object} [options] Options passed to `insertNode()`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
    @return {Number} Index at which _node_ should be inserted into _parent_'s
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
        `children` array.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
    _getDefaultNodeIndex: function (parent/*, node, options*/) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
        return parent.children.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
    Removes the specified node from its parent node if it has one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
    @method _removeNodeFromParent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
    @param {Tree.Node} node Node to remove.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
    _removeNodeFromParent: function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
        var parent = node.parent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
            index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
        if (parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
            index = parent.indexOf(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
            if (index > -1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
                var children = parent.children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
                if (index === children.length - 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
                    children.pop();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
                    children.splice(index, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
                    parent._isIndexStale = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
                node.parent = null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   846
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   847
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   848
    // -- Default Event Handlers -----------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   849
    _defAddFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   850
        var index  = e.index,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   851
            node   = e.node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   852
            parent = e.parent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   853
            oldIndex;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   854
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   855
        // Remove the node from its existing parent if it has one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   856
        if (node.parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   857
            // If the node's existing parent is the same parent it's being
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   858
            // inserted into, adjust the index to avoid an off-by-one error.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   859
            if (node.parent === parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   860
                oldIndex = parent.indexOf(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   861
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   862
                if (oldIndex === index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   863
                    // Old index is the same as the new index, so just don't do
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   864
                    // anything.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   865
                    return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   866
                } else if (oldIndex < index) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   867
                    // Removing the node from its old index will affect the new
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   868
                    // index, so decrement the new index by one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   869
                    index -= 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   870
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   871
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   872
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   873
            this.removeNode(node, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   874
                silent: e.silent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   875
                src   : 'add'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   876
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   877
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   878
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   879
        // Add the node to its new parent at the desired index.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   880
        node.parent = parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   881
        parent.children.splice(index, 0, node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   882
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   883
        parent.canHaveChildren = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   884
        parent._isIndexStale   = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   885
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   886
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   887
    _defClearFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   888
        var newRootNode = e.rootNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   889
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   890
        if (this.rootNode) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   891
            this.destroyNode(this.rootNode, {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   892
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   893
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   894
        this._nodeMap = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   895
        this._nodeMap[newRootNode.id] = newRootNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   896
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   897
        this.rootNode = newRootNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   898
        this.children = newRootNode.children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   899
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   900
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   901
    _defRemoveFn: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   902
        var node = e.node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   903
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   904
        if (e.destroy) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   905
            this.destroyNode(node, {silent: true});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   906
        } else if (e.parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   907
            this._removeNodeFromParent(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   908
        } else if (this.rootNode === node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   909
            // Guess we'll need a new root node!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   910
            this.rootNode = this.createNode(this._rootNodeConfig);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   911
            this.children = this.rootNode.children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   912
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   913
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   914
}, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   915
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   916
    Return this value from a `Tree#traverseNode()` or `Tree.Node#traverse()`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   917
    callback to immediately stop traversal.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   918
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   919
    @property STOP_TRAVERSAL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   920
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   921
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   922
    STOP_TRAVERSAL: {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   923
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   924
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   925
Y.Tree = Y.mix(Tree, Y.Tree);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   926
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   927
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   928
}, '@VERSION@', {"requires": ["base-build", "tree-node"]});