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 19797e9dcc3f78257d60a1368f9fd278ed6158d8
Merge: 8de9ead bac0d85
Author: Alex Harui <[email protected]>
AuthorDate: Mon Feb 17 23:43:45 2020 -0800

    Merge branch 'has' into develop

 .../main/royale/products/ProductItemRenderer.as    |   2 -
 .../ListExample/src/main/royale/MyInitialView.mxml |   7 +-
 .../main/royale/simple/IRFactoryForArrayData.as    | 178 ---------------
 .../src/main/config/compile-app-config.xml         |   3 +
 .../AdvancedIconListItemRenderer.mxml              |   2 +-
 .../itemRenderers/IconDataGridItemRenderer.mxml    |   2 +-
 .../royale/itemRenderers/IconListItemRenderer.mxml |   2 +-
 .../NavigationGroupExampleItemRenderer.mxml        |   2 +-
 .../TableCellCloseIconItemRenderer.mxml            |   2 +-
 .../projects/Basic/src/main/resources/defaults.css |  40 +++-
 .../projects/Basic/src/main/royale/BasicClasses.as |   4 +
 .../org/apache/royale/core/DataContainerBase.as    |   2 +-
 .../apache/royale/core/StyledMXMLItemRenderer.as   |  78 +++----
 .../royale/org/apache/royale/html/DataContainer.as |   2 +-
 .../accessories/ToolTipRemovalWhenItemRemoved.as   |   5 +-
 .../royale/html/beads/AccordionCollapseBead.as     |   4 +-
 .../apache/royale/html/beads/DataContainerView.as  |  28 +--
 .../html/beads/DataItemRendererFactoryBase.as      | 126 +++++++++++
 .../beads/DataItemRendererFactoryForArrayData.as   | 168 +++-----------
 .../beads/DataItemRendererFactoryForArrayList.as   | 139 ++----------
 .../DataItemRendererFactoryForCollectionView.as    | 217 +++++-------------
 .../beads/DataItemRendererFactoryForColumnData.as  |  84 +------
 .../DataItemRendererFactoryForHierarchicalData.as  |  52 +----
 .../DynamicAddItemRendererForArrayListData.as      | 184 +++------------
 .../DynamicItemsRendererFactoryForArrayListData.as | 187 +++-------------
 ...cRemoveAllByNullItemRendererForArrayListData.as |  16 +-
 ...DynamicRemoveAllItemRendererForArrayListData.as |  16 +-
 .../DynamicRemoveItemRendererForArrayListData.as   | 102 +--------
 .../DynamicUpdateItemRendererForArrayListData.as   | 109 ++-------
 .../apache/royale/html/beads/ITextItemRenderer.as  |   7 +-
 .../html/beads/IndexedItemRendererInitializer.as   | 107 +++++++++
 ...yForArrayData.as => ItemRendererFactoryBase.as} | 149 ++++++-------
 .../html/beads/ListItemRendererInitializer.as      |  87 ++++++++
 .../org/apache/royale/html/beads/ListView.as       |  79 +++++--
 .../MultiSelectionItemRendererClassFactory.as      |   6 +-
 .../royale/html/beads/MultiSelectionListView.as    |   2 +-
 ...dBackgroundRuntimeSelectableItemRendererBead.as | 128 +++++++++++
 .../SolidBackgroundSelectableItemRendererBead.as}  |  59 ++---
 .../beads/TextItemRendererFactoryForArrayData.as   |   8 +-
 .../TextItemRendererFactoryForStringVectorData.as  |  10 +-
 .../html/beads/TreeItemRendererInitializer.as      |  86 +++++++
 .../royale/html/beads/VirtualDataContainerView.as  |   4 +-
 ...ta.as => VirtualDataItemRendererFactoryBase.as} |  92 ++++----
 .../VirtualDataItemRendererFactoryForArrayData.as  | 166 ++------------
 .../apache/royale/html/beads/VirtualListView.as    |  74 +++++--
 .../controllers/ItemRendererMouseController.as     |  57 +++--
 .../ListMultiSelectionMouseController.as           |  29 ++-
 .../ListSingleSelectionMouseController.as          |  26 ++-
 .../MultiSelectionItemRendererMouseController.as   |  59 +++--
 .../layouts/UseMaxChildForTileCellDimensions.as    |   4 +-
 .../beads/layouts/VirtualListVerticalLayout.as     |   8 +-
 .../html/supportClasses/AccordionItemRenderer.as   | 107 +--------
 ...AlternatingBackgroundColorStringItemRenderer.as |  39 ++--
 .../supportClasses/ButtonBarButtonItemRenderer.as  |   4 +-
 .../supportClasses/CascadingMenuItemRenderer.as    |   2 -
 .../html/supportClasses/ColorItemRenderer.as       |  51 ++---
 .../html/supportClasses/ContainerContentArea.as    |  11 +-
 .../DataGridButtonBarButtonItemRenderer.as         |   2 +-
 .../apache/royale/html/supportClasses/DataGroup.as |   4 +-
 .../royale/html/supportClasses/DataItemRenderer.as |  25 ---
 .../html/supportClasses/GraphicsItemRenderer.as    |  21 +-
 .../html/supportClasses/MenuBarItemRenderer.as     |   2 -
 .../royale/html/supportClasses/MenuItemRenderer.as |   2 -
 .../html/supportClasses/StringItemRenderer.as      |   1 -
 .../html/supportClasses/TextButtonItemRenderer.as  | 124 +----------
 .../html/supportClasses/TextFieldItemRenderer.as   |  17 +-
 .../supportClasses/TreeGridControlItemRenderer.as  |  37 +++-
 .../royale/html/supportClasses/TreeItemRenderer.as |  25 ++-
 .../html/supportClasses/UIItemRendererBase.as      | 170 +-------------
 .../Charts/src/main/resources/defaults.css         |   5 +
 .../Charts/src/main/royale/ChartsClasses.as        |   1 +
 .../charts/beads/ChartItemRendererFactory.as       |   7 +-
 .../beads/ChartSelectableItemRendererBead.as       | 110 +++++++++
 .../org/apache/royale/charts/beads/ChartView.as    |  11 +-
 ...ataItemRendererFactoryForSeriesArrayListData.as |  94 ++------
 .../beads/DataItemRendererFactoryForSeriesData.as  | 246 ++++++++++++++-------
 .../controllers/ChartSeriesMouseController.as      |   4 +-
 .../layouts/LineChartCategoryVsLinearLayout.as     |   1 -
 .../beads/layouts/LineChartLinearVsLinearLayout.as |   1 -
 .../apache/royale/charts/core/IChartDataGroup.as   |   4 +-
 .../royale/charts/core/IChartItemRenderer.as       |  13 ++
 .../royale/charts/optimized/SVGBoxItemRenderer.as  |   1 -
 .../royale/charts/optimized/SVGChartDataGroup.as   |  22 +-
 .../charts/optimized/SVGLineSegmentItemRenderer.as |  78 +------
 .../charts/optimized/SVGWedgeItemRenderer.as       |  52 +----
 .../charts/supportClasses/BoxItemRenderer.as       | 120 +---------
 .../royale/charts/supportClasses/ChartDataGroup.as |  24 +-
 .../ChartItemRenderer.as}                          |  76 +++++--
 .../supportClasses/LineSegmentItemRenderer.as      |  73 +-----
 .../charts/supportClasses/WedgeItemRenderer.as     |  79 +------
 .../org/apache/royale/collections/IArrayList.as    |   2 +-
 .../projects/Core/src/main/royale/CoreClasses.as   |   8 +
 .../core/IDataProviderVirtualItemRendererMapper.as |   2 +-
 .../apache/royale/core/IIndexedItemRenderer.as}    |  18 +-
 ...arent.as => IIndexedItemRendererInitializer.as} |  28 +--
 .../royale/org/apache/royale/core/IItemRenderer.as |  25 +--
 .../royale/core/IItemRendererClassFactory.as       |   8 +-
 ...ndererParent.as => IItemRendererInitializer.as} |  31 ++-
 ...RendererParent.as => IItemRendererOwnerView.as} |   9 +-
 .../apache/royale/core/ILabelFieldItemRenderer.as} |  26 +--
 .../main/royale/org/apache/royale/core/IList.as    |   2 +-
 .../apache/royale/core/IListDataItemRenderer.as}   |  19 +-
 .../apache/royale/core/IOwnerViewItemRenderer.as}  |  27 +--
 .../apache/royale/core/ISelectableItemRenderer.as  |  25 +--
 .../apache/royale/core/ItemRendererClassFactory.as |  13 +-
 .../royale/core/ItemRendererOwnerViewBead.as}      |  31 +--
 ...er.as => SelectableItemRendererClassFactory.as} |  85 ++++---
 .../org/apache/royale/events/ItemAddedEvent.as     |   2 +-
 .../org/apache/royale/events/ItemRemovedEvent.as   |   2 +-
 .../org/apache/royale/events/ItemRendererEvent.as  |   2 +-
 .../org/apache/royale/html/beads/IListView.as      |   4 +-
 .../html/beads/SelectableItemRendererBeadBase.as   | 212 ++++++++++++++++++
 .../royale/html/beads/ButtonBarReorderBead.as      |  14 +-
 .../beads/DragDropListItemRendererInitializer.as   |  86 +++++++
 .../html/beads/MultiSelectionDragImageBead.as      |   6 +-
 .../beads/SensitiveMultiSelectionDropTargetBead.as |  22 +-
 .../SensitiveSingleSelectionDropTargetBead.as      |  22 +-
 .../html/beads/SingleSelectionDragImageBead.as     |   2 +-
 .../html/beads/SingleSelectionDragSourceBead.as    |   4 +-
 .../html/beads/SingleSelectionDropIndicatorBead.as |   2 +-
 .../html/beads/SingleSelectionDropTargetBead.as    |  20 +-
 .../projects/Flat/src/main/resources/defaults.css  |   3 +-
 .../projects/Flat/src/main/royale/FlatClasses.as   |   2 +-
 ...stSolidBackgroundSelectableItemRendererBead.as} |  16 +-
 .../projects/Jewel/src/main/resources/defaults.css |   5 +
 .../projects/Jewel/src/main/royale/JewelClasses.as |   5 +
 .../controllers/ItemRendererMouseController.as     |  68 +++---
 .../TableCellSelectionMouseController.as           |  18 +-
 .../AddListItemRendererForArrayListData.as         |  34 +--
 .../itemRenderers/AddTableRowForArrayListData.as   |  22 +-
 ...tHoverableRuntimeSelectableItemRendererBead.as} |  46 ++--
 ...electorListRuntimeSelectableItemRendererBead.as | 122 ++++++++++
 .../DataItemRendererFactoryForArrayData.as         |  19 +-
 .../DataItemRendererFactoryForCollectionView.as    |  39 ++--
 ...DownListItemRendererFactoryForCollectionView.as |  10 +-
 .../jewel/beads/itemRenderers/ITextItemRenderer.as |   5 +-
 .../JewelListItemRendererInitializer.as            | 122 ++++++++++
 .../RemoveAllItemRendererForArrayListData.as       |  16 +-
 .../RemoveListItemRendererForArrayListData.as      |  26 +--
 .../RemoveTableRowForArrayListData.as              |  24 +-
 .../TableItemRendererFactoryForCollectionView.as   |  22 +-
 .../UpdateListItemRendererForArrayListData.as      |  20 +-
 .../UpdateTableRowForArrayListData.as              |  24 +-
 ...tualDataItemRendererFactoryForCollectionView.as | 163 ++------------
 .../beads/layouts/VirtualListVerticalLayout.as     |   8 +-
 .../royale/jewel/beads/views/DropDownListView.as   |  22 +-
 .../apache/royale/jewel/beads/views/ListView.as    | 134 ++++++-----
 .../apache/royale/jewel/beads/views/TabBarView.as  |  12 +-
 .../apache/royale/jewel/beads/views/TableView.as   |  18 +-
 .../royale/jewel/beads/views/VirtualListView.as    |  49 ++--
 .../jewel/itemRenderers/ButtonBarItemRenderer.as   |  20 +-
 .../CollapsibleNavigationSectionRenderer.as        |  15 +-
 .../royale/jewel/itemRenderers/DateItemRenderer.as |   8 +-
 .../itemRenderers/DropDownListItemRenderer.as      |   6 +-
 .../itemRenderers/IconButtonBarItemRenderer.as     | 125 +----------
 .../royale/jewel/itemRenderers/ListItemRenderer.as |  54 +----
 .../itemRenderers/NavigationLinkItemRenderer.as    |  15 +-
 .../jewel/itemRenderers/StringItemRenderer.as      |   1 -
 .../itemRenderers/TabBarButtonItemRenderer.as      |  41 +---
 .../jewel/itemRenderers/TableItemRenderer.as       |  29 +++
 .../itemRenderers/ToggleButtonBarItemRenderer.as   |  23 +-
 .../supportClasses/container/DataContainerBase.as  |   2 +-
 .../royale/jewel/supportClasses/list/DataGroup.as  |   2 +-
 .../jewel/supportClasses/table/TBodyContentArea.as |  31 +--
 .../MXRoyale/src/main/resources/defaults.css       |  11 +-
 .../MXRoyale/src/main/royale/MXRoyaleClasses.as    |   4 +
 .../MXRoyale/src/main/royale/mx/controls/Button.as |  43 +++-
 .../MXRoyale/src/main/royale/mx/controls/Label.as  |  43 +++-
 .../AdvancedDataGridHeaderRenderer.as              |  19 --
 .../AdvancedDataGridItemRenderer.as                |  88 +++-----
 .../AdvancedDataGridSelectableItemRendererBead.as  | 140 ++++++++++++
 ...actoryForICollectionViewAdvancedDataGridData.as | 105 +--------
 .../AdvancedDataGridItemRendererInitializer.as     | 117 ++++++++++
 .../mx/controls/beads/AdvancedDataGridView.as      |   8 +-
 .../controls/beads/ListItemRendererInitializer.as  |  85 +++++++
 .../controls/beads/TreeItemRendererInitializer.as  |  86 +++++++
 .../AdvancedDataGridVirtualListVerticalLayout.as   |   6 +-
 .../mx/controls/listClasses/AdvancedListBase.as    |  23 +-
 ...ataItemRendererFactoryForICollectionViewData.as |  88 ++++----
 .../DataItemRendererFactoryForIListData.as         |  76 ++++---
 .../listClasses/IDropInListItemRenderer.as         |  23 +-
 .../mx/controls/listClasses/IListItemRenderer.as   |   2 +-
 .../mx/controls/listClasses/ListItemRenderer.as    | 137 ++----------
 ...ataItemRendererFactoryForICollectionViewData.as |  42 +---
 .../VirtualDataItemRendererFactoryForIListData.as  |  57 ++---
 ...rerFactoryForICollectionViewHierarchicalData.as |  86 ++-----
 .../mx/controls/treeClasses/TreeItemRenderer.as    | 171 +-------------
 .../src/main/royale/mx/core/IDataRenderer.as       |  22 +-
 .../src/main/royale/mx/core/UIComponent.as         |  18 ++
 .../src/main/resources/defaults.css                |   7 +
 .../src/main/royale/MDLClasses.as                  |   1 +
 .../DynamicTabsAddItemRendererForArrayListData.as  |  37 ----
 .../TabsDataItemRendererFactoryForArrayListData.as |  72 +-----
 .../beads/TabsItemRendererFactoryForArrayData.as   |   8 +-
 .../mdl/beads/TabsItemRendererInitializer.as       | 120 ++++++++++
 .../itemRenderers/FooterLinkItemMouseRenderer.as   |   5 -
 .../royale/mdl/itemRenderers/MenuItemRenderer.as   |   5 -
 .../NavigationLinkItemMouseRenderer.as             |   5 -
 .../mdl/itemRenderers/TableRowItemRenderer.as      |   2 +-
 .../TableRowItemSingleSelectionMouseRenderer.as    |  32 ++-
 .../royale/mdl/supportClasses/ITabItemRenderer.as  |   5 +-
 .../SparkRoyale/src/main/resources/defaults.css    |  12 +-
 .../main/royale/spark/components/DataRenderer.as   |  29 ++-
 .../royale/spark/components/beads/TabBarView.as    |  21 +-
 .../components/supportClasses/ItemRenderer.as      |  18 +-
 .../supportClasses/SparkTextButtonItemRenderer.as  |  12 +-
 206 files changed, 4080 insertions(+), 4692 deletions(-)

