Blame | Last modification | View Log | RSS feed
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 childrenisLayoutContainer: 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 widgetif(!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 sizeif(args){dojo.marginBox(node, args);// set offset of the nodeif(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 childrenthis.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 childwidget.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 sometimesdojo.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 itdim = 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/sizesdojo.forEach(children, function(child){var elm = child.domNode,pos = child.layoutAlign;// set elem to upper left corner of unused space; may move it latervar 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);}});};})();}