yzt
2023-05-26 de4278af2fd46705a40bac58ec01122db6b7f3d7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
define([
    "dojo/_base/array", // array.forEach array.indexOf
    "dojo/_base/declare", // declare
    "dojo/dom-construct", // domConstruct.place
    "dojo/_base/kernel" // kernel.deprecated
], function(array, declare, domConstruct, kernel){
 
    // module:
    //      dijit/_Container
 
    return declare("dijit._Container", null, {
        // summary:
        //      Mixin for widgets that contain HTML and/or a set of widget children.
 
        buildRendering: function(){
            this.inherited(arguments);
            if(!this.containerNode){
                // All widgets with descendants must set containerNode.
                // NB: this code doesn't quite work right because for TabContainer it runs before
                // _TemplatedMixin::buildRendering(), and thus
                // sets this.containerNode to this.domNode, later to be overridden by the assignment in the template.
                this.containerNode = this.domNode;
            }
        },
 
        addChild: function(/*dijit/_WidgetBase*/ widget, /*int?*/ insertIndex){
            // summary:
            //      Makes the given widget a child of this widget.
            // description:
            //      Inserts specified child widget's dom node as a child of this widget's
            //      container node, and possibly does other processing (such as layout).
 
            // I want to just call domConstruct.place(widget.domNode, this.containerNode, insertIndex), but the counting
            // is thrown off by text nodes and comment nodes that show up when constructed by markup.
            // In the future consider stripping those nodes on construction, either in the parser or this widget code.
            var refNode = this.containerNode;
            if(insertIndex > 0){
                // Old-school way to get nth child; dojo.query would be easier but _Container was weened from dojo.query
                // in #10087 to minimize download size.   Not sure if that's still and issue with new smaller dojo/query.
                refNode = refNode.firstChild;
                while(insertIndex > 0){
                    if(refNode.nodeType == 1){ insertIndex--; }
                    refNode = refNode.nextSibling;
                }
                if(refNode){
                    insertIndex = "before";
                }else{
                    // to support addChild(child, n-1) where there are n children (should add child at end)
                    refNode = this.containerNode;
                    insertIndex = "last";
                }
            }
 
            domConstruct.place(widget.domNode, refNode, insertIndex);
 
            // If I've been started but the child widget hasn't been started,
            // start it now.  Make sure to do this after widget has been
            // inserted into the DOM tree, so it can see that it's being controlled by me,
            // so it doesn't try to size itself.
            if(this._started && !widget._started){
                widget.startup();
            }
        },
 
        removeChild: function(/*Widget|int*/ widget){
            // summary:
            //      Removes the passed widget instance from this widget but does
            //      not destroy it.  You can also pass in an integer indicating
            //      the index within the container to remove (ie, removeChild(5) removes the sixth widget).
 
            if(typeof widget == "number"){
                widget = this.getChildren()[widget];
            }
 
            if(widget){
                var node = widget.domNode;
                if(node && node.parentNode){
                    node.parentNode.removeChild(node); // detach but don't destroy
                }
            }
        },
 
        hasChildren: function(){
            // summary:
            //      Returns true if widget has child widgets, i.e. if this.containerNode contains widgets.
            return this.getChildren().length > 0;   // Boolean
        },
 
        _getSiblingOfChild: function(/*dijit/_WidgetBase*/ child, /*int*/ dir){
            // summary:
            //      Get the next or previous widget sibling of child
            // dir:
            //      if 1, get the next sibling
            //      if -1, get the previous sibling
            // tags:
            //      private
            kernel.deprecated(this.declaredClass+"::_getSiblingOfChild() is deprecated. Use _KeyNavMixin::_getNext() instead.", "", "2.0");
            var children = this.getChildren(),
                idx = array.indexOf(children, child);   // int
            return children[idx + dir];
        },
 
        getIndexOfChild: function(/*dijit/_WidgetBase*/ child){
            // summary:
            //      Gets the index of the child in this container or -1 if not found
            return array.indexOf(this.getChildren(), child);    // int
        }
    });
});