source: Dev/branches/rest-dojo-ui/client/dijit/_Container.js @ 274

Last change on this file since 274 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 3.5 KB
Line 
1define([
2        "dojo/_base/array", // array.forEach array.indexOf
3        "dojo/_base/declare", // declare
4        "dojo/dom-construct", // domConstruct.place
5        "./registry"    // registry.byNode()
6], function(array, declare, domConstruct, registry){
7
8        // module:
9        //              dijit/_Container
10        // summary:
11        //              Mixin for widgets that contain a set of widget children.
12
13        return declare("dijit._Container", null, {
14                // summary:
15                //              Mixin for widgets that contain a set of widget children.
16                // description:
17                //              Use this mixin for widgets that needs to know about and
18                //              keep track of their widget children. Suitable for widgets like BorderContainer
19                //              and TabContainer which contain (only) a set of child widgets.
20                //
21                //              It's not suitable for widgets like ContentPane
22                //              which contains mixed HTML (plain DOM nodes in addition to widgets),
23                //              and where contained widgets are not necessarily directly below
24                //              this.containerNode.   In that case calls like addChild(node, position)
25                //              wouldn't make sense.
26
27                buildRendering: function(){
28                        this.inherited(arguments);
29                        if(!this.containerNode){
30                                // all widgets with descendants must set containerNode
31                                this.containerNode = this.domNode;
32                        }
33                },
34
35                addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){
36                        // summary:
37                        //              Makes the given widget a child of this widget.
38                        // description:
39                        //              Inserts specified child widget's dom node as a child of this widget's
40                        //              container node, and possibly does other processing (such as layout).
41
42                        var refNode = this.containerNode;
43                        if(insertIndex && typeof insertIndex == "number"){
44                                var children = this.getChildren();
45                                if(children && children.length >= insertIndex){
46                                        refNode = children[insertIndex-1].domNode;
47                                        insertIndex = "after";
48                                }
49                        }
50                        domConstruct.place(widget.domNode, refNode, insertIndex);
51
52                        // If I've been started but the child widget hasn't been started,
53                        // start it now.  Make sure to do this after widget has been
54                        // inserted into the DOM tree, so it can see that it's being controlled by me,
55                        // so it doesn't try to size itself.
56                        if(this._started && !widget._started){
57                                widget.startup();
58                        }
59                },
60
61                removeChild: function(/*Widget|int*/ widget){
62                        // summary:
63                        //              Removes the passed widget instance from this widget but does
64                        //              not destroy it.  You can also pass in an integer indicating
65                        //              the index within the container to remove
66
67                        if(typeof widget == "number"){
68                                widget = this.getChildren()[widget];
69                        }
70
71                        if(widget){
72                                var node = widget.domNode;
73                                if(node && node.parentNode){
74                                        node.parentNode.removeChild(node); // detach but don't destroy
75                                }
76                        }
77                },
78
79                hasChildren: function(){
80                        // summary:
81                        //              Returns true if widget has children, i.e. if this.containerNode contains something.
82                        return this.getChildren().length > 0;   // Boolean
83                },
84
85                _getSiblingOfChild: function(/*dijit._Widget*/ child, /*int*/ dir){
86                        // summary:
87                        //              Get the next or previous widget sibling of child
88                        // dir:
89                        //              if 1, get the next sibling
90                        //              if -1, get the previous sibling
91                        // tags:
92                        //      private
93                        var node = child.domNode,
94                                which = (dir>0 ? "nextSibling" : "previousSibling");
95                        do{
96                                node = node[which];
97                        }while(node && (node.nodeType != 1 || !registry.byNode(node)));
98                        return node && registry.byNode(node);   // dijit._Widget
99                },
100
101                getIndexOfChild: function(/*dijit._Widget*/ child){
102                        // summary:
103                        //              Gets the index of the child in this container or -1 if not found
104                        return array.indexOf(this.getChildren(), child);        // int
105                }
106        });
107});
Note: See TracBrowser for help on using the repository browser.