UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

188 lines (155 loc) 5.04 kB
/* ************************************************************************ 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) ************************************************************************ */ /** * Layouter used by the qooxdoo menu's to render their buttons * * @internal */ qx.Class.define("qx.ui.menu.Layout", { extend: qx.ui.layout.VBox, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties: { /** Spacing between each cell on the menu buttons */ columnSpacing: { check: "Integer", init: 0, apply: "_applyLayoutChange" }, /** * Whether a column and which column should automatically span * when the following cell is empty. Spanning may be disabled * through setting this property to <code>null</code>. */ spanColumn: { check: "Integer", init: 1, nullable: true, apply: "_applyLayoutChange" }, /** Default icon column width if no icons are rendered */ iconColumnWidth: { check: "Integer", init: 0, themeable: true, apply: "_applyLayoutChange" }, /** Default arrow column width if no sub menus are rendered */ arrowColumnWidth: { check: "Integer", init: 0, themeable: true, apply: "_applyLayoutChange" } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members: { __columnSizes: null, /* --------------------------------------------------------------------------- LAYOUT INTERFACE --------------------------------------------------------------------------- */ // overridden _computeSizeHint() { var children = this._getLayoutChildren(); var child, sizes, spacing; var spanColumn = this.getSpanColumn(); var columnSizes = (this.__columnSizes = [0, 0, 0, 0]); var columnSpacing = this.getColumnSpacing(); var spanColumnWidth = 0; var maxInset = 0; // Compute column sizes and insets for (var i = 0, l = children.length; i < l; i++) { child = children[i]; if (child.isAnonymous()) { continue; } sizes = child.getChildrenSizes(); for (var column = 0; column < sizes.length; column++) { if ( spanColumn != null && column == spanColumn && sizes[spanColumn + 1] == 0 ) { spanColumnWidth = Math.max(spanColumnWidth, sizes[column]); } else { columnSizes[column] = Math.max(columnSizes[column], sizes[column]); } } var insets = children[i].getInsets(); maxInset = Math.max(maxInset, insets.left + insets.right); } // Fix label column width is cases where the maximum button with no shortcut // is larger than the maximum button with a shortcut if ( spanColumn != null && columnSizes[spanColumn] + columnSpacing + columnSizes[spanColumn + 1] < spanColumnWidth ) { columnSizes[spanColumn] = spanColumnWidth - columnSizes[spanColumn + 1] - columnSpacing; } // When merging the cells for label and shortcut // ignore the spacing between them if (spanColumnWidth == 0) { spacing = columnSpacing * 2; } else { spacing = columnSpacing * 3; } // Fix zero size icon column if (columnSizes[0] == 0) { columnSizes[0] = this.getIconColumnWidth(); } // Fix zero size arrow column if (columnSizes[3] == 0) { columnSizes[3] = this.getArrowColumnWidth(); } var height = super._computeSizeHint().height; // Build hint return { minHeight: height, height: height, width: qx.lang.Array.sum(columnSizes) + maxInset + spacing }; }, /* --------------------------------------------------------------------------- CUSTOM ADDONS --------------------------------------------------------------------------- */ /** * Returns the column sizes detected during the pre-layout phase * * @return {Array} List of all column widths */ getColumnSizes() { return this.__columnSizes || null; } }, /* ***************************************************************************** DESTRUCT ***************************************************************************** */ destruct() { this.__columnSizes = null; } });