You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ah...@apache.org on 2019/12/28 04:55:49 UTC
[royale-asjs] 02/02: grouped columns appear in the right places.
Next is to improve the visuals
This is an automated email from the ASF dual-hosted git repository.
aharui pushed a commit to branch adg_grouped
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
commit 19391b26d83df985cf0bfb26a8f60bfec1a94ccd
Author: Alex Harui <ah...@apache.org>
AuthorDate: Fri Dec 27 20:55:33 2019 -0800
grouped columns appear in the right places. Next is to improve the visuals
---
.../MXRoyale/src/main/resources/defaults.css | 3 +-
.../beads/AdvancedDataGridHeaderLayout.as | 161 +++++++++++++++++++++
.../main/royale/mx/controls/AdvancedDataGrid.as | 5 +-
.../AdvancedDataGridButtonBar.as | 9 ++
.../AdvancedDataGridHeaderRenderer.as | 54 ++++++-
.../mx/controls/beads/AdvancedDataGridView.as | 18 ++-
.../main/royale/mx/controls/beads/DataGridView.as | 4 +
.../beads/layouts/AdvancedDataGridLayout.as | 36 +++++
.../mx/controls/beads/layouts/DataGridLayout.as | 28 ++--
9 files changed, 290 insertions(+), 28 deletions(-)
diff --git a/frameworks/projects/MXRoyale/src/main/resources/defaults.css b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
index 0001694..f07e80a 100644
--- a/frameworks/projects/MXRoyale/src/main/resources/defaults.css
+++ b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
@@ -76,6 +76,7 @@ Basic|DataGridButtonBar {
adg|AdvancedDataGridButtonBar {
IItemRenderer: ClassReference("mx.controls.advancedDataGridClasses.AdvancedDataGridHeaderRenderer");
+ position: absolute;
}
AdvancedDataGrid
@@ -89,7 +90,7 @@ AdvancedDataGrid
IDataProviderNotifier: ClassReference("mx.controls.beads.DataProviderChangeNotifier");
columnClass: ClassReference("mx.controls.advancedDataGridClasses.AdvancedDataGridColumnList");
columnContainerClass: ClassReference("mx.controls.advancedDataGridClasses.AdvancedDataGridButtonBar");
- columnLayoutClass: ClassReference("org.apache.royale.html.beads.layouts.ButtonBarLayout");
+ columnLayoutClass: ClassReference("mx.containers.beads.AdvancedDataGridHeaderLayout");
listAreaClass: ClassReference("mx.controls.advancedDataGridClasses.AdvancedDataGridListArea");
background-color: #FFFFFF;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as
new file mode 100644
index 0000000..8d3ffc3
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/AdvancedDataGridHeaderLayout.as
@@ -0,0 +1,161 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+// 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.containers.beads
+{
+ import mx.core.EdgeMetrics;
+ import mx.core.UIComponent;
+
+ import org.apache.royale.core.LayoutBase;
+ import org.apache.royale.geom.Rectangle;
+ import org.apache.royale.core.IBeadLayout;
+ import org.apache.royale.core.ILayoutChild;
+ import org.apache.royale.core.ILayoutView;
+ import org.apache.royale.core.IStyleableObject;
+ import org.apache.royale.core.IStrand;
+ import org.apache.royale.html.beads.models.ButtonBarModel;
+
+/*
+import mx.core.mx_internal;
+import mx.events.ChildExistenceChangedEvent;
+import mx.events.MoveEvent;
+import mx.resources.IResourceManager;
+import mx.resources.ResourceManager;
+import flash.utils.Dictionary;
+
+use namespace mx_internal;
+*/
+
+/**
+ * @private
+ * The AdvancedDataGridHeaderLayout class is for internal use only.
+ */
+public class AdvancedDataGridHeaderLayout extends LayoutBase
+{
+
+
+ //--------------------------------------------------------------------------
+ //
+ // Constructor
+ //
+ //--------------------------------------------------------------------------
+
+ /**
+ * Constructor.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ public function AdvancedDataGridHeaderLayout()
+ {
+ super();
+ }
+
+ //--------------------------------------------------------------------------
+ //
+ // Properties
+ //
+ //--------------------------------------------------------------------------
+
+ private var _strand:IStrand;
+
+ override public function set strand(value:IStrand):void
+ {
+ _strand = value;
+ super.strand = value;
+
+ }
+
+ private var _buttonWidths:Array = null;
+
+ /**
+ * An array of widths (Number), one per button. These values supersede the
+ * default of equally-sized buttons.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 10.2
+ * @playerversion AIR 2.6
+ * @productversion Royale 0.9
+ */
+ public function get buttonWidths():Array
+ {
+ return _buttonWidths;
+ }
+ public function set buttonWidths(value:Array):void
+ {
+ _buttonWidths = value;
+ }
+
+
+ //--------------------------------------------------------------------------
+ //
+ // Overridden methods
+ //
+ //--------------------------------------------------------------------------
+
+ override public function layout():Boolean
+ {
+ var contentView:ILayoutView = layoutView;
+
+ var model:ButtonBarModel = (host as IStrand).getBeadByType(ButtonBarModel) as ButtonBarModel;
+ if (model) {
+ buttonWidths = model.buttonWidths;
+ }
+
+ var n:int = contentView.numElements;
+ if (n <= 0) return false;
+
+ var xx:Number = 0;
+
+ for (var i:int=0; i < n; i++)
+ {
+ var ilc:ILayoutChild = contentView.getElementAt(i) as ILayoutChild;
+ if (ilc == null || !ilc.visible) continue;
+ if (!(ilc is IStyleableObject)) continue;
+
+ COMPILE::SWF {
+ if (buttonWidths) {
+ var widthValue:* = buttonWidths[i];
+
+ if (widthValue != null) ilc.width = Number(widthValue);
+ ilc.x = xx;
+ xx += ilc.width;
+ }
+ }
+
+ COMPILE::JS {
+ // otherwise let the flexbox layout handle matters on its own.
+ if (buttonWidths) {
+ var widthValue:* = buttonWidths[i];
+ if (widthValue != null) ilc.width = Number(widthValue);
+ ilc.x = xx;
+ xx += ilc.width;
+ }
+ if (!host.isHeightSizedToContent())
+ ilc.height = contentView.height;
+ }
+ }
+
+ return true;
+ }
+}
+}
+
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/AdvancedDataGrid.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/AdvancedDataGrid.as
index 96b7961..4be01c0 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/AdvancedDataGrid.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/AdvancedDataGrid.as
@@ -48,12 +48,12 @@ package mx.controls
import mx.collections.IViewCursor;
import mx.collections.Sort;
import mx.collections.SortField;
+ import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
+ import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
import mx.controls.beads.AdvancedDataGridSortBead;
import mx.controls.beads.AdvancedDataGridView;
import mx.controls.beads.DataGridColumnResizeBead;
import mx.controls.beads.DataGridLinesBeadForICollectionView;
- import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
- import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.AdvancedListBase;
import mx.core.mx_internal;
@@ -6442,6 +6442,7 @@ public class AdvancedDataGrid extends AdvancedListBase implements IDataGrid
var i:int=0;
while (i < groupedColumns.length)
{
+ (groupedColumns[i] as AdvancedDataGridColumn).owner = this;
if (groupedColumns[i] is AdvancedDataGridColumnGroup && groupedColumns[i].children && groupedColumns[i].children.length >0)
{
var prefix:Array = groupedColumns.slice(0,i);
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridButtonBar.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridButtonBar.as
index 1fbfb95..758ca4d 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridButtonBar.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridButtonBar.as
@@ -20,6 +20,8 @@
package mx.controls.advancedDataGridClasses
{
+ import mx.containers.beads.AdvancedDataGridHeaderLayout;
+
import org.apache.royale.html.DataGridButtonBar;
/**
@@ -39,6 +41,13 @@ package mx.controls.advancedDataGridClasses
typeNames += " AdvancedDataGridButtonBar";
}
+
+ override public function addedToParent():void
+ {
+ var layout:AdvancedDataGridHeaderLayout = new AdvancedDataGridHeaderLayout();
+ addBead(layout);
+ super.addedToParent();
+ }
}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridHeaderRenderer.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridHeaderRenderer.as
index 3c196c0..2dac500 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridHeaderRenderer.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/advancedDataGridClasses/AdvancedDataGridHeaderRenderer.as
@@ -29,6 +29,8 @@ import flash.geom.Rectangle;
import flash.text.TextLineMetrics;
*/
import mx.controls.AdvancedDataGrid;
+import mx.controls.advancedDataGridClasses.AdvancedDataGridButtonBar;
+import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import mx.controls.listClasses.IListItemRenderer;
@@ -37,18 +39,22 @@ import mx.core.IDataRenderer;
import mx.core.IFactory;
import mx.core.IInvalidating;
import mx.core.IToolTip;
+import mx.core.IUIComponent;
import mx.core.IUITextField;
import mx.core.UIComponent;
import mx.core.UITextField;
import mx.core.mx_internal;
import mx.events.FlexEvent;
import mx.events.ToolTipEvent;
-import mx.core.IUIComponent;
-import org.apache.royale.geom.Point;
+import mx.managers.ISystemManager;
+
+import org.apache.royale.core.IChild;
import org.apache.royale.core.TextLineMetrics;
-import org.apache.royale.geom.Rectangle;
import org.apache.royale.events.Event;
import org.apache.royale.events.MouseEvent;
+import org.apache.royale.geom.Point;
+import org.apache.royale.geom.Rectangle;
+import org.apache.royale.html.DataGridButtonBar;
use namespace mx_internal;
@@ -186,11 +192,6 @@ public class AdvancedDataGridHeaderRenderer extends UIComponent implements IData
// InteractiveObject variables.
tabEnabled = false;
- COMPILE::JS
- {
- isAbsolute = false;
- }
-
addEventListener(ToolTipEvent.TOOL_TIP_SHOW, toolTipShowHandler);
}
@@ -427,6 +428,8 @@ public class AdvancedDataGridHeaderRenderer extends UIComponent implements IData
addChild(background);
}
}
+
+ private var childHeaders:DataGridButtonBar;
/**
* @private
@@ -521,6 +524,13 @@ public class AdvancedDataGridHeaderRenderer extends UIComponent implements IData
{
toolTip = null;
}
+ if (data is AdvancedDataGridColumnGroup)
+ {
+ var adgcg:AdvancedDataGridColumnGroup = data as AdvancedDataGridColumnGroup;
+ childHeaders = new AdvancedDataGridButtonBar();
+ childHeaders.dataProvider = adgcg.children;
+ addElement(childHeaders);
+ }
}
}
else
@@ -774,6 +784,18 @@ public class AdvancedDataGridHeaderRenderer extends UIComponent implements IData
background.graphics.endFill();
setChildIndex( IUIComponent(background), 0 );
}
+ if (childHeaders)
+ {
+ var adgcg:AdvancedDataGridColumnGroup = data as AdvancedDataGridColumnGroup;
+ var buttonWidths:Array = [];
+ for (var i:int = 0; i < adgcg.children.length; i++)
+ buttonWidths.push((adgcg.children[i] as DataGridColumn).columnWidth);
+ childHeaders.buttonWidths = buttonWidths;
+ childHeaders.height = unscaledHeight / 2;
+ childHeaders.width = unscaledWidth;
+ childHeaders.x = 0;
+ childHeaders.y = unscaledHeight / 2;
+ }
}
//--------------------------------------------------------------------------
@@ -884,7 +906,23 @@ public class AdvancedDataGridHeaderRenderer extends UIComponent implements IData
return label;
}
+ override public function setWidth(value:Number, noEvent:Boolean = false):void
+ {
+ super.setWidth(value, noEvent);
+ updateDisplayList(width, height);
+ }
+ override public function get systemManager():ISystemManager
+ {
+ var sm:ISystemManager = super.systemManager;
+ if (!sm)
+ {
+ // skip a layer because parent ButtonBar is not IUIComponent
+ systemManager = ((parent as IChild).parent as IUIComponent).systemManager;
+ }
+ return sm;
+ }
+
public function get nestLevel():int
{
throw new Error("Method not implemented.");
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/AdvancedDataGridView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/AdvancedDataGridView.as
index b5fe4aa..70d3e2a 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/AdvancedDataGridView.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/AdvancedDataGridView.as
@@ -67,15 +67,14 @@ package mx.controls.beads
IEventDispatcher(host).addEventListener("columnsInvalid", handleColumnsInvalid);
handleColumnsInvalid(null);
}
-
+
private function handleColumnsInvalid(event:Event):void
{
if (!columnLists) return;
- var host:IDataGrid = _strand as IDataGrid;
+ var host:AdvancedDataGrid = _strand as AdvancedDataGrid;
var sharedModel:IDataGridModel = (host.model as IDataGridModel);
- var visibleColumns:Array = [];
columnLists.length = 0;
for (var i:int=0; i < sharedModel.columns.length; i++)
{
@@ -90,7 +89,18 @@ package mx.controls.beads
columnLists.push(list);
}
}
- (header as DataGridButtonBar).dataProvider = visibleColumns;
+ if (host.groupedColumns != null)
+ {
+ var groupedColumns:Array = [];
+ for (i = 0; i < host.groupedColumns.length; i++)
+ {
+ if ((host.groupedColumns[i] as AdvancedDataGridColumn).visible)
+ groupedColumns.push(host.groupedColumns[i]);
+ }
+ (header as DataGridButtonBar).dataProvider = groupedColumns;
+ }
+ else
+ (header as DataGridButtonBar).dataProvider = visibleColumns;
host.dispatchEvent(new Event("layoutNeeded"));
}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/DataGridView.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/DataGridView.as
index 2a89092..5a20ad1 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/DataGridView.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/DataGridView.as
@@ -61,6 +61,8 @@ package mx.controls.beads
{
}
+ public var visibleColumns:Array = [];
+
override protected function handleInitComplete(event:Event):void
{
var host:IDataGrid = _strand as IDataGrid;
@@ -112,6 +114,8 @@ package mx.controls.beads
}
if (sharedModel.columns == null)
return;
+ if (visibleColumns == null)
+ visibleColumns = sharedModel.columns;
super.handleDataProviderChanged(event);
}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/AdvancedDataGridLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/AdvancedDataGridLayout.as
index 1e031e5..23956d4 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/AdvancedDataGridLayout.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/layouts/AdvancedDataGridLayout.as
@@ -18,6 +18,7 @@
////////////////////////////////////////////////////////////////////////////////
package mx.controls.beads.layouts
{
+ import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnGroup;
import mx.controls.dataGridClasses.DataGridColumn;
import org.apache.royale.core.IBorderPaddingMarginValuesImpl;
@@ -68,6 +69,41 @@ package mx.controls.beads.layouts
COMPILE::JS
private var listening:Boolean;
+ override protected function setHeaderWidths(columnWidths:Array):void
+ {
+ 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;
+ if (bbmodel.dataProvider.length != columnWidths.length)
+ {
+ // probably some grouped columns so recompute widths;
+ var newColumnWidths:Array = [];
+ for (var i:int = 0; i < bbmodel.dataProvider.length; i++)
+ {
+ newColumnWidths.push(getHeaderColumnWidth(bbmodel.dataProvider[i] as DataGridColumn));
+ }
+ columnWidths = newColumnWidths;
+ }
+ super.setHeaderWidths(columnWidths);
+ }
+
+ private function getHeaderColumnWidth(column:DataGridColumn):Number
+ {
+ if (column is AdvancedDataGridColumnGroup)
+ {
+ var adgcg:AdvancedDataGridColumnGroup = column as AdvancedDataGridColumnGroup;
+ var w:Number = 0;
+ for (var i:int = 0; i < adgcg.children.length; i++)
+ {
+ w += getHeaderColumnWidth(adgcg.children[i] as DataGridColumn);
+ }
+ return w;
+ }
+ return column.columnWidth;
+ }
+
/**
* @copy org.apache.royale.core.IBeadLayout#layout
* @royaleignorecoercion org.apache.royale.core.IBorderPaddingMarginValuesImpl
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
index 9f47d19..05312a6 100644
--- 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
@@ -26,7 +26,7 @@ package mx.controls.beads.layouts
import org.apache.royale.html.beads.models.ButtonBarModel;
import org.apache.royale.html.beads.layouts.DataGridLayout;
import mx.controls.dataGridClasses.DataGridColumn;
-
+ import mx.controls.beads.DataGridView;
/**
* The DataGridLayout class.
@@ -50,6 +50,12 @@ package mx.controls.beads.layouts
{
}
+ override protected function getColumnsForLayout():Array
+ {
+ var view:DataGridView = (uiHost.view as DataGridView);
+ return view.visibleColumns;
+ }
+
/**
* @copy org.apache.royale.core.IBeadLayout#layout
* @royaleignorecoercion org.apache.royale.core.IBorderPaddingMarginValuesImpl
@@ -62,11 +68,7 @@ package mx.controls.beads.layouts
*/
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;
+ var view:DataGridView = (uiHost.view as DataGridView);
// 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);
@@ -74,10 +76,10 @@ package mx.controls.beads.layouts
var totalWidths:Number = 0;
var unspecifiedWidths:int = 0;
- if (bbmodel.dataProvider)
+ if (view.visibleColumns)
{
- for(var i:int=0; i < bbmodel.dataProvider.length; i++) {
- var columnDef:DataGridColumn = bbmodel.dataProvider[i] as DataGridColumn;
+ for(var i:int=0; i < view.visibleColumns.length; i++) {
+ var columnDef:DataGridColumn = view.visibleColumns[i] as DataGridColumn;
if (!isNaN(columnDef.width))
totalWidths += columnDef.width;
else
@@ -95,8 +97,8 @@ package mx.controls.beads.layouts
// 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;
+ for(i=0; i < view.visibleColumns.length; i++) {
+ columnDef = view.visibleColumns[i] as DataGridColumn;
if (!isNaN(columnDef.width))
columnDef.columnWidth = columnDef.width;
else
@@ -108,8 +110,8 @@ package mx.controls.beads.layouts
if (totalWidths != useWidth)
{
var factor:Number = useWidth / totalWidths;
- for(i=0; i < bbmodel.dataProvider.length; i++) {
- columnDef = bbmodel.dataProvider[i] as DataGridColumn;
+ for(i=0; i < view.visibleColumns.length; i++) {
+ columnDef = view.visibleColumns[i] as DataGridColumn;
columnDef.columnWidth = columnDef.width * factor;
}
}