This is an automated email from the ASF dual-hosted git repository. aharui pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit 1f05de4e899089583436ea3302245843d9092cc1 Author: Alex Harui <[email protected]> AuthorDate: Thu Aug 15 15:41:18 2019 -0700 try to get DG columns to behave better --- .../royale/html/beads/layouts/DataGridLayout.as | 19 ++-- .../royale/html/supportClasses/DataGridColumn.as | 3 +- .../MXRoyale/src/main/resources/defaults.css | 4 +- .../MXRoyale/src/main/royale/MXRoyaleClasses.as | 1 + .../mx/controls/beads/layouts/DataGridLayout.as | 114 +++++++++++++++++++++ 5 files changed, 130 insertions(+), 11 deletions(-) diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as index faf1595..f586943 100644 --- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as +++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/DataGridLayout.as @@ -25,9 +25,9 @@ package org.apache.royale.html.beads.layouts import org.apache.royale.core.IDataGridModel; import org.apache.royale.core.IStrand; import org.apache.royale.core.IUIBase; - import org.apache.royale.core.layout.EdgeData; import org.apache.royale.core.UIBase; import org.apache.royale.core.ValuesManager; + import org.apache.royale.core.layout.EdgeData; import org.apache.royale.events.Event; import org.apache.royale.events.IEventDispatcher; import org.apache.royale.geom.Rectangle; @@ -60,7 +60,7 @@ package org.apache.royale.html.beads.layouts { } - private var _strand:IStrand; + protected var _strand:IStrand; /** * @copy org.apache.royale.core.IBead#strand @@ -84,7 +84,7 @@ package org.apache.royale.html.beads.layouts /** * @royaleignorecoercion org.apache.royale.core.UIBase */ - private function get uiHost():UIBase + protected function get uiHost():UIBase { return _strand as UIBase; } @@ -112,6 +112,10 @@ package org.apache.royale.html.beads.layouts public function layout():Boolean { var header:IUIBase = (uiHost.view as IDataGridView).header; + // fancier DG's will filter invisible columns and only put visible columns + // in the bbmodel, so do all layout based on the bbmodel, not the set + // of columns that may contain invisible columns + var bbmodel:ButtonBarModel = header.getBeadByType(ButtonBarModel) as ButtonBarModel; var listArea:IUIBase = (uiHost.view as IDataGridView).listArea; var displayedColumns:Array = (uiHost.view as IDataGridView).columnLists; @@ -122,11 +126,11 @@ package org.apache.royale.html.beads.layouts var useHeight:Number = uiHost.height - (borderMetrics.top + borderMetrics.bottom); var xpos:Number = 0; - var defaultColumnWidth:Number = (useWidth) / model.columns.length; + var defaultColumnWidth:Number = (useWidth) / bbmodel.dataProvider.length; var columnWidths:Array = []; - for(var i:int=0; i < displayedColumns.length; i++) { - var columnDef:IDataGridColumn = model.columns[i] as IDataGridColumn; + for(var i:int=0; i < bbmodel.dataProvider.length; i++) { + var columnDef:IDataGridColumn = bbmodel.dataProvider[i] as IDataGridColumn; var columnList:UIBase = displayedColumns[i] as UIBase; // probably do not need to set (x,y), but if the Container's layout requires it, they will be set. @@ -135,7 +139,7 @@ package org.apache.royale.html.beads.layouts var columnWidth:Number = defaultColumnWidth; if (!isNaN(columnDef.columnWidth)) { - columnWidth = (columnDef.columnWidth / uiHost.width) * useWidth; + columnWidth = columnDef.columnWidth; } columnList.width = columnWidth; @@ -144,7 +148,6 @@ package org.apache.royale.html.beads.layouts xpos += columnList.width; } - var bbmodel:ButtonBarModel = header.getBeadByType(ButtonBarModel) as ButtonBarModel; bbmodel.buttonWidths = columnWidths; header.x = borderMetrics.left; diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as index cc58aff..db02435 100644 --- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as +++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/supportClasses/DataGridColumn.as @@ -85,7 +85,8 @@ package org.apache.royale.html.supportClasses private var _columnWidth:Number = Number.NaN; /** - * The width of the column (default is 100 pixels). + * The width of the column. If not set, + * the columns will be sized to fit. * * @langversion 3.0 * @playerversion Flash 10.2 diff --git a/frameworks/projects/MXRoyale/src/main/resources/defaults.css b/frameworks/projects/MXRoyale/src/main/resources/defaults.css index c86d206..e8c6631 100644 --- a/frameworks/projects/MXRoyale/src/main/resources/defaults.css +++ b/frameworks/projects/MXRoyale/src/main/resources/defaults.css @@ -81,7 +81,7 @@ AdvancedDataGrid IDataGridPresentationModel: ClassReference("org.apache.royale.html.beads.models.DataGridPresentationModel"); IBeadView: ClassReference("mx.controls.beads.AdvancedDataGridView"); IBeadModel: ClassReference("mx.controls.beads.models.DataGridICollectionViewModel"); - IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.DataGridLayout"); + IBeadLayout: ClassReference("mx.controls.beads.layouts.DataGridLayout"); columnClass: ClassReference("mx.controls.advancedDataGridClasses.AdvancedDataGridColumnList"); background-color: #FFFFFF; @@ -154,7 +154,7 @@ DataGrid IDataGridPresentationModel: ClassReference("org.apache.royale.html.beads.models.DataGridPresentationModel"); IBeadView: ClassReference("org.apache.royale.html.beads.DataGridView"); IBeadModel: ClassReference("org.apache.royale.html.beads.models.DataGridModel"); - IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.DataGridLayout"); + IBeadLayout: ClassReference("mx.controls.beads.layouts.DataGridLayout"); columnClass: ClassReference("org.apache.royale.html.supportClasses.DataGridColumnList"); background-color: #FFFFFF; diff --git a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as index f8977b9..cbe0646 100644 --- a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as +++ b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as @@ -162,6 +162,7 @@ internal class MXRoyaleClasses import mx.controls.advancedDataGridClasses.AdvancedDataGridSingleSelectionMouseController; AdvancedDataGridSingleSelectionMouseController; import mx.controls.beads.AdvancedDataGridView; AdvancedDataGridView; import mx.controls.beads.DataGridView; DataGridView; + import mx.controls.beads.layouts.DataGridLayout; DataGridLayout; import mx.formatters.Formatter; Formatter; import mx.formatters.IFormatter; IFormatter; import mx.formatters.NumberBase; NumberBase; diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/DataGridLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/DataGridLayout.as new file mode 100644 index 0000000..bfca4d7 --- /dev/null +++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/DataGridLayout.as @@ -0,0 +1,114 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package mx.controls.beads.layouts +{ + import org.apache.royale.core.IUIBase; + import org.apache.royale.core.IBorderPaddingMarginValuesImpl; + import org.apache.royale.core.ValuesManager; + import org.apache.royale.core.layout.EdgeData; + import org.apache.royale.html.beads.IDataGridView; + import org.apache.royale.html.beads.models.ButtonBarModel; + import org.apache.royale.html.beads.layouts.DataGridLayout; + import mx.controls.dataGridClasses.DataGridColumn; + + + /** + * The DataGridLayout class. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ + public class DataGridLayout extends org.apache.royale.html.beads.layouts.DataGridLayout + { + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 10.2 + * @playerversion AIR 2.6 + * @productversion Royale 0.0 + */ + public function DataGridLayout() + { + } + + /** + * @copy org.apache.royale.core.IBeadLayout#layout + * @royaleignorecoercion org.apache.royale.core.IBorderPaddingMarginValuesImpl + * @royaleignorecoercion org.apache.royale.core.IDataGridModel + * @royaleignorecoercion org.apache.royale.core.IUIBase + * @royaleignorecoercion org.apache.royale.core.UIBase + * @royaleignorecoercion org.apache.royale.html.beads.IDataGridView + * @royaleignorecoercion org.apache.royale.html.beads.models.ButtonBarModel + * @royaleignorecoercion org.apache.royale.html.supportClasses.IDataGridColumn + */ + override public function layout():Boolean + { + var header:IUIBase = (uiHost.view as IDataGridView).header; + // fancier DG's will filter invisible columns and only put visible columns + // in the bbmodel, so do all layout based on the bbmodel, not the set + // of columns that may contain invisible columns + var bbmodel:ButtonBarModel = header.getBeadByType(ButtonBarModel) as ButtonBarModel; + // do the proportional sizing of columns + var borderMetrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getBorderMetrics(_strand as IUIBase); + var useWidth:Number = uiHost.width - (borderMetrics.left + borderMetrics.right); + var useHeight:Number = uiHost.height - (borderMetrics.top + borderMetrics.bottom); + + var totalWidths:Number = 0; + var unspecifiedWidths:int = 0; + for(var i:int=0; i < bbmodel.dataProvider.length; i++) { + var columnDef:DataGridColumn = bbmodel.dataProvider[i] as DataGridColumn; + if (!isNaN(columnDef.width)) + totalWidths += columnDef.width; + else + unspecifiedWidths++; + } + + if (unspecifiedWidths > 0 && totalWidths > 0) + { + // some widths are specified, others are not, so fit the unspecified + // in the remaining space + var remainingSpace:Number = useWidth - totalWidths; + var proportionateShare:Number = remainingSpace / unspecifiedWidths; + for(i=0; i < bbmodel.dataProvider.length; i++) { + columnDef = bbmodel.dataProvider[i] as DataGridColumn; + if (!isNaN(columnDef.width)) + columnDef.columnWidth = columnDef.width; + else + columnDef.columnWidth = proportionateShare; + } + } + else if (totalWidths > 0) + { + if (totalWidths != useWidth) + { + var factor:Number = useWidth / totalWidths; + for(i=0; i < bbmodel.dataProvider.length; i++) { + columnDef = bbmodel.dataProvider[i] as DataGridColumn; + columnDef.columnWidth = columnDef.width * factor; + } + } + } + + return super.layout(); + } + } +}
