UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

161 lines (132 loc) 4.5 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2008 Derrell Lipman License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Derrell Lipman (derrell) ************************************************************************ */ /** * A header for a standard table. */ qx.Class.define("qx.ui.progressive.headfoot.TableHeading", { extend: qx.ui.progressive.headfoot.Abstract, /** * @param columnWidths {qx.ui.progressive.renderer.table.Widths} * The set of widths, minimum widths, and maximum widths to be used for * each of the columns in the table. * * @param labelArr {Array} * Array of labels, one for each of the columns. * */ construct(columnWidths, labelArr) { super(); // Save the Widths object containing all of our column widths this.__columnWidths = columnWidths; // Get the array of column width data var columnData = columnWidths.getData(); // Create a place to put labels this.__labels = []; // For each label... for (var i = 0; i < columnData.length; i++) { // ... create an atom to hold the label var label = new qx.ui.basic.Atom(labelArr[i]); label.setAppearance("progressive-table-header-cell"); // Add the label to this heading. this.add(label); // Save this label so we can resize it later this.__labels[i] = label; } // Add a spacer to take up the scroll-bar width var spacer = new qx.ui.core.Widget(); spacer.set({ height: 16, appearance: "progressive-table-header-cell", minWidth: 0, width: 0 }); this.add(spacer, { flex: 1 }); // Arrange to be called when the window appears or is resized, so we // can set each style sheet's left and width field appropriately. this.addListener("resize", this._resizeColumns, this); // This layout is not connected to a widget but to this class. This class // must implement the method "getLayoutChildren", which must return all // columns (LayoutItems) which should be recalculated. The call // "layout.renderLayout" will call the method "renderLayout" on each // column data object The advantage of the use of the normal layout // manager is that the semantics of flex and percent are exactly the same // as in the widget code. this.__layout = new qx.ui.layout.HBox(); this.__layout.connectToWidget(this); }, properties: { appearance: { refine: true, init: "progressive-table-header" } }, members: { __columnWidths: null, __bCalculateWidths: null, __labels: null, __layout: null, // overridden join(progressive) { // Save the progressive handle super.join(progressive); }, /** * This method is required by the box layout. If returns an array of items * to relayout. * @return {Array} List of child items */ getLayoutChildren() { if (this.__bCalculateWidths) { return this.__columnWidths.getData(); } else { return super.getLayoutChildren(); } }, /** * Event handler for the "resize" event. We recalculate and set the * new widths of each of our columns. * * @param e {qx.event.type.Event} * Ignored. * */ _resizeColumns(e) { var insets = this.getInsets(); var width = this.getBounds().width - qx.bom.element.Scroll.getScrollbarWidth() - insets.left - insets.right; // Compute the column widths this.__bCalculateWidths = true; var padding = { top: this.getPaddingTop(), right: this.getPaddingRight(), bottom: this.getPaddingBottom(), left: this.getPaddingLeft() }; this.__layout.renderLayout(width, 100, padding); this.__bCalculateWidths = false; // Get the column data var columnData = this.__columnWidths.getData(); // Get the column width data. For each label... for (var i = 0; i < columnData.length; i++) { // ... reset the width of the corresponding column (label) this.__labels[i].setWidth(columnData[i].getComputedWidth()); } } }, destruct() { this.__columnWidths = this.__labels = null; this._disposeObjects("_layout"); } });