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 2018/12/03 07:19:12 UTC

[royale-asjs] branch develop updated (ead1739 -> 8354cbb)

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

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


    from ead1739  make showContent only do that and don't worry about currentStep
     new 2f28e44  assigments to int are not currently checked to see if the value is an int so if it isn't you have to force floats to int.  Flash runtime seems to use floor and not round
     new 20afdb4  fail if SWF compile fails
     new 6981eb4  allow subclasses to access dataProviderModel before the strand is set
     new cc94cc7  don't need this after all of the other refactoring
     new 0377683  refactor virtual layout so it can be re-used in MXRoyale
     new 27ac6d3  virtual item renderers for MXRoyale
     new fce4b1d  Spark Scroller, DataGroup, ItemRenderer as used by TDF DataGroupExample
     new 8354cbb  clean up so asdoc builds

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../src/spark/controls/DataGroupExample.mxml       |   2 +-
 frameworks/projects/Basic/build.xml                |  19 +-
 .../Basic/src/main/resources/basic-manifest.xml    |   1 +
 .../apache/royale/html/beads/DataContainerView.as  |   9 +-
 .../DataItemRendererFactoryForCollectionView.as    |   2 +-
 .../DynamicAddItemRendererForArrayListData.as      |   2 +-
 ...cRemoveAllByNullItemRendererForArrayListData.as |   2 +-
 ...DynamicRemoveAllItemRendererForArrayListData.as |   2 +-
 .../DynamicRemoveItemRendererForArrayListData.as   |   2 +-
 .../DynamicUpdateItemRendererForArrayListData.as   |   2 +-
 .../royale/html/beads/VirtualDataContainerView.as  | 170 +++--------------
 .../apache/royale/html/beads/VirtualListView.as    |  21 +-
 .../beads/layouts/VirtualListVerticalLayout.as     |  15 +-
 .../org/apache/royale/utils/object/defineGetter.as |   1 +
 .../apache/royale/utils/object/defineProperty.as   |   1 +
 .../royale/utils/object/defineSimpleGetter.as      |   1 +
 .../royale/utils/object/defineSimpleProperty.as    |   1 +
 .../royale/org/apache/royale/utils/Language.as     |  12 +-
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   1 +
 ...ataItemRendererFactoryForICollectionViewData.as |  17 --
 ...taItemRendererFactoryForICollectionViewData.as} | 212 ++++++++-------------
 .../listClasses}/VirtualListVerticalLayout.as      |  15 +-
 .../SparkRoyale/src/main/resources/defaults.css    |  25 ++-
 .../src/main/royale/spark/components/DataGroup.as  |  27 ++-
 .../main/royale/spark/components/DataRenderer.as   |  77 ++++++++
 .../src/main/royale/spark/components/Scroller.as   |  31 ++-
 .../components/supportClasses/ItemRenderer.as      | 173 +++++++++++++++--
 27 files changed, 481 insertions(+), 362 deletions(-)
 copy frameworks/projects/{Basic/src/main/royale/org/apache/royale/html/beads/VirtualDataItemRendererFactoryForArrayData.as => MXRoyale/src/main/royale/mx/controls/listClasses/VirtualDataItemRendererFactoryForICollectionViewData.as} (54%)
 copy frameworks/projects/{Basic/src/main/royale/org/apache/royale/html/beads/layouts => MXRoyale/src/main/royale/mx/controls/listClasses}/VirtualListVerticalLayout.as (97%)


[royale-asjs] 01/08: assigments to int are not currently checked to see if the value is an int so if it isn't you have to force floats to int. Flash runtime seems to use floor and not round

Posted by ah...@apache.org.
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 2f28e44a72f0fb60a239072bc8a200a9eb1d02bc
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 21:58:23 2018 -0800

    assigments to int are not currently checked to see if the value is an int so if it isn't you have to force floats to int.  Flash runtime seems to use floor and not round
---
 .../mxroyale/tourdeflexmodules/src/spark/controls/DataGroupExample.mxml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/mxroyale/tourdeflexmodules/src/spark/controls/DataGroupExample.mxml b/examples/mxroyale/tourdeflexmodules/src/spark/controls/DataGroupExample.mxml
