@qooxdoo/framework
Version:
The JS Framework for Coders
291 lines (223 loc) • 6 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2009 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Fabian Jakobs (fjakobs)
************************************************************************ */
qx.Class.define("qx.test.ui.layout.LayoutItem",
{
extend : qx.ui.core.LayoutItem,
construct : function(width, height)
{
this.base(arguments);
if (width !== undefined) {
this.setWidth(width);
}
if (height !== undefined) {
this.setHeight(height);
}
this.bounds = {};
},
properties :
{
visibility :
{
check : ["visible", "hidden", "excluded"],
init : "visible",
apply : "_applyVisibility",
event : "changeVisibility"
}
},
members :
{
bounds : null,
__layout : null,
__children : null,
renderLayout : function(left, top, width, height)
{
var changes = this.base(arguments, left, top, width, height);
if (!changes) {
return;
}
this.bounds = {
left: left,
top: top,
width: width,
height: height
};
if (changes.size || changes.local || changes.margin)
{
if (this.__layout && this.getLayoutChildren().length > 0) {
this.__layout.renderLayout(width, height, {top: 0, right: 0, bottom: 0, left: 0});
}
}
return changes;
},
setLayout : function(layout)
{
layout.connectToWidget(this);
qx.ui.core.queue.Layout.add(this);
this.__layout = layout;
},
_getLayout : function() {
return this.__layout;
},
// overridden
invalidateLayoutCache : function()
{
this.base(arguments);
if (this.__layout) {
this.__layout.invalidateLayoutCache();
}
},
invalidateLayoutChildren : function()
{
var layout = this.__layout;
if (layout) {
layout.invalidateChildrenCache();
}
qx.ui.core.queue.Layout.add(this);
},
// property apply
_applyVisibility : function(value, old)
{
// only force a layout update if visibility change from/to "exclude"
var parent = this.$$parent;
if (parent && (old == null || value == null || old === "excluded" || value === "excluded")) {
parent.invalidateLayoutChildren();
}
// Update visibility cache
qx.ui.core.queue.Visibility.add(this);
},
_getContentHint : function()
{
if (this.__layout && this.getLayoutChildren().length > 0) {
return this.__layout.getSizeHint();
} else {
return { width: 0, height: 0};
}
},
// overridden
_computeSizeHint : function()
{
// Start with the user defined values
var width = this.getWidth();
var minWidth = this.getMinWidth();
var maxWidth = this.getMaxWidth();
var height = this.getHeight();
var minHeight = this.getMinHeight();
var maxHeight = this.getMaxHeight();
// Ask content
var contentHint = this._getContentHint();
if (width == null) {
width = contentHint.width;
}
if (height == null) {
height = contentHint.height;
}
if (minWidth == null)
{
if (contentHint.minWidth != null) {
minWidth = contentHint.minWidth;
}
}
if (minHeight == null)
{
if (contentHint.minHeight != null) {
minHeight = contentHint.minHeight;
}
}
if (maxWidth == null)
{
if (contentHint.maxWidth == null) {
maxWidth = Infinity;
} else {
maxWidth = contentHint.maxWidth;
}
}
if (maxHeight == null)
{
if (contentHint.maxHeight == null) {
maxHeight = Infinity;
} else {
maxHeight = contentHint.maxHeight;
}
}
return {
width : width,
minWidth : minWidth,
maxWidth : maxWidth,
height : height,
minHeight : minHeight,
maxHeight : maxHeight
};
},
add : function(child, options)
{
if (!this.__children) {
this.__children = [];
}
this.__children.push(child);
this.__layout.invalidateChildrenCache();
if (options) {
child.setLayoutProperties(options);
} else {
this.updateLayoutProperties();
}
child.setLayoutParent(this);
qx.ui.core.queue.Layout.add(this);
},
remove : function(child)
{
if (!this.__children) {
this.__children = [];
}
qx.lang.Array.remove(this.__children, child);
// Clear parent connection
child.setLayoutParent(null);
// clear the layout's children cache
if (this.__layout) {
this.__layout.invalidateChildrenCache();
}
// Add to layout queue
qx.ui.core.queue.Layout.add(this);
},
getLayoutChildren : function()
{
var children = this.__children || [];
var layoutChildren = [];
for (var i=0; i<children.length; i++)
{
var child = children[i];
if (child.getVisibility() !== "excluded") {
layoutChildren.push(child);
}
}
return layoutChildren;
},
checkAppearanceNeeds : function() {},
// copied from qx.ui.core.Widget
addChildrenToQueue : function(queue)
{
var children = this.__children;
if (!children) {
return;
}
var child;
for (var i=0, l=children.length; i<l; i++)
{
child = children[i];
queue.push(child);
child.addChildrenToQueue(queue);
}
}
},
destruct : function() {
this.bounds = this.__layout = this.__children = null;
}
});