UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

174 lines (144 loc) 4.59 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 : function(columnWidths, labelArr) { this.base(arguments); // 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 : function(progressive) { // Save the progressive handle this.base(arguments, progressive); }, /** * This method is required by the box layout. If returns an array of items * to relayout. * @return {Array} List of child items */ getLayoutChildren : function() { if (this.__bCalculateWidths) { return this.__columnWidths.getData(); } else { return this.base(arguments); } }, /** * 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 : function(e) { var width = this.getBounds().width - qx.bom.element.Scroll.getScrollbarWidth(); // 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 : function() { this.__columnWidths = this.__labels = null; this._disposeObjects( "_layout"); } });