index 14a54cd..8a51c7b 100644
--- a/examples/mxroyale/tourdeflexmodules/src/spark/controls/DataGroupExample.mxml
+++ b/examples/mxroyale/tourdeflexmodules/src/spark/controls/DataGroupExample.mxml
@@ -40,7 +40,7 @@
 				// create a collection of random flights
 				for (var i:int = 0; i < nItems; i++){
 					var temp:Object = new Object();
-					var random:int = Math.random() * 5;
+					var random:int = Math.floor(Math.random() * 5);
 					
 					temp.start = sources[random];
 					temp.end = destinations[random];


[royale-asjs] 08/08: clean up so asdoc builds

Posted by ah...@apache.org.
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 8354cbbb9986cb56a02f12333b0842cfc773c564
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 23:18:58 2018 -0800

    clean up so asdoc builds
---
 .../royale/org/apache/royale/utils/object/defineGetter.as    |  1 +
 .../royale/org/apache/royale/utils/object/defineProperty.as  |  1 +
 .../org/apache/royale/utils/object/defineSimpleGetter.as     |  1 +
 .../org/apache/royale/utils/object/defineSimpleProperty.as   |  1 +
 .../src/main/royale/org/apache/royale/utils/Language.as      | 12 ++++++------
 5 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineGetter.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineGetter.as
index 501cd14..fc00c65 100644
--- a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineGetter.as
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineGetter.as
@@ -26,6 +26,7 @@ package org.apache.royale.utils.object
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9.3
 	 */
+    COMPILE::JS
     public function defineGetter(obj:Object,prop:String,getterFunction:Function):void
     {
             Object.defineProperty(obj, prop, {"get": getterFunction});
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineProperty.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineProperty.as
index 4b34648..b57dc41 100644
--- a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineProperty.as
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineProperty.as
@@ -26,6 +26,7 @@ package org.apache.royale.utils.object
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9.3
 	 */
+    COMPILE::JS
     public function defineProperty(obj:Object,prop:String,getter:Function,setter:Function):void
     {
             Object.defineProperty(obj, prop, {"get": getter, "set": setter});
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleGetter.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleGetter.as
index 42b5d9f..0876e44 100644
--- a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleGetter.as
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleGetter.as
@@ -26,6 +26,7 @@ package org.apache.royale.utils.object
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9.3
 	 */
+    COMPILE::JS
     public function defineSimpleGetter(obj:Object,prop:String,returnVal:*):void
     {
             Object.defineProperty(obj, prop, {
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleProperty.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleProperty.as
index 6b46a9e..1e7be4c 100644
--- a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleProperty.as
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/object/defineSimpleProperty.as
@@ -26,6 +26,7 @@ package org.apache.royale.utils.object
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.9.3
 	 */
+    COMPILE::JS
     public function defineSimpleProperty(obj:Object,prop:String):void
     {
 		var privateProp:String = "_" + prop;
diff --git a/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as b/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as
index 21e6b93..c13ec8d 100644
--- a/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as
+++ b/frameworks/projects/Language/src/main/royale/org/apache/royale/utils/Language.as
@@ -291,9 +291,9 @@ package org.apache.royale.utils
         };
 
         /**
-         * @param	arr
-         * @param	names
-         * @param	opt
+         * @param arr
+         * @param names
+         * @param opt
          */
         public static function sort(arr:Array,...args):void{
             var compareFunction:Function = null;
@@ -348,9 +348,9 @@ package org.apache.royale.utils
         }
         
 		/**
-		 * @param	arr
-		 * @param	names
-		 * @param	opt
+		 * @param arr
+		 * @param names
+		 * @param opt
 		 */
 		public static function sortOn(arr:Array,names:Object,opt:Object=0):void{
 			if (names is Array){


[royale-asjs] 02/08: fail if SWF compile fails

Posted by ah...@apache.org.
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 20afdb4fe92db7f5d7d1ff563954cea8baf3fcfa
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 21:59:26 2018 -0800

    fail if SWF compile fails
---
 frameworks/projects/Basic/build.xml | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/frameworks/projects/Basic/build.xml b/frameworks/projects/Basic/build.xml
index 5d50633..d8ab079 100644
--- a/frameworks/projects/Basic/build.xml
+++ b/frameworks/projects/Basic/build.xml
@@ -80,12 +80,19 @@
     </target>
     
     <target name="compile" description="Compiles .as files into .swc" if="env.AIR_HOME">
+        <!-- use antcall so that resultproperty can be used in other projects and
+         they don't collide when being run one after the other -->
+        <antcall target="compile-swf" />
+    </target>
+    
+    <target name="compile-swf">
         <echo message="Compiling libs/${ant.project.name}.swc"/>
         <echo message="ROYALE_HOME: ${ROYALE_HOME}"/>
         <echo message="ROYALE_SWF_COMPILER_HOME: ${ROYALE_SWF_COMPILER_HOME}"/>
         <echo message="ROYALE_COMPILER_HOME: ${ROYALE_COMPILER_HOME}"/>
         
-        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true" >
+        <java jar="${ROYALE_COMPILER_HOME}/lib/compc.jar" fork="true"
+            resultproperty="compcoutput">
             <jvmarg value="-Xmx384m" />
             <jvmarg value="-Dsun.io.useCanonCaches=false" />
             <jvmarg value="-Droyalelib=${ROYALE_HOME}/frameworks" />
@@ -99,6 +106,16 @@
             <arg value="-js-load-config=${ROYALE_HOME}/frameworks/js-config.xml" />
             <arg value="-js-load-config+=${basedir}/../../js/projects/${ant.project.name}JS/src/main/config/compile-js-config.xml" />
         </java>
+        <fail>
+            <condition>
+                <not>
+                    <or>
+                        <equals arg1="${compcoutput}" arg2="0" />
+                        <equals arg1="${compcoutput}" arg2="2" />
+                    </or>
+                </not>
+            </condition>
+        </fail>
     </target>
     
     <target name="check-compiler" depends="check-compiler-home,check-transpiler-home">


[royale-asjs] 05/08: refactor virtual layout so it can be re-used in MXRoyale

Posted by ah...@apache.org.
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 037768395fcc6af4216cb1f49a0152bc2c1866ae
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 22:24:10 2018 -0800

    refactor virtual layout so it can be re-used in MXRoyale
---
 .../Basic/src/main/resources/basic-manifest.xml    |   1 +
 .../apache/royale/html/beads/DataContainerView.as  |   9 +-
 .../royale/html/beads/VirtualDataContainerView.as  | 170 ++++-----------------
 .../apache/royale/html/beads/VirtualListView.as    |  21 +--
 .../beads/layouts/VirtualListVerticalLayout.as     |  15 +-
 5 files changed, 43 insertions(+), 173 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
index fcb5c78..2a5b73e 100644
--- a/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
+++ b/frameworks/projects/Basic/src/main/resources/basic-manifest.xml
@@ -81,6 +81,7 @@
     <component id="RemovableBasicLayout" class="org.apache.royale.html.beads.layouts.RemovableBasicLayout"/>
     <component id="LayoutChangeNotifier" class="org.apache.royale.html.beads.layouts.LayoutChangeNotifier"/>
     <component id="VerticalLayout" class="org.apache.royale.html.beads.layouts.VerticalLayout"/>
+    <component id="VirtualDataContainerView" class="org.apache.royale.html.beads.VirtualDataContainerView"/>
     <component id="VirtualListView" class="org.apache.royale.html.beads.VirtualListView"/>
     <component id="VirtualListVerticalLayout" class="org.apache.royale.html.beads.layouts.VirtualListVerticalLayout"/>
     <component id="VerticalLayoutWithPaddingAndGap" class="org.apache.royale.html.beads.layouts.VerticalLayoutWithPaddingAndGap"/>
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataContainerView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataContainerView.as
index 3641ad8..e4fa1fa 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataContainerView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataContainerView.as
@@ -121,14 +121,7 @@ package org.apache.royale.html.beads
 		protected function dataProviderChangeHandler(event:Event):void
 		{
 			// trace("DataContainerView: dataProviderChangeHandler");
-            COMPILE::JS
-            {
-    			performLayout(event);
-            }
-            COMPILE::SWF
-            {
-                host.dispatchEvent(new Event("layoutNeeded"));                
-            }
+            host.dispatchEvent(new Event("layoutNeeded"));                
 		}
         
         /**
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualDataContainerView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualDataContainerView.as
index 7e6d17e..2901996 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualDataContainerView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualDataContainerView.as
@@ -18,7 +18,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 package org.apache.royale.html.beads
 {	
-	import org.apache.royale.html.beads.ContainerView;
+	import org.apache.royale.html.beads.DataContainerView;
 	import org.apache.royale.core.BeadViewBase;
 	import org.apache.royale.core.ContainerBase;
 	import org.apache.royale.core.IBead;
@@ -43,6 +43,9 @@ package org.apache.royale.html.beads
 	import org.apache.royale.html.supportClasses.Border;
 	import org.apache.royale.html.supportClasses.DataGroup;
 	import org.apache.royale.html.beads.IListView;
+    COMPILE::SWF {
+        import org.apache.royale.geom.Size;
+    }
 
 	/**
 	 *  The DataContainerView provides the visual elements for the DataContainer.
@@ -53,8 +56,7 @@ package org.apache.royale.html.beads
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.8
 	 */
-	COMPILE::JS
-	public class VirtualDataContainerView extends ContainerView implements IListView
+	public class VirtualDataContainerView extends DataContainerView implements IListView
 	{
 		public function VirtualDataContainerView()
 		{
@@ -77,147 +79,29 @@ package org.apache.royale.html.beads
 			host.addEventListener("beadsAdded", beadsAddedHandler);
 		}
 		
-		protected var dataModel:IDataProviderModel;
-		
-		/**
-		 * @royaleignorecoercion org.apache.royale.core.IItemRendererParent
-		 */
-		public function get dataGroup():IItemRendererParent
-		{
-			return super.contentView as IItemRendererParent;
-		}
-		
-		protected function beadsAddedHandler(event:Event):void
-		{
-			dataModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
-			host.addEventListener("itemsCreated", itemsCreatedHandler);
-			dataModel.addEventListener("dataProviderChanged", dataProviderChangeHandler);
-		}
-		
-		/**
-		 * @private
-		 */
-		override protected function handleInitComplete(event:Event):void
-		{
-			super.handleInitComplete(event);
-		}
-		
-		/**
-		 * @private
-		 */
-		protected function itemsCreatedHandler(event:Event):void
-		{
-			// trace("DataContainerView: itemsCreatedHandler");
-			host.dispatchEvent(new Event("layoutNeeded"));
-		}
-		
-		/**
-		 * @private
-		 */
-		protected function dataProviderChangeHandler(event:Event):void
-		{
-			// trace("DataContainerView: dataProviderChangeHandler");
-			performLayout(event);
-		}
-        
-	}
-	
-	COMPILE::SWF
-	public class VirtualDataContainerView extends ContainerView implements IListView
-	{
-		public function VirtualDataContainerView()
-		{
-			super();
-		}
-						
-		protected var dataModel:IDataProviderModel;
-		
-		/**
-		 * @private
-		 */
-		override public function get host():IUIBase
-		{
-			return _strand as IUIBase;
-		}
-		
-		/**
-		 *  @copy org.apache.royale.core.IBead#strand
-		 *  
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.8
-		 */
-		override public function set strand(value:IStrand):void
-		{
-			_strand = value;
-			super.strand = value;
-			
-			host.addEventListener("beadsAdded", beadsAddedHandler);
-		}
-		
-		override protected function completeSetup():void
-		{
-			super.completeSetup();
-			
-			// list is not interested in UI children, it wants to know when new items
-			// have been added or the dataProvider has changed.
-//			host.removeEventListener("childrenAdded", childrenChangedHandler);
-//			host.removeEventListener("childrenAdded", performLayout);
-		}
-		
-		protected function beadsAddedHandler(event:Event):void
-		{
-			dataModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
-			dataModel.addEventListener("dataProviderChanged", dataProviderChangeHandler);
-		}
-		
-		override protected function handleInitComplete(event:Event):void
-		{
-			super.handleInitComplete(event);
-		}
-		
-		/**
-		 *  The area holding the itemRenderers.
-		 *
-		 *  @langversion 3.0
-		 *  @playerversion Flash 10.2
-		 *  @playerversion AIR 2.6
-		 *  @productversion Royale 0.8
-		 */
-		public function get dataGroup():IItemRendererParent
-		{
-			return super.contentView as IItemRendererParent;
-		}
-				
-		/**
-		 * @private
-		 */
-		override public function get resizableView():IUIBase
-		{
-			return _strand as IUIBase;
-		}
-				
-		/**
-		 * @private
-		 */
-		protected function dataProviderChangeHandler(event:Event):void
-		{
-			host.dispatchEvent(new Event("layoutNeeded"));
-		}
-		        
         /**
-         *  respond to a change in size or request to re-layout everything
-         *  
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.0
+         * @private
          */
-		override protected function resizeHandler(event:Event):void
-		{
-			// might need to do something here, not sure yet.
-			super.resizeHandler(event);
-		}
+        COMPILE::SWF
+        override public function get resizableView():IUIBase
+        {
+            return _strand as IUIBase;
+        }
+
+        COMPILE::SWF
+        override protected function calculateContentSize():Size
+        {
+            return _lastContentSize;
+        }
+        
+        COMPILE::SWF
+        private var _lastContentSize:Size;
+        
+        COMPILE::SWF
+        public function set lastContentSize(value:Size):void
+        {
+            _lastContentSize = value;
+        }
 	}
+	
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualListView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualListView.as
index da97038..6b4a259 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualListView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/VirtualListView.as
@@ -40,9 +40,6 @@ package org.apache.royale.html.beads
 	import org.apache.royale.events.IEventDispatcher;
 	import org.apache.royale.html.supportClasses.Border;
 	import org.apache.royale.html.supportClasses.DataGroup;
-    COMPILE::SWF {
-        import org.apache.royale.geom.Size;
-    }
         
 	/**
 	 *  The List class creates the visual elements of the org.apache.royale.html.List
@@ -55,7 +52,7 @@ package org.apache.royale.html.beads
 	 *  @playerversion AIR 2.6
 	 *  @productversion Royale 0.0
 	 */
-	public class VirtualListView extends DataContainerView // was VirtualDataContainerView
+	public class VirtualListView extends VirtualDataContainerView
 	{
 		public function VirtualListView()
 		{
@@ -112,21 +109,5 @@ package org.apache.royale.html.beads
 			lastRollOverIndex = (listModel as IRollOverModel).rollOverIndex;
 		}
         
-        COMPILE::SWF
-        override protected function calculateContentSize():Size
-        {
-            return _lastContentSize;
-        }
-        
-        COMPILE::SWF
-        private var _lastContentSize:Size;
-        
-        COMPILE::SWF
-        public function set lastContentSize(value:Size):void
-        {
-            _lastContentSize = value;
-        }
-        
-
 	}
 }
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/VirtualListVerticalLayout.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/VirtualListVerticalLayout.as
index f62ae94..923b8b9 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/VirtualListVerticalLayout.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/layouts/VirtualListVerticalLayout.as
@@ -44,7 +44,7 @@ package org.apache.royale.html.beads.layouts
 	import org.apache.royale.events.Event;
 	import org.apache.royale.events.IEventDispatcher;
 	import org.apache.royale.geom.Rectangle;
-    import org.apache.royale.html.beads.VirtualListView;
+    import org.apache.royale.html.beads.VirtualDataContainerView;
 	import org.apache.royale.utils.CSSUtils;
 
     COMPILE::SWF {
@@ -112,6 +112,7 @@ package org.apache.royale.html.beads.layouts
 		 *  @playerversion Flash 10.2
 		 *  @playerversion AIR 2.6
 		 *  @productversion Royale 0.0
+		 *  @royaleignorecoercion Array
 		 *  @royaleignorecoercion org.apache.royale.core.ILayoutHost
 		 *  @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
 		 *  @royaleignorecoercion org.apache.royale.core.IListPresentationModel
@@ -134,6 +135,11 @@ package org.apache.royale.html.beads.layouts
 				var maxWidth:Number = 0;
 				var maxHeight:Number = 0;
                 var dp:Array = dataProviderModel.dataProvider as Array;
+                if (!dp) 
+                {
+                    inLayout = false;
+                    return true;
+                }
                 var presentationModel:IListPresentationModel = (host as IStrandWithPresentationModel).presentationModel as IListPresentationModel;
 				var hostWidthSizedToContent:Boolean = host.isWidthSizedToContent();
 				var hostHeightSizedToContent:Boolean = host.isHeightSizedToContent();
@@ -238,7 +244,7 @@ package org.apache.royale.html.beads.layouts
                 }
                 visibleIndexes = visibleIndexes.sort(numberSort);
 
-                var view:VirtualListView = host.getBeadByType(VirtualListView) as VirtualListView;
+                var view:VirtualDataContainerView = host.getBeadByType(VirtualDataContainerView) as VirtualDataContainerView;
                 view.lastContentSize = new Size(hostWidth, dp.length * presentationModel.rowHeight);
 
                 inLayout = false;
@@ -254,6 +260,11 @@ package org.apache.royale.html.beads.layouts
                 // going off-screen
                 var contentView:ILayoutView = layoutView;
                 var dp:Array = dataProviderModel.dataProvider as Array;
+                if (!dp) 
+                {
+                    inLayout = false;
+                    return true;
+                }
                 var presentationModel:IListPresentationModel = (host as IStrandWithPresentationModel).presentationModel as IListPresentationModel;
                 var totalHeight:Number = presentationModel.rowHeight * dp.length;
                 var viewportTop:Number = Math.max(contentView.element.scrollTop, 0);


[royale-asjs] 03/08: allow subclasses to access dataProviderModel before the strand is set

Posted by ah...@apache.org.
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 6981eb44d5946e59e644e36b68a028ec19b19b7c
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 22:19:02 2018 -0800

    allow subclasses to access dataProviderModel before the strand is set
---
 .../royale/html/beads/DataItemRendererFactoryForCollectionView.as       | 2 +-
 .../apache/royale/html/beads/DynamicAddItemRendererForArrayListData.as  | 2 +-
 .../html/beads/DynamicRemoveAllByNullItemRendererForArrayListData.as    | 2 +-
 .../royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as   | 2 +-
 .../royale/html/beads/DynamicRemoveItemRendererForArrayListData.as      | 2 +-
 .../royale/html/beads/DynamicUpdateItemRendererForArrayListData.as      | 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
index ca360d6..6661524 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -104,7 +104,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel():IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IBeadModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicAddItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicAddItemRendererForArrayListData.as
index da86642..9528185 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicAddItemRendererForArrayListData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicAddItemRendererForArrayListData.as
@@ -151,7 +151,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel(): IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllByNullItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllByNullItemRendererForArrayListData.as
index ab64441..b264da2 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllByNullItemRendererForArrayListData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllByNullItemRendererForArrayListData.as
@@ -120,7 +120,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel(): IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as
index c78805c..655726b 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveAllItemRendererForArrayListData.as
@@ -134,7 +134,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel(): IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveItemRendererForArrayListData.as
index d0bee21..3ef3f8e 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveItemRendererForArrayListData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicRemoveItemRendererForArrayListData.as
@@ -140,7 +140,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel(): IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;
diff --git a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicUpdateItemRendererForArrayListData.as b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicUpdateItemRendererForArrayListData.as
index 7661058..5823fda 100644
--- a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicUpdateItemRendererForArrayListData.as
+++ b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DynamicUpdateItemRendererForArrayListData.as
@@ -135,7 +135,7 @@ package org.apache.royale.html.beads
 		 */
 		public function get dataProviderModel(): IDataProviderModel
 		{
-			if (_dataProviderModel == null) {
+			if (_dataProviderModel == null && _strand != null) {
 				_dataProviderModel = _strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
 			}
 			return _dataProviderModel;


[royale-asjs] 07/08: Spark Scroller, DataGroup, ItemRenderer as used by TDF DataGroupExample

Posted by ah...@apache.org.
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 fce4b1d1332dd8f9ee8eebf421850f60eb04baf8
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 22:26:18 2018 -0800

    Spark Scroller, DataGroup, ItemRenderer as used by TDF DataGroupExample
---
 .../SparkRoyale/src/main/resources/defaults.css    |  25 ++-
 .../src/main/royale/spark/components/DataGroup.as  |  27 +++-
 .../main/royale/spark/components/DataRenderer.as   |  77 +++++++++
 .../src/main/royale/spark/components/Scroller.as   |  31 +++-
 .../components/supportClasses/ItemRenderer.as      | 173 +++++++++++++++++++--
 5 files changed, 307 insertions(+), 26 deletions(-)

diff --git a/frameworks/projects/SparkRoyale/src/main/resources/defaults.css b/frameworks/projects/SparkRoyale/src/main/resources/defaults.css
index 2e2c802..ddde944 100644
--- a/frameworks/projects/SparkRoyale/src/main/resources/defaults.css
+++ b/frameworks/projects/SparkRoyale/src/main/resources/defaults.css
@@ -65,18 +65,28 @@ Image
 }
 
 
-List
+DataGroup
 {
-	IBeadModel: ClassReference("org.apache.royale.html.beads.models.ArraySelectionModel");
-	IBeadView:  ClassReference("org.apache.royale.html.beads.ListView");			
+	IDataProviderItemRendererMapper: ClassReference("mx.controls.listClasses.VirtualDataItemRendererFactoryForICollectionViewData");
+	IBeadModel: ClassReference("mx.controls.beads.models.SingleSelectionICollectionViewModel");
+	IBeadView:  ClassReference("org.apache.royale.html.beads.VirtualDataContainerView");			
 	IBeadController: ClassReference("org.apache.royale.html.beads.controllers.ListSingleSelectionMouseController");
-	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VerticalLayout");
-	IDataProviderItemRendererMapper: ClassReference("org.apache.royale.html.beads.DataItemRendererFactoryForArrayData");
+	IBeadLayout: ClassReference("org.apache.royale.html.beads.layouts.VirtualListVerticalLayout");
 	IItemRendererClassFactory: ClassReference("org.apache.royale.core.ItemRendererClassFactory");
 	IItemRenderer: ClassReference("mx.controls.listClasses.ListItemRenderer");
 	IViewport: ClassReference("org.apache.royale.html.supportClasses.ScrollingViewport");
 	IViewportModel: ClassReference("org.apache.royale.html.beads.models.ViewportModel");
 }
+
+List
+{
+	IBeadView: ClassReference("spark.components.beads.SkinnableContainerView");
+	IBeadLayout: ClassReference("spark.layouts.supportClasses.SparkLayoutBead");
+	IViewport: ClassReference("org.apache.royale.html.supportClasses.ScrollingViewport");
+	IViewportModel: ClassReference("org.apache.royale.html.beads.models.ViewportModel");
+	IContentView: ClassReference("spark.components.DataGroup");
+}
+
 NumericStepper
 {
 	IBeadModel: ClassReference("org.apache.royale.html.beads.models.RangeModel");
@@ -102,6 +112,11 @@ Panel .TitleBar
 	background-color: #FFFFFF;
 }
 
+Scroller
+{
+	IBeadView: ClassReference("org.apache.royale.html.beads.GroupView");
+}
+
 SkinnableContainer
 {
 	IBeadView: ClassReference("spark.components.beads.SkinnableContainerView");
diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataGroup.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataGroup.as
index d70b9ff..9459dd0 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataGroup.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataGroup.as
@@ -49,7 +49,12 @@ import mx.collections.IList;
  import mx.core.mx_internal;
 use namespace mx_internal;  // for mx_internal property contentChangeDelta
 
+import org.apache.royale.core.IBead;
 import org.apache.royale.core.ISelectionModel;
+import org.apache.royale.core.IItemRendererProvider;
+import org.apache.royale.core.IStrandWithPresentationModel;
+import org.apache.royale.core.IListPresentationModel;
+import org.apache.royale.html.beads.models.ListPresentationModel;
 
 /**
  *  Dispatched when a renderer is added to this dataGroup.
@@ -164,7 +169,7 @@ import org.apache.royale.core.ISelectionModel;
  *  @playerversion AIR 1.5
  *  @productversion Flex 4
  */
-public class DataGroup extends GroupBase 
+public class DataGroup extends GroupBase implements IItemRendererProvider, IStrandWithPresentationModel
 { //implements IItemRendererOwner
     /**
      *  Constructor.
@@ -177,11 +182,31 @@ public class DataGroup extends GroupBase
     public function DataGroup()
     {
         super();
+        typeNames = "DataGroup";
         
        // _rendererUpdateDelegate = this;
     }
     
     /**
+     *  The presentation model for the list.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.9
+     *  @royaleignorecoercion org.apache.royale.core.IListPresentationModel
+     */
+    public function get presentationModel():IBead
+    {
+        var presModel:IListPresentationModel = getBeadByType(IListPresentationModel) as IListPresentationModel;
+        if (presModel == null) {
+            presModel = new ListPresentationModel();
+            addBead(presModel);
+        }
+        return presModel;
+    }
+    
+    /**
      *  @private
      *  flag to indicate whether a child in the item renderer has a non-zero layer, requiring child re-ordering.
      */
diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataRenderer.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataRenderer.as
index df28c86..439b3ec 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataRenderer.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/DataRenderer.as
@@ -19,6 +19,7 @@
 
 package spark.components { 
     
+import org.apache.royale.events.Event;
 import mx.core.IDataRenderer;
 import mx.events.FlexEvent;
 //import org.apache.royale.events.EventDispatcher;
@@ -83,6 +84,25 @@ public class DataRenderer extends Group implements IDataRenderer
         super();
     }
     
+    private var _itemRendererParent:Object;
+    
+    /**
+     * The parent container for the itemRenderer instance.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+    public function get itemRendererParent():Object
+    {
+        return _itemRendererParent;
+    }
+    public function set itemRendererParent(value:Object):void
+    {
+        _itemRendererParent = value;
+    }
+    
     //--------------------------------------------------------------------------
     //
     //  Properties
@@ -131,6 +151,63 @@ public class DataRenderer extends Group implements IDataRenderer
 
         if (hasEventListener(FlexEvent.DATA_CHANGE))
             dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
+        callLater(runLayout);
     }
+    
+    public function runLayout():void
+    {
+        dispatchEvent(new Event("layoutNeeded"));
+    }
+    
+    private var _listData:Object;
+    
+    [Bindable("__NoChangeEvent__")]
+    /**
+     *  Additional data about the list structure the itemRenderer may
+     *  find useful.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+    public function get listData():Object
+    {
+        return _listData;
+    }
+    public function set listData(value:Object):void
+    {
+        _listData = value;
+    }
+    
+    private var _labelField:String = "label";
+    
+    /**
+     * The name of the field within the data to use as a label. Some itemRenderers use this field to
+     * identify the value they should show while other itemRenderers ignore this if they are showing
+     * complex information.
+     */
+    public function get labelField():String
+    {
+        return _labelField;
+    }
+    public function set labelField(value:String):void
+    {
+        _labelField = value;
+    }
+    
+    override public function addedToParent():void
+    {
+        super.addedToParent();
+        COMPILE::JS
+        {
+            // UIComponent defaults everything to absolute positioning, but
+            // item renderers are likely to be positioned by the virtual layout
+            // and thus need to use default positioning.
+            element.style.position = "static";
+        }
+        
+    }
+
 }
 }
diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Scroller.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Scroller.as
index 793eb36..2d3def5 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Scroller.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/Scroller.as
@@ -69,6 +69,7 @@ import mx.core.IVisualElementContainer;
 import mx.managers.IFocusManagerComponent;
 
 import org.apache.royale.events.Event;
+import org.apache.royale.core.IChild;
 
 use namespace mx_internal;
 /* 
@@ -548,6 +549,8 @@ public class Scroller extends SkinnableComponent
     public function Scroller()
     {
         super();
+        typeNames = "Scroller";
+        
        /*  hasFocusableChildren = true;
         focusEnabled = false;
 
@@ -1087,9 +1090,9 @@ public class Scroller extends SkinnableComponent
         if (value == _viewport)
             return;
         
-       // uninstallViewport();
+       uninstallViewport();
         _viewport = value;
-       // installViewport();
+       installViewport();
         dispatchEvent(new Event("viewportChanged"));
     }
     
@@ -1097,10 +1100,15 @@ public class Scroller extends SkinnableComponent
      *  @private
      *  This is used to disable thinning for automated testing.
      */
-   /*  mx_internal static var dragEventThinning:Boolean = true;
+    //mx_internal static var dragEventThinning:Boolean = true;
     
+    /**
+     *  @private
+     *  @royaleignorecoercion org.apache.royale.core.IChild
+     */
     private function installViewport():void
     {
+        /*  SWF?
         if (skin && viewport)
         {
             viewport.clipAndEnableScrolling = true;
@@ -1112,10 +1120,20 @@ public class Scroller extends SkinnableComponent
             verticalScrollBar.viewport = viewport;
         if (horizontalScrollBar)
             horizontalScrollBar.viewport = viewport;
+        */
+        COMPILE::JS
+        {
+            addElement(viewport as IChild);
+        }
     } 
     
+    /**
+     *  @private
+     *  @royaleignorecoercion org.apache.royale.core.IChild
+     */
     private function uninstallViewport():void
     {
+        /*
         if (horizontalScrollBar)
             horizontalScrollBar.viewport = null;
         if (verticalScrollBar)
@@ -1127,8 +1145,13 @@ public class Scroller extends SkinnableComponent
             viewport.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, viewport_propertyChangeHandler);
             viewport.removeEventListener(Event.RESIZE, viewport_resizeHandler);
         }
+        */
+        COMPILE::JS
+        {
+            if (viewport)
+                removeElement(viewport as IChild);
+        }
     }
-    */
     
     //----------------------------------
     //  minViewportInset
diff --git a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/ItemRenderer.as b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/ItemRenderer.as
index 90f3d3b..bd920ec 100644
--- a/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/ItemRenderer.as
+++ b/frameworks/projects/SparkRoyale/src/main/royale/spark/components/supportClasses/ItemRenderer.as
@@ -32,6 +32,7 @@ import spark.components.ResizeMode;
 
 use namespace mx_internal;  */
 
+import org.apache.royale.core.ISelectableItemRenderer;
 import spark.components.DataRenderer;
 /**
  *  The ItemRenderer class is the base class for Spark item renderers.
@@ -83,7 +84,7 @@ import spark.components.DataRenderer;
  *  @playerversion AIR 1.5
  *  @productversion Royale 0.9.4
  */
-public class ItemRenderer extends DataRenderer
+public class ItemRenderer extends DataRenderer implements ISelectableItemRenderer
 {    // implements IItemRenderer
     //--------------------------------------------------------------------------
     //
@@ -213,7 +214,7 @@ public class ItemRenderer extends DataRenderer
      *  @private
      *  storage for the down property 
      */    
-    //private var _down:Boolean = false;
+    private var _down:Boolean = false;
     
     /**
      *  Set to <code>true</code> when the user is pressing down on an item renderer.
@@ -225,27 +226,29 @@ public class ItemRenderer extends DataRenderer
      *  @playerversion AIR 1.5
      *  @productversion Royale 0.9.4
      */    
-    /* protected function get down():Boolean
+    public function get down():Boolean
     {
         return _down;
-    } */
+    }
     
     /**
      *  @private
      */    
-    /* protected function set down(value:Boolean):void
+    public function set down(value:Boolean):void
     {
         if (value != _down)
         {
             _down = value;
+            /*
             invalidateRendererState();
             if (autoDrawBackground)
             {
                 redrawRequested = true;
                 super.$invalidateDisplayList();
             }
+            */
         }
-    } */
+    }
     
     //----------------------------------
     //  hovered
@@ -254,7 +257,7 @@ public class ItemRenderer extends DataRenderer
      *  @private
      *  storage for the hovered property 
      */    
-    //private var _hovered:Boolean = false;
+    private var _hovered:Boolean = false;
     
     /**
      *  Set to <code>true</code> when the user is hovered over the item renderer.
@@ -266,27 +269,72 @@ public class ItemRenderer extends DataRenderer
      *  @playerversion AIR 1.5
      *  @productversion Royale 0.9.4
      */    
-    /* protected function get hovered():Boolean
+    public function get hovered():Boolean
     {
         return _hovered;
-    } */
+    }
     
     /**
      *  @private
      */    
-    /* protected function set hovered(value:Boolean):void
+    public function set hovered(value:Boolean):void
     {
         if (value != _hovered)
         {
             _hovered = value;
+            /*
             invalidateRendererState();
             if (autoDrawBackground)
             {
                 redrawRequested = true;
                 super.$invalidateDisplayList();
             }
+            */
         }
-    } */
+    }
+    
+    //----------------------------------
+    //  hoverable
+    //----------------------------------
+    /**
+     *  @private
+     *  storage for the hovered property 
+     */    
+    private var _hoverable:Boolean = false;
+    
+    /**
+     *  Set to <code>true</code> when the user is hovered over the item renderer.
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Royale 0.9.4
+     */    
+    public function get hoverable():Boolean
+    {
+        return _hoverable;
+    }
+    
+    /**
+     *  @private
+     */    
+    public function set hoverable(value:Boolean):void
+    {
+        if (value != _hoverable)
+        {
+            _hoverable = value;
+            /*
+            invalidateRendererState();
+            if (autoDrawBackground)
+            {
+            redrawRequested = true;
+            super.$invalidateDisplayList();
+            }
+            */
+        }
+    }
     
     //----------------------------------
     //  itemIndex
@@ -335,6 +383,54 @@ public class ItemRenderer extends DataRenderer
     } */
     
     //----------------------------------
