This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git

commit 99d6bb9b556d98106bf69d8557078215914994ba
Author: greg-dove <[email protected]>
AuthorDate: Fri Dec 17 12:15:36 2021 +1300

    Prep for emulation creationPolicy: foundation for deferred layouts and
---
 .../AdvancedDataGridHeaderRenderer.as              |   4 +-
 .../dataGridClasses/DataGridHeaderRenderer.as      |   4 +-
 .../mx/controls/listClasses/ListItemRenderer.as    |   4 +-
 .../src/main/royale/mx/core/UIComponent.as         | 179 +++++++++++++++++++--
 .../src/main/royale/spark/components/Grid.as       |   4 +-
 .../supportClasses/SparkTextButtonItemRenderer.as  |   4 +-
 6 files changed, 176 insertions(+), 23 deletions(-)

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 66c3989..074fa74 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
@@ -1012,7 +1012,7 @@ public class AdvancedDataGridHeaderRenderer extends 
UIComponent implements IData
        throw new Error("Method not implemented.");
     }
 
-    public function get processedDescriptors():Boolean
+    /*public function get processedDescriptors():Boolean
     {
        throw new Error("Method not implemented.");
     }
@@ -1020,7 +1020,7 @@ public class AdvancedDataGridHeaderRenderer extends 
UIComponent implements IData
     public function set processedDescriptors(value:Boolean):void
     {
        throw new Error("Method not implemented.");
-    }
+    }*/
 
     public function get updateCompletePendingFlag():Boolean
     {
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/dataGridClasses/DataGridHeaderRenderer.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/dataGridClasses/DataGridHeaderRenderer.as
index 628abeb..f3d21e9 100644
--- 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/dataGridClasses/DataGridHeaderRenderer.as
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/dataGridClasses/DataGridHeaderRenderer.as
@@ -1010,7 +1010,7 @@ public class DataGridHeaderRenderer extends UIComponent 
implements IDataRenderer
        throw new Error("Method not implemented.");
     }
 
-    public function get processedDescriptors():Boolean
+    /*public function get processedDescriptors():Boolean
     {
        throw new Error("Method not implemented.");
     }
@@ -1018,7 +1018,7 @@ public class DataGridHeaderRenderer extends UIComponent 
implements IDataRenderer
     public function set processedDescriptors(value:Boolean):void
     {
        throw new Error("Method not implemented.");
-    }
+    }*/
 
     public function get updateCompletePendingFlag():Boolean
     {
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/ListItemRenderer.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/ListItemRenderer.as
index 4412721..7116cc8 100644
--- 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/ListItemRenderer.as
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/ListItemRenderer.as
@@ -313,7 +313,7 @@ public class ListItemRenderer extends UIComponent 
implements IListItemRenderer,
        throw new Error("Method not implemented.");
     }
 
