Page Menu
Home
Code
Search
Configure Global Search
Log In
Files
F1607261
_LayoutWidget.js
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
_LayoutWidget.js
View Options
if
(
!
dojo
.
_hasResource
[
"dijit.layout._LayoutWidget"
]){
//_hasResource checks added by build. Do not use _hasResource directly in your code.
dojo
.
_hasResource
[
"dijit.layout._LayoutWidget"
]
=
true
;
dojo
.
provide
(
"dijit.layout._LayoutWidget"
);
dojo
.
require
(
"dijit._Widget"
);
dojo
.
require
(
"dijit._Container"
);
dojo
.
declare
(
"dijit.layout._LayoutWidget"
,
[
dijit
.
_Widget
,
dijit
.
_Container
,
dijit
.
_Contained
],
{
// summary
// Mixin for widgets that contain a list of children like SplitContainer.
// Widgets which mixin this code must define layout() to lay out the children
isLayoutContainer
:
true
,
postCreate
:
function
(){
dojo
.
addClass
(
this
.
domNode
,
"dijitContainer"
);
},
startup
:
function
(){
// summary:
// Called after all the widgets have been instantiated and their
// dom nodes have been inserted somewhere under document.body.
//
// Widgets should override this method to do any initialization
// dependent on other widgets existing, and then call
// this superclass method to finish things off.
//
// startup() in subclasses shouldn't do anything
// size related because the size of the widget hasn't been set yet.
if
(
this
.
_started
){
return
;
}
this
.
_started
=
true
;
if
(
this
.
getChildren
){
dojo
.
forEach
(
this
.
getChildren
(),
function
(
child
){
child
.
startup
();
});
}
// If I am a top level widget
if
(
!
this
.
getParent
||
!
this
.
getParent
()){
// Do recursive sizing and layout of all my descendants
// (passing in no argument to resize means that it has to glean the size itself)
this
.
resize
();
// since my parent isn't a layout container, and my style is width=height=100% (or something similar),
// then I need to watch when the window resizes, and size myself accordingly
// (passing in no argument to resize means that it has to glean the size itself)
this
.
connect
(
window
,
'onresize'
,
function
(){
this
.
resize
();});
}
},
resize
:
function
(
args
){
// summary:
// Explicitly set this widget's size (in pixels),
// and then call layout() to resize contents (and maybe adjust child widgets)
//
// args: Object?
// {w: int, h: int, l: int, t: int}
var
node
=
this
.
domNode
;
// set margin box size, unless it wasn't specified, in which case use current size
if
(
args
){
dojo
.
marginBox
(
node
,
args
);
// set offset of the node
if
(
args
.
t
){
node
.
style
.
top
=
args
.
t
+
"px"
;
}
if
(
args
.
l
){
node
.
style
.
left
=
args
.
l
+
"px"
;
}
}
// If either height or width wasn't specified by the user, then query node for it.
// But note that setting the margin box and then immediately querying dimensions may return
// inaccurate results, so try not to depend on it.
var
mb
=
dojo
.
mixin
(
dojo
.
marginBox
(
node
),
args
||
{});
// Save the size of my content box.
this
.
_contentBox
=
dijit
.
layout
.
marginBox2contentBox
(
node
,
mb
);
// Callback for widget to adjust size of it's children
this
.
layout
();
},
layout
:
function
(){
// summary
// Widgets override this method to size & position their contents/children.
// When this is called this._contentBox is guaranteed to be set (see resize()).
//
// This is called after startup(), and also when the widget's size has been
// changed.
}
}
);
dijit
.
layout
.
marginBox2contentBox
=
function
(
/*DomNode*/
node
,
/*Object*/
mb
){
// summary:
// Given the margin-box size of a node, return it's content box size.
// Functions like dojo.contentBox() but is more reliable since it doesn't have
// to wait for the browser to compute sizes.
var
cs
=
dojo
.
getComputedStyle
(
node
);
var
me
=
dojo
.
_getMarginExtents
(
node
,
cs
);
var
pb
=
dojo
.
_getPadBorderExtents
(
node
,
cs
);
return
{
l
:
dojo
.
_toPixelValue
(
node
,
cs
.
paddingLeft
),
t
:
dojo
.
_toPixelValue
(
node
,
cs
.
paddingTop
),
w
:
mb
.
w
-
(
me
.
w
+
pb
.
w
),
h
:
mb
.
h
-
(
me
.
h
+
pb
.
h
)
};
};
(
function
(){
var
capitalize
=
function
(
word
){
return
word
.
substring
(
0
,
1
).
toUpperCase
()
+
word
.
substring
(
1
);
};
var
size
=
function
(
widget
,
dim
){
// size the child
widget
.
resize
?
widget
.
resize
(
dim
)
:
dojo
.
marginBox
(
widget
.
domNode
,
dim
);
// record child's size, but favor our own numbers when we have them.
// the browser lies sometimes
dojo
.
mixin
(
widget
,
dojo
.
marginBox
(
widget
.
domNode
));
dojo
.
mixin
(
widget
,
dim
);
};
dijit
.
layout
.
layoutChildren
=
function
(
/*DomNode*/
container
,
/*Object*/
dim
,
/*Object[]*/
children
){
/**
* summary
* Layout a bunch of child dom nodes within a parent dom node
* container:
* parent node
* dim:
* {l, t, w, h} object specifying dimensions of container into which to place children
* children:
* an array like [ {domNode: foo, layoutAlign: "bottom" }, {domNode: bar, layoutAlign: "client"} ]
*/
// copy dim because we are going to modify it
dim
=
dojo
.
mixin
({},
dim
);
dojo
.
addClass
(
container
,
"dijitLayoutContainer"
);
// Move "client" elements to the end of the array for layout. a11y dictates that the author
// needs to be able to put them in the document in tab-order, but this algorithm requires that
// client be last.
children
=
dojo
.
filter
(
children
,
function
(
item
){
return
item
.
layoutAlign
!=
"client"
;
})
.
concat
(
dojo
.
filter
(
children
,
function
(
item
){
return
item
.
layoutAlign
==
"client"
;
}));
// set positions/sizes
dojo
.
forEach
(
children
,
function
(
child
){
var
elm
=
child
.
domNode
,
pos
=
child
.
layoutAlign
;
// set elem to upper left corner of unused space; may move it later
var
elmStyle
=
elm
.
style
;
elmStyle
.
left
=
dim
.
l
+
"px"
;
elmStyle
.
top
=
dim
.
t
+
"px"
;
elmStyle
.
bottom
=
elmStyle
.
right
=
"auto"
;
dojo
.
addClass
(
elm
,
"dijitAlign"
+
capitalize
(
pos
));
// set size && adjust record of remaining space.
// note that setting the width of a <div> may affect it's height.
if
(
pos
==
"top"
||
pos
==
"bottom"
){
size
(
child
,
{
w
:
dim
.
w
});
dim
.
h
-=
child
.
h
;
if
(
pos
==
"top"
){
dim
.
t
+=
child
.
h
;
}
else
{
elmStyle
.
top
=
dim
.
t
+
dim
.
h
+
"px"
;
}
}
else
if
(
pos
==
"left"
||
pos
==
"right"
){
size
(
child
,
{
h
:
dim
.
h
});
dim
.
w
-=
child
.
w
;
if
(
pos
==
"left"
){
dim
.
l
+=
child
.
w
;
}
else
{
elmStyle
.
left
=
dim
.
l
+
dim
.
w
+
"px"
;
}
}
else
if
(
pos
==
"client"
){
size
(
child
,
dim
);
}
});
};
})();
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Aug 29, 00:58 (1 w, 5 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26465
Default Alt Text
_LayoutWidget.js (6 KB)
Attached To
rZED Zed
Event Timeline
Log In to Comment