@qooxdoo/framework
Version:
The JS Framework for Coders
148 lines (122 loc) • 3.73 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(item, name, value) {
this.assert(
name == "column",
"The property '" +
name +
"' is not supported by the MenuButton layout!"
);
},
false: null
}),
// overridden
renderLayout(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(widget) {
while (!(widget instanceof qx.ui.menu.Menu)) {
widget = widget.getLayoutParent();
}
return widget;
},
// overridden
_computeSizeHint() {
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
};
}
}
});