diff --cc 
frameworks/projects/Basic/src/main/royale/org/apache/royale/core/StyledMXMLItemRenderer.as
index fd63ad2,7b38413..b1cf951
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/core/StyledMXMLItemRenderer.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/core/StyledMXMLItemRenderer.as
@@@ -18,7 -18,9 +18,9 @@@
  
////////////////////////////////////////////////////////////////////////////////
  package org.apache.royale.core
  {
 +    import org.apache.royale.html.supportClasses.MXMLStatesItemRenderer;
+     import org.apache.royale.core.IItemRendererOwnerView;
+     import org.apache.royale.core.IOwnerViewItemRenderer;
 -    import org.apache.royale.html.supportClasses.MXMLItemRenderer;
      import org.apache.royale.utils.ClassSelectorList;
      import org.apache.royale.utils.IClassSelectorListSupport;
      import org.apache.royale.utils.IEmphasis;
@@@ -32,7 -34,7 +34,7 @@@
         *  @playerversion AIR 2.6
         *  @productversion Royale 0.9.3
         */
-       public class StyledMXMLItemRenderer extends MXMLStatesItemRenderer 
implements IClassSelectorListSupport, IRuntimeSelectableItemRenderer, IEmphasis
 -      public class StyledMXMLItemRenderer extends MXMLItemRenderer implements 
IClassSelectorListSupport, IEmphasis, IOwnerViewItemRenderer
++      public class StyledMXMLItemRenderer extends MXMLStatesItemRenderer 
implements IClassSelectorListSupport, IEmphasis, IOwnerViewItemRenderer
        {
                /**
                 *  constructor.
@@@ -233,9 -205,9 +205,9 @@@
                {
                        super.addedToParent();
                        
-                       if (itemRendererParent && itemRendererParent.host is 
IEmphasis && (itemRendererParent.host as IEmphasis).emphasis)
 -                      if (itemRendererOwnerView.host is IEmphasis && 
(itemRendererOwnerView.host as IEmphasis).emphasis)
++                      if (itemRendererOwnerView && itemRendererOwnerView.host 
is IEmphasis && (itemRendererOwnerView.host as IEmphasis).emphasis)
                        {
-                               emphasis = (itemRendererParent.host as 
IEmphasis).emphasis;
+                               emphasis = (itemRendererOwnerView.host as 
IEmphasis).emphasis;
                        } else
                        {
                                emphasis = "primary";
diff --cc 
frameworks/projects/Basic/src/main/royale/org/apache/royale/html/accessories/ToolTipRemovalWhenItemRemoved.as
index a72b82d,5108897..3ef69d6
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/accessories/ToolTipRemovalWhenItemRemoved.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/accessories/ToolTipRemovalWhenItemRemoved.as
@@@ -16,20 -16,20 +16,21 @@@
  //  limitations under the License.
  //
  
////////////////////////////////////////////////////////////////////////////////
 -package org.apache.royale.reflection.beads
 +package org.apache.royale.html.accessories
  {
 +      import org.apache.royale.core.IBead;
 +      import org.apache.royale.core.IBeadView;
-       import org.apache.royale.core.IItemRenderer;
++      import org.apache.royale.core.IOwnerViewItemRenderer;
++      import org.apache.royale.core.IItemRendererOwnerView;
 +      import org.apache.royale.core.IToolTipBead;
 +      import org.apache.royale.core.IStrand;
 +      import org.apache.royale.events.IEventDispatcher;
 +      import org.apache.royale.events.ItemRemovedEvent;
  
 -    import org.apache.royale.reflection.TypeDefinition;
 -    import org.apache.royale.core.IBead;
 -    import org.apache.royale.core.IStrand;
 -    
      /**
 -     *  An easy way to configure Royale Reflection classes to use caching.
 -     *  This can increase memory use, but will provide faster performance for 
any
 -     *  application that uses reflection in a central role.
 -     *  This bead should be used at the Application level, before any 
reflection support
 -     *  is needed.
 -     * 
 +     *  The ToolTipRemovalWhenItemRemoved class can be used in lists that 
have 
 +     *  item tenderers that have tooltips.
 +     *  
       *  @langversion 3.0
       *  @playerversion Flash 10.2
       *  @playerversion AIR 2.6
@@@ -57,24 -56,13 +58,24 @@@
           *  @langversion 3.0
           *  @playerversion Flash 10.2
           *  @playerversion AIR 2.6
 -         *  @productversion Royale 0.0
 +         *  @productversion Royale 0.9.7
           */
 -        public function set strand(value:IStrand):void
 +              public function set strand(value:IStrand):void
 +              {
-             var eventDispatcher:IEventDispatcher = ((value as 
IItemRenderer).itemRendererParent as IBeadView).host as IEventDispatcher;
++            var eventDispatcher:IEventDispatcher = ((value as 
IOwnerViewItemRenderer).itemRendererOwnerView as IBeadView).host as 
IEventDispatcher;
 +            eventDispatcher.addEventListener("itemRemoved", 
handleItemRemoved);
 +              }
 +
 +        protected function handleItemRemoved(event:ItemRemovedEvent):void
          {
 -            TypeDefinition.useCache = true;
 +                _tooltip.removeTip();
          }
 -            
  
 -    }
 +        private var _tooltip:IToolTipBead;
 +        public function set tooltip(value:IToolTipBead):void
 +            {
 +                    _tooltip = value;
 +            }
 +              
 +      }
  }
