UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

222 lines (182 loc) 5.92 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) * Jonathan Weiß (jonathan_rass) ************************************************************************ */ /** * Layouter for vertical split panes. * * @internal */ qx.Class.define("qx.ui.splitpane.VLayout", { extend: qx.ui.layout.Abstract, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members: { /* --------------------------------------------------------------------------- LAYOUT INTERFACE --------------------------------------------------------------------------- */ // overridden verifyLayoutProperty: qx.core.Environment.select("qx.debug", { true(item, name, value) { this.assert( name === "type" || name === "flex", "The property '" + name + "' is not supported by the split layout!" ); if (name == "flex") { this.assertNumber(value); } if (name == "type") { this.assertString(value); } }, false: null }), // overridden renderLayout(availWidth, availHeight, padding) { var children = this._getLayoutChildren(); var length = children.length; var child, type; var begin, splitter, slider, end; var paddingLeft = padding.left || 0; var paddingTop = padding.top || 0; for (var i = 0; i < length; i++) { child = children[i]; type = child.getLayoutProperties().type; if (type === "splitter") { splitter = child; } else if (type === "slider") { slider = child; } else if (!begin) { begin = child; } else { end = child; } } if (begin && end) { var beginFlex = begin.getLayoutProperties().flex; var endFlex = end.getLayoutProperties().flex; if (beginFlex === undefined || beginFlex === null) { beginFlex = 1; } if (endFlex === undefined || endFlex === null) { endFlex = 1; } var beginHint = begin.getSizeHint(); var splitterHint = splitter.getSizeHint(); var endHint = end.getSizeHint(); var beginHeight = beginHint.height; var splitterHeight = splitterHint.height; var endHeight = endHint.height; if (beginFlex > 0 && endFlex > 0) { var flexSum = beginFlex + endFlex; var flexAvailable = availHeight - splitterHeight; var beginHeight = Math.round((flexAvailable / flexSum) * beginFlex); var endHeight = flexAvailable - beginHeight; var sizes = qx.ui.layout.Util.arrangeIdeals( beginHint.minHeight, beginHeight, beginHint.maxHeight, endHint.minHeight, endHeight, endHint.maxHeight ); beginHeight = sizes.begin; endHeight = sizes.end; } else if (beginFlex > 0) { beginHeight = availHeight - splitterHeight - endHeight; if (beginHeight < beginHint.minHeight) { beginHeight = beginHint.minHeight; } if (beginHeight > beginHint.maxHeight) { beginHeight = beginHint.maxHeight; } } else if (endFlex > 0) { endHeight = availHeight - beginHeight - splitterHeight; if (endHeight < endHint.minHeight) { endHeight = endHint.minHeight; } if (endHeight > endHint.maxHeight) { endHeight = endHint.maxHeight; } } begin.renderLayout(paddingLeft, paddingTop, availWidth, beginHeight); splitter.renderLayout( paddingLeft, beginHeight + paddingTop, availWidth, splitterHeight ); end.renderLayout( paddingLeft, beginHeight + splitterHeight + paddingTop, availWidth, endHeight ); } else { // Hide the splitter completely splitter.renderLayout(0, 0, 0, 0); // Render one child if (begin) { begin.renderLayout(paddingLeft, paddingTop, availWidth, availHeight); } else if (end) { end.renderLayout(paddingLeft, paddingTop, availWidth, availHeight); } } }, // overridden _computeSizeHint() { var children = this._getLayoutChildren(); var length = children.length; var child, hint, props; var minHeight = 0, height = 0, maxHeight = 0; var minWidth = 0, width = 0, maxWidth = 0; for (var i = 0; i < length; i++) { child = children[i]; props = child.getLayoutProperties(); // The slider is not relevant for auto sizing if (props.type === "slider") { continue; } hint = child.getSizeHint(); minHeight += hint.minHeight; height += hint.height; maxHeight += hint.maxHeight; if (hint.minWidth > minWidth) { minWidth = hint.minWidth; } if (hint.width > width) { width = hint.width; } if (hint.maxWidth > maxWidth) { maxWidth = hint.maxWidth; } } return { minHeight: minHeight, height: height, maxHeight: maxHeight, minWidth: minWidth, width: width, maxWidth: maxWidth }; } } });