+    //  index
+    //----------------------------------
+    
+    /**
+     *  @private
+     *  storage for the index property 
+     */    
+    private var _index:int;
+    
+    [Bindable("itemIndexChanged")]
+    
+    /**
+     *  @inheritDoc 
+     *
+     *  @default 0
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Royale 0.9.4
+     */    
+    public function get index():int
+    {
+        return _index;
+    }
+    
+    /**
+     *  @private
+     */    
+    public function set index(value:int):void
+    {
+        if (value == _index)
+        return;
+        
+        _index = value;
+
+        /*
+        if (autoDrawBackground)
+        {
+            redrawRequested = true;
+            super.$invalidateDisplayList();
+        }
+        
+        dispatchEvent(new Event("itemIndexChanged"));
+        */
+    }
+    
+    //----------------------------------
     //  labelDisplay
     //----------------------------------
     
@@ -401,7 +497,7 @@ public class ItemRenderer extends DataRenderer
      *  @private
      *  storage for the selected property 
      */    
-    //private var _selected:Boolean = false;
+    private var _selected:Boolean = false;
     
     /**
      *  @inheritDoc 
@@ -413,28 +509,73 @@ public class ItemRenderer extends DataRenderer
      *  @playerversion AIR 1.5
      *  @productversion Royale 0.9.4
      */    