diff --cc frameworks/projects/Core/src/main/royale/CoreClasses.as
index 4acda47,7a7d3a1..786a010
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@@ -261,8 -266,9 +268,9 @@@ internal class CoreClasse
      
      import org.apache.royale.core.IDataGridModel; IDataGridModel;
      import org.apache.royale.core.IDataGridPresentationModel; 
IDataGridPresentationModel;
 -    import org.apache.royale.core.IDateChooserModel; IDateChooserModel;
 +    import org.apache.royale.core.IDateChooserModelWithChangeCheck; 
IDateChooserModelWithChangeCheck;
        import org.apache.royale.core.ParentDocumentBead; ParentDocumentBead;
+     import org.apache.royale.core.ItemRendererOwnerViewBead; 
ItemRendererOwnerViewBead;
        import org.apache.royale.core.TransformBeadBase; TransformBeadBase;
        import org.apache.royale.core.TransformModel; TransformModel;
        import org.apache.royale.core.TransformCompoundModel; 
TransformCompoundModel;
diff --cc 
frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/VirtualDataItemRendererFactoryForCollectionView.as
index d5b6532,0000000..6d3a89b
mode 100644,000000..100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/VirtualDataItemRendererFactoryForCollectionView.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/itemRenderers/VirtualDataItemRendererFactoryForCollectionView.as
@@@ -1,253 -1,0 +1,132 @@@
 