-    public function get processedDescriptors():Boolean
+    /*public function get processedDescriptors():Boolean
     {
        throw new Error("Method not implemented.");
     }
@@ -321,7 +321,7 @@ public class ListItemRenderer extends UIComponent 
implements IListItemRenderer,
     public function set processedDescriptors(value:Boolean):void
     {
        throw new Error("Method not implemented.");
-    }
+    }*/
 
     public function get updateCompletePendingFlag():Boolean
     {
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/core/UIComponent.as 
b/frameworks/projects/MXRoyale/src/main/royale/mx/core/UIComponent.as
index 857004e..d0e56cf 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/core/UIComponent.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/core/UIComponent.as
@@ -39,6 +39,8 @@ import flash.events.IEventDispatcher;
 
 import mx.controls.beads.ToolTipBead;
 import mx.core.mx_internal;
+import mx.managers.IToolTipManagerClient;
+
 COMPILE::SWF
 {
 import flash.display.DisplayObject;
@@ -761,7 +763,7 @@ public class UIComponent extends UIBase
     IMXMLDocument,
     IInvalidating,
     IStatesObject,
-    ISimpleStyleClient,
+    ISimpleStyleClient,IToolTipManagerClient,
     IUIComponent, IVisualElement, IFlexModule, IValidatorListener
 {
     
//--------------------------------------------------------------------------
@@ -1123,6 +1125,10 @@ public class UIComponent extends UIBase
 
         if (value)
         {
+            if (_needsLayout) {
+                //invalidateSize();
+                dispatchEvent(new Event('layoutNeeded'));
+            }
             dispatchEvent(new FlexEvent(FlexEvent.CREATION_COMPLETE));
         }
     }
@@ -2692,10 +2698,15 @@ COMPILE::JS
                     for (var i:int = 0; i < numChildren; i++)
                     {
                         var child:IUIComponent = getChildAt(i);
-                        if (child) // child is null for TextNodes
+                        //@todo investigate traces
+                        if (child is IUIComponent) // child is null for 
TextNodes
                             mw = Math.max(mw, 
child.getExplicitOrMeasuredWidth());
-                        else
-                            trace("Child class not IUIComponent: " + 
getQualifiedClassName(getElementAt(i)));
+                        else {
+                            if (child is IUIBase) {
+                                mw = Math.max(mw, child.width);
+                            }
+                            trace(getQualifiedClassName(this) + " Child class 
not IUIComponent: " + getQualifiedClassName(getElementAt(i)));
+                        }
                     }
                 }
                 if (oldWidth.length)
@@ -2768,10 +2779,15 @@ COMPILE::JS
                     for (var i:int = 0; i < numChildren; i++)
                     {
                         var child:IUIComponent = getChildAt(i);
-                        if (child)
+                        //@todo investigate traces
+                        if (child is IUIComponent) // child is null for 
TextNodes
                             mh = Math.max(mh, 
child.getExplicitOrMeasuredHeight());
-                        else
-                            trace("Child class not IUIComponent: " + 
getQualifiedClassName(getElementAt(i)));
+                        else {
+                            if (child is IUIBase) {
+                                mh = Math.max(mh, child.height);
+                            }
+                            trace(getQualifiedClassName(this) + " Child class 
not IUIComponent: " + getQualifiedClassName(getElementAt(i)));
+                        }
                     }
                 }
                 if (oldHeight.length)
@@ -4006,8 +4022,8 @@ COMPILE::JS
                        var n:int = arr.length;
                        var num:int = 0;
                        for (var i:int = 0; i < n; i++)
-                       {
-                               if ((arr[i] as 
WrappedHTMLElement).royale_wrapper)
+                       {   //@todo review issuses with internal native support 
that points to 'this' (2nd check below), can cause infinite recursion in 
measurement if avoided:
+                               if ((arr[i] as 
WrappedHTMLElement).royale_wrapper && (arr[i] as 
WrappedHTMLElement).royale_wrapper != this)
                                        num++;
                        }
                        return num;
@@ -4193,8 +4209,61 @@ COMPILE::JS
      */
     protected function initializationComplete():void
     {
-        dispatchEvent(new FlexEvent(FlexEvent.INITIALIZE));
-    }
+        processedDescriptors = true;
+    }
+
+        //----------------------------------
+        //  processedDescriptors
+        //----------------------------------
+
+        /**
+         *  @private
+         *  Storage for the processedDescriptors property.
+         */
+        private var _processedDescriptors:Boolean = false;
+
+        [Inspectable(environment="none")]
+
+        /**
+         *  Set to <code>true</code> after immediate or deferred child 
creation,
+         *  depending on which one happens. For a Container object, it is set
+         *  to <code>true</code> at the end of
+         *  the <code>createComponentsFromDescriptors()</code> method,
+         *  meaning after the Container object creates its children from its 
child descriptors.
+         *
+         *  <p>For example, if an Accordion container uses deferred 
instantiation,
+         *  the <code>processedDescriptors</code> property for the second pane 
of
+         *  the Accordion container does not become <code>true</code> until 
after
+         *  the user navigates to that pane and the pane creates its children.
+         *  But, if the Accordion had set the <code>creationPolicy</code> 
property
+         *  to <code>"all"</code>, the <code>processedDescriptors</code> 
property
+         *  for its second pane is set to <code>true</code> during application 
startup.</p>
+         *
+         *  <p>For classes that are not containers, which do not have 
descriptors,
+         *  it is set to <code>true</code> after the 
<code>createChildren()</code>
+         *  method creates any internal component children.</p>
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 9
+         *  @playerversion AIR 1.1
+         *  @productversion Flex 3
+         */
+        public function get processedDescriptors():Boolean
+        {
+            return _processedDescriptors;
+        }
+
+        /**
+         *  @private
+         */
+        public function set processedDescriptors(value:Boolean):void
+        {
+            _processedDescriptors = value;
+
+            if (value)
+                dispatchEvent(new FlexEvent(FlexEvent.INITIALIZE));
+        }
+
     
     /**
      *  Create child objects of the component.
@@ -4221,9 +4290,17 @@ COMPILE::JS
      */
     protected function createChildren():void
     {
-        MXMLDataInterpreter.generateMXMLInstances(mxmlDocument, this, 
MXMLDescriptor);
+        var children:Array =  this.MXMLDescriptor;
+        if (children && children.length && !processedMXMLDescriptors) {
+            layoutDeferred = true;
+            MXMLDataInterpreter.generateMXMLInstances(mxmlDocument, this, 
children);
+            layoutDeferred = false;
+            processedMXMLDescriptors = true;
+        }
     }
-    
+
+    private var processedMXMLDescriptors : Boolean;
+
     private var _mxmlDescriptor:Array;
     
     /**
@@ -4340,6 +4417,82 @@ COMPILE::JS
             (parent as IEventDispatcher).dispatchEvent(new 
Event("layoutNeeded")); // might cause too many layouts
     }
 
+    private var _layoutDeferred:Boolean;
+    /**
+     *  Support for deferred layout requests
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     * @productversion Royale 0.9.9
+     */
+    protected function get layoutDeferred():Boolean{
+        return _layoutDeferred
+    }
+    protected function set layoutDeferred(value:Boolean):void{
+        _layoutDeferred = value;
+        if (!value && _needsLayout) {
+            dispatchEvent(new Event('layoutNeeded'));
+        }
+    }
+    private var _needsLayout:Boolean;
+    /**
+     *  Support for deferred layout requests
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     * @productversion Royale 0.9.9
+     */
+    protected function get needsLayout():Boolean{
+        return _needsLayout;
+    }
+
+    /**
+     *  Support for deferred layout requests
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     * @productversion Royale 0.9.9
+     */
+    COMPILE::JS
+    override public function dispatchEvent(event:Object):Boolean{
+        //trap the layout requests and ignore them if we have deferred layout
+        if (event.type == "layoutNeeded" || event == 'layoutNeeded') {
+            if (_layoutDeferred) {
+                _needsLayout = true;
+                return false;
+            } else {
+                //layout will run, no 'need' to re-run later
+                _needsLayout = false;
+            }
+        }
+        return super.dispatchEvent(event);
+    }
+    /**
+     *  Support for deferred layout requests
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     * @productversion Royale 0.9.9
+     */
+    COMPILE::SWF
+    override public function dispatchEvent(event:Event):Boolean{
+        //trap the layout requests and ignore them if we have deferred layout
+        if (event.type == "layoutNeeded") {
+            if (_layoutDeferred) {
+                _needsLayout = true;
+                return false;
+            } else {
+                //layout will run, no 'need' to re-run later
+                _needsLayout = false;
+            }
+        }
+        return super.dispatchEvent(event);
+    }
+
     /**
      *  Helper method to invalidate parent size and display list if
      *  this object affects its layout (includeInLayout is true).
diff --git 
a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Grid.as 
b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Grid.as
index 276c35a..e5170265 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Grid.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Grid.as
@@ -6022,13 +6022,13 @@ package spark.components
                        return 0;
                }
                
-               public function set processedDescriptors(value:Boolean):void {
+               /*public function set processedDescriptors(value:Boolean):void {
                        
                }
                
                public function get processedDescriptors():Boolean {
                        return false;
-               }
+               }*/
                
                public function set 
updateCompletePendingFlag(value:Boolean):void {
                        
diff --git 
a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/SparkTextButtonItemRenderer.as
 
b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/SparkTextButtonItemRenderer.as
index b288837..ac67469 100644
--- 
a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/SparkTextButtonItemRenderer.as
+++ 
b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/SparkTextButtonItemRenderer.as
@@ -273,7 +273,7 @@ package spark.components.supportClasses
             throw new Error("Method not implemented.");
         }
 
-        public function get processedDescriptors():Boolean
+       /* public function get processedDescriptors():Boolean
         {
             throw new Error("Method not implemented.");
         }
@@ -281,7 +281,7 @@ package spark.components.supportClasses
         public function set processedDescriptors(value:Boolean):void
         {
             throw new Error("Method not implemented.");
-        }
+        }*/
 
         public function get updateCompletePendingFlag():Boolean
         {

Reply via email to