UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

310 lines (238 loc) 7.76 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2006 STZ-IDA, Germany, http://www.stz-ida.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Til Schneider (til132) ************************************************************************ */ /** * The model of a table pane. This model works as proxy to a * {@link qx.ui.table.columnmodel.Basic} and manages the visual order of the columns shown in * a {@link Pane}. */ qx.Class.define("qx.ui.table.pane.Model", { extend : qx.core.Object, /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ /** * * @param tableColumnModel {qx.ui.table.columnmodel.Basic} The TableColumnModel of which this * model is the proxy. */ construct : function(tableColumnModel) { this.base(arguments); this.setTableColumnModel(tableColumnModel); }, /* ***************************************************************************** EVENTS ***************************************************************************** */ events : { /** Fired when the model changed. */ "modelChanged" : "qx.event.type.Event" }, /* ***************************************************************************** STATICS ***************************************************************************** */ statics : { /** @type {string} The type of the event fired when the model changed. */ EVENT_TYPE_MODEL_CHANGED : "modelChanged" }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { /** The visible x position of the first column this model should contain. */ firstColumnX : { check : "Integer", init : 0, apply : "_applyFirstColumnX" }, /** * The maximum number of columns this model should contain. If -1 this model will * contain all remaining columns. */ maxColumnCount : { check : "Number", init : -1, apply : "_applyMaxColumnCount" } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { __columnCount : null, __tableColumnModel : null, // property modifier _applyFirstColumnX : function(value, old) { this.__columnCount = null; this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED); }, // property modifier _applyMaxColumnCount : function(value, old) { this.__columnCount = null; this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED); }, /** * Connects the table model to the column model * * @param tableColumnModel {qx.ui.table.columnmodel.Basic} the column model */ setTableColumnModel : function(tableColumnModel) { if (this.__tableColumnModel) { this.__tableColumnModel.removeListener("visibilityChangedPre", this._onColVisibilityChanged, this); this.__tableColumnModel.removeListener("headerCellRendererChanged", this._onHeaderCellRendererChanged, this); } this.__tableColumnModel = tableColumnModel; this.__tableColumnModel.addListener("visibilityChangedPre", this._onColVisibilityChanged, this); this.__tableColumnModel.addListener("headerCellRendererChanged", this._onHeaderCellRendererChanged, this); this.__columnCount = null; }, /** * Event handler. Called when the visibility of a column has changed. * * @param evt {Map} the event. */ _onColVisibilityChanged : function(evt) { this.__columnCount = null; this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED); }, /** * Event handler. Called when the cell renderer of a column has changed. * * @param evt {Map} the event. */ _onHeaderCellRendererChanged : function(evt) { this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED); }, /** * Returns the number of columns in this model. * * @return {Integer} the number of columns in this model. */ getColumnCount : function() { if (this.__columnCount == null) { var firstX = this.getFirstColumnX(); var maxColCount = this.getMaxColumnCount(); var totalColCount = this.__tableColumnModel.getVisibleColumnCount(); if (maxColCount == -1 || (firstX + maxColCount) > totalColCount) { this.__columnCount = totalColCount - firstX; } else { this.__columnCount = maxColCount; } } return this.__columnCount; }, /** * Returns the model index of the column at the position <code>xPos</code>. * * @param xPos {Integer} the x position in the table pane of the column. * @return {Integer} the model index of the column. */ getColumnAtX : function(xPos) { var firstX = this.getFirstColumnX(); return this.__tableColumnModel.getVisibleColumnAtX(firstX + xPos); }, /** * Returns the x position of the column <code>col</code>. * * @param col {Integer} the model index of the column. * @return {Integer} the x position in the table pane of the column. */ getX : function(col) { var firstX = this.getFirstColumnX(); var maxColCount = this.getMaxColumnCount(); var x = this.__tableColumnModel.getVisibleX(col) - firstX; if (x >= 0 && (maxColCount == -1 || x < maxColCount)) { return x; } else { return -1; } }, /** * Gets the position of the left side of a column (in pixels, relative to the * left side of the table pane). * * This value corresponds to the sum of the widths of all columns left of the * column. * * @param col {Integer} the model index of the column. * @return {var} the position of the left side of the column. */ getColumnLeft : function(col) { var left = 0; var colCount = this.getColumnCount(); for (var x=0; x<colCount; x++) { var currCol = this.getColumnAtX(x); if (currCol == col) { return left; } left += this.__tableColumnModel.getColumnWidth(currCol); } return -1; }, /** * Returns the total width of all columns in the model. * * @return {Integer} the total width of all columns in the model. */ getTotalWidth : function() { var totalWidth = 0; var colCount = this.getColumnCount(); for (var x=0; x<colCount; x++) { var col = this.getColumnAtX(x); totalWidth += this.__tableColumnModel.getColumnWidth(col); } return totalWidth; } }, /* ***************************************************************************** DESTRUCTOR ***************************************************************************** */ destruct : function() { if (this.__tableColumnModel) { this.__tableColumnModel.removeListener("visibilityChangedPre", this._onColVisibilityChanged, this); this.__tableColumnModel.removeListener("headerCellRendererChanged", this._onHeaderCellRendererChanged, this); } this.__tableColumnModel = null; } });