+////////////////////////////////////////////////////////////////////////////////
 +//
 +//  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.jewel.beads.itemRenderers
 +{
 +      import org.apache.royale.collections.ArrayList;
 +      import org.apache.royale.collections.ICollectionView;
 +      import org.apache.royale.core.IBead;
 +      import org.apache.royale.core.IDataProviderModel;
 +      import org.apache.royale.core.IDataProviderVirtualItemRendererMapper;
 +      import org.apache.royale.core.IItemRendererClassFactory;
-       import org.apache.royale.core.IItemRendererParent;
++      import org.apache.royale.core.IIndexedItemRenderer;
 +      import org.apache.royale.core.ISelectableItemRenderer;
 +      import org.apache.royale.core.ISelectionModel;
 +      import org.apache.royale.core.IStrand;
 +      import org.apache.royale.core.IStrandWithModelView;
 +      import org.apache.royale.core.UIBase;
 +      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.beads.IListView;
++      import org.apache.royale.html.beads.VirtualDataItemRendererFactoryBase;
 +      import org.apache.royale.html.supportClasses.DataItemRenderer;
 +      import 
org.apache.royale.jewel.supportClasses.list.IListPresentationModel;
 +      import org.apache.royale.utils.loadBeadFromValuesManager;
 +      import org.apache.royale.utils.sendStrandEvent;
 +
 +    
[Event(name="itemRendererCreated",type="org.apache.royale.events.ItemRendererEvent")]
 +      
 +    /**
 +     *  The DataItemRendererFactoryForArrayData class reads an
 +     *  array of data 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.9.7
 +     */
-       public class VirtualDataItemRendererFactoryForCollectionView extends 
EventDispatcher implements IBead, IDataProviderVirtualItemRendererMapper
++      public class VirtualDataItemRendererFactoryForCollectionView extends 
VirtualDataItemRendererFactoryBase
 +      {
 +        /**
 +         *  Constructor.
 +         *  
 +         *  @langversion 3.0
 +         *  @playerversion Flash 10.2
 +         *  @playerversion AIR 2.6
 +         *  @productversion Royale 0.9.7
 +         */
 +              public function 
VirtualDataItemRendererFactoryForCollectionView(target:Object=null)
 +              {
 +                      super(target);
 +              }
 +
-               protected var dataProviderModel:IDataProviderModel;
-               protected var dataFieldProvider:DataFieldProviderBead;
-               
-               protected var labelField:String;
-         protected var dataField:String;
- 
-               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.9.7
-          */
-               public function set strand(value:IStrand):void
-               {
-                       _strand = value;
-                       
IEventDispatcher(value).addEventListener("initComplete", initComplete);
-               }
-               
-               /**
-                * @private
-                */
-               private function initComplete(event:Event):void
-               {
-             IEventDispatcher(_strand).removeEventListener("initComplete", 
initComplete);
- 
-             var view:IListView = (_strand as IStrandWithModelView).view as 
IListView;
-                       dataGroup = view.dataGroup;
- 
-                       dataProviderModel = 
_strand.getBeadByType(IDataProviderModel) as IDataProviderModel;
-                       
dataProviderModel.addEventListener("dataProviderChanged", 
dataProviderChangeHandler);
-                       labelField = dataProviderModel.labelField;
- 
-             dataFieldProvider = _strand.getBeadByType(DataFieldProviderBead) 
as DataFieldProviderBead;
-                       if (dataFieldProvider)
-             {
-                 dataField = dataFieldProvider.dataField;
-             }
- 
-                       // if the host component inherits from 
DataContainerBase, the itemRendererClassFactory will 
-                       // already have been loaded by 
DataContainerBase.addedToParent function.
-                       if(!_itemRendererFactory)
-                       _itemRendererFactory = 
loadBeadFromValuesManager(IItemRendererClassFactory, 
"iItemRendererClassFactory", _strand) as IItemRendererClassFactory;             
            
-                       
-                       dataProviderChangeHandler(null);
-               }
-               
-               private var _itemRendererFactory:IItemRendererClassFactory;
-               
-         /**
-          *  The org.apache.royale.core.IItemRendererClassFactory used 
-          *  to generate instances of item renderers.
-          *  
-          *  @langversion 3.0
-          *  @playerversion Flash 10.2
-          *  @playerversion AIR 2.6
-          *  @productversion Royale 0.9.7
-          */
-               public function get 
itemRendererFactory():IItemRendererClassFactory
-               {
-                       if(!_itemRendererFactory)
-                       _itemRendererFactory = 
loadBeadFromValuesManager(IItemRendererClassFactory, 
"iItemRendererClassFactory", _strand) as IItemRendererClassFactory;
-                       
-                       return _itemRendererFactory;
-               }
-               
-         /**
-          *  @private
-          */
-               public function set 
itemRendererFactory(value:IItemRendererClassFactory):void
-               {
-                       _itemRendererFactory = value;
-               }
- 
-         /**
-                *  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.9.7
-                */
-               protected var dataGroup:IItemRendererParent;
++              private var dp:ArrayList;
 +              
 +        /**
-          *  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.9.7
 +         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
 +         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
 +         */           
-               protected function dataProviderChangeHandler(event:Event):void
++              override protected function 
dataProviderChangeHandler(event:Event):void
 +              {
 +            if (!dataProviderModel)
 +                              return;
-                       var dp:ICollectionView = dataProviderModel.dataProvider 
as ICollectionView;
++            dp = dataProviderModel.dataProvider as ArrayList;
 +                      if (!dp)
 +                              return;
 +                      
-                       dataGroup.removeAllItemRenderers();
++                      super.dataProviderChangeHandler(event);
 +
 +            sendStrandEvent(_strand, "layoutNeeded");
 +        }
 +        
 +        /**
-          *  Free an item renderer for a given index.
-          *
-          *  @langversion 3.0
-          *  @playerversion Flash 10.2
-          *  @playerversion AIR 2.6
-          *  @productversion Royale 0.9.7
-          *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
-          *  @royaleignorecoercion org.apache.royale.html.beads.IListView
-          */
-         public function freeItemRendererForIndex(index:int):void
-         {
-             dataGroup.removeItemRenderer(rendererMap[index]);
-             delete rendererMap[index];
-         }
-         
-         protected var rendererMap:Object = {};
-         
-         /**
 +         *  Get an item renderer for a given index.
 +         *
 +         *  @langversion 3.0
 +         *  @playerversion Flash 10.2
 +         *  @playerversion AIR 2.6
 +         *  @productversion Royale 0.9.7
 +         *  @royaleignorecoercion org.apache.royale.core.IStrandWithModelView
 +         *  @royaleignorecoercion org.apache.royale.html.beads.IListView
 +         */
-         public function getItemRendererForIndex(index:int, 
elementIndex:int):ISelectableItemRenderer
++        override public function getItemRendererForIndex(index:int, 
elementIndex:int):IIndexedItemRenderer
 +        {
-             var ir:ISelectableItemRenderer = rendererMap[index];
++            var ir:IIndexedItemRenderer = rendererMap[index];
 +            if (ir) return ir;
 +            
-             var dp:ArrayList = dataProviderModel.dataProvider as ArrayList;
-             
-                       ir = itemRendererFactory.createItemRenderer(dataGroup) 
as ISelectableItemRenderer;
-             var dataItemRenderer:DataItemRenderer = ir as DataItemRenderer;
- 
-             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) {
-                               UIBase(ir).height = presentationModel.rowHeight;
-                               
-                               if(ir is IAlignItemRenderer)
-                               {
-                                       (ir as IAlignItemRenderer).align = 
presentationModel.align;
-                               }
-                       }
-                       ir.data = dp.getItemAt(index);
-             
++                      ir = super.getItemRendererForIndex(index, elementIndex);
++                                  
 +            // if the item was already selected make the item show it
 +            if(index == (dataProviderModel as ISelectionModel).selectedIndex)
 +            {
-                 ir.selected = true;
++                  var selectionBead:ISelectableItemRenderer;
++                selectionBead = ir.getBeadByType(ISelectableItemRenderer) as 
ISelectableItemRenderer;
++                if (selectionBead)
++                    selectionBead.selected = false;
 +            }
 +                              
-                       var itemCreatedEvent:ItemRendererEvent = new 
ItemRendererEvent(ItemRendererEvent.CREATED);
-                       itemCreatedEvent.itemRenderer = ir;
-                       sendStrandEvent(_strand, itemCreatedEvent);
 +            return ir;
 +              }
++              
++              override public function getItemAt(index:int):Object
++        {
++            return dp.getItemAt(index);
++        }
++
 +      }
 +}
