You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2021/12/17 19:08:15 UTC

[royale-asjs] 03/04: Support for now for creationPolicy='none', supporting the deferred layout functionality.

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 7524dadd4d745e2e0128ce229a4206e8f189b6a0
Author: greg-dove <gr...@gmail.com>
AuthorDate: Fri Dec 17 21:30:05 2021 +1300

    Support for now for creationPolicy='none', supporting the deferred layout functionality.
---
 .../MXRoyale/src/main/resources/defaults.css       |   4 +-
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   1 +
 .../src/main/royale/mx/containers/ViewStack.as     |  11 +-
 .../beads/supportClasses/ContainerContentArea.as   |  78 +++++++
 .../MXRoyale/src/main/royale/mx/core/Container.as  | 240 +++++++++++++++++++--
 .../main/royale/mx/core/IDeferredContentOwner.as   | 103 +++++++++
 .../src/main/royale/mx/core/INavigatorContent.as   |   2 +-
 .../src/main/royale/mx/events/FlexEvent.as         |   2 +-
 .../royale/spark/components/SkinnableContainer.as  |  20 +-
 9 files changed, 422 insertions(+), 39 deletions(-)

diff --git a/frameworks/projects/MXRoyale/src/main/resources/defaults.css b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
index 2f40eb6..24d52a5 100644
--- a/frameworks/projects/MXRoyale/src/main/resources/defaults.css
+++ b/frameworks/projects/MXRoyale/src/main/resources/defaults.css
@@ -990,7 +990,7 @@ charts|DataTip
 	{
 		IBackgroundBead: ClassReference("org.apache.royale.html.beads.SolidBackgroundBead");
 		IBorderBead: ClassReference("org.apache.royale.html.beads.SingleLineBorderBead");
-		IContentView: ClassReference("org.apache.royale.html.supportClasses.ContainerContentArea");
+		IContentView: ClassReference("mx.containers.beads.supportClasses.ContainerContentArea");
 	}
 	
 	DataGrid {
@@ -1034,7 +1034,7 @@ charts|DataTip
 	
 	Panel
 	{
-		IContentView: ClassReference("org.apache.royale.html.supportClasses.ContainerContentArea");
+		IContentView: ClassReference("mx.containers.beads.supportClasses.ContainerContentArea");
 		IBorderBead: ClassReference("org.apache.royale.html.beads.SingleLineBorderBead");
 		IBackgroundBead: ClassReference("org.apache.royale.html.beads.SolidBackgroundBead");    
 	}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
index 4be7101..36daf24 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
@@ -72,6 +72,7 @@ internal class MXRoyaleClasses
     import mx.containers.beads.layouts.BasicLayout; BasicLayout;
 	import mx.containers.beads.PanelInternalContainer; PanelInternalContainer;
 	import mx.containers.beads.PanelInternalContainerView; PanelInternalContainerView;
+	import mx.containers.beads.supportClasses.ContainerContentArea;ContainerContentArea;
 	import mx.controls.beads.AlertView; AlertView;
     import mx.controls.beads.controllers.AlertMouseController; AlertMouseController;
     import mx.containers.errors.ConstraintError; ConstraintError;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/ViewStack.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/ViewStack.as
index 1a3ba4e..ca9a9c8 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/ViewStack.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/ViewStack.as
@@ -54,6 +54,10 @@ import mx.utils.RoyaleUtil;
 
 import org.apache.royale.core.IChild;
 
+import mx.events.ChildExistenceChangedEvent;
+import org.apache.royale.core.IUIBase;
+import mx.utils.RoyaleUtil;
+
 use namespace mx_internal;
 
 //--------------------------------------
@@ -965,13 +969,14 @@ public class ViewStack extends Container implements /*IHistoryManagerClient,*/ I
         super.updateDisplayList(unscaledWidth, unscaledHeight);
 
         var nChildren:int = numChildren;
+        if (!nChildren) return;
         var w:Number = contentWidth;
         var h:Number = contentHeight;
         var left:Number = contentX;
         var top:Number = contentY;
 
         // Stretch the selectedIndex to fill our size
-        if (nChildren && selectedIndex != -1)
+        if (selectedIndex != -1)
         {
             var child:UIComponent =
                 UIComponent(getChildAt(selectedIndex));
@@ -1274,16 +1279,14 @@ public class ViewStack extends Container implements /*IHistoryManagerClient,*/ I
         if (!selectedChild)
             return;
 
-        /*
         // Performance optimization: don't call createComponents if we know
         // that createComponents has already been called.
-        if (selectedChild && selectedChild.deferredContentCreated == false)
+        if (selectedChild && !selectedChild.deferredContentCreated)
         {
             if (initialized)  // Only listen if the ViewStack has already been initialized.
                 selectedChild.addEventListener(FlexEvent.CREATION_COMPLETE,childCreationCompleteHandler);
             selectedChild.createDeferredContent();
         }
-        */
 
         // Do the initial measurement/layout pass for the
         // newly-instantiated descendants.
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/supportClasses/ContainerContentArea.as b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/supportClasses/ContainerContentArea.as
new file mode 100644
index 0000000..4768d25
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/supportClasses/ContainerContentArea.as
@@ -0,0 +1,78 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.supportClasses
+{
+	import mx.core.UIComponent;
+
+	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.core.IUIBase;
+    import org.apache.royale.core.UIBase;
+    import org.apache.royale.events.Event;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.core.IChild;
+	import org.apache.royale.core.ILayoutView;
+
+    /**
+     *  The ContainerContentArea class implements the contentView for
+     *  a Container on the SWF platform.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+	public class ContainerContentArea extends UIComponent implements IBead, ILayoutView
+	{
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function ContainerContentArea()
+		{
+			super();
+            addEventListener("layoutNeeded", forwardEventHandler);
+		}
+		
+        private var _host:IUIBase;
+		public function get host():IUIBase
+        {
+            return _host;
+        }
+		/**
+		 *  @royaleignorecoercion org.apache.royale.core.IUIBase
+         */
+		public function set strand(value:IStrand):void
+		{
+			_host = value as IUIBase;
+		}
+        /**
+		 *  @royaleignorecoercion org.apache.royale.events.IEventDispatcher
+         */
+        private function forwardEventHandler(event:Event):void
+        {
+            if (parent is IEventDispatcher)
+                (parent as IEventDispatcher).dispatchEvent(event);
+        }
+	}
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/core/Container.as b/frameworks/projects/MXRoyale/src/main/royale/mx/core/Container.as
index 9c64770..789e0fe 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/core/Container.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/core/Container.as
@@ -19,7 +19,9 @@
 
 package mx.core
 {
-    import org.apache.royale.binding.ContainerDataBinding;
+import mx.events.ChildExistenceChangedEvent;
+
+import org.apache.royale.binding.ContainerDataBinding;
     import org.apache.royale.binding.DataBindingBase;
     import org.apache.royale.core.ContainerBaseStrandChildren;
     import org.apache.royale.core.IBeadLayout;
@@ -81,6 +83,7 @@ import mx.controls.listClasses.IListItemRenderer;
 import mx.events.FlexEvent;
 import mx.events.IndexChangedEvent;
 import mx.managers.IFocusManagerContainer;
+import org.apache.royale.utils.MXMLDataInterpreter;
 
 COMPILE::SWF
 {
@@ -1086,25 +1089,110 @@ public class Container extends UIComponent
 			// each MXML file can also have styles in fx:Style block
 			ValuesManager.valuesImpl.init(this);
 		}
-		
-		super.addedToParent();		
-		
+		const noChildrenNow:Boolean = creationPolicy == 'none';
+
+        if (noChildrenNow) _deferSetInitialized = true;
+		super.addedToParent();
+
 		// Load the layout bead if it hasn't already been loaded.
 		loadBeadFromValuesManager(IBeadLayout, "iBeadLayout", this);
-        dispatchEvent(new Event("initComplete"));
-        if ((isHeightSizedToContent() || !isNaN(explicitHeight)) &&
-            (isWidthSizedToContent() || !isNaN(explicitWidth)))
-			dispatchEvent(new Event("layoutNeeded"));
+        if (!noChildrenNow) {
+            //we don't want to run the states etc, they will error at this point
+            dispatchEvent(new Event("initComplete"));
+            if ((isHeightSizedToContent() || !isNaN(explicitHeight)) &&
+                    (isWidthSizedToContent() || !isNaN(explicitWidth)))
+                dispatchEvent(new Event("layoutNeeded"));
+        }
+
 	}
+
+
+    override public function initialize():void
+    {
+        if (initialized)
+            return;
+
+        if (creationPolicy == 'none') {
+            _deferSetInitialized = true;
+            dispatchEvent(new FlexEvent(FlexEvent.PREINITIALIZE));
+
+            _measuredWidth = NaN;
+            _measuredHeight = NaN;
+
+            // This should always be the last thing that initialize() calls.
+            initializationComplete();
+            return;
+        }
+        super.initialize();
+    }
 	
     override protected function createChildren():void
     {
+        if (creationPolicy == 'none') return;
         super.createChildren();
-        
-        if (getBeadByType(DataBindingBase) == null && '_bindings' in this /*mxmlDocument == this*/)
-            addBead(new ContainerDataBinding());
+        if ('_bindings' in this) {
+            if (getBeadByType(DataBindingBase) == null) {
+                addBead(new ContainerDataBinding());
+            }
+            dispatchEvent(new Event("initBindings"));
+        }
+    }
+
+
+    private var _deferSetInitialized:Boolean;
+    /**
+     *  @private
+     */
+    override public function set initialized(value:Boolean):void
+    {
+        if (value && !_deferSetInitialized) {
+            dispatchEvent(new FlexEvent(FlexEvent.CONTENT_CREATION_COMPLETE));
+            super.initialized = value;
+        } else {
+            _deferSetInitialized = false;
+        }
+    }
+
 
-        dispatchEvent(new Event("initBindings"));
+    override protected function initializationComplete():void
+    {
+        // Don't call super.initializationComplete().
+        //variation to flex sdk
+        //did we already create content ?
+        if (creationPolicy != 'none') {
+            super.initializationComplete();
+        }
+    }
+
+    /**
+     *  Performs the equivalent action of calling
+     *  the <code>createComponentsFromDescriptors(true)</code> method for containers
+     *  that implement the IDeferredContentOwner interface to support deferred instantiation.
+     *
+     *  @see #createComponentsFromDescriptors()
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    public function createDeferredContent():void
+    {
+        if (creationPolicy == 'none') {
+            creationPolicyNone = false;
+            _deferSetInitialized = false
+            createChildren();
+            //run the original addedToParent stuff
+            dispatchEvent(new Event("initComplete"));
+            if ((isHeightSizedToContent() || !isNaN(explicitHeight)) &&
+                    (isWidthSizedToContent() || !isNaN(explicitWidth)))
+                dispatchEvent(new Event("layoutNeeded"));
+
+            processedDescriptors = true;
+            creationPolicyNone = true;
+            //dispatchEvent(new FlexEvent(FlexEvent.CONTENT_CREATION_COMPLETE));
+            initialized = true;
+        }
     }
     
     /**
@@ -1152,13 +1240,78 @@ public class Container extends UIComponent
 	{
 		dispatchEvent( new Event("layoutNeeded") );
 	}
+
+
+
+    override mx_internal function addingChild(child:IUIBase):void
+    {
+
+        COMPILE::SWF{
+            //was
+            // Throw an RTE if child is not an IUIComponent.
+            //var uiChild:IUIComponent = IUIComponent(child);
+            if (!(child is IUIComponent)) {
+                //commented out for now, to allow legacy mustella tests to pass in swf
+              //  trace('this is child is not an IUIComponent', child )
+               // throw new Error('child is not IUIComponent '+child)
+            }
+
+        }
+
+
+        // Set the child's virtual parent, nestLevel, document, etc.
+        super.addingChild(child);
+
+        invalidateSize();
+        invalidateDisplayList();
+
+        /*if (!contentPane)
+        {
+            // If this is the first content child, then any chrome
+            // that already exists is positioned in front of it.
+            // If other content children already existed, then set the
+            // depth of this object to be just behind the existing
+            // content children.
+            if (_numChildren == 0)
+                _firstChildIndex = super.numChildren;
+
+            // Increment the number of content children.
+            _numChildren++;
+        }
+
+        if (contentPane && !autoLayout)
+        {
+            forceLayout = true;
+            // weak reference
+            UIComponentGlobals.layoutManager.addEventListener(
+                    FlexEvent.UPDATE_COMPLETE, layoutCompleteHandler, false, 0, true);
+        }*/
+    }
 	
     /**
      *  @private
      */
     override mx_internal function childAdded(child:IUIBase):void
     {
-		super.addingChild(child);
+        if (hasEventListener("childrenChanged"))
+            dispatchEvent(new Event("childrenChanged"));
+
+        if (hasEventListener(ChildExistenceChangedEvent.CHILD_ADD))
+        {
+            var event:ChildExistenceChangedEvent =
+                    new ChildExistenceChangedEvent(
+                            ChildExistenceChangedEvent.CHILD_ADD);
+            event.relatedObject = child as UIComponent;
+            dispatchEvent(event);
+        }
+
+       /* if (child.hasEventListener(FlexEvent.ADD))
+            child.dispatchEvent(new FlexEvent(FlexEvent.ADD));*/
+
+        //why is this calling addingChild in the super?
+	//	super.addingChild(child);
+        super.childAdded(child);
+
 		if (parent)
 		{
 			var oldMeasuredWidth:Number = measuredWidth;
@@ -1175,12 +1328,36 @@ public class Container extends UIComponent
 		}
 	}
 
+
+    /**
+     *  @private
+     */
+    override mx_internal function removingChild(child:IUIBase):void
+    {
+        super.removingChild(child);
+
+       /* if (child.hasEventListener(FlexEvent.REMOVE))
+            child.dispatchEvent(new FlexEvent(FlexEvent.REMOVE));*/
+
+        if (hasEventListener(ChildExistenceChangedEvent.CHILD_REMOVE))
+        {
+            var event:ChildExistenceChangedEvent =
+                    new ChildExistenceChangedEvent(
+                            ChildExistenceChangedEvent.CHILD_REMOVE);
+            event.relatedObject = child as UIComponent;
+            dispatchEvent(event);
+        }
+    }
+
     /**
      *  @private
      */
     override mx_internal function childRemoved(child:IUIBase):void
     {
-		super.removingChild(child);
+        //why is this calling removingChild in the super?
+		//super.removingChild(child);
+
+        super.childRemoved(child);
 		if (parent)
 		{
 			var oldMeasuredWidth:Number = measuredWidth;
@@ -1701,9 +1878,10 @@ public class Container extends UIComponent
         // don't have this property (ie Group).
         // This style is an implementation detail and should be considered
         // private. Do not set it from CSS.
-        /*if (creationPolicyNone)
-            return ContainerCreationPolicy.NONE;*/
-        return getStyle("_creationPolicy");
+        if (creationPolicyNone)
+            return ContainerCreationPolicy.NONE;
+        //return getStyle("_creationPolicy");
+        return  getStyle("_creationPolicy");
     }
 
     /**
@@ -1712,8 +1890,7 @@ public class Container extends UIComponent
     public function set creationPolicy(value:String):void
     {
         var styleValue:String = value;
-        
-        /*if (value == ContainerCreationPolicy.NONE)
+        if (value == ContainerCreationPolicy.NONE)
         {
             // creationPolicy of none is not inherited by descendants.
             // In this case, set the style to "auto" and set a local
@@ -1724,12 +1901,14 @@ public class Container extends UIComponent
         else
         {
             creationPolicyNone = false;
-        }*/
-        
+        }
         setStyle("_creationPolicy", styleValue);
 
         //setActualCreationPolicies(value);
     }