-    /* public function get selected():Boolean
+    public function get selected():Boolean
     {
         return _selected;
-    } */
+    }
     
     /**
      *  @private
      */    
-    /* public function set selected(value:Boolean):void
+    public function set selected(value:Boolean):void
     {
         if (value != _selected)
         {
             _selected = value;
+            /*
             invalidateRendererState();
             if (autoDrawBackground)
             {
                 redrawRequested = true;
                 super.$invalidateDisplayList();
             }
+            */
+        }
+    }
+    
+    //----------------------------------
+    //  selected
+    //----------------------------------
+    /**
+     *  @private
+     *  storage for the selected property 
+     */    
+    private var _selectable:Boolean = false;
+    
+    /**
+     *  @inheritDoc 
+     *
+     *  @default false
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10
+     *  @playerversion AIR 1.5
+     *  @productversion Royale 0.9.4
+     */    
+    public function get selectable():Boolean
+    {
+        return _selectable;
+    }
+    
+    /**
+     *  @private
+     */    
+    public function set selectable(value:Boolean):void
+    {
+        if (value != _selectable)
+        {
+            _selectable = value;
+            /*
+            invalidateRendererState();
+            if (autoDrawBackground)
+            {
+            redrawRequested = true;
+            super.$invalidateDisplayList();
+            }
+            */
         }
     }
