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 + { + + } + } +}