+
+
+    [Bindable("childrenChanged")]
     /**
      *  Returns an Array of DisplayObject objects consisting of the content children 
      *  of the container.
@@ -1799,6 +1978,25 @@ public class Container extends UIComponent
         */
         return super.contentMouseY; 
     }
+
+    //----------------------------------
+    //  deferredContentCreated
+    //----------------------------------
+
+    /**
+     *  IDeferredContentOwner equivalent of processedDescriptors
+     *
+     *  @see UIComponent#processedDescriptors
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 9
+     *  @playerversion AIR 1.1
+     *  @productversion Flex 3
+     */
+    public function get deferredContentCreated():Boolean
+    {
+        return processedDescriptors;
+    }
 	
 	
 	    //----------------------------------
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/core/IDeferredContentOwner.as b/frameworks/projects/MXRoyale/src/main/royale/mx/core/IDeferredContentOwner.as
new file mode 100644
index 0000000..d9ca45f
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/core/IDeferredContentOwner.as
@@ -0,0 +1,103 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.core
+{
+
+/**
+ *  Dispatched after the content for this component has been created. With deferred 
+ *  instantiation, the content for a component can be created long after the 
+ *  component is created.
+ *
+ *  @eventType mx.events.FlexEvent.CONTENT_CREATION_COMPLETE
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+[Event(name="contentCreationComplete", type="mx.events.FlexEvent")]
+
+/**
+ *  The IDeferredContentOwner interface defines the properties and methods
+ *  for deferred instantiation.
+ * 
+ *  @see spark.components.SkinnableContainer
+ *  @see mx.core.Container
+ *  @see mx.core.INavigatorContent
+ *  
+ *  @langversion 3.0
+ *  @playerversion Flash 10
+ *  @playerversion AIR 1.5
+ *  @productversion Flex 4
+ */
+public interface IDeferredContentOwner extends IUIComponent
+{
+    [Inspectable(enumeration="auto, all, none", defaultValue="auto")]
+
+    /**
+     *  Content creation policy for this component.
+     *
+     *  <p>Possible values are:
+     *    <ul>
+     *      <li><code>auto</code> - Automatically create the content immediately before it is needed.</li>
+     *      <li><code>all</code> - Create the content as soon as the parent component is created. This
+     *          option should only be used as a last resort because it increases startup time and memory usage.</li>
+     *      <li><code>none</code> - Content must be created manually by calling 
+     *          the <code>createDeferredContent()</code> method.</li>
+     *    </ul>
+     *  </p>
+     *  
+     *  <p>If no <code>creationPolicy</code> is specified for a container, that container inherits the value of 
+     *  its parent's <code>creationPolicy</code> property.</p>
+     *
+     *  @default "auto"
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    function get creationPolicy():String;
+    function set creationPolicy(value:String):void;
+
+    /**
+     *  Create the content for this component. If the value of the <code>creationPolicy</code> property
+     *  is <code>auto</code> or <code>all</code>, this the Flex framework calls this method. If the value of the 
+     *  <code>creationPolicy</code> property is <code>none</code>, you must explicitly call this method
+     *  to create the content for the component.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    function createDeferredContent():void;
+
+    /**
+     *  A flag that indicates whether the deferred content has been created.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Flex 4
+     */
+    function get deferredContentCreated():Boolean;
+}
+
+}
\ No newline at end of file
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/core/INavigatorContent.as b/frameworks/projects/MXRoyale/src/main/royale/mx/core/INavigatorContent.as
index 0733639..f5f8c22 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/core/INavigatorContent.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/core/INavigatorContent.as
@@ -36,7 +36,7 @@ import mx.core.IUIComponent;
  *  @playerversion AIR 1.5
  *  @productversion Flex 4
  */