-       */ 
+
     //----------------------------------
     //  dragging
     //----------------------------------


[royale-asjs] 04/08: don't need this after all of the other refactoring

Posted by ah...@apache.org.
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 cc94cc79a21b225a7cb9d9ab8aa77f862ed1a223
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 22:23:34 2018 -0800

    don't need this after all of the other refactoring
---
 .../DataItemRendererFactoryForICollectionViewData.as    | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/DataItemRendererFactoryForICollectionViewData.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/DataItemRendererFactoryForICollectionViewData.as
index cdfb917..21fbcfb 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/DataItemRendererFactoryForICollectionViewData.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/DataItemRendererFactoryForICollectionViewData.as
@@ -72,23 +72,6 @@ package mx.controls.listClasses
 		{
 			super();
 		}
-
-		private var _strand:IStrand;
-
-        /**
-         *  @copy org.apache.royale.core.IBead#strand
-         *
-         *  @langversion 3.0
-         *  @playerversion Flash 10.2
-         *  @playerversion AIR 2.6
-         *  @productversion Royale 0.0
-         */
-		override public function set strand(value:IStrand):void
-		{
-			_strand = value;
-			
-			super.strand = value;
-		}
         
         /**
          * @private


[royale-asjs] 06/08: virtual item renderers for MXRoyale

Posted by ah...@apache.org.
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 27ac6d36901ab6686f88df13376b3e6be5882926
Author: Alex Harui <ah...@apache.org>
AuthorDate: Sun Dec 2 22:25:39 2018 -0800

    virtual item renderers for MXRoyale
---
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   1 +
 ...ataItemRendererFactoryForICollectionViewData.as | 190 ++++++++++
 .../listClasses/VirtualListVerticalLayout.as       | 416 +++++++++++++++++++++
 3 files changed, 607 insertions(+)

diff --git a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
index f6796d2..db25050 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/MXRoyaleClasses.as
@@ -71,6 +71,7 @@ internal class MXRoyaleClasses
 	import mx.controls.treeClasses.ITreeDataDescriptor; ITreeDataDescriptor;
 	import mx.controls.treeClasses.TreeListData; TreeListData;
 	import mx.controls.listClasses.DataItemRendererFactoryForICollectionViewData; DataItemRendererFactoryForICollectionViewData;
+    import mx.controls.listClasses.VirtualDataItemRendererFactoryForICollectionViewData; VirtualDataItemRendererFactoryForICollectionViewData;
 	import mx.controls.treeClasses.DataItemRendererFactoryForICollectionViewHierarchicalData; DataItemRendererFactoryForICollectionViewHierarchicalData;
 	import mx.charts.chartClasses.RenderData; RenderData;
 	import mx.effects.EffectInstance; EffectInstance;
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualDataItemRendererFactoryForICollectionViewData.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualDataItemRendererFactoryForICollectionViewData.as
new file mode 100644
index 0000000..20a5a5f
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualDataItemRendererFactoryForICollectionViewData.as
@@ -0,0 +1,190 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.listClasses
+{
+    import mx.collections.CursorBookmark;
+	import mx.collections.ICollectionView;
+	import mx.collections.IViewCursor;
+	
+	import org.apache.royale.core.IBead;
+	import org.apache.royale.core.IBeadModel;
+	import org.apache.royale.core.IDataProviderItemRendererMapper;
+    import org.apache.royale.core.IDataProviderVirtualItemRendererMapper;
+	import org.apache.royale.core.IDataProviderModel;
+	import org.apache.royale.core.IItemRendererClassFactory;
+	import org.apache.royale.core.IItemRendererParent;
+	import org.apache.royale.core.IListPresentationModel;
+	import org.apache.royale.core.ISelectableItemRenderer;
+	import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IStrandWithModelView;
+	import org.apache.royale.core.IUIBase;
+	import org.apache.royale.core.SimpleCSSStyles;
+	import org.apache.royale.core.UIBase;
+	import org.apache.royale.core.ValuesManager;
+	import org.apache.royale.events.CollectionEvent;
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.EventDispatcher;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.events.ItemRendererEvent;
+	import org.apache.royale.html.List;
+    import org.apache.royale.html.beads.IListView;
+	import org.apache.royale.html.beads.DataItemRendererFactoryForCollectionView;
+    import org.apache.royale.html.supportClasses.DataItemRenderer;
+	
+	[Event(name="itemRendererCreated",type="org.apache.royale.events.ItemRendererEvent")]
+
+    /**
+     *  The DataItemRendererFactoryForHierarchicalData class reads a
+     *  HierarchicalData object and creates an item renderer for every
+     *  item in the array.  Other implementations of
+     *  IDataProviderItemRendererMapper map different data
+     *  structures or manage a virtual set of renderers.
+     *
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion Royale 0.0
+     */
+	public class VirtualDataItemRendererFactoryForICollectionViewData extends DataItemRendererFactoryForICollectionViewData 
+        implements IDataProviderVirtualItemRendererMapper
+	{
+        /**
+         *  Constructor.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         */
+		public function VirtualDataItemRendererFactoryForICollectionViewData()
+		{
+			super();
+		}
+
+        protected var dataProviderModel:IDataProviderModel;
+        
+        protected var dataField:String;
+                
+        /**
+         *  Free an item renderer for a given index.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.0
+         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
+         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
+         */
+        public function freeItemRendererForIndex(index:int):void
+        {
+            var ir:ISelectableItemRenderer = rendererMap[index];
+            var view:IListView = (_strand as IStrandWithModelView).view as IListView;
+            var dataGroup:IItemRendererParent = view.dataGroup;
+            dataGroup.removeItemRenderer(ir);
+            delete rendererMap[index];
+        }
+        
+        private var rendererMap:Object = {};
+        
+        private var currentIndex:int = 0;
+        
+        private var cursor:IViewCursor;
+        
+        /**
+         *  The org.apache.royale.core.IItemRendererParent that will
+         *  parent the item renderers.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.0
+         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
+         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
+         */		
+        override protected function dataProviderChangeHandler(event:Event):void
+        {
+            // do not call super as it will be non-virtual and renderer every item in the dp
+            
+            var dp:Array = dataProviderModel.dataProvider as Array;
+            if (!dp)
+                return;
+            
+            var view:IListView = (_strand as IStrandWithModelView).view as IListView;
+            var dataGroup:IItemRendererParent = view.dataGroup;
+            
+            dataGroup.removeAllItemRenderers();
+        }
+        
+
+        /**
+         *  Get an item renderer for a given index.
+         *
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.0
+         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
+         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
+         */
+        public function getItemRendererForIndex(index:int, elementIndex:int):ISelectableItemRenderer
+        {
+            var ir:ISelectableItemRenderer = rendererMap[index];
+            if (ir) return ir;
+            
+            if (!cursor)
+            {
+                var dp:ICollectionView = dataProviderModel.dataProvider as ICollectionView;
+                cursor = dp.createCursor();
+            }
+            
+            ir = itemRendererFactory.createItemRenderer(dataGroup) as ISelectableItemRenderer;
+            var dataItemRenderer:DataItemRenderer = ir as DataItemRenderer;
+            
+            var view:IListView = (_strand as IStrandWithModelView).view as IListView;
+            var dataGroup:IItemRendererParent = view.dataGroup;
+            dataGroup.addItemRendererAt(ir, elementIndex);
+            ir.index = index;
+            ir.labelField = labelField;
+            if (dataItemRenderer)
+            {
+                dataItemRenderer.dataField = dataField;
+            }
+            rendererMap[index] = ir;
+            
+            var presentationModel:IListPresentationModel = _strand.getBeadByType(IListPresentationModel) as IListPresentationModel;
+            if (presentationModel) {
+                var style:SimpleCSSStyles = new SimpleCSSStyles();
+                style.marginBottom = presentationModel.separatorThickness;
+                UIBase(ir).style = style;
+                UIBase(ir).height = presentationModel.rowHeight;
+                UIBase(ir).percentWidth = 100;
+            }
+            var distance:int = index - currentIndex;
+            cursor.seek(CursorBookmark.CURRENT, distance);
+            currentIndex = index;
+            ir.data = cursor.current;
+            
+            var newEvent:ItemRendererEvent = new ItemRendererEvent(ItemRendererEvent.CREATED);
+            newEvent.itemRenderer = ir;
+            dispatchEvent(newEvent);
+            return ir;
+        }
+		
+	}
+}
diff --git a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualListVerticalLayout.as b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualListVerticalLayout.as
new file mode 100644
index 0000000..923b8b9
--- /dev/null
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/listClasses/VirtualListVerticalLayout.as
@@ -0,0 +1,416 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 org.apache.royale.html.beads.layouts
+{
+	import org.apache.royale.core.IBeadLayout;
+	import org.apache.royale.core.IBeadModel;
+	import org.apache.royale.core.IBorderPaddingMarginValuesImpl;
+	import org.apache.royale.core.IDataProviderModel;
+	import org.apache.royale.core.IDataProviderVirtualItemRendererMapper;
+	import org.apache.royale.core.ILayoutChild;
+	import org.apache.royale.core.ILayoutHost;
+	import org.apache.royale.core.ILayoutParent;
+	import org.apache.royale.core.ILayoutView;
+	import org.apache.royale.core.IListPresentationModel;
+	import org.apache.royale.core.IParentIUIBase;
+	import org.apache.royale.core.IScrollingViewport;
+	import org.apache.royale.core.ISelectableItemRenderer;
+	import org.apache.royale.core.IStrand;
+	import org.apache.royale.core.IStrandWithPresentationModel;
+	import org.apache.royale.core.IUIBase;
+	import org.apache.royale.core.LayoutBase;
+	import org.apache.royale.core.ValuesManager;
+	import org.apache.royale.core.layout.EdgeData;
+	COMPILE::JS
+	{
+		import org.apache.royale.core.WrappedHTMLElement;
+	}
+	import org.apache.royale.events.Event;
+	import org.apache.royale.events.IEventDispatcher;
+	import org.apache.royale.geom.Rectangle;
+    import org.apache.royale.html.beads.VirtualDataContainerView;
+	import org.apache.royale.utils.CSSUtils;
+
+    COMPILE::SWF {
+        import org.apache.royale.geom.Size;
+    }
+        
+	/**
+	 *  The VerticalLayout class is a simple layout
+	 *  bead.  It takes the set of children and lays them out
+	 *  vertically in one column, separating them according to
+	 *  CSS layout rules for margin and horizontal-align styles.
+	 *
+	 *  @langversion 3.0
+	 *  @playerversion Flash 10.2
+	 *  @playerversion AIR 2.6
+	 *  @productversion Royale 0.0
+	 */
+	public class VirtualListVerticalLayout extends LayoutBase implements IBeadLayout
+	{
+		/**
+		 *  Constructor.
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.0
+         *  @royaleignorecoercion HTMLDivElement
+		 */
+		public function VirtualListVerticalLayout()
+		{
+			super();
+		}
+
+        protected var dataProviderModel:IDataProviderModel;
+
+        override public function set strand(value:IStrand):void
+        {
+            super.strand = value;
+            dataProviderModel = host.getBeadByType(IDataProviderModel) as IDataProviderModel;
+            COMPILE::JS
+            {
+                host.element.addEventListener("scroll", scrollHandler);
+            }
+        }
+        
+        COMPILE::JS
+        private var topSpacer:HTMLDivElement;
+        
+        COMPILE::JS
+        private var bottomSpacer:HTMLDivElement;
+        
+        private var visibleIndexes:Array = [];
+        
+        private function scrollHandler(e:Event):void
+        {
+            layout();
+        }
+        
+        private var inLayout:Boolean;
+        
+		/**
+		 *  Layout children vertically
+		 *
+		 *  @langversion 3.0
+		 *  @playerversion Flash 10.2
+		 *  @playerversion AIR 2.6
+		 *  @productversion Royale 0.0
+		 *  @royaleignorecoercion Array
+		 *  @royaleignorecoercion org.apache.royale.core.ILayoutHost
+		 *  @royaleignorecoercion org.apache.royale.core.WrappedHTMLElement
+		 *  @royaleignorecoercion org.apache.royale.core.IListPresentationModel
+		 *  @royaleignorecoercion org.apache.royale.core.IStrandWithPresentationModel
+		 */
+		override public function layout():Boolean
+		{
+            if (inLayout) return true;
+            inLayout = true;
+            
+			COMPILE::SWF
+			{
+                // the strategy for virtualization in SWF is based on the
+                // fact that we can completely control the scrolling metrics
+                // instead of trying to rely on the browsers built-in scrolling.
+                // This code puts enough renderers on the screen and then dictates
+                // the scrolling metrics.
+				var contentView:ILayoutView = layoutView;
+
+				var maxWidth:Number = 0;
+				var maxHeight:Number = 0;
+                var dp:Array = dataProviderModel.dataProvider as Array;
+                if (!dp) 
+                {
+                    inLayout = false;
+                    return true;
+                }
+                var presentationModel:IListPresentationModel = (host as IStrandWithPresentationModel).presentationModel as IListPresentationModel;
+				var hostWidthSizedToContent:Boolean = host.isWidthSizedToContent();
+				var hostHeightSizedToContent:Boolean = host.isHeightSizedToContent();
+				var hostWidth:Number = host.width;
+				var hostHeight:Number = host.height;
+
+				var data:Object;
+				var canAdjust:Boolean = false;
+
+				var paddingMetrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getPaddingMetrics(host);
+				var borderMetrics:EdgeData = (ValuesManager.valuesImpl as IBorderPaddingMarginValuesImpl).getBorderMetrics(host);
+				
+				// adjust the host's usable size by the metrics. If hostSizedToContent, then the
+				// resulting adjusted value may be less than zero.
+				hostWidth -= paddingMetrics.left + paddingMetrics.right + borderMetrics.left + borderMetrics.right;
+				hostHeight -= paddingMetrics.top + paddingMetrics.bottom + borderMetrics.top + borderMetrics.bottom;
+
+				var xpos:Number = borderMetrics.left + paddingMetrics.left;
+                var ypos:Number = borderMetrics.top + paddingMetrics.top;
+                
+                var viewport:IScrollingViewport = host.getBeadByType(IScrollingViewport) as IScrollingViewport;
+                viewport.addEventListener("verticalScrollPositionChanged", scrollHandler);
+                var viewportTop:Number = viewport.verticalScrollPosition;
+                var viewportHeight:Number = hostHeight;
+                var startIndex:int = Math.floor(viewportTop / presentationModel.rowHeight);
+                var factory:IDataProviderVirtualItemRendererMapper = host.getBeadByType(IDataProviderVirtualItemRendererMapper) as IDataProviderVirtualItemRendererMapper;
+                var endIndex:int = Math.ceil((viewportTop + viewportHeight) / presentationModel.rowHeight);
+                var freeIndex:int;
+                var firstIndex:int;
+                var lastIndex:int;
+
+                if (visibleIndexes.length)
+                {
+                    if (startIndex < visibleIndexes[0])
+                    {
+                        // see if we can re-use any renderers
+                        freeIndex = visibleIndexes.pop();
+                        while (freeIndex >= endIndex)
+                        {
+                            factory.freeItemRendererForIndex(freeIndex);
+                            if (visibleIndexes.length == 0)
+                                break;
+                            freeIndex = visibleIndexes.pop();
+                        }
+                        if (visibleIndexes.length)
+                            endIndex = visibleIndexes[visibleIndexes.length - 1];
+                    }
+                    else if (startIndex > visibleIndexes[0])
+                    {
+                        // see if we can re-use any renderers
+                        freeIndex = visibleIndexes.shift();
+                        while (freeIndex < startIndex)
+                        {
+                            factory.freeItemRendererForIndex(freeIndex);
+                            if (visibleIndexes.length == 0)
+                                break;
+                            freeIndex = visibleIndexes.shift();
+                        }
+                    }
+                    else
+                    {
+                        // see if rows got added or removed because height changed
+                        lastIndex = visibleIndexes[visibleIndexes.length - 1];
+                        if (lastIndex > endIndex)
+                        {
+                            // see if we can re-use any renderers
+                            freeIndex = visibleIndexes.pop();
+                            while (freeIndex > endIndex)
+                            {
+                                factory.freeItemRendererForIndex(freeIndex);
+                                if (visibleIndexes.length == 0)
+                                    break;
+                                freeIndex = visibleIndexes.pop();
+                            }
+                            inLayout = false;
+                            return true;  // we should be all done if we shrunk
+                        }
+                    }
+                    firstIndex = visibleIndexes[0];
+                    lastIndex = visibleIndexes[visibleIndexes.length - 1];
+                }
+                else
+                {
+                    firstIndex = dp.length;
+                    lastIndex = 0;
+                }
+                for (var i:int = startIndex; i < endIndex; i++)
+                {
+                    var ir:ISelectableItemRenderer;
+                    if (i < firstIndex)
+                    {
+                        ir  = factory.getItemRendererForIndex(i, i - startIndex);
+                        sizeAndPositionRenderer(ir, xpos, ypos + (presentationModel.rowHeight * i), hostWidth, hostHeight);
+                        visibleIndexes.push(i);
+                    }
+                    else if (i > lastIndex)
+                    {
+                        ir  = factory.getItemRendererForIndex(i, i - startIndex);
+                        sizeAndPositionRenderer(ir, xpos, ypos + (presentationModel.rowHeight * i), hostWidth, hostHeight);
+                        visibleIndexes.push(i);
+                    }
+                }
+                visibleIndexes = visibleIndexes.sort(numberSort);
+
+                var view:VirtualDataContainerView = host.getBeadByType(VirtualDataContainerView) as VirtualDataContainerView;
+                view.lastContentSize = new Size(hostWidth, dp.length * presentationModel.rowHeight);
+
+                inLayout = false;
+				return true;
+			}
+			COMPILE::JS
+			{
+                // the strategy for virtualization in JS is to leverage the built-in scrollbars
+                // by creating a topSpacer and bottomSpacer that take up the area that is offscreen
+                // so the scrollbars have the right metrics, then create enough renderers to
+                // show in the visible area.  This code does not recycle renderers, but the
+                // factory can.  This code does try to keep renderers on the DOM that aren't
+                // going off-screen
+                var contentView:ILayoutView = layoutView;
+                var dp:Array = dataProviderModel.dataProvider as Array;
+                if (!dp) 
+                {
+                    inLayout = false;
+                    return true;
+                }
+                var presentationModel:IListPresentationModel = (host as IStrandWithPresentationModel).presentationModel as IListPresentationModel;
+                var totalHeight:Number = presentationModel.rowHeight * dp.length;
+                var viewportTop:Number = Math.max(contentView.element.scrollTop, 0);
+                var viewportHeight:Number = contentView.element.clientHeight;
+                var startIndex:int = Math.floor(viewportTop / presentationModel.rowHeight);
+                var factory:IDataProviderVirtualItemRendererMapper = host.getBeadByType(IDataProviderVirtualItemRendererMapper) as IDataProviderVirtualItemRendererMapper;
+                var endIndex:int = Math.ceil((viewportTop + viewportHeight) / presentationModel.rowHeight);
+                var freeIndex:int;
+                var firstIndex:int;
+                var lastIndex:int;
+                if (!topSpacer)
+                {
+                    topSpacer = document.createElement("div") as HTMLDivElement;
+                    contentView.element.appendChild(topSpacer);
+                }
+                topSpacer.style.height = (startIndex * presentationModel.rowHeight).toString() + "px";
+                if (visibleIndexes.length)
+                {
+                    if (startIndex < visibleIndexes[0])
+                    {
+                        // see if we can re-use any renderers
+                        freeIndex = visibleIndexes.pop();
+                        while (freeIndex >= endIndex)
+                        {
+                            factory.freeItemRendererForIndex(freeIndex);
+                            if (visibleIndexes.length == 0)
+                                break;
+                            freeIndex = visibleIndexes.pop();
+                        }
+                        if (visibleIndexes.length)
+                            endIndex = visibleIndexes[visibleIndexes.length - 1];
+                    }
+                    else if (startIndex > visibleIndexes[0])
+                    {
+                        // see if we can re-use any renderers
+                        freeIndex = visibleIndexes.shift();
+                        while (freeIndex < startIndex)
+                        {
+                            factory.freeItemRendererForIndex(freeIndex);
+                            if (visibleIndexes.length == 0)
+                                break;
+                            freeIndex = visibleIndexes.shift();
+                        }
+                    }
+                    else
+                    {
+                        // see if rows got added or removed because height changed
+                        lastIndex = visibleIndexes[visibleIndexes.length - 1];
+                        if (lastIndex > endIndex)
+                        {
+                            // see if we can re-use any renderers
+                            freeIndex = visibleIndexes.pop();
+                            while (freeIndex > endIndex)
+                            {
+                                factory.freeItemRendererForIndex(freeIndex);
+                                if (visibleIndexes.length == 0)
+                                    break;
+                                freeIndex = visibleIndexes.pop();
+                            }
+                            inLayout = false;
+                            return true;  // we should be all done if we shrunk
+                        }
+                    }
+                    firstIndex = visibleIndexes[0];
+                    lastIndex = visibleIndexes[visibleIndexes.length - 1];
+                }
+                else
+                {
+                    firstIndex = dp.length;
+                    lastIndex = 0;
+                }
+                for (var i:int = startIndex; i < endIndex; i++)
+                {
+                    var ir:ISelectableItemRenderer;
+                    if (i < firstIndex)
+                    {
+                       ir  = factory.getItemRendererForIndex(i, i - startIndex + 1);
+                       ir.element.style.display = "block";
+                       visibleIndexes.push(i);
+                    }
+                    else if (i > lastIndex)
+                    {
+                        ir  = factory.getItemRendererForIndex(i, i - startIndex + 1);
+                        ir.element.style.display = "block";
+                        visibleIndexes.push(i);
+                    }
+                }
+                visibleIndexes = visibleIndexes.sort(numberSort);
+                if (!bottomSpacer)
+                {
+                    bottomSpacer = document.createElement("div") as HTMLDivElement;
+                    contentView.element.appendChild(bottomSpacer);
+                }
+                bottomSpacer.style.height = ((dp.length - endIndex) * presentationModel.rowHeight).toString() + "px";  
+                inLayout = false;
+				return true;
+			}
+		}
+        
+        public function numberSort(a:int, b:int):int
+        {
+            return a - b;
+        }
+
+        COMPILE::SWF
+        private function sizeAndPositionRenderer(ir:ISelectableItemRenderer, xpos:Number, ypos:Number, hostWidth:Number, hostHeight:Number):void
+        {
+            var ilc:ILayoutChild;
+            var positions:Object = childPositions(ir);
+            var margins:Object = childMargins(ir, hostWidth, hostHeight);
+            
+            ilc = ir as ILayoutChild;
+            var child:IUIBase = ir as IUIBase;
+            
+            ypos += margins.top;
+            
+            var childXpos:Number = xpos + margins.left; // default x position
+            
+            var childWidth:Number = child.width;
+            if (ilc != null && !isNaN(ilc.percentWidth)) {
+                childWidth = hostWidth * ilc.percentWidth/100.0;
+                ilc.setWidth(childWidth);
+            }
+            else if (ilc.isWidthSizedToContent() && !margins.auto)
+            {
+                childWidth = hostWidth;
+                ilc.setWidth(childWidth);
+            }
+            if (margins.auto)
+                childXpos = (hostWidth - childWidth) / 2;
+            
+            if (ilc) {
+                ilc.setX(childXpos);
+                ilc.setY(ypos);
+                
+                if (!isNaN(ilc.percentHeight)) {
+                    var newHeight:Number = hostHeight * ilc.percentHeight / 100;
+                    ilc.setHeight(newHeight);
+                }
+                
+            } else {
+                child.x = childXpos;
+                child.y = ypos;
+            }
+            
+            ypos += child.height + margins.bottom;
+        }
+	}
+}