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 <[email protected]>
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;
+ }
+ }
+}