@qooxdoo/framework
Version:
The JS Framework for Coders
136 lines (106 loc) • 3.5 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 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:
* Sebastian Werner (wpbasti)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/**
* Layout used for the menu buttons which may contain four elements. A icon,
* a label, a shortcut text and an arrow (for a sub menu)
*
* @internal
*/
qx.Class.define("qx.ui.menu.ButtonLayout",
{
extend : qx.ui.layout.Abstract,
/*
*****************************************************************************
MEMBERS
*****************************************************************************
*/
members :
{
// overridden
verifyLayoutProperty : qx.core.Environment.select("qx.debug",
{
"true" : function(item, name, value) {
this.assert(name=="column", "The property '"+name+"' is not supported by the MenuButton layout!");
},
"false" : null
}),
// overridden
renderLayout : function(availWidth, availHeight, padding)
{
var children = this._getLayoutChildren();
var child;
var column;
var columnChildren = [];
for (var i=0, l=children.length; i<l; i++)
{
child = children[i];
column = child.getLayoutProperties().column;
columnChildren[column] = child;
}
var menu = this.__getMenu(children[0]);
var columns = menu.getColumnSizes();
var spacing = menu.getSpacingX();
// stretch label column
var neededWidth = qx.lang.Array.sum(columns) + spacing * (columns.length - 1);
if (neededWidth < availWidth) {
columns[1] += availWidth - neededWidth;
}
var left = padding.left, top = padding.top;
var Util = qx.ui.layout.Util;
for (var i=0, l=columns.length; i<l; i++)
{
child = columnChildren[i];
if (child)
{
var hint = child.getSizeHint();
var childTop = top + Util.computeVerticalAlignOffset(child.getAlignY()||"middle", hint.height, availHeight, 0, 0);
var offsetLeft = Util.computeHorizontalAlignOffset(child.getAlignX()||"left", hint.width, columns[i], child.getMarginLeft(), child.getMarginRight());
child.renderLayout(left + offsetLeft, childTop, hint.width, hint.height);
}
if (columns[i] > 0) {
left += columns[i] + spacing;
}
}
},
/**
* Get the widget's menu
*
* @param widget {qx.ui.core.Widget} the widget to get the menu for
* @return {qx.ui.menu.Menu} the menu
*/
__getMenu : function(widget)
{
while (!(widget instanceof qx.ui.menu.Menu)) {
widget = widget.getLayoutParent();
}
return widget;
},
// overridden
_computeSizeHint : function()
{
var children = this._getLayoutChildren();
var neededHeight = 0;
var neededWidth = 0;
for (var i=0, l=children.length; i<l; i++)
{
var hint = children[i].getSizeHint();
neededWidth += hint.width;
neededHeight = Math.max(neededHeight, hint.height);
}
return {
width : neededWidth,
height : neededHeight
};
}
}
});