diff --cc 
frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/layouts/VirtualListVerticalLayout.as
index a22ca7a,0000000..aba0652
mode 100644,000000..100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/layouts/VirtualListVerticalLayout.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/layouts/VirtualListVerticalLayout.as
@@@ -1,463 -1,0 +1,463 @@@
 
+////////////////////////////////////////////////////////////////////////////////
 +//
 +//  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.jewel.beads.layouts
 +{
 +    COMPILE::SWF {
 +    import org.apache.royale.core.IBorderPaddingMarginValuesImpl;
 +    import org.apache.royale.core.ILayoutChild;
 +    import org.apache.royale.core.IScrollingViewport;
 +    import org.apache.royale.core.ISelectionModel;
 +    import org.apache.royale.core.IUIBase;
 +    import org.apache.royale.core.ValuesManager;
 +    import org.apache.royale.core.layout.EdgeData;
 +    import org.apache.royale.geom.Size;
 +    import org.apache.royale.html.beads.VirtualDataContainerView;
 +    }
 +      import org.apache.royale.collections.ICollectionView;
 +      import org.apache.royale.core.IBeadLayout;
 +      import org.apache.royale.core.IDataProviderModel;
 +      import org.apache.royale.core.IDataProviderVirtualItemRendererMapper;
 +      import org.apache.royale.core.ILayoutView;
-       import org.apache.royale.core.ISelectableItemRenderer;
++      import org.apache.royale.core.IIndexedItemRenderer;
 +      import org.apache.royale.core.IStrand;
 +      import org.apache.royale.core.IStrandWithPresentationModel;
 +      import org.apache.royale.events.Event;
 +      import 
org.apache.royale.jewel.supportClasses.list.IListPresentationModel;
 +        
 +      /**
 +       *  The VirtualListVerticalLayout class is used for Jewel List that 
wants to use VirtualListView
 +     *  and Virtual ItemRenders.
 +       *
 +       *  @langversion 3.0
 +       *  @playerversion Flash 10.2
 +       *  @playerversion AIR 2.6
 +       *  @productversion Royale 0.9.7
 +       */
 +      public class VirtualListVerticalLayout extends StyledLayoutBase 
implements IBeadLayout
 +      {
 +              /**
 +               *  Constructor.
 +               *
 +               *  @langversion 3.0
 +               *  @playerversion Flash 10.2
 +               *  @playerversion AIR 2.6
 +               *  @productversion Royale 0.9.7
 +         *  @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);
 +            }
 +        }
 +
 +        // override public function set strand(value:IStrand):void
 +        // {
 +        //     super.strand = value;
 +        //     // dataProviderModel = host.getBeadByType(IDataProviderModel) 
as IDataProviderModel;
 +        //     listModel = value.getBeadByType(ISelectionModel) as 
ISelectionModel;
 +
 +        //     //if the list is composed as part of another component, with a 
shared model (e.g. ComboBox) then it should not be the primary dispatcher
 +              //      if (listModel is IJewelSelectionModel && 
!(IJewelSelectionModel(listModel).hasDispatcher)) {
 +        //          IJewelSelectionModel(listModel).dispatcher = 
IEventDispatcher(value);
 +              //      }
 +        //     else {
 +              //              
IEventDispatcher(listModel).addEventListener('rollOverIndexChanged', 
modelChangeHandler);
 +              //              
IEventDispatcher(listModel).addEventListener('selectionChanged', 
modelChangeHandler);
 +        //         
IEventDispatcher(listModel).addEventListener('dataProviderChanged', 
modelChangeHandler);
 +        //     }
 +        //     COMPILE::JS
 +        //     {
 +        //         host.element.addEventListener("scroll", scrollHandler);
 +        //     }
 +        // }
 +        // protected function modelChangeHandler(event:Event):void{
 +        //     IEventDispatcher(_strand).dispatchEvent(new Event(event.type));
 +        // }
 +        
 +        COMPILE::JS
 +        protected var topSpacer:HTMLDivElement;
 +        
 +        COMPILE::JS
 +        protected var bottomSpacer:HTMLDivElement;
 +        
 +        protected var visibleIndexes:Array = [];
 +        
 +        protected 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.9.7
 +               *  @royaleignorecoercion Array
 +               *  @royaleignorecoercion org.apache.royale.core.ILayoutHost
 +               *  @royaleignorecoercion 
org.apache.royale.core.WrappedHTMLElement
 +               *  @royaleignorecoercion 
org.apache.royale.jewel.supportClasses.list.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:ICollectionView = dataProviderModel.dataProvider as 
ICollectionView;
 +                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++)
 +                {
 +                    if (i >= dp.length) continue; // no more renderers needed
 +                    
-                     var ir:ISelectableItemRenderer;
++                    var ir:IIndexedItemRenderer;
 +                    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:ICollectionView = dataProviderModel.dataProvider as 
ICollectionView;
 +                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.height;
 +                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) + 1;
 +                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";
 +                // trace("starting layout: startIndex = " + startIndex + " 
endIndex = " + endIndex);
 +                if (visibleIndexes.length)
 +                {
 +                    // trace("visibleIndexes: " + visibleIndexes);
 +                    if (startIndex < visibleIndexes[0])
 +                    {
 +                        // trace("startIndex < visibleIndex[0]");
 +                        // see if we can re-use any renderers
 +                        freeIndex = visibleIndexes.pop();
 +                        // trace("freeIndex: " + freeIndex);
 +                        while (freeIndex > endIndex)
 +                        {
 +                            // trace("free: " + freeIndex);
 +                            factory.freeItemRendererForIndex(freeIndex);
 +                            if (visibleIndexes.length == 0)
 +                                break;
 +                            freeIndex = visibleIndexes.pop();
 +                        }
 +                        // we popped it off at the end of loop but if we 
didn't
 +                        // use it, then push it back on
 +                        if (freeIndex == endIndex)
 +                            visibleIndexes.push(freeIndex);
 +                        if (visibleIndexes.length)
 +                        {
 +                            endIndex = visibleIndexes[visibleIndexes.length - 
1];
 +                            // trace("changing endIndex: " + endIndex);
 +                        }
 +                    }
 +                    else if (startIndex > visibleIndexes[0])
 +                    {
 +                        // trace("startIndex > visibleIndex[0]");
 +                        // see if we can re-use any renderers
 +                        freeIndex = visibleIndexes.shift();
 +                        // trace("freeIndex: " + freeIndex);
 +                        while (freeIndex < startIndex)
 +                        {
 +                            // trace("free: " + freeIndex);
 +                            factory.freeItemRendererForIndex(freeIndex);
 +                            if (visibleIndexes.length == 0)
 +                                break;
 +                            freeIndex = visibleIndexes.shift();
 +                        }
 +                    }
 +                    else
 +                    {
 +                        // trace("startIndex == visibleIndex[0]");
 +                        // see if rows got added or removed because height 
changed
 +                        lastIndex = visibleIndexes[visibleIndexes.length - 1];
 +                        // trace("lastIndex: " + lastIndex);
 +                        if (lastIndex > endIndex)
 +                        {
 +                            // see if we can re-use any renderers
 +                            freeIndex = visibleIndexes.pop();
 +                            // trace("freeIndex: " + freeIndex);
 +                            while (freeIndex > endIndex)
 +                            {
 +                                // trace("free: " + freeIndex);
 +                                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];
 +                    // trace("done freeing: firstIndex = " + firstIndex + " 
lastIndex = " + lastIndex);
 +                }
 +                else
 +                {
 +                    firstIndex = dp.length;
 +                    lastIndex = 0;
 +                    // trace("no freeing: firstIndex = " + firstIndex + " 
lastIndex = " + lastIndex);
 +                }
 +                for (var i:int = startIndex; i < endIndex; i++)
 +                {
 +                    if (i >= dp.length) continue; // no more renderers needed
 +                    
-                     var ir:ISelectableItemRenderer;
++                    var ir:IIndexedItemRenderer;
 +                    if (i < firstIndex)
 +                    {
 +                    //    trace("i < firstIndex: creating: i = " + i);
 +                       ir  = factory.getItemRendererForIndex(i, i - 
startIndex + 1);
 +                       visibleIndexes.push(i);
 +                    }
 +                    else if (i > lastIndex)
 +                    {
 +                        // trace("i > lastIndex: creating: i = " + i);
 +                        ir  = factory.getItemRendererForIndex(i, i - 
startIndex + 1);
 +                        visibleIndexes.push(i);
 +                    }
 +                }
 +                visibleIndexes = visibleIndexes.sort(numberSort);
 +                // trace("visibleIndexes: " + visibleIndexes);
 +                if (!bottomSpacer)
 +                {
 +                    bottomSpacer = document.createElement("div") as 
HTMLDivElement;
 +                    contentView.element.appendChild(bottomSpacer);
 +                }
 +                else
 +                {
 +                    // ensure bottom spacer is at the bottom!
 +                    contentView.element.removeChild(bottomSpacer);            
        
 +                    contentView.element.appendChild(bottomSpacer);            
        
 +                }
 +                
 +                var numBottomRows:int = dp.length - endIndex;
 +                bottomSpacer.style.height = (numBottomRows > 0) ? 
(numBottomRows * presentationModel.rowHeight).toString() + "px" : "0px";  
 +                // trace("ENDING LAYOUT: bottom spacer = " + 
bottomSpacer.style.height);
 +                inLayout = false;
 +                              return true;
 +                      }
 +              }
 +        
 +        public function numberSort(a:int, b:int):int
 +        {
 +            return a - b;
 +        }
 +
 +        COMPILE::SWF
-         protected function 
sizeAndPositionRenderer(ir:ISelectableItemRenderer, xpos:Number, ypos:Number, 
hostWidth:Number, hostHeight:Number):void
++        protected function sizeAndPositionRenderer(ir:IIndexedItemRenderer, 
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;
 +        }
 +      }
 +}
diff --cc 
frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
index d8ad7e8,4cc2122..cb781f8
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/ListView.as
@@@ -18,9 -18,14 +18,10 @@@
  
////////////////////////////////////////////////////////////////////////////////
  package org.apache.royale.jewel.beads.views
  {
-       import org.apache.royale.core.IItemRendererParent;
 -      COMPILE::JS
 -      {
 -      import org.apache.royale.events.IEventDispatcher;
 -      }
 -      import org.apache.royale.core.IItemRenderer;
+       import org.apache.royale.core.IItemRendererOwnerView;
        import org.apache.royale.core.ILayoutView;
        import org.apache.royale.core.IRollOverModel;
++      import org.apache.royale.core.IItemRenderer;
        import org.apache.royale.core.ISelectableItemRenderer;
        import org.apache.royale.core.ISelectionModel;
        import org.apache.royale.core.IStrand;
diff --cc 
frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
index 26737a1,0000000..a65bcb4
mode 100644,000000..100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/views/VirtualListView.as
@@@ -1,137 -1,0 +1,154 @@@
 
+////////////////////////////////////////////////////////////////////////////////
 +//
 +//  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.jewel.beads.views
 +{
 +      import org.apache.royale.core.IItemRenderer;
 +      import org.apache.royale.core.IRollOverModel;
++      import org.apache.royale.core.IIndexedItemRenderer;
 +      import org.apache.royale.core.ISelectableItemRenderer;
 +      import org.apache.royale.core.ISelectionModel;
 +      import org.apache.royale.events.Event;
 +      import org.apache.royale.html.beads.VirtualDataContainerView;
 +        
 +      /**
 +       *  The VirtualListView class creates the visual elements of the 
org.apache.royale.jewel.List
 +       *  component in a way that can be recicled to reuse as the user 
scrolls the list getting performance improvements
 +       *  when dataproviders with lots of items are passed to the component. 
In This way Royale just create a few 
 +       *  item renderers visible for the user, instead of one renderer for 
each item in the data provider. 
 +       *   
 +       *  A List consists of the area to display the data (in the dataGroup), 
any
 +       *  scrollbars, and so forth.
 +       *
 +       *  @viewbead
 +       *  @langversion 3.0
 +       *  @playerversion Flash 10.2
 +       *  @playerversion AIR 2.6
 +       *  @productversion Royale 0.9.7
 +       */
 +      public class VirtualListView extends VirtualDataContainerView
 +      {
 +              public function VirtualListView()
 +              {
 +                      super();
 +              }
 +
 +              protected var listModel:ISelectionModel;
 +
 +              protected var lastSelectedIndex:int = -1;
 +
 +              /**
 +               * @private
 +               * @royaleignorecoercion org.apache.royale.core.ISelectionModel
 +               */
 +              override protected function handleInitComplete(event:Event):void
 +              {
 +                      listModel = _strand.getBeadByType(ISelectionModel) as 
ISelectionModel;
 +                      listModel.addEventListener("selectionChanged", 
selectionChangeHandler);
 +                      listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
 +                      // listenOnStrand("itemsCreated", itemsCreatedHandler);
 +
 +                      super.handleInitComplete(event);
 +              }
 +
 +              /**
 +               * @private
 +               * Ensure the list selects the selectedItem if some is set by 
the user at creation time
 +               */
 +              // override protected function 
itemsCreatedHandler(event:Event):void
 +              // {
 +        //     super.itemsCreatedHandler(event);
 +              //      if(listModel.selectedIndex != -1)
 +              //              selectionChangeHandler(null);
 +              // }
 +
 +        protected var firstElementIndex:int = 1;
 +              /**
 +               * Retrieve the renderer for a given index
 +               */
 +        override public function 
getItemRendererForIndex(index:int):IItemRenderer
 +        {
 +            if (contentView.numElements == 0)
 +                return null;
 +            
-             var firstIndex:int = (contentView.getElementAt(firstElementIndex) 
as ISelectableItemRenderer).index;
++            var firstIndex:int = (contentView.getElementAt(firstElementIndex) 
as IIndexedItemRenderer).index;
 +            
 +            if (index < firstIndex) 
 +                return null;
 +            if (index >= (firstIndex + contentView.numElements))
 +                return null;
 +            
 +            return contentView.getElementAt(index - firstIndex + 
firstElementIndex) as IItemRenderer;            
 +        }
 +        
 +              /**
 +               * @private
-                * @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
++               * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
 +               */
 +              protected function selectionChangeHandler(event:Event):void
 +              {
-                       var ir:ISelectableItemRenderer = 
dataGroup.getItemRendererForIndex(lastSelectedIndex) as ISelectableItemRenderer;
-                       if(ir)
-                               ir.selected = false;
-                       ir = 
dataGroup.getItemRendererForIndex(listModel.selectedIndex) as 
ISelectableItemRenderer;
-                       if(ir)
-                               ir.selected = true;
- 
++            var selectionBead:ISelectableItemRenderer;
++            var ir:IItemRenderer = 
dataGroup.getItemRendererForIndex(lastSelectedIndex) as IItemRenderer;
++            if (ir) 
++            {
++                selectionBead = ir.getBeadByType(ISelectableItemRenderer) as 
ISelectableItemRenderer;
++                if (selectionBead)
++                    selectionBead.selected = false;
++            }
++            ir = dataGroup.getItemRendererForIndex(listModel.selectedIndex) 
as IItemRenderer;
++            if (ir) {
++                selectionBead = ir.getBeadByType(ISelectableItemRenderer) as 
ISelectableItemRenderer;
++                if (selectionBead)
++                    selectionBead.selected = true;
++            }
++                              
 +                      lastSelectedIndex = listModel.selectedIndex;
 +              }
 +
 +              protected var lastRollOverIndex:int = -1;
 +
 +              /**
 +               * @private
-                * @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
++               * @royaleignorecoercion 
org.apache.royale.core.IIndexedItemRenderer
 +               * * @royaleignorecoercion org.apache.royale.core.IRollOverModel
 +               */
 +              protected function rollOverIndexChangeHandler(event:Event):void
 +              {
-                       var ir:ISelectableItemRenderer = 
dataGroup.getItemRendererForIndex(lastRollOverIndex) as ISelectableItemRenderer;
-                       if(ir)
-                               ir.hovered = false;
-                       ir = dataGroup.getItemRendererForIndex((listModel as 
IRollOverModel).rollOverIndex) as ISelectableItemRenderer;
-                       if(ir)
-                               ir.hovered = true;
++            var selectionBead:ISelectableItemRenderer;
++            var ir:IIndexedItemRenderer = 
dataGroup.getItemRendererForIndex(lastRollOverIndex) as IIndexedItemRenderer;
++            if (ir) 
++            {
++                selectionBead = ir.getBeadByType(ISelectableItemRenderer) as 
ISelectableItemRenderer;
++                if (selectionBead)
++                    selectionBead.hovered = false;
++            }
++            ir = dataGroup.getItemRendererForIndex((listModel as 
IRollOverModel).rollOverIndex) as IIndexedItemRenderer;
++            if (ir) {
++                selectionBead = ir.getBeadByType(ISelectableItemRenderer) as 
ISelectableItemRenderer;
++                if (selectionBead)
++                    selectionBead.hovered = true;
++            }
 +                      lastRollOverIndex = (listModel as 
IRollOverModel).rollOverIndex;
 +              }
 +
 +              override protected function 
dataProviderChangeHandler(event:Event):void
 +              {
 +
 +              }
 +      }
 +}

Reply via email to