FLEX_34368 Add percentageWidth to GridColumn. Accept patch from Alexander Konovalov with some modifications. Needs tests. Current tests pass
Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/8e546012 Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/8e546012 Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/8e546012 Branch: refs/heads/master Commit: 8e546012128025dcdf148fbecd5c704d85878b43 Parents: 0c91593 Author: Alex Harui <[email protected]> Authored: Sun Jun 22 07:28:31 2014 -0700 Committer: Alex Harui <[email protected]> Committed: Sun Jun 22 07:28:31 2014 -0700 ---------------------------------------------------------------------- .../spark/components/gridClasses/GridColumn.as | 43 ++++++++ .../components/gridClasses/GridViewLayout.as | 106 ++++++++++++++++++- 2 files changed, 145 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8e546012/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as index ff7b298..5c3236f 100644 --- a/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as +++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridColumn.as @@ -1180,6 +1180,49 @@ public class GridColumn extends EventDispatcher dispatchChangeEvent("maxWidthChanged"); } + [Inspectable(category="General")] + [PercentProxy("percentWidth")] + + /** + * @private + */ + private var _percentWidth:Number = NaN; + + [Bindable("widthChanged")] + [Inspectable(environment="none")] + + /** + * The width of this column as a percentage of DataGrid width. + * Setting this property does not change the <code>width</code> + * or <code>minWidth</code> properties. + * + * @default NaN + * + * @langversion 3.0 + * @playerversion Flash 13 + * @playerversion AIR 13.0 + * @productversion Flex 4.12.2 + */ + public function get percentWidth ():Number + { + return _percentWidth; + } + + /** + * @private + */ + public function set percentWidth(value:Number):void + { + if (_percentWidth == value) + { + return; + } + this._percentWidth = value; + invalidateGrid(); + + dispatchChangeEvent("widthChanged"); + } + //---------------------------------- // rendererIsEditable //---------------------------------- http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/8e546012/frameworks/projects/spark/src/spark/components/gridClasses/GridViewLayout.as ---------------------------------------------------------------------- diff --git a/frameworks/projects/spark/src/spark/components/gridClasses/GridViewLayout.as b/frameworks/projects/spark/src/spark/components/gridClasses/GridViewLayout.as index 76febe3..4dbaf11 100644 --- a/frameworks/projects/spark/src/spark/components/gridClasses/GridViewLayout.as +++ b/frameworks/projects/spark/src/spark/components/gridClasses/GridViewLayout.as @@ -1289,18 +1289,67 @@ public class GridViewLayout extends LayoutBase const startCellX:Number = gridDimensionsView.getCellX(0 /* rowIndex */, firstVisibleColumnIndex); const columnGap:int = gridDimensionsView.columnGap; - for (var columnIndex:int = firstVisibleColumnIndex; + var columnIndex : int; + var column : GridColumn; + var totalWidthCoef : Number = 0; + var contentFreeSpace : Number = grid.contentWidth; + var gridFreeSpace : Number = grid.width; + for (columnIndex = 0; (columnIndex < columnCount); columnIndex++) + { + column = getGridColumn(columnIndex); + if (isNaN(column.width) && column.visible) + { + totalWidthCoef += column.percentWidth; + } + else + { + if (!isNaN(column.width) && column.visible) + { + contentFreeSpace -= column.width; + gridFreeSpace -= column.width; + } + } + } + var freeSpace : Number = gridFreeSpace < 0 ? contentFreeSpace : gridFreeSpace; + var unusedFreeSpace : Number = freeSpace; + + for (columnIndex = firstVisibleColumnIndex; (width > 0) && (columnIndex >= 0) && (columnIndex < columnCount); columnIndex = getNextVisibleColumnIndex(columnIndex)) { var cellHeight:Number = gridDimensionsView.getTypicalCellHeight(columnIndex); var cellWidth:Number = gridDimensionsView.getTypicalCellWidth(columnIndex); - var column:GridColumn = getGridColumn(columnIndex); + column = getGridColumn(columnIndex); if (!isNaN(column.width)) { cellWidth = column.width; gridDimensionsView.setTypicalCellWidth(columnIndex, cellWidth); + } + else + { + if (totalWidthCoef > 0) + { + cellWidth = Math.round(column.percentWidth / totalWidthCoef * (freeSpace > 0 ? freeSpace : 0)); + if (cellWidth < column.minWidth) + { + cellWidth = column.minWidth; + unusedFreeSpace -= cellWidth; + } + else + { + if (cellWidth > unusedFreeSpace) + { + cellWidth = unusedFreeSpace; + unusedFreeSpace = 0; + } + else + { + unusedFreeSpace -= cellWidth; + } + } + gridDimensionsView.setTypicalCellWidth(columnIndex, cellWidth); + } } if (isNaN(cellWidth) || isNaN(cellHeight)) @@ -1344,12 +1393,36 @@ public class GridViewLayout extends LayoutBase const requestedColumnCount:int = grid.requestedColumnCount; // TBD GridView... var measuredColumnCount:int = 0; - for (var columnIndex:int = 0; (columnIndex < columnCount); columnIndex++) + var columnIndex : int; + var column : GridColumn; + var totalWidthCoef : Number = 0; + var contentFreeSpace : Number = grid.contentWidth; + var gridFreeSpace : Number = grid.width; + for (columnIndex = 0; (columnIndex < columnCount); columnIndex++) + { + column = getGridColumn(columnIndex); + if (isNaN(column.width) && column.visible) + { + totalWidthCoef += column.percentWidth; + } + else + { + if (!isNaN(column.width) && column.visible) + { + contentFreeSpace -= column.width; + gridFreeSpace -= column.width; + } + } + } + var freeSpace : Number = gridFreeSpace < 0 ? contentFreeSpace : gridFreeSpace; + var unusedFreeSpace : Number = freeSpace; + + for (columnIndex = 0; (columnIndex < columnCount); columnIndex++) { var cellHeight:Number = gridDimensionsView.getTypicalCellHeight(columnIndex); var cellWidth:Number = gridDimensionsView.getTypicalCellWidth(columnIndex); - var column:GridColumn = getGridColumn(columnIndex); + column = getGridColumn(columnIndex); // GridColumn.visible==false columns have a typical size of (0,0) // to distinguish them from the GridColumn.visible==true columns @@ -1366,6 +1439,31 @@ public class GridViewLayout extends LayoutBase { cellWidth = column.width; gridDimensionsView.setTypicalCellWidth(columnIndex, cellWidth); + } + else + { + if (totalWidthCoef > 0) + { + cellWidth = Math.round(column.percentWidth / totalWidthCoef * (freeSpace > 0 ? freeSpace : 0)); + if (cellWidth < column.minWidth) + { + cellWidth = column.minWidth; + unusedFreeSpace -= cellWidth; + } + else + { + if (cellWidth > unusedFreeSpace) + { + cellWidth = unusedFreeSpace; + unusedFreeSpace = 0; + } + else + { + unusedFreeSpace -= cellWidth; + } + } + gridDimensionsView.setTypicalCellWidth(columnIndex, cellWidth); + } } var needTypicalRenderer:Boolean = (requestedColumnCount == -1) || (measuredColumnCount < requestedColumnCount);
