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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 29d667a  Multi SelectionList is added in mx emulation
29d667a is described below

commit 29d667a826c9a5e69c46f06b552198ccaa2abe53
Author: alinakazi <alinakazi1...@gmail.com>
AuthorDate: Fri Mar 12 22:39:17 2021 +0500

    Multi SelectionList is added in mx emulation
---
 .../main/royale/mx/controls/MultiSelectionList.as  | 159 ++++++++++++++
 .../MultiSelectionItemRendererClassFactory.as      |  65 ++++++
 .../mx/controls/beads/MultiSelectionListView.as    | 211 +++++++++++++++++++
 .../ListMultiSelectionMouseController.as           | 230 ++++++++++++++++++++
 .../beads/models/ArrayMultiSelectionModel.as       | 232 +++++++++++++++++++++
 5 files changed, 897 insertions(+)

diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as
new file mode 100644
index 0000000..a03001a
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/MultiSelectionList.as
@@ -0,0 +1,159 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package mx.controls
+{
+       import org.apache.royale.core.IRollOverModel;
+       import org.apache.royale.core.IMultiSelectionModel;
+       import mx.controls.listClasses.ListBase;
+       import org.apache.royale.core.IListPresentationModel;
+               import org.apache.royale.core.IDataProviderModel;
+import org.apache.royale.html.DataContainer;
+       COMPILE::JS
+       {
+               import org.apache.royale.core.WrappedHTMLElement;
+       }
+
+       /**
+        *  Indicates that the initialization of the list is complete.
+        *
+        *  @toplevel
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.7
+        */
+       [Event(name="initComplete", type="org.apache.royale.events.Event")]
+
+       /**
+        * The change event is dispatched whenever the list's selection changes.
+        *
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.7
+        */
+       [Event(name="change", type="org.apache.royale.events.Event")]
+
+       /**
+        *  The MultiSelectionList class is a component that displays multiple 
data items. The MultiSelectionList uses
+        *  the following bead types:
+        *
+        *  org.apache.royale.core.IBeadModel: the data model, which includes 
the dataProvider, selectedItems, and
+        *  so forth.
+        *  org.apache.royale.core.IBeadView:  the bead that constructs the 
visual parts of the list.
+        *  org.apache.royale.core.IBeadController: the bead that handles input 
and output.
+        *  org.apache.royale.core.IBeadLayout: the bead responsible for the 
size and position of the itemRenderers.
+        *  org.apache.royale.core.IDataProviderItemRendererMapper: the bead 
responsible for creating the itemRenders.
+        *  org.apache.royale.core.IItemRenderer: the class or factory used to 
display an item in the list.
+        *
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.7
+        */
+       public class MultiSelectionList  extends DataContainer
+       {
+               /**
+                *  constructor.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function MultiSelectionList()
+               {
+                       super();
+                       typeNames += " MultiSelectionList";
+               }
+
+               /**
+                *  The index of the currently selected item. Changing this 
value
+                *  also changes the selectedItems property.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                *  @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                */
+               [Bindable("change")]
+                public function get selectedIndices():Array
+               {
+                       return IMultiSelectionModel(model).selectedIndices;
+               }
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                */
+                public function set selectedIndices(value:Array):void
+               {
+                       IMultiSelectionModel(model).selectedIndices = value;
+               }
+
+               /**
+                *  The index of the item currently below the pointer.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                *  @royaleignorecoercion org.apache.royale.core.IRollOverModel
+                */
+                public function get rollOverIndex():int
+               {
+                       return IRollOverModel(model).rollOverIndex;
+               }
+
+               /**
+                * @royaleignorecoercion org.apache.royale.core.IRollOverModel
+                */
+                public function set rollOverIndex(value:int):void
+               {
+                       IRollOverModel(model).rollOverIndex = value;
+               }
+
+       
+               /**
+                *  The items currently selected. Changing this value also
+                *  changes the selectedIndices property.
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                *  @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                */
+               [Bindable("change")]
+                public function get selectedItems():Array
+               {
+                       return IMultiSelectionModel(model).selectedItems;
+               }
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                */
+                public function set selectedItems(value:Array):void
+               {
+                       IMultiSelectionModel(model).selectedItems = value;
+               }
+               
+       
+       }
+}
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as
new file mode 100644
index 0000000..737d3b4
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionItemRendererClassFactory.as
@@ -0,0 +1,65 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package mx.controls.beads
+{
+       /**
+        *  The MultiSelectionItemRendererClassFactory class extends 
ItemRendererClassFactory to add a multiselection controller to item renderers
+        * 
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.7
+        */
+       import org.apache.royale.core.IBeadController;
+       import org.apache.royale.core.IItemRendererOwnerView;
+       import org.apache.royale.core.IBead;
+       import org.apache.royale.core.ItemRendererClassFactory;
+       import org.apache.royale.core.IItemRenderer;
+       import org.apache.royale.core.IStrand;
+       import 
org.apache.royale.html.beads.controllers.MultiSelectionItemRendererMouseController;
+
+       public class MultiSelectionItemRendererClassFactory extends 
ItemRendererClassFactory
+       {
+               /**
+                *  Constructor.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function MultiSelectionItemRendererClassFactory()
+               {
+                       super();
+               }
+
+               override public function createFromClass():IItemRenderer
+               {
+                       var renderer:IItemRenderer = super.createFromClass();
+                       var strand:IStrand = renderer as IStrand;
+                       var bead:IBead = strand.getBeadByType(IBeadController);
+                       if (bead)
+                       {
+                               strand.removeBead(bead);
+                       }
+                       strand.addBead(new 
MultiSelectionItemRendererMouseController());
+                       return renderer;
+               }
+       }
+}
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as
new file mode 100644
index 0000000..ac31a25
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/MultiSelectionListView.as
@@ -0,0 +1,211 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package mx.controls.beads
+{
+       import org.apache.royale.html.beads.DataContainerView;
+       import org.apache.royale.core.BeadViewBase;
+       import org.apache.royale.core.ContainerBase;
+       import org.apache.royale.core.IBead;
+       import org.apache.royale.core.IBeadLayout;
+       import org.apache.royale.core.IBeadModel;
+       import org.apache.royale.core.IBeadView;
+       import org.apache.royale.core.ISelectableItemRenderer;
+       import org.apache.royale.core.IItemRenderer;
+       import org.apache.royale.core.IItemRendererOwnerView;
+       import org.apache.royale.core.IParent;
+    import org.apache.royale.core.IParentIUIBase;
+       import org.apache.royale.core.IRollOverModel;
+       import org.apache.royale.core.IMultiSelectionModel;
+       import org.apache.royale.core.IStrand;
+    import org.apache.royale.core.IUIBase;
+       import org.apache.royale.core.Strand;
+       import org.apache.royale.core.UIBase;
+       import org.apache.royale.core.ValuesManager;
+       import org.apache.royale.events.Event;
+       import org.apache.royale.events.IEventDispatcher;
+       import org.apache.royale.html.supportClasses.Border;
+       import org.apache.royale.html.supportClasses.DataGroup;
+
+       /**
+        *  The List class creates the visual elements of the 
org.apache.royale.html.List
+        *  component. 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
+        */
+       COMPILE::JS
+       public class MultiSelectionListView extends DataContainerView
+       {
+               public function MultiSelectionListView()
+               {
+                       super();
+               }
+
+               protected var listModel:IMultiSelectionModel;
+
+               protected var lastSelectedIndices:Array = null;
+
+               /**
+                * @private
+                * @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                */
+               override protected function handleInitComplete(event:Event):void
+               {
+                       listModel = _strand.getBeadByType(IMultiSelectionModel) 
as IMultiSelectionModel;
+                       listModel.addEventListener("selectedIndicesChanged", 
selectionChangeHandler);
+                       listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
+                       
+
+                       super.handleInitComplete(event);
+               }
+
+               /**
+                * @private
+                * @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
+                */
+               protected function selectionChangeHandler(event:Event):void
+               {
+                       if (lastSelectedIndices)
+                       {
+                               for (var i:int = 0; i < 
lastSelectedIndices.length; i++)
+                               {
+                                       var ir:ISelectableItemRenderer = 
dataGroup.getItemRendererForIndex(lastSelectedIndices[i]) as 
ISelectableItemRenderer;
+                                       if(ir)
+                                               ir.selected = false;
+                               }
+                       }
+                       if (listModel.selectedIndices)
+                       {
+                               for (i = 0; i < 
listModel.selectedIndices.length; i++)
+                               {
+                                       ir = 
dataGroup.getItemRendererForIndex(listModel.selectedIndices[i]) as 
ISelectableItemRenderer;
+                                       if(ir)
+                                               ir.selected = true;
+                               }
+                       }
+
+                       lastSelectedIndices = listModel.selectedIndices;
+               }
+
+               protected var lastRollOverIndex:int = -1;
+
+               /**
+                * @private
+                * @royaleignorecoercion 
org.apache.royale.core.ISelectableItemRenderer
+                * * @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;
+                       lastRollOverIndex = (listModel as 
IRollOverModel).rollOverIndex;
+               }
+       }
+
+       COMPILE::SWF
+       public class MultiSelectionListView extends DataContainerView
+       {
+               public function MultiSelectionListView()
+               {
+                       super();
+               }
+
+               protected var listModel:IMultiSelectionModel;
+
+               /**
+                *  @copy org.apache.royale.core.IBead#strand
+                *
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               override public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       super.strand = value;
+               }
+
+               /**
+                * @private
+                */
+               override protected function handleInitComplete(event:Event):void
+               {
+                       super.handleInitComplete(event);
+
+                       listModel = _strand.getBeadByType(IMultiSelectionModel) 
as IMultiSelectionModel;
+                       listModel.addEventListener("selectedIndicesChanged", 
selectionChangeHandler);
+                       listModel.addEventListener("rollOverIndexChanged", 
rollOverIndexChangeHandler);
+               }
+
+               protected var lastSelectedIndices:Array = null;
+
+               /**
+                * @private
+                */
+               protected function selectionChangeHandler(event:Event):void
+               {
+
+                       if (lastSelectedIndices)
+                       {
+                               for (var i:int = 0; i < 
lastSelectedIndices.length; i++)
+                               {
+                                       var ir:ISelectableItemRenderer = 
dataGroup.getItemRendererForIndex(lastSelectedIndices[i]) as 
ISelectableItemRenderer;
+                                       if (ir)
+                                               ir.selected = false;
+                               }
+                       }
+                       if (listModel.selectedIndices)
+                       {
+                               for (i = 0; i < listModel.selectedIndices; i++)
+                               {
+                                       ir = 
dataGroup.getItemRendererForIndex(listModel.selectedIndices[i]) as 
ISelectableItemRenderer;
+                                       if (ir)
+                                               ir.selected = true;
+                               }
+                       }
+                       lastSelectedIndices = listModel.selectedIndices;
+               }
+
+               protected var lastRollOverIndex:int = -1;
+
+               /**
+                * @private
+                */
+               protected function rollOverIndexChangeHandler(event:Event):void
+               {
+                       var ir:ISelectableItemRenderer = 
dataGroup.getItemRendererForIndex(lastRollOverIndex) as ISelectableItemRenderer;
+                       if(ir)
+                               ir.hovered = false;
+                       ir = 
dataGroup.getItemRendererForIndex(IRollOverModel(listModel).rollOverIndex) as 
ISelectableItemRenderer;
+                       if(ir)
+                               ir.hovered = true;
+                       
+                       lastRollOverIndex = 
IRollOverModel(listModel).rollOverIndex;
+               }
+       }
+}
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as
new file mode 100644
index 0000000..376f55b
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/controllers/ListMultiSelectionMouseController.as
@@ -0,0 +1,230 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package mx.controls.beads.controllers
+{
+       import org.apache.royale.core.IBeadController;
+       import org.apache.royale.core.IIndexedItemRenderer;
+       import org.apache.royale.core.IItemRendererOwnerView;
+       import org.apache.royale.core.IMultiSelectionModel;
+       import org.apache.royale.core.IRollOverModel;
+       import org.apache.royale.core.ISelectableItemRenderer;
+       import org.apache.royale.core.IStrand;
+       import org.apache.royale.events.Event;
+       import org.apache.royale.events.IEventDispatcher;
+       import org.apache.royale.events.ItemAddedEvent;
+       import org.apache.royale.events.ItemRemovedEvent;
+       import org.apache.royale.events.MultiSelectionItemClickedEvent;
+       import org.apache.royale.html.beads.IListView;
+       import org.apache.royale.utils.getSelectionRenderBead;
+       import org.apache.royale.utils.sendEvent;
+       import org.apache.royale.core.Bead;
+
+       /**
+        *  The ListMultiSelectionMouseController class is a controller for
+        *  org.apache.royale.html.List.  Controllers
+        *  watch for events from the interactive portions of a View and
+        *  update the data model or dispatch a semantic event.
+        *  This controller watches for events from the item renderers
+        *  and updates an IMultiSelectionModel (which supports multi
+        *  selection).   
+        * 
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion Royale 0.9.7
+        */
+       public class ListMultiSelectionMouseController extends Bead implements 
IBeadController
+       {
+               /**
+                *  Constructor.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function ListMultiSelectionMouseController()
+               {
+               }
+
+               /**
+                *  The model.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               protected var listModel:IMultiSelectionModel;
+
+               /**
+                *  The view.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               protected var listView:IListView;
+
+               /**
+                *  The parent of the item renderers.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               protected var dataGroup:IItemRendererOwnerView;
+
+
+               /**
+                *  @copy org.apache.royale.core.IBead#strand
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                *  @royaleignorecoercion 
org.apache.royale.core.IMultiSelectionModel
+                *  @royaleignorecoercion org.apache.royale.html.beads.IListView
+                */
+               override public function set strand(value:IStrand):void
+               {
+                       _strand = value;
+                       listModel = value.getBeadByType(IMultiSelectionModel) 
as IMultiSelectionModel;
+                       listView = value.getBeadByType(IListView) as IListView;
+                       listenOnStrand("itemAdded", handleItemAdded);
+                       listenOnStrand("itemRemoved", handleItemRemoved);
+               }
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
+                */
+               protected function handleItemAdded(event:ItemAddedEvent):void
+               {
+                       
IEventDispatcher(event.item).addEventListener("itemClicked", selectedHandler);
+                       
IEventDispatcher(event.item).addEventListener("itemRollOver", rolloverHandler);
+                       
IEventDispatcher(event.item).addEventListener("itemRollOut", rolloutHandler);
+               }
+
+               /**
+                * @royaleignorecoercion 
org.apache.royale.events.IEventDispatcher
+                */
+               protected function 
handleItemRemoved(event:ItemRemovedEvent):void
+               {
+                       
IEventDispatcher(event.item).removeEventListener("itemClicked", 
selectedHandler);
+                       
IEventDispatcher(event.item).removeEventListener("itemRollOver", 
rolloverHandler);
+                       
IEventDispatcher(event.item).removeEventListener("itemRollOut", rolloutHandler);
+               }
+
+               protected function 
selectedHandler(event:MultiSelectionItemClickedEvent):void
+               {
+                       var selectedIndices:Array = [];
+                       var newIndices:Array;
+                       if (!(event.ctrlKey || event.shiftKey) || 
!listModel.selectedIndices || listModel.selectedIndices.length == 0)
+                       {
+                               newIndices = [event.index];
+                       } else if (event.ctrlKey)
+                       {
+                               // concat is so we have a new instance, 
avoiding code that might presume no change was made according to instance
+                               newIndices = listModel.selectedIndices.concat();
+                               var locationInSelectionList:int = 
newIndices.indexOf(event.index);
+                               if (locationInSelectionList < 0)
+                               {
+                                       newIndices.push(event.index);
+                               } else
+                               {
+                                       
newIndices.removeAt(locationInSelectionList);
+                               }
+                       } else if (event.shiftKey)
+                       {
+                               newIndices = [];
+                               var min:int = getMin(listModel.selectedIndices);
+                               var max:int = getMax(listModel.selectedIndices);
+                               var from:int = Math.min(min, event.index);
+                               var to:int = event.index > min ? event.index : 
min;
+                               while (from <= to)
+                               {
+                                       newIndices.push(from++);
+                               }
+                       }
+                       listModel.selectedIndices = newIndices;
+                       sendEvent(listView.host,"change");
+               }
+
+               private function getMin(value:Array):int
+               {
+                       var result:int = int(value[0]);
+                       for (var i:int = 0; i < value.length; i++)
+                       {
+                               if (value[i] < result)
+                               {
+                                       result = value[i];
+                               }
+                       }
+                       return result;
+               }
+
+               private function getMax(value:Array):int
+               {
+                       var result:int = int(value[0]);
+                       for (var i:int = 0; i < value.length; i++)
+                       {
+                               if (value[i] > result)
+                               {
+                                       result = value[i];
+                               }
+                       }
+                       return result;
+               }
+
+               /**
+                * @royaleemitcoercion 
org.apache.royale.core.IIndexedItemRenderer
+                * @royaleignorecoercion org.apache.royale.core.IRollOverModel
+                */
+               protected function rolloverHandler(event:Event):void
+               {
+                       var renderer:IIndexedItemRenderer = event.currentTarget 
as IIndexedItemRenderer;
+                       if (renderer) {
+                               IRollOverModel(listModel).rollOverIndex = 
renderer.index;
+                       }
+               }
+
+               /**
+                * @royaleemitcoercion 
org.apache.royale.core.IIndexedItemRenderer
+                * @royaleignorecoercion org.apache.royale.core.IRollOverModel
+                */
+               protected function rolloutHandler(event:Event):void
+               {
+                       var renderer:IIndexedItemRenderer = event.currentTarget 
as IIndexedItemRenderer;
+                       if (renderer) {
+                               if (renderer is IStrand)
+                               {
+                                       var 
selectionBead:ISelectableItemRenderer = getSelectionRenderBead(renderer);
+                                       if (selectionBead)
+                                       {
+                                               selectionBead.hovered = false;
+                                               selectionBead.down = false;     
                                        
+                                       }
+                               }
+                               IRollOverModel(listModel).rollOverIndex = -1;
+                       }
+               }
+       }
+}
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as
new file mode 100644
index 0000000..339204d
--- /dev/null
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/beads/models/ArrayMultiSelectionModel.as
@@ -0,0 +1,232 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package mx.controls.beads.models
+{
+       import org.apache.royale.core.IRollOverModel;
+       import org.apache.royale.core.IMultiSelectionModel;
+       import org.apache.royale.core.IStrand;
+       import org.apache.royale.events.Event;
+       import org.apache.royale.events.EventDispatcher;
+       /**
+        *  The ArrayMultiSelectionModel class is a selection model for
+        *  a dataProvider that is an array. It assumes that items
+        *  can be fetched from the dataProvider
+        *  dataProvider[index].  Other selection models
+        *  would support other kinds of data providers.
+        *  
+        *  @langversion 3.0
+        *  @playerversion Flash 10.2
+        *  @playerversion AIR 2.6
+        *  @productversion 0.9.7
+        */
+
+       public class ArrayMultiSelectionModel extends EventDispatcher 
implements IMultiSelectionModel, IRollOverModel
+       {
+               /**
+                *  Constructor.
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function ArrayMultiSelectionModel()
+               {
+               }
+
+               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;
+               }
+               
+               private var _dataProvider:Object;
+        
+               /**
+                *  @copy 
org.apache.royale.core.IMultiSelectionModel#dataProvider
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function get dataProvider():Object
+               {
+                       return _dataProvider;
+               }
+
+               /**
+                *  @private
+                */
+               public function set dataProvider(value:Object):void
+               {
+                       if (value == _dataProvider) return;
+                       _dataProvider = value;
+                       if(_dataProvider && _selectedIndices)
+                       {
+                               var indices:Array = [];
+                               var length:int = (value as Array).length;
+                               for (var i:int = 0; i < 
_selectedIndices.length; i++)
+                               {
+                                       if (_selectedIndices[i] < length)
+                                       {
+                                               
indices.push(value[_selectedIndices[i]]);
+                                       }
+                                       _selectedIndices = indices;
+                                       syncItemsAndIndices();
+                               }
+                       }
+                       dispatchEvent(new Event("dataProviderChanged"));
+               }
+
+               private var _selectedIndices:Array = null;
+               private var _rollOverIndex:int = -1;
+               private var _labelField:String = null;
+               
+               /**
+                *  @copy org.apache.royale.core.IMultiSelectionModel#labelField
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function get labelField():String
+               {
+                       return _labelField;
+               }
+
+               /**
+                *  @private
+                */
+               public function set labelField(value:String):void
+               {
+                       if (value != _labelField) {
+                               _labelField = value;
+                               dispatchEvent(new Event("labelFieldChanged"));
+                       }
+               }
+               
+               /**
+                *  @copy 
org.apache.royale.core.IMultiSelectionModel#selectedIndices
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function get selectedIndices():Array
+               {
+                       return _selectedIndices;
+               }
+
+               /**
+                *  @private
+                */
+               public function set selectedIndices(value:Array):void
+               {
+                       if (value == _selectedIndices) return;
+                       _selectedIndices = value;
+                       if (value == null || dataProvider == null)
+                       {
+                               _selectedItems = null;
+                       } else
+                       {
+                               syncItemsAndIndices();
+                       }
+                       dispatchEvent(new Event("selectedItemsChanged"));       
                
+                       dispatchEvent(new Event("selectedIndicesChanged"));
+               }
+               
+               /**
+                *  @copy org.apache.royale.core.IRollOverModel#rollOverIndex
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function get rollOverIndex():int
+               {
+                       return _rollOverIndex;
+               }
+
+               /**
+                *  @private
+                */
+               public function set rollOverIndex(value:int):void
+               {
+                       _rollOverIndex = value;
+                       dispatchEvent(new Event("rollOverIndexChanged"));       
                
+               }
+               
+               private var _selectedItems:Array;
+               
+               /**
+                *  @copy 
org.apache.royale.core.IMultiSelectionModel#selectedItems
+                *  
+                *  @langversion 3.0
+                *  @playerversion Flash 10.2
+                *  @playerversion AIR 2.6
+                *  @productversion Royale 0.9.7
+                */
+               public function get selectedItems():Array
+               {
+                       return _selectedItems;
+               }
+
+               /**
+                *  @private
+                */
+               public function set selectedItems(value:Array):void
+               {
+                       if (value == _selectedItems) return;
+
+                       _selectedItems = value; 
+                       _selectedIndices = [];
+                       var dp:Array = _dataProvider as Array;
+                       for (var i:int = 0; i < value.length; i++)
+                       {
+                               _selectedIndices.push(dp.indexOf(value[i]));
+                       }
+                       dispatchEvent(new Event("selectedItemsChanged"));       
                
+                       dispatchEvent(new Event("selectedIndicesChanged"));
+               }
+               
+
+               private function syncItemsAndIndices():void
+               {
+                               var items:Array = [];
+                               for (var i:int = 0; i < 
_selectedIndices.length; i++)
+                               {
+                                       
items.push(dataProvider[_selectedIndices[i]]);
+                               }
+                               _selectedItems = items;
+               }
+       }
+}

Reply via email to