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