You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.5 KiB
115 lines
3.5 KiB
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; |
|
}); |