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/11/01 23:16:05 UTC

[royale-asjs] branch develop updated: handle scenario where no columns are specified and generate columns later when dataprovider is specified

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


The following commit(s) were added to refs/heads/develop by this push:
     new 71992d7  handle scenario where no columns are specified and generate columns later when dataprovider is specified
71992d7 is described below

commit 71992d72bee42de02b6da4c2e89552a6a963cce2
Author: Alex Harui <ah...@apache.org>
AuthorDate: Fri Nov 1 16:15:42 2019 -0700

    handle scenario where no columns are specified and generate columns later when dataprovider is specified
---
 .../org/apache/royale/html/beads/DataGridView.as   |   7 +-
 .../mx/controls/beads/AdvancedDataGridView.as      |   2 +
 .../main/royale/mx/controls/beads/DataGridView.as  | 114 +++++++++++++++++++--
 .../beads/layouts/AdvancedDataGridLayout.as        |   1 +
 .../mx/controls/beads/layouts/DataGridLayout.as    |  19 ++--
 5 files changed, 128 insertions(+), 15 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
index 7f77b65..0e7d8ec 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataGridView.as
@@ -134,7 +134,8 @@ package org.apache.royale.html.beads
 				_listArea = new listAreaClass() as IUIBase;
 				(_listArea as ILayoutChild).percentWidth = 100;
 
-				createLists();
+                if (sharedModel.columns)
+    				createLists();
 
                 var columnLayoutClass:Class = ValuesManager.valuesImpl.getValue(host, "columnLayoutClass") as Class;
                 assert(columnLayoutClass != null,"columnLayoutClass for DataGrid must be set!")
@@ -165,7 +166,7 @@ package org.apache.royale.html.beads
 			/**
 			 * @private
 			 */