-public interface INavigatorContent extends IEventDispatcher,IUIComponent, IToolTipManagerClient // IDeferredContentOwner
+public interface INavigatorContent extends IEventDispatcher,IUIComponent,IDeferredContentOwner, IToolTipManagerClient
 {
     [Bindable("labelChanged")]
     /**
diff --git a/frameworks/projects/MXRoyaleBase/src/main/royale/mx/events/FlexEvent.as b/frameworks/projects/MXRoyaleBase/src/main/royale/mx/events/FlexEvent.as
index 2281d22..940e074 100644
--- a/frameworks/projects/MXRoyaleBase/src/main/royale/mx/events/FlexEvent.as
+++ b/frameworks/projects/MXRoyaleBase/src/main/royale/mx/events/FlexEvent.as
@@ -324,7 +324,7 @@ public class FlexEvent extends Event
      *  @playerversion AIR 1.1
      *  @productversion Flex 4
      */
-    //public static const CONTENT_CREATION_COMPLETE:String = "contentCreationComplete";
+    public static const CONTENT_CREATION_COMPLETE:String = "contentCreationComplete";
 
     
     /**
diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/SkinnableContainer.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/SkinnableContainer.as
index e3a3725..8694745 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/SkinnableContainer.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/SkinnableContainer.as
@@ -1180,21 +1180,21 @@ public class SkinnableContainer extends SkinnableContainerBase implements IConta
      *  @playerversion AIR 1.5
      *  @productversion Royale 0.9.4
      */
-    /* public function createDeferredContent():void
-    {
+     public function createDeferredContent():void
+    {   //@todo similar fix as mx Container for creationPolicy NONE (at least)
         var children:Array =  this.MXMLDescriptor;
         if (children)
         {
-			creatingDeferredContent = true;
+			/*creatingDeferredContent = true;
             generateMXMLInstances(document, children);
 			creatingDeferredContent = false;
             mxmlContentCreated = true; // keep the code from recursing back into here.
             _deferredContentCreated = true; 
-            dispatchEvent(new FlexEvent(FlexEvent.CONTENT_CREATION_COMPLETE));
+            dispatchEvent(new FlexEvent(FlexEvent.CONTENT_CREATION_COMPLETE));*/
             return;
         }
         
-        if (!mxmlContentCreated)
+        /*if (!mxmlContentCreated)
         {
             mxmlContentCreated = true;
             
@@ -1205,11 +1205,11 @@ public class SkinnableContainer extends SkinnableContainerBase implements IConta
                 _deferredContentCreated = true;
                 dispatchEvent(new FlexEvent(FlexEvent.CONTENT_CREATION_COMPLETE));
             }
-        }
+        }*/
     }
-
+    //@todo similar fix as mx for creationPolicy NONE (at least)
     private var _deferredContentCreated:Boolean;
-    */
+
     /**
      *  Contains <code>true</code> if deferred content has been created.
      *  
@@ -1218,10 +1218,10 @@ public class SkinnableContainer extends SkinnableContainerBase implements IConta
      *  @playerversion AIR 1.5
      *  @productversion Royale 0.9.4
      */
-    /* public function get deferredContentCreated():Boolean
+     public function get deferredContentCreated():Boolean
     {
         return _deferredContentCreated;
-    } */
+    }
 
     /**
      *  @private