diff options
Diffstat (limited to 'webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/table/DefaultResizeBehavior.js')
-rw-r--r-- | webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/table/DefaultResizeBehavior.js | 621 |
1 files changed, 0 insertions, 621 deletions
diff --git a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/table/DefaultResizeBehavior.js b/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/table/DefaultResizeBehavior.js deleted file mode 100644 index cfcd912dd4..0000000000 --- a/webapps/qooxdoo-0.6.5-sdk/frontend/framework/source/class/qx/ui/table/DefaultResizeBehavior.js +++ /dev/null @@ -1,621 +0,0 @@ -/* ************************************************************************ - - qooxdoo - the new era of web development - - http://qooxdoo.org - - Copyright: - 2007 Derrell Lipman - - License: - LGPL: http://www.gnu.org/licenses/lgpl.html - EPL: http://www.eclipse.org/org/documents/epl-v10.php - See the LICENSE file in the project's top-level directory for details. - - Authors: - * Derrell Lipman (derrell) - -************************************************************************ */ - -/* ************************************************************************ - -#module(table) - -************************************************************************ */ - -/** - * The default resize behavior. Until a resize model is loaded, the default - * behavior is to: - * <ol> - * <li> - * Upon the table initially appearing, and upon any window resize, divide - * the table space equally between the visible columns. - * </li> - * <li> - * When a column is increased in width, all columns to its right are - * pushed to the right with no change to their widths. This may push some - * columns off the right edge of the table, causing a horizontal scroll - * bar to appear. - * </li> - * <li> - * When a column is decreased in width, if the total width of all columns - * is <i>greater than</i> the table width, no additional column wiidth - * changes are made. - * </li> - * <li> - * When a column is decreased in width, if the total width of all columns - * is <i>less than</i> the width of the table, the visible column - * immediately to the right of the column which decreased in width has its - * width increased to fill the remaining space. - * </li> - * </ol> - * - * A resize model may be loaded to provide more guidance on how to adjust - * column width upon each of the events: initial appear, window resize, and - * column resize. *** TO BE FILLED IN *** - */ -qx.OO.defineClass("qx.ui.table.DefaultResizeBehavior", - qx.ui.table.AbstractResizeBehavior, -function() -{ - qx.ui.table.AbstractResizeBehavior.call(this); -}); - - -/* - * A function to instantiate a resize behavior column data object. - */ -qx.OO.addProperty( - { - name : - "newResizeBehaviorColumnData", - type : - "function", - setOnlyOnce : - true, - defaultValue: - function(obj) - { - return new qx.ui.table.ResizeBehaviorColumnData(); - } - }); - - -/** - * Set the width of a column. - * - * @param col {Integer} - * The column whose width is to be set - * - * @param width {Integer, String} - * The width of the specified column. The width may be specified as integer - * number of pixels (e.g. 100), a string representing percentage of the - * inner width of the Table (e.g. "25%"), or a string representing a flex - * width (e.g. "1*"). - */ -qx.Proto.setWidth = function(col, width) -{ - // Ensure the column is within range - if (col >= this._resizeColumnData.length) - { - throw new Error("Column number out of range"); - } - - // Set the new width - this._resizeColumnData[col].setWidth(width); -}; - - -/** - * Set the minimum width of a column. - * - * @param col {Integer} - * The column whose minimum width is to be set - * - * @param width {Integer} - * The minimum width of the specified column. - */ -qx.Proto.setMinWidth = function(col, width) -{ - // Ensure the column is within range - if (col >= this._resizeColumnData.length) - { - throw new Error("Column number out of range"); - } - - // Set the new width - this._resizeColumnData[col].setMinWidth(width); -}; - - -/** - * Set the maximum width of a column. - * - * @param col {Integer} - * The column whose maximum width is to be set - * - * @param width {Integer} - * The maximum width of the specified column. - */ -qx.Proto.setMaxWidth = function(col, width) -{ - // Ensure the column is within range - if (col >= this._resizeColumnData.length) - { - throw new Error("Column number out of range"); - } - - // Set the new width - this._resizeColumnData[col].setMaxWidth(width); -}; - - -/** - * Set any or all of the width, minimum width, and maximum width of a column - * in a single call. - * - * @param map {Map} - * A map containing any or all of the property names "width", "minWidth", - * and "maxWidth". The property values are as described for - * {@link #setWidth}, {@link #setMinWidth} and {@link #setMaxWidth} - * respectively. - */ -qx.Proto.set = function(col, map) -{ - for (var prop in map) - { - switch(prop) - { - case "width": - this.setWidth(col, map[prop]); - break; - - case "minWidth": - this.setMinWidth(col, map[prop]); - break; - - case "maxWidth": - this.setMaxWidth(col, map[prop]); - break; - - default: - throw new Error("Unknown property: " + prop); - } - } -}; - - -// overloaded -qx.Proto.onAppear = function(tableColumnModel, event) -{ - // Get the initial available width so we know whether a resize caused an - // increase or decrease in the available space. - this._width = this._getAvailableWidth(tableColumnModel); - - // Calculate column widths - this._computeColumnsFlexWidth(tableColumnModel, event); -}; - - -// overloaded -qx.Proto.onTableWidthChanged = function(tableColumnModel, event) -{ - // Calculate column widths - this._computeColumnsFlexWidth(tableColumnModel, event); -}; - - -// overloaded -qx.Proto.onColumnWidthChanged = function(tableColumnModel, event) -{ - // Extend the next column to fill blank space - this._extendNextColumn(tableColumnModel, event); -}; - - -// overloaded -qx.Proto.onVisibilityChanged = function(tableColumnModel, event) -{ - // Extend the last column to fill blank space - this._extendLastColumn(tableColumnModel, event); -}; - - -// overloaded -qx.Proto._setNumColumns = function(numColumns) -{ - // Are there now fewer (or the same number of) columns than there were - // previously? - if (numColumns <= this._resizeColumnData.length) - { - // Yup. Delete the extras. - this._resizeColumnData.splice(numColumns); - return; - } - - // There are more columns than there were previously. Allocate more. - for (var i = this._resizeColumnData.length; i < numColumns; i++) - { - this._resizeColumnData[i] = this.getNewResizeBehaviorColumnData()(); - this._resizeColumnData[i]._columnNumber = i; - } -}; - - -/** - * Computes the width of all flexible children (based loosely on the method of - * the same name in HorizontalBoxLayoutImpl). - * - * @param tableColumnModel {qx.ui.table.ResizeTableColumnModel} - * The table column model in use. - * - * @param event - * The event object. - */ -qx.Proto._computeColumnsFlexWidth = function(tableColumnModel, event) -{ - // Semi-permanent configuration settings - var debug = true; - - if (debug) - { - this.debug("computeColumnsFlexWidth"); - } - - var visibleColumns = tableColumnModel._visibleColumnArr; - var visibleColumnsLength = visibleColumns.length; - var columnData; - var flexibleColumns = [ ]; - var widthUsed = 0; - var i; - - // Determine the available width - var width = this._getAvailableWidth(tableColumnModel); - - - // ************************************************************* - // 1. Compute the sum of all static sized columns and find - // all flexible columns. - // ************************************************************* - for (i = 0; i < visibleColumnsLength; i++) - { - // Get the current column's column data - columnData = this._resizeColumnData[visibleColumns[i]]; - - // Is this column width type "auto"? - if (columnData._computedWidthTypeAuto) - { - // Yup. Convert it to a Flex "1*" - columnData._computedWidthTypeAuto = false; - columnData._computedWidthTypeFlex = true; - columnData._computedWidthParsed = 1; - } - - // Is this column a flex width? - if (columnData._computedWidthTypeFlex) - { - // Yup. Save it for future processing. - flexibleColumns.push(columnData); - } - else if (columnData._computedWidthTypePercent) - { - // We can calculate the width of a Percent type right now. Convert it - // to a Flex type that's already calculated (no further calculation - // required). - columnData._computedWidthPercentValue = - Math.round(width * (columnData._computedWidthParsed / 100)); - widthUsed += columnData._computedWidthPercentValue; - } - else - { - // We have a fixed width. Track width already allocated. - widthUsed += columnData.getWidth(); - } - } - - if (debug) - { - this.debug("Width: " + widthUsed + "/" + width); - this.debug("Flexible Count: " + flexibleColumns.length); - } - - - // ************************************************************* - // 2. Compute the sum of all flexible column widths - // ************************************************************* - var widthRemaining = width - widthUsed; - var flexibleColumnsLength = flexibleColumns.length; - var prioritySum = 0; - - for (i = 0; i < flexibleColumnsLength; i++) - { - prioritySum += flexibleColumns[i]._computedWidthParsed; - } - - - // ************************************************************* - // 3. Calculating the size of each 'part'. - // ************************************************************* - var partWidth = widthRemaining / prioritySum; - - // ************************************************************* - // 4. Adjust flexible columns, taking min/max values into account - // ************************************************************* - - bSomethingChanged = true; - for (flexibleColumnsLength = flexibleColumns.length; - bSomethingChanged && flexibleColumnsLength > 0; - flexibleColumnsLength = flexibleColumns.length) - { - // Assume nothing will change - bSomethingChanged = false; - - for (i = flexibleColumnsLength - 1; i >= 0; i--) - { - columnData = flexibleColumns[i]; - - computedFlexibleWidth = - columnData._computedWidthFlexValue = - columnData._computedWidthParsed * partWidth; - - // If the part is not within its specified min/max range, adjust it. - var min = columnData.getMinWidthValue(); - var max = columnData.getMaxWidthValue(); - if (min && computedFlexibleWidth < min) - { - columnData._computedWidthFlexValue = Math.round(min); - widthUsed += columnData._computedWidthFlexValue; - qx.lang.Array.removeAt(flexibleColumns, i); - bSomethingChanged = true; - - // Don't round fixed-width columns (in step 5) - columnData = null; - } - else if (max && computedFlexibleWidth > max) - { - columnData._computedWidthFlexValue = Math.round(max); - widthUsed += columnData._computedWidthFlexValue; - qx.lang.Array.removeAt(flexibleColumns, i); - bSomethingChanged = true; - - // Don't round fixed-width columns (in step 5) - columnData = null; - } - } - } - - // If any flexible columns remain, then allocate the remaining space to them - if (flexibleColumns.length > 0) - { - // Recalculate the priority sum of the remaining flexible columns - prioritySum = 0; - for (i = 0; i < flexibleColumnsLength; i++) - { - prioritySum += flexibleColumns[i]._computedWidthParsed; - } - - // Recalculate the width remaining and part width - widthRemaining = width - widthUsed; - partWidth = widthRemaining / prioritySum; - - // If there's no width remaining... - if (widthRemaining <= 0) - { - // ... then use minimum width * priority for all remaining columns - for (i = 0; i < flexibleColumnsLength; i++) - { - columnData = flexibleColumns[i]; - - computedFlexibleWidth = - columnData._computedWidthFlexValue = - (qx.ui.table.DefaultResizeBehavior.MIN_WIDTH * - flexibleColumns[i]._computedWidthParsed); - columnData._computedWidthFlexValue = Math.round(computedFlexibleWidth); - widthUsed += columnData._computedWidthFlexValue; - } - } - else - { - // Assign widths of remaining flexible columns - for (i = 0; i < flexibleColumnsLength; i++) - { - columnData = flexibleColumns[i]; - - computedFlexibleWidth = - columnData._computedWidthFlexValue = - columnData._computedWidthParsed * partWidth; - - // If the computed width is less than our hard-coded minimum... - if (computedFlexibleWidth < - qx.ui.table.DefaultResizeBehavior.MIN_WIDTH) - { - // ... then use the hard-coded minimum - computedFlexibleWidth = qx.ui.table.DefaultResizeBehavior.MIN_WIDTH; - } - - columnData._computedWidthFlexValue = Math.round(computedFlexibleWidth); - widthUsed += columnData._computedWidthFlexValue; - } - } - } - - // ************************************************************* - // 5. Fix rounding errors - // ************************************************************* - if (columnData != null && widthRemaining > 0) - { - columnData._computedWidthFlexValue += width - widthUsed; - } - - // ************************************************************* - // 6. Set the column widths to what we have calculated - // ************************************************************* - for (i = 0; i < visibleColumnsLength; i++) - { - var colWidth; - - // Get the current column's column data - columnData = this._resizeColumnData[visibleColumns[i]]; - - // Is this column a flex width? - if (columnData._computedWidthTypeFlex) - { - // Yup. Set the width to the calculated width value based on flex - colWidth = columnData._computedWidthFlexValue; - } - else if (columnData._computedWidthTypePercent) - { - // Set the width to the calculated width value based on percent - colWidth = columnData._computedWidthPercentValue; - } - else - { - colWidth = columnData.getWidth(); - } - - // Now that we've calculated the width, set it. - tableColumnModel.setColumnWidth(visibleColumns[i], colWidth); - - if (debug) - { - this.debug("col " + columnData._columnNumber + ": width=" + colWidth); - } - } -}; - - -/** - * Extend the visible column to right of the column which just changed width, - * to fill any available space within the inner width of the table. This - * means that if the sum of the widths of all columns exceeds the inner width - * of the table, no change is made. If, on the other hand, the sum of the - * widths of all columns is less than the inner width of the table, the - * visible column to the right of the column which just changed width is - * extended to take up the width available within the inner width of the - * table. - * - * @param tableColumnModel {qx.ui.table.ResizeTableColumnModel} - * The table column model in use. - * - * @param event - * The event object. - */ -qx.Proto._extendNextColumn = function(tableColumnModel, event) -{ - // Event data properties: col, oldWidth, newWidth - var data = event.getData(); - - var visibleColumns = tableColumnModel._visibleColumnArr; - - // Determine the available width - var width = this._getAvailableWidth(tableColumnModel); - - // Determine the number of visible columns - var numColumns = visibleColumns.length; - - // Did this column become longer than it was? - if (data.newWidth > data.oldWidth) - { - // Yup. Don't resize anything else. The other columns will just get - // pushed off and require scrollbars be added (if not already there). - return; - } - - // This column became shorter. See if we no longer take up the full space - // that's available to us. - var i; - var nextCol; - var widthUsed = 0; - for (i = 0; i < numColumns; i++) - { - widthUsed += - tableColumnModel.getColumnWidth(visibleColumns[i]); - } - - // If the used width is less than the available width... - if (widthUsed < width) - { - // ... then determine the next visible column - for (i = 0; i < visibleColumns.length; i++) - { - if (visibleColumns[i] == data.col) - { - nextCol = visibleColumns[i + 1]; - break; - } - } - - if (nextCol) - { - // Make the next column take up the available space. - var oldWidth = tableColumnModel.getColumnWidth(nextCol); - var newWidth = (width - (widthUsed - - tableColumnModel.getColumnWidth(nextCol))); - tableColumnModel.setColumnWidth(nextCol, newWidth); - } - } -}; - - -/** - * If a column was just made invisible, extend the last column to fill any - * available space within the inner width of the table. This means that if - * the sum of the widths of all columns exceeds the inner width of the table, - * no change is made. If, on the other hand, the sum of the widths of all - * columns is less than the inner width of the table, the last column is - * extended to take up the width available within the inner width of the - * table. - * - * @param tableColumnModel {qx.ui.table.ResizeTableColumnModel} - * The table column model in use. - * - * @param event - * The event object. - */ -qx.Proto._extendLastColumn = function(tableColumnModel, event) -{ - // Event data properties: col, visible - var data = event.getData(); - - // If the column just became visible, don't make any width changes - if (data.visible) - { - return; - } - - // Get the array of visible columns - var visibleColumns = tableColumnModel._visibleColumnArr; - - // Determine the available width - var width = this._getAvailableWidth(tableColumnModel); - - // Determine the number of visible columns - var numColumns = visibleColumns.length; - - // See if we no longer take up the full space that's available to us. - var i; - var lastCol; - var widthUsed = 0; - for (i = 0; i < numColumns; i++) - { - widthUsed += - tableColumnModel.getColumnWidth(visibleColumns[i]); - } - - // If the used width is less than the available width... - if (widthUsed < width) - { - // ... then get the last visible column - lastCol = visibleColumns[visibleColumns.length - 1]; - - // Make the last column take up the available space. - var oldWidth = tableColumnModel.getColumnWidth(lastCol); - var newWidth = (width - (widthUsed - - tableColumnModel.getColumnWidth(lastCol))); - tableColumnModel.setColumnWidth(lastCol, newWidth); - } -}; - - - -qx.Class.MIN_WIDTH = 10; |