UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

218 lines (175 loc) 5.75 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" : function(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 : function(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 == null) { beginFlex = 1; } if (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 : function() { 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 }; } } });