-			private function handleDataProviderChanged(event:Event):void
+			protected function handleDataProviderChanged(event:Event):void
 			{
                 var sharedModel:IDataGridModel = _strand.getBeadByType(IBeadModel) as IDataGridModel;
                 for (var i:int=0; i < _lists.length; i++)
@@ -226,7 +227,7 @@ package org.apache.royale.html.beads
 			 * @royaleignorecoercion org.apache.royale.core.IDataGridPresentationModel
 			 * @royaleignorecoercion org.apache.royale.html.supportClasses.IDataGridColumn
 			 */
-			private function createLists():void
+			protected function createLists():void
 			{
 				var host:IDataGrid = _strand as IDataGrid;
 				
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 38764f6..c3bcfe7 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,6 +67,8 @@ package mx.controls.beads
         
         private function handleColumnsInvalid(event:Event):void
         {
+            if (!columnLists) return;
+            
             var host:IDataGrid = _strand as IDataGrid;
             var sharedModel:IDataGridModel = (host.model as IDataGridModel);
             
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 0070e03..94707d2 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
@@ -18,15 +18,24 @@
 ////////////////////////////////////////////////////////////////////////////////
 package mx.controls.beads
 {
+    import mx.collections.CursorBookmark;
+    import mx.collections.ICollectionView;
+    import mx.collections.IViewCursor;
+    import mx.controls.AdvancedDataGrid;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnList;
+    import mx.events.CollectionEvent;
+    import mx.utils.ObjectUtil;
+    
+    import org.apache.royale.core.IBeadModel;
     import org.apache.royale.core.IDataGrid;
+    import org.apache.royale.core.IDataGridModel;
     import org.apache.royale.core.UIBase;
     import org.apache.royale.events.Event;
     import org.apache.royale.events.IEventDispatcher;
     import org.apache.royale.html.beads.DataGridView;
-    
-    import mx.events.CollectionEvent;
-    import mx.controls.advancedDataGridClasses.AdvancedDataGridColumnList;
-    import mx.controls.AdvancedDataGrid;
+    import org.apache.royale.html.DataGridButtonBar;
+    import org.apache.royale.html.supportClasses.IDataGridColumnList;
 	
     /**
      *  The AlertView class.
@@ -52,10 +61,15 @@ package mx.controls.beads
 
         override protected function handleInitComplete(event:Event):void
         {
-            super.handleInitComplete(event);
-            
             var host:IDataGrid = _strand as IDataGrid;
             
+            if (host.model.columns == null && host.model.dataProvider != null)
+            {
+                generateCols();
+            }
+            
+            super.handleInitComplete(event);
+            
             IEventDispatcher(host).addEventListener(CollectionEvent.COLLECTION_CHANGE, handleCollectionChanged);
             if (host.model.dataProvider != null && host.model.dataProvider.length > 0)
             {
@@ -79,5 +93,93 @@ package mx.controls.beads
             host.dispatchEvent(new Event("layoutNeeded"));
             
         }
+        
+        /**
+         * @private
+         */
+        override protected function handleDataProviderChanged(event:Event):void
+        {
+            var sharedModel:IDataGridModel = _strand.getBeadByType(IBeadModel) as IDataGridModel;
+            if (sharedModel.columns == null && sharedModel.dataProvider != null)
+            {
+                generateCols();
+                createLists();
+                (header as DataGridButtonBar).dataProvider = sharedModel.columns;
+            }
+            if (sharedModel.columns == null)
+                return;
+            super.handleDataProviderChanged(event);
+        }
+
+        /**
+         *  @private
+         *  Searches the iterator to determine columns.
+         */
+        private function generateCols():void
+        {
+            var sharedModel:IDataGridModel = _strand.getBeadByType(IBeadModel) as IDataGridModel;
+            if (sharedModel.dataProvider.length > 0)
+            {
+                var col:AdvancedDataGridColumn;
+                var newCols:Array = [];
+                var cols:Array;
+                if (sharedModel.dataProvider)
+                {
+                    var iterator:IViewCursor = sharedModel.dataProvider.createCursor();
+                    //try
+                    //{
+                        iterator.seek(CursorBookmark.FIRST);
+                    //}
+                    /*
+                    catch (e:ItemPendingError)
+                    {
+                        lastSeekPending = new ListBaseSeekPending(CursorBookmark.FIRST, 0);
+                        e.addResponder(new ItemResponder(generateColumnsPendingResultHandler, seekPendingFailureHandler,
+                            lastSeekPending));
+                        iteratorValid = false;
+                        return;
+                    }
+                        */
+                    var info:Object =
+                        ObjectUtil.getClassInfo(iterator.current,
+                            ["uid", "mx_internal_uid"]);
+                    
+                    if(info)
+                        cols = info.properties;
+                }
+                
+                if (!cols)
+                {
+                    // introspect the first item and use its fields
+                    var itmObj:Object = iterator.current;
+                    for (var p:String in itmObj)
+                    {
+                        if (p != "uid")
+                        {
+                            col = new AdvancedDataGridColumn();
+                            col.dataField = p;
+                            newCols.push(col);
+                        }
+                    }
+                }
+                else
+                {
+                    // this is an old recordset - use its columns
+                    var n:int = cols.length;
+                    var colName:Object;
+                    for (var i:int = 0; i < n; i++)
+                    {
+                        colName = cols[i];
+                        if (colName is QName)
+                            colName = QName(colName).localName;
+                        col = new AdvancedDataGridColumn();
+                        col.dataField = String(colName);
+                        newCols.push(col);
+                    }
+                }
+                sharedModel.columns = newCols;
+                //generatedColumns = true;
+            }
+        }
 	}
 }
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 37216e4..6bf8694 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
@@ -100,6 +100,7 @@ package mx.controls.beads.layouts
                 var useWidth:Number = uiHost.width - (borderMetrics.left + borderMetrics.right);
                 var useHeight:Number = uiHost.height - (borderMetrics.top + borderMetrics.bottom);
                 var displayedColumns:Array = (uiHost.view as IDataGridView).columnLists;
+                if (!displayedColumns) return retval;
                 var n:int = displayedColumns.length;
                 var listArea:IUIBase = (uiHost.view as IDataGridView).listArea;
                 COMPILE::JS
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 bfca4d7..9f47d19 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
@@ -74,12 +74,19 @@ package mx.controls.beads.layouts
             
             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 (bbmodel.dataProvider)
+            {
+                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++;
+                }
+            }
+            else
+            {
+                return true;
             }
             
             if (unspecifiedWidths > 0 && totalWidths > 0)