dijit
Version:
Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible u
115 lines (96 loc) • 3.58 kB
JavaScript
define(["dojo/_base/kernel", "dojo/_base/array", "dojo/dom-geometry", "dojo/json"], function(dojo, array, geom, json){
function dijitById(id){
return dojo.global.require("dijit/registry").byId(id);
}
var exports = {
checkInside: function(/*Widget*/ child, /*Widget*/ parent, /*String?*/ comment){
// summary:
// Test that child is fully inside of parent
child = dijitById(child);
parent = dijitById(parent);
var cp = geom.position(child.domNode, true),
pp = geom.position(parent.domNode, true);
// Adjust for IE10+ fractional values
pp.w = Math.ceil(pp.w);
doh.t(
cp.y >= pp.y && cp.y+cp.h <= pp.y+pp.h &&
cp.x >= pp.x && cp.x+cp.w <= pp.x+pp.w,
(comment ? comment + ": " : "") + child.region + " inside " + parent.id + json.stringify(cp) + json.stringify(pp)
);
},
checkAbove: function(/*String*/ comment, /*Widget*/ above, /*Widget*/ below){
// summary:
// Test that child is fully above parent
above = dijitById(above);
below = dijitById(below);
var ap = geom.position(above.domNode, true),
bp = geom.position(below.domNode, true);
doh.t(ap.y+ap.h < bp.y,
comment + " " + above.region + " above " + below.region + json.stringify(ap) + json.stringify(bp)
);
},
checkLeft: function(/*String*/ comment, /*Widget*/ left, /*Widget*/ right){
// summary:
// Test that child is fully left of parent
left = dijitById(left);
right = dijitById(right);
var lp = geom.position(left.domNode, true),
rp = geom.position(right.domNode, true);
doh.t(lp.x+lp.w < rp.x,
comment + " " + left.region + " to left of " + right.region + json.stringify(lp) + json.stringify(rp)
);
},
checkBCpanes: function(/*BorderContainer*/ bc, /*String*/ comment){
// summary:
// Check that all the panes in this BorderContainer are in sane
// positions relative to each other. Assumes at most one pane
// in each region.
var children = bc.getChildren(),
regions = {};
// Check all panes inside BorderContainer
array.forEach(children, function(child, comment){
exports.checkInside(child, bc, comment);
regions[child.region] = child;
});
// Check pane positions relative to each other
array.forEach(children, function(child){
switch(child.region){
case "top":
array.forEach(bc.design == "sidebar" ? ["center", "bottom"] : ["left", "center", "right", "bottom"], function(region){
if(regions[region]){
exports.checkAbove(bc.id, child, regions[region], comment);
}
});
break;
case "bottom":
array.forEach(bc.design == "sidebar" ? ["center", "top"] : ["left", "center", "right", "top"], function(region){
if(regions[region]){
exports.checkAbove(bc.id, regions[region], child, comment);
}
});
break;
case "left":
array.forEach(bc.design == "sidebar" ? ["top", "center", "bottom", "right"] : ["right"], function(region){
if(regions[region]){
exports.checkLeft(bc.id, child, regions[region], comment);
}
});
break;
case "right":
array.forEach(bc.design == "sidebar" ? ["top", "center", "bottom", "left"] : ["left"], function(region){
if(regions[region]){
exports.checkLeft(bc.id, regions[region], child, comment);
}
});
break;
}
});
},
within: function(/*Number*/ a, /*Number*/ b, /*Number*/ range){
// summary:
// Returns true if a and b are within range
return Math.abs(a-b) <= range;
}
};
return exports;
});