src/cm/media/js/lib/yui/yui3-3.15.0/build/tree-node/tree-node.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-node', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/*jshint 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 the `Tree.Node` class, which represents a tree node contained in a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
`Tree` data structure.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
@module tree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
@submodule tree-node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
Represents a tree node in a `Tree` data structure.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
@class Tree.Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
@param {Tree} tree `Tree` instance with which this node should be associated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
@param {Object} [config] Configuration hash for this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
    @param {Boolean} [config.canHaveChildren=false] Whether or not this node can
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
        contain child nodes. Will be automatically set to `true` if not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
        specified and `config.children` contains one or more children.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
    @param {Tree.Node[]} [config.children] Array of `Tree.Node` instances
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
        for child nodes of this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
    @param {Object} [config.data] Implementation-specific data related to this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
        node. You may add arbitrary properties to this hash for your own use.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    @param {String} [config.id] Unique id for this node. This id must be unique
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
        among all tree nodes on the entire page, and will also be used as this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
        node's DOM id when it's rendered by a TreeView. A unique id will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
        automatically generated unless you specify a custom value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    @param {Object} [config.state] State hash for this node. You may add
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
        arbitrary state properties to this hash for your own use. See the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
        docs for `Tree.Node`'s `state` property for details on state values used
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
        internally by `Tree.Node`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
@constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
function TreeNode(tree, config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    config || (config = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    this.id   = this._yuid = config.id || this.id || Y.guid('treeNode-');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
    this.tree = tree;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    this.children = config.children || [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    this.data     = config.data || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    this.state    = config.state || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    if (config.canHaveChildren) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
        this.canHaveChildren = config.canHaveChildren;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    } else if (this.children.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
        this.canHaveChildren = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    // Mix in arbitrary properties on the config object, but don't overwrite any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    // existing properties of this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    Y.mix(this, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    // If this node has children, loop through them and ensure their parent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    // references are all set to this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    for (var i = 0, len = this.children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
        this.children[i].parent = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
TreeNode.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    // -- Public Properties ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    Whether or not this node can contain child nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    This value is falsy by default unless child nodes are added at instantiation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    time, in which case it will be automatically set to `true`. You can also
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    manually set it to `true` to indicate that a node can have children even
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
    though it might not currently have any children.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
    Note that regardless of the value of this property, appending, prepending,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
    or inserting a node into this node will cause `canHaveChildren` to be set to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
    true automatically.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    @property {Boolean} canHaveChildren
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
    Child nodes contained within this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
    @property {Tree.Node[]} children
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    @default []
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
    Arbitrary serializable data related to this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    Use this property to store any data that should accompany this node when it
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
    is serialized to JSON.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    @property {Object} data
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    @default {}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    Unique id for this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    @property {String} id
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    Parent node of this node, or `undefined` if this is an unattached node or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    the root node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    @property {Tree.Node} parent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    @readOnly
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    Current state of this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    Use this property to store state-specific info -- such as whether this node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
    is "open", "selected", or any other arbitrary state -- that should accompany
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    this node when it is serialized to JSON.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
    @property {Object} state
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    The Tree instance with which this node is associated.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    @property {Tree} tree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    @readOnly
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
    // -- Protected Properties -------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    Mapping of child node ids to indices.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    @property {Object} _indexMap
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    @protected
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
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    Flag indicating whether the `_indexMap` is stale and needs to be rebuilt.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
    @property {Boolean} _isIndexStale
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    _isIndexStale: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
    Simple way to type-check that this is an instance of Tree.Node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    @property {Boolean} _isYUITreeNode
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
    _isYUITreeNode: true,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    Array of property names on this node that should be serialized to JSON when
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
    `toJSON()` is called.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
    Note that the `children` property is a special case that is managed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
    separately.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
    @property {String[]} _serializable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
    _serializable: ['canHaveChildren', 'data', 'id', 'state'],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
    // -- Public Methods -------------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    Appends the given tree node or array of nodes to the end of this node's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    children.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    @method append
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node, node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
        object, array of child nodes, or array of node config objects to append
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
        to the given parent. Node config objects will automatically be converted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
        into node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    @return {Tree.Node|Tree.Node[]} Node or array of nodes that were appended.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    append: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
        return this.tree.appendNode(this, node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    Returns this node's depth.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    The root node of a tree always has a depth of 0. A child of the root has a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    depth of 1, a child of that child will have a depth of 2, and so on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    @method depth
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
    @return {Number} This node's depth.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    @since 3.11.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
    depth: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
        if (this.isRoot()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
            return 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
        var depth  = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
            parent = this.parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
        while (parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            depth += 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
            parent = parent.parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
        return depth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
    Removes all children from this node. The removed children will still be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
    reusable unless the `destroy` option is truthy.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
    @method empty
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        @param {Boolean} [options.destroy=false] If `true`, the children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
            also be destroyed, which makes them available for garbage collection
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
            and means they can't be reused.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
        @param {Boolean} [options.silent=false] If `true`, `remove` events will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
            to the event facade of the resulting event. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
    @return {Tree.Node[]} Array of removed child nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
    empty: function (options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
        return this.tree.emptyNode(this, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
    Performs a depth-first traversal of this node, passing it and each of its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    descendants to the specified _callback_, and returning the first node for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
    which the callback returns a truthy value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
    Traversal will stop as soon as a truthy value is returned from the callback.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    See `Tree#traverseNode()` for more details on how depth-first traversal
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
    works.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    @method find
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
        @param {Number} [options.depth] Depth limit. If specified, descendants
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
            will only be traversed to this depth before backtracking and moving
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
            on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
    @param {Function} callback Callback function to call with the traversed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
        node and each of its descendants. If this function returns a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        value, traversal will be stopped and the current node will be returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        @param {Tree.Node} callback.node Node being traversed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
    @param {Object} [thisObj] `this` object to use when executing _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    @return {Tree.Node|null} Returns the first node for which the _callback_
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
        returns a truthy value, or `null` if the callback never returns a truthy
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
        value.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
    find: function (options, callback, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
        return this.tree.findNode(this, options, callback, thisObj);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    Returns `true` if this node has one or more child nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    @method hasChildren
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
    @return {Boolean} `true` if this node has one or more child nodes, `false`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
        otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
    hasChildren: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
        return !!this.children.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
    Returns the numerical index of this node within its parent node, or `-1` if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
    this node doesn't have a parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
    @method index
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
    @return {Number} Index of this node within its parent node, or `-1` if this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        node doesn't have a parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
    index: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
        return this.parent ? this.parent.indexOf(this) : -1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
    },
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
    Returns the numerical index of the given child node, or `-1` if the node is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
    not a child of this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    @method indexOf
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
    @param {Tree.Node} node Child node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
    @return {Number} Index of the child, or `-1` if the node is not a child of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    indexOf: function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
        var index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
        if (this._isIndexStale) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
            this._reindex();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
        index = this._indexMap[node.id];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
        return typeof index === 'undefined' ? -1 : index;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    Inserts a node or array of nodes at the specified index under this node, or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    appends them to this node if no index is specified.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
    If a node being inserted is from another tree, it and all its children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
    be removed from that tree and moved to this one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
    @method insert
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node, node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
        object, array of child nodes, or array of node config objects to insert
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
        under the given parent. Node config objects will automatically be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
        converted into node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
        @param {Number} [options.index] Index at which to insert the child node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
            If not specified, the node will be appended as the last child of the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
            parent.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
        @param {String} [options.src='insert'] Source of the change, to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
            passed along to the event facade of the resulting event. This can be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
            used to distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
    @return {Tree.Node[]} Node or array of nodes that were inserted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
    insert: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
        return this.tree.insertNode(this, node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    Returns `true` if this node has been inserted into a tree, `false` if it is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    merely associated with a tree and has not yet been inserted.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @method isInTree
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    @return {Boolean} `true` if this node has been inserted into a tree, `false`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
        otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
    isInTree: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
        if (this.tree && this.tree.rootNode === this) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
            return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
        return !!(this.parent && this.parent.isInTree());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
    Returns `true` if this node is the root of the tree.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    @method isRoot
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    @return {Boolean} `true` if this node is the root of the tree, `false`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
        otherwise.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    isRoot: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
        return !!(this.tree && this.tree.rootNode === this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    Returns this node's next sibling, or `undefined` if this node is the last
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    child.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    @method next
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
    @return {Tree.Node} This node's next sibling, or `undefined` if this node is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        the last child.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
    next: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
        if (this.parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
            return this.parent.children[this.index() + 1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    Prepends a node or array of nodes at the beginning of this node's children.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
    If a node being prepended is from another tree, it and all its children will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    be removed from that tree and moved to this one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
    @method prepend
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
    @param {Object|Object[]|Tree.Node|Tree.Node[]} node Child node, node config
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
        object, array of child nodes, or array of node config objects to prepend
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
        to this node. Node config objects will automatically be converted into
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
        node instances.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
        @param {Boolean} [options.silent=false] If `true`, the `add` event will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
            be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
    @return {Tree.Node|Tree.Node[]} Node or array of nodes that were prepended.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    prepend: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
        return this.tree.prependNode(this, node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
    Returns this node's previous sibling, or `undefined` if this node is the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
    first child
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
    @method previous
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
    @return {Tree.Node} This node's previous sibling, or `undefined` if this
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
        node is the first child.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
    previous: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
        if (this.parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
            return this.parent.children[this.index() - 1];
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
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    Removes this node from its parent node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
    @method remove
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
        @param {Boolean} [options.destroy=false] If `true`, this node and all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
            its children will also be destroyed, which makes them available for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
            garbage collection and means they can't be reused.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
        @param {Boolean} [options.silent=false] If `true`, the `remove` event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
            will be suppressed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
        @param {String} [options.src] Source of the change, to be passed along
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
            to the event facade of the resulting event. This can be used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
            distinguish between changes triggered by a user and changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
            triggered programmatically, for example.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
    @chainable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
    remove: function (options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
        return this.tree.removeNode(this, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
    Returns the total number of nodes contained within this node, including all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
    descendants of this node's children.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
    @method size
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
    @return {Number} Total number of nodes contained within this node, including
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
        all descendants.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
    size: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
        var children = this.children,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
            len      = children.length,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            total    = len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
        for (var i = 0; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
            total += children[i].size();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
        return total;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
    Serializes this node to an object suitable for use in JSON.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
    @method toJSON
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
    @return {Object} Serialized node object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
    toJSON: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
        var obj   = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
            state = this.state,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
            i, key, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
        // Do nothing if this node is marked as destroyed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
        if (state.destroyed) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
            return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
        // Serialize properties explicitly marked as serializable.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
        for (i = 0, len = this._serializable.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
            key = this._serializable[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
            if (key in this) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
                obj[key] = this[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
        // Serialize child nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
        if (this.canHaveChildren) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
            obj.children = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
            for (i = 0, len = this.children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
                obj.children.push(this.children[i].toJSON());
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
        return obj;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
    },
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
    Performs a depth-first traversal of this node, passing it and each of its
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
    descendants to the specified _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
    If the callback function returns `Tree.STOP_TRAVERSAL`, traversal will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
    stopped immediately. Otherwise, it will continue until the deepest
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
    descendant of _node_ has been traversed, or until each branch has been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
    traversed to the optional maximum depth limit.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
    Since traversal is depth-first, that means nodes are traversed like this:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
                1
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
              / | \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
             2  8  9
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
            / \     \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
           3   7    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
         / | \      / \
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
        4  5  6    11 12
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
    @method traverse
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
    @param {Object} [options] Options.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
        @param {Number} [options.depth] Depth limit. If specified, descendants
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
            will only be traversed to this depth before backtracking and moving
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
            on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
    @param {Function} callback Callback function to call with the traversed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
        node and each of its descendants.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
        @param {Tree.Node} callback.node Node being traversed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
    @param {Object} [thisObj] `this` object to use when executing _callback_.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
    @return {Mixed} Returns `Tree.STOP_TRAVERSAL` if traversal was stopped;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
        otherwise returns `undefined`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
    traverse: function (options, callback, thisObj) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
        return this.tree.traverseNode(this, options, callback, thisObj);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
    // -- Protected Methods ----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
    _reindex: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
        var children = this.children,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
            indexMap = {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
            i, len;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
        for (i = 0, len = children.length; i < len; i++) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
            indexMap[children[i].id] = i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
        this._indexMap     = indexMap;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
        this._isIndexStale = false;
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
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
Y.namespace('Tree').Node = TreeNode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
}, '@